@agntk/core 0.2.0 → 0.3.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/dist/agent.d.ts.map +1 -1
- package/dist/agent.js +61 -43
- package/dist/agent.js.map +1 -1
- package/dist/config/defaults.d.ts.map +1 -1
- package/dist/config/defaults.js +16 -4
- package/dist/config/defaults.js.map +1 -1
- package/dist/config/loader.d.ts +14 -6
- package/dist/config/loader.d.ts.map +1 -1
- package/dist/config/loader.js +38 -16
- package/dist/config/loader.js.map +1 -1
- package/dist/config/schema.d.ts +14 -14
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/config/schema.js +1 -1
- package/dist/config/schema.js.map +1 -1
- package/dist/guardrails/runner.d.ts.map +1 -1
- package/dist/guardrails/runner.js +4 -0
- package/dist/guardrails/runner.js.map +1 -1
- package/dist/index.d.ts +5 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -1
- package/dist/index.js.map +1 -1
- package/dist/models.d.ts +24 -1
- package/dist/models.d.ts.map +1 -1
- package/dist/models.js +50 -4
- package/dist/models.js.map +1 -1
- package/dist/presets/tools.d.ts +2 -2
- package/dist/provider-resolver.d.ts +38 -0
- package/dist/provider-resolver.d.ts.map +1 -0
- package/dist/provider-resolver.js +142 -0
- package/dist/provider-resolver.js.map +1 -0
- package/dist/reflection.d.ts +5 -2
- package/dist/reflection.d.ts.map +1 -1
- package/dist/reflection.js +8 -3
- package/dist/reflection.js.map +1 -1
- package/dist/skills/loader.d.ts +18 -0
- package/dist/skills/loader.d.ts.map +1 -1
- package/dist/skills/loader.js +58 -2
- package/dist/skills/loader.js.map +1 -1
- package/dist/system-detect.d.ts +59 -0
- package/dist/system-detect.d.ts.map +1 -0
- package/dist/system-detect.js +193 -0
- package/dist/system-detect.js.map +1 -0
- package/dist/tools/browser/tool.d.ts +2 -2
- package/dist/tools/browser/types.d.ts +2 -2
- package/dist/tools/file/tools.d.ts.map +1 -1
- package/dist/tools/file/tools.js +30 -1
- package/dist/tools/file/tools.js.map +1 -1
- package/dist/tools/index.d.ts +0 -1
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +0 -2
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/progress/index.d.ts +1 -1
- package/dist/tools/shell/background.d.ts.map +1 -1
- package/dist/tools/shell/background.js +45 -3
- package/dist/tools/shell/background.js.map +1 -1
- package/dist/tools/shell/tools.d.ts.map +1 -1
- package/dist/tools/shell/tools.js +9 -2
- package/dist/tools/shell/tools.js.map +1 -1
- package/dist/tools/utils/shell.d.ts +14 -0
- package/dist/tools/utils/shell.d.ts.map +1 -1
- package/dist/tools/utils/shell.js +171 -12
- package/dist/tools/utils/shell.js.map +1 -1
- package/dist/types/agent.d.ts +10 -0
- package/dist/types/agent.d.ts.map +1 -1
- package/package.json +1 -1
- package/dist/tools/factory.d.ts +0 -109
- package/dist/tools/factory.d.ts.map +0 -1
- package/dist/tools/factory.js +0 -166
- package/dist/tools/factory.js.map +0 -1
|
@@ -7,17 +7,48 @@
|
|
|
7
7
|
import { tool } from 'ai';
|
|
8
8
|
import { z } from 'zod';
|
|
9
9
|
import { spawn } from 'node:child_process';
|
|
10
|
-
import { isDangerousCommand } from '../utils/shell.js';
|
|
10
|
+
import { isDangerousCommand, buildSanitizedEnv } from '../utils/shell.js';
|
|
11
11
|
import { MAX_COMMAND_LENGTH, MAX_CWD_LENGTH } from './constants.js';
|
|
12
12
|
// ============================================================================
|
|
13
13
|
// Session Store
|
|
14
14
|
// ============================================================================
|
|
15
15
|
const MAX_BUFFER = 1024 * 1024; // 1MB
|
|
16
16
|
const ROLLING_BUFFER = 512 * 1024; // 512KB
|
|
17
|
+
const MAX_SESSIONS = 20;
|
|
18
|
+
const SESSION_TTL_MS = 2 * 60 * 60 * 1000; // 2 hours
|
|
17
19
|
const backgroundSessions = new Map();
|
|
18
20
|
function generateSessionId() {
|
|
19
21
|
return `bg-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
|
|
20
22
|
}
|
|
23
|
+
/**
|
|
24
|
+
* Evict completed/stopped sessions when at capacity, or the oldest expired session.
|
|
25
|
+
* M-1: prevents the Map from growing indefinitely.
|
|
26
|
+
*/
|
|
27
|
+
function evictSessions() {
|
|
28
|
+
const now = Date.now();
|
|
29
|
+
// First, remove TTL-expired entries regardless of capacity
|
|
30
|
+
for (const [id, session] of backgroundSessions.entries()) {
|
|
31
|
+
if (now - session.startedAt > SESSION_TTL_MS) {
|
|
32
|
+
if (session.status === 'running') {
|
|
33
|
+
try {
|
|
34
|
+
session.process.kill('SIGTERM');
|
|
35
|
+
}
|
|
36
|
+
catch { /* ignore */ }
|
|
37
|
+
}
|
|
38
|
+
backgroundSessions.delete(id);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
// Then, if still over cap, evict oldest completed/stopped session
|
|
42
|
+
if (backgroundSessions.size >= MAX_SESSIONS) {
|
|
43
|
+
for (const [id, session] of backgroundSessions.entries()) {
|
|
44
|
+
if (session.status !== 'running') {
|
|
45
|
+
backgroundSessions.delete(id);
|
|
46
|
+
if (backgroundSessions.size < MAX_SESSIONS)
|
|
47
|
+
break;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
21
52
|
/** Get all sessions (for testing). */
|
|
22
53
|
export function getBackgroundSessions() {
|
|
23
54
|
return backgroundSessions;
|
|
@@ -38,11 +69,22 @@ export function clearBackgroundSessions() {
|
|
|
38
69
|
// Background Process Lifecycle
|
|
39
70
|
// ============================================================================
|
|
40
71
|
function startBackgroundProcess(command, options = {}) {
|
|
72
|
+
// Evict old sessions before adding a new one (M-1)
|
|
73
|
+
evictSessions();
|
|
41
74
|
const sessionId = generateSessionId();
|
|
42
|
-
const { cwd = process.cwd()
|
|
75
|
+
const { cwd = process.cwd() } = options;
|
|
76
|
+
// S-12: filter user-supplied env — strip secrets and disallow PATH/LD_PRELOAD overrides
|
|
77
|
+
const filteredExtra = {};
|
|
78
|
+
if (options.env) {
|
|
79
|
+
for (const [k, v] of Object.entries(options.env)) {
|
|
80
|
+
if (k === 'LD_PRELOAD' || k === 'LD_LIBRARY_PATH')
|
|
81
|
+
continue; // block dangerous overrides
|
|
82
|
+
filteredExtra[k] = v;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
43
85
|
const proc = spawn('bash', ['-c', command], {
|
|
44
86
|
cwd,
|
|
45
|
-
env: { ...
|
|
87
|
+
env: { ...buildSanitizedEnv(filteredExtra), TERM: 'dumb' },
|
|
46
88
|
detached: true,
|
|
47
89
|
stdio: ['ignore', 'pipe', 'pipe'],
|
|
48
90
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"background.js","sourceRoot":"","sources":["../../../src/tools/shell/background.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,IAAI,CAAC;AAC1B,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,KAAK,EAAqB,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"background.js","sourceRoot":"","sources":["../../../src/tools/shell/background.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../../src/tools/shell/tools.ts"],"names":[],"mappings":"AAUA,wBAAgB,eAAe,CAAC,aAAa,EAAE,MAAM;;;;;;
|
|
1
|
+
{"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../../src/tools/shell/tools.ts"],"names":[],"mappings":"AAUA,wBAAgB,eAAe,CAAC,aAAa,EAAE,MAAM;;;;;;WA8EpD;AAED,eAAO,MAAM,SAAS;;;;;;UAAiC,CAAC;AAGxD,eAAO,MAAM,mBAAmB;;;;;;UAAqB,CAAC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { tool } from 'ai';
|
|
2
|
-
import { executeCommand, isDangerousCommand } from '../utils/shell.js';
|
|
2
|
+
import { executeCommand, isDangerousCommand, validateCwd } from '../utils/shell.js';
|
|
3
3
|
import { success, error } from '../utils/tool-result.js';
|
|
4
4
|
import { ToolError, ToolErrorType } from '../utils/errors.js';
|
|
5
5
|
import { SHELL_DESCRIPTION, DEFAULT_TIMEOUT } from './constants.js';
|
|
@@ -23,7 +23,14 @@ export function createShellTool(workspaceRoot) {
|
|
|
23
23
|
if (allow && !isCommandAllowed(command)) {
|
|
24
24
|
addToAllowlist(command);
|
|
25
25
|
}
|
|
26
|
-
|
|
26
|
+
// S-13: Validate cwd is within workspace root
|
|
27
|
+
let effectiveCwd;
|
|
28
|
+
try {
|
|
29
|
+
effectiveCwd = cwd ? validateCwd(cwd, workspaceRoot) : workspaceRoot;
|
|
30
|
+
}
|
|
31
|
+
catch (err) {
|
|
32
|
+
return error(err instanceof Error ? err.message : 'Invalid working directory');
|
|
33
|
+
}
|
|
27
34
|
const result = await executeCommand(command, {
|
|
28
35
|
cwd: effectiveCwd,
|
|
29
36
|
timeout,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../../../src/tools/shell/tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,IAAI,CAAC;AAE1B,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../../../src/tools/shell/tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,18 @@
|
|
|
1
1
|
export declare function isDangerousCommand(command: string): boolean;
|
|
2
|
+
/**
|
|
3
|
+
* Ensure the requested cwd is within workspaceRoot (or is workspaceRoot itself).
|
|
4
|
+
* Returns the resolved cwd, or throws if the path escapes the workspace.
|
|
5
|
+
*/
|
|
6
|
+
export declare function validateCwd(cwd: string, workspaceRoot: string): string;
|
|
7
|
+
/**
|
|
8
|
+
* Build a sanitized copy of process.env suitable for child processes.
|
|
9
|
+
* Strips all credential-like keys; always preserves PATH, HOME, USER, TERM, LANG, etc.
|
|
10
|
+
*/
|
|
11
|
+
export declare function buildSanitizedEnv(extra?: Record<string, string>): Record<string, string>;
|
|
12
|
+
/**
|
|
13
|
+
* Redact API keys and secrets from command output before returning to the LLM.
|
|
14
|
+
*/
|
|
15
|
+
export declare function sanitizeOutput(output: string): string;
|
|
2
16
|
export interface ShellOptions {
|
|
3
17
|
cwd?: string;
|
|
4
18
|
timeout?: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shell.d.ts","sourceRoot":"","sources":["../../../src/tools/utils/shell.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"shell.d.ts","sourceRoot":"","sources":["../../../src/tools/utils/shell.ts"],"names":[],"mappings":"AA4FA,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAE3D;AAMD;;;GAGG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,MAAM,CAYtE;AA6BD;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAM,GACjC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAmBxB;AAgBD;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAMrD;AAED,MAAM,WAAW,YAAY;IAC3B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC9B;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,OAAO,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAsB,cAAc,CAClC,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,YAAiB,GACzB,OAAO,CAAC,WAAW,CAAC,CA2EtB;AAED,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,YAAiB,GACzB,OAAO,CAAC;IACT,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,CAAC,CAuBD"}
|
|
@@ -1,19 +1,178 @@
|
|
|
1
1
|
import { spawn } from 'node:child_process';
|
|
2
|
+
import * as path from 'node:path';
|
|
3
|
+
import * as fs from 'node:fs';
|
|
4
|
+
// ============================================================================
|
|
5
|
+
// Dangerous Command Detection (S-1, S-2, S-3, S-4, S-5, S-6)
|
|
6
|
+
// ============================================================================
|
|
7
|
+
/**
|
|
8
|
+
* Patterns that are unconditionally blocked.
|
|
9
|
+
*
|
|
10
|
+
* Covers:
|
|
11
|
+
* S-1: rm with any target (not just absolute paths)
|
|
12
|
+
* S-2: Nested interpreter invocation (bash -c, python -c, node -e, etc.)
|
|
13
|
+
* S-3: Destructive git operations
|
|
14
|
+
* S-4: Fork bomb (multiple forms)
|
|
15
|
+
* S-5: chmod with dangerous modes (666, setuid, world-writable)
|
|
16
|
+
* S-6: Pipe-to-shell / download-and-execute bypass
|
|
17
|
+
*/
|
|
2
18
|
const DANGEROUS_PATTERNS = [
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
19
|
+
// S-1: rm -r/-rf targeting dangerous targets.
|
|
20
|
+
//
|
|
21
|
+
// Dangerous targets: bare `.` (current dir), `..` (parent), `*` (glob all),
|
|
22
|
+
// `/` (root), `~` (home), `$(...)` or `${...}` or `` ` `` (command sub)
|
|
23
|
+
// Safe targets: `./dist`, `./node_modules`, `./build`, etc. (explicit relative path)
|
|
24
|
+
//
|
|
25
|
+
// Strategy: after flags, match a target that is NOT `.` followed by `/`.
|
|
26
|
+
// `(?!\.[/\w])` means: NOT `.` followed by slash or word char — i.e. not `./dist`.
|
|
27
|
+
// We then explicitly enumerate dangerous patterns.
|
|
28
|
+
/\brm\s+(-[^\s]*r[^\s]*\s+|--recursive\s+)((?<!\.)\.\.(?![^\s])|(?<=\s)\.(?=[\s$])|(?<=\s)\.(?=\s|$)|\*|\/|~|\$[({`])/i,
|
|
29
|
+
// Simpler, more readable alternative that splits into two patterns:
|
|
30
|
+
// Pattern A: rm -r targeting .. or * or / or ~ or command sub
|
|
31
|
+
/\brm\s+-[^\s]*r[^\s]*\s+(\*|\/|~|\$[({]|`|\.\.(\s|$|\/))/i,
|
|
32
|
+
// Pattern B: rm -r targeting bare . (not followed by / or word char meaning ./dist)
|
|
33
|
+
/\brm\s+-[^\s]*r[^\s]*\s+\.(?![\w\/])/i,
|
|
34
|
+
// Pattern C: rm without -r but with -f targeting absolute or dangerous paths
|
|
35
|
+
/\brm\s+-[^\s]*f[^\s]*\s+(\*|~|\$[({]|`|\.\.(\s|$|\/)|\/(?!tmp|var\/tmp))/i,
|
|
36
|
+
// S-2: Nested interpreter invocation
|
|
37
|
+
/\b(bash|sh|zsh|dash|ksh|fish|tcsh)\s+(-[ce]|--[a-z]+\s)/i,
|
|
38
|
+
/\b(python3?|python3\.[0-9]+|pypy3?)\s+-[cC]/i,
|
|
39
|
+
/\b(node|nodejs|deno|bun)\s+-[eE]/i,
|
|
40
|
+
/\b(perl|ruby|php|lua|Rscript|groovy)\s+-[e]/i,
|
|
41
|
+
// S-3: Destructive git operations
|
|
42
|
+
/\bgit\s+(push\s+[^\n]*--?force|push\s+-f\b)/i,
|
|
43
|
+
/\bgit\s+reset\s+--hard/i,
|
|
44
|
+
/\bgit\s+clean\s+-[fdxXqn]*[fF][fdxXqn]*/i,
|
|
45
|
+
/\bgit\s+rebase\s+(-i|--interactive)/i,
|
|
46
|
+
// S-4: Fork bomb — colon function form and nohup infinite loop, but NOT normal while loops
|
|
47
|
+
/:\(\s*\)\s*\{/,
|
|
48
|
+
/:\s*\(\s*\)\s*\{.*:\s*\|\s*:/,
|
|
49
|
+
// S-5: chmod dangerous modes (setuid, setgid, world-write, 666, 777)
|
|
50
|
+
// Allows: 644, 755, 600, 700, u+x, go-w etc.
|
|
51
|
+
// Blocks: 666, 777, 4xxx (setuid), 2xxx (setgid), +s, o+w, a+w, u+s, g+s
|
|
52
|
+
/\bchmod\s+(-R\s+)?(666|777|4[0-9]{3}|2[0-9]{3}|\+s|o\+w|a\+w|u\+s|g\+s)/i,
|
|
53
|
+
// S-6: Pipe-to-shell and download-execute bypasses
|
|
54
|
+
/\b(curl|wget)\b.*\|\s*(bash|sh|zsh|dash|python3?|node)/i,
|
|
55
|
+
/\b(curl|wget)\b.*>\s*\S+.*&&\s*(bash|sh|chmod)/i,
|
|
56
|
+
// Disk/device destruction
|
|
57
|
+
/>\s*\/dev\/(sd[a-z]|nvme[0-9]|hd[a-z]|vd[a-z])/i,
|
|
58
|
+
/\bmkfs\./i,
|
|
59
|
+
/\bdd\s+if=/i,
|
|
60
|
+
// Privilege escalation
|
|
61
|
+
/\b(sudo|su)\s/i,
|
|
9
62
|
/\b(shutdown|reboot|halt|poweroff)\b/i,
|
|
10
|
-
|
|
11
|
-
/\beval\
|
|
12
|
-
|
|
63
|
+
// Shell eval builtin — `eval <string>` or `eval "..."`, not English words like 'evaluate'
|
|
64
|
+
/\beval\s*["'`(]/i,
|
|
65
|
+
/^eval\s/,
|
|
66
|
+
/;\s*eval\s/,
|
|
67
|
+
/&&\s*eval\s/,
|
|
68
|
+
/\|\s*eval\s/,
|
|
69
|
+
// MITRE T1027.010: Decode-then-execute bypass patterns
|
|
70
|
+
// base64 -d / --decode / openssl base64 decode → piped to shell
|
|
71
|
+
/\b(base64\s+-d|base64\s+--decode|openssl\s+enc\s+-d)\b.*\|\s*(bash|sh|zsh|dash|node|python3?)/i,
|
|
72
|
+
// xxd hex-decode → piped to shell
|
|
73
|
+
/\b(xxd\s+-r|xxd\s+--reverse)\b.*\|\s*(bash|sh|zsh|dash|node|python3?)/i,
|
|
74
|
+
// gzip decompress → piped to shell
|
|
75
|
+
/\bgzip\s+(-d|--decompress)\b.*\|\s*(bash|sh|zsh|dash)/i,
|
|
76
|
+
// printf with hex escapes → piped to shell
|
|
77
|
+
/\bprintf\b.*\\x[0-9a-fA-F]{2}.*\|\s*(bash|sh|zsh|dash)/i,
|
|
78
|
+
// ANSI-C quoting with octal escapes: $'\173\40...' | sh
|
|
79
|
+
/\$'\\[0-7]{3,}'.*\|\s*(bash|sh|zsh|dash)/i,
|
|
13
80
|
];
|
|
14
81
|
export function isDangerousCommand(command) {
|
|
15
82
|
return DANGEROUS_PATTERNS.some((pattern) => pattern.test(command));
|
|
16
83
|
}
|
|
84
|
+
// ============================================================================
|
|
85
|
+
// CWD Validation (S-13)
|
|
86
|
+
// ============================================================================
|
|
87
|
+
/**
|
|
88
|
+
* Ensure the requested cwd is within workspaceRoot (or is workspaceRoot itself).
|
|
89
|
+
* Returns the resolved cwd, or throws if the path escapes the workspace.
|
|
90
|
+
*/
|
|
91
|
+
export function validateCwd(cwd, workspaceRoot) {
|
|
92
|
+
const resolvedCwd = path.resolve(cwd);
|
|
93
|
+
let realWorkspace;
|
|
94
|
+
try {
|
|
95
|
+
realWorkspace = fs.realpathSync(path.resolve(workspaceRoot));
|
|
96
|
+
}
|
|
97
|
+
catch {
|
|
98
|
+
realWorkspace = path.resolve(workspaceRoot);
|
|
99
|
+
}
|
|
100
|
+
if (!resolvedCwd.startsWith(realWorkspace + path.sep) && resolvedCwd !== realWorkspace) {
|
|
101
|
+
throw new Error(`cwd "${cwd}" is outside workspace root`);
|
|
102
|
+
}
|
|
103
|
+
return resolvedCwd;
|
|
104
|
+
}
|
|
105
|
+
// ============================================================================
|
|
106
|
+
// Env Var Filtering (A-3)
|
|
107
|
+
// ============================================================================
|
|
108
|
+
/** Key patterns that indicate credentials — stripped from child process env. */
|
|
109
|
+
const SENSITIVE_ENV_PATTERNS = [
|
|
110
|
+
/API[_-]?KEY/i,
|
|
111
|
+
/SECRET/i,
|
|
112
|
+
/TOKEN(?!_DIR|_PATH)/i,
|
|
113
|
+
/PASSWORD/i,
|
|
114
|
+
/PASSWD/i,
|
|
115
|
+
/CREDENTIAL/i,
|
|
116
|
+
/OPENAI_/i,
|
|
117
|
+
/ANTHROPIC_/i,
|
|
118
|
+
/LANGFUSE_/i,
|
|
119
|
+
/AWS_(?!REGION|DEFAULT_REGION|EXECUTION_ENV)/i,
|
|
120
|
+
/GOOGLE_(API|CLOUD|APPLICATION)/i,
|
|
121
|
+
/GITHUB_TOKEN/i,
|
|
122
|
+
/SLACK_(BOT|APP|SIGNING)/i,
|
|
123
|
+
/STRIPE_/i,
|
|
124
|
+
/TWILIO_/i,
|
|
125
|
+
/SENDGRID_/i,
|
|
126
|
+
/DATABASE_URL/i,
|
|
127
|
+
/MONGO(DB)?_URI/i,
|
|
128
|
+
/REDIS_URL/i,
|
|
129
|
+
];
|
|
130
|
+
/**
|
|
131
|
+
* Build a sanitized copy of process.env suitable for child processes.
|
|
132
|
+
* Strips all credential-like keys; always preserves PATH, HOME, USER, TERM, LANG, etc.
|
|
133
|
+
*/
|
|
134
|
+
export function buildSanitizedEnv(extra = {}) {
|
|
135
|
+
const safe = {};
|
|
136
|
+
for (const [key, value] of Object.entries(process.env)) {
|
|
137
|
+
if (value === undefined)
|
|
138
|
+
continue;
|
|
139
|
+
if (SENSITIVE_ENV_PATTERNS.some((p) => p.test(key)))
|
|
140
|
+
continue;
|
|
141
|
+
safe[key] = value;
|
|
142
|
+
}
|
|
143
|
+
// Merge caller-supplied extras, but also filter those
|
|
144
|
+
for (const [key, value] of Object.entries(extra)) {
|
|
145
|
+
if (SENSITIVE_ENV_PATTERNS.some((p) => p.test(key)))
|
|
146
|
+
continue;
|
|
147
|
+
safe[key] = value;
|
|
148
|
+
}
|
|
149
|
+
// Always ensure PATH is present
|
|
150
|
+
if (process.env.PATH)
|
|
151
|
+
safe.PATH = process.env.PATH;
|
|
152
|
+
return safe;
|
|
153
|
+
}
|
|
154
|
+
// ============================================================================
|
|
155
|
+
// Output Sanitization (A-1)
|
|
156
|
+
// ============================================================================
|
|
157
|
+
const SENSITIVE_OUTPUT_PATTERNS = [
|
|
158
|
+
[/\bsk-[a-zA-Z0-9]{16,}\b/g, '[OPENAI_KEY REDACTED]'],
|
|
159
|
+
[/\bsk-ant-[a-zA-Z0-9\-]{20,}\b/g, '[ANTHROPIC_KEY REDACTED]'],
|
|
160
|
+
[/\bghp_[a-zA-Z0-9]{36}\b/g, '[GITHUB_TOKEN REDACTED]'],
|
|
161
|
+
[/\bxoxb-[a-zA-Z0-9\-]+\b/g, '[SLACK_TOKEN REDACTED]'],
|
|
162
|
+
[/Bearer\s+[a-zA-Z0-9._\-]{20,}/g, '[BEARER_TOKEN REDACTED]'],
|
|
163
|
+
// Generic: KEY=value and SECRET=value patterns on a line
|
|
164
|
+
[/(?:api[_\-]?key|secret|token|password|api_secret)\s*[=:]\s*[^\s'"]{8,}/gi, '[SECRET REDACTED]'],
|
|
165
|
+
];
|
|
166
|
+
/**
|
|
167
|
+
* Redact API keys and secrets from command output before returning to the LLM.
|
|
168
|
+
*/
|
|
169
|
+
export function sanitizeOutput(output) {
|
|
170
|
+
let sanitized = output;
|
|
171
|
+
for (const [pattern, replacement] of SENSITIVE_OUTPUT_PATTERNS) {
|
|
172
|
+
sanitized = sanitized.replace(pattern, replacement);
|
|
173
|
+
}
|
|
174
|
+
return sanitized;
|
|
175
|
+
}
|
|
17
176
|
export async function executeCommand(command, options = {}) {
|
|
18
177
|
const { cwd = process.cwd(), timeout = 30000, maxBuffer = 1024 * 1024, env, } = options;
|
|
19
178
|
const startTime = performance.now();
|
|
@@ -23,7 +182,7 @@ export async function executeCommand(command, options = {}) {
|
|
|
23
182
|
let killed = false;
|
|
24
183
|
const proc = spawn('bash', ['-c', command], {
|
|
25
184
|
cwd,
|
|
26
|
-
env: { ...
|
|
185
|
+
env: { ...buildSanitizedEnv(env), TERM: 'dumb' },
|
|
27
186
|
});
|
|
28
187
|
const timer = setTimeout(() => {
|
|
29
188
|
killed = true;
|
|
@@ -55,8 +214,8 @@ export async function executeCommand(command, options = {}) {
|
|
|
55
214
|
proc.on('close', (code) => {
|
|
56
215
|
clearTimeout(timer);
|
|
57
216
|
resolve({
|
|
58
|
-
stdout: stdout.trim(),
|
|
59
|
-
stderr: stderr.trim(),
|
|
217
|
+
stdout: sanitizeOutput(stdout.trim()),
|
|
218
|
+
stderr: sanitizeOutput(stderr.trim()),
|
|
60
219
|
exitCode: code ?? 1,
|
|
61
220
|
killed,
|
|
62
221
|
durationMs: performance.now() - startTime,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shell.js","sourceRoot":"","sources":["../../../src/tools/utils/shell.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"shell.js","sourceRoot":"","sources":["../../../src/tools/utils/shell.ts"],"names":[],"mappings":"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"}
|
package/dist/types/agent.d.ts
CHANGED
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
*/
|
|
7
7
|
import type { LanguageModel, LanguageModelUsage, Tool } from 'ai';
|
|
8
8
|
import type { UsageLimits } from '../usage-limits.js';
|
|
9
|
+
import type { ApprovalConfig } from '../tools/approval.js';
|
|
9
10
|
/**
|
|
10
11
|
* Configuration for creating an agent.
|
|
11
12
|
*
|
|
@@ -48,6 +49,15 @@ export interface AgentOptions {
|
|
|
48
49
|
* Useful for testing with mock tools or adding custom capabilities.
|
|
49
50
|
*/
|
|
50
51
|
tools?: Record<string, Tool>;
|
|
52
|
+
/**
|
|
53
|
+
* Enable human-in-the-loop approval for dangerous tools.
|
|
54
|
+
*
|
|
55
|
+
* - `true` — use defaults (shell, browser, file_write, file_edit, file_create require approval)
|
|
56
|
+
* - `ApprovalConfig` — full control over which tools require approval, timeout behaviour, etc.
|
|
57
|
+
*
|
|
58
|
+
* @default false (no approval required)
|
|
59
|
+
*/
|
|
60
|
+
approval?: boolean | ApprovalConfig;
|
|
51
61
|
}
|
|
52
62
|
/**
|
|
53
63
|
* An agent instance. Stream-only — no generate().
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../../src/types/agent.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,kBAAkB,EAAE,IAAI,EAAE,MAAM,IAAI,CAAC;AAClE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../../src/types/agent.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,kBAAkB,EAAE,IAAI,EAAE,MAAM,IAAI,CAAC;AAClE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAMxD;;;;;GAKG;AACH,MAAM,WAAW,YAAY;IAC3B;;;;OAIG;IACH,IAAI,EAAE,MAAM,CAAC;IAEb;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IAIvB;;;;OAIG;IACH,KAAK,CAAC,EAAE,aAAa,CAAC;IAEtB;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB;;OAEG;IACH,WAAW,CAAC,EAAE,WAAW,CAAC;IAE1B;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAE7B;;;;;;;OAOG;IACH,QAAQ,CAAC,EAAE,OAAO,GAAG,cAAc,CAAC;CACrC;AAMD;;GAEG;AACH,MAAM,WAAW,KAAK;IACpB,wBAAwB;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB,wFAAwF;IACxF,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAEtB;;;OAGG;IACH,MAAM,CAAC,KAAK,EAAE;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAE9D,+EAA+E;IAC/E,eAAe,IAAI,MAAM,CAAC;IAE1B,8DAA8D;IAC9D,YAAY,IAAI,MAAM,EAAE,CAAC;CAC1B;AAED;;;GAGG;AACH,MAAM,WAAW,iBAAiB;IAChC,oFAAoF;IACpF,UAAU,EAAE,aAAa,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;KAAE,CAAC,CAAC;IACnF,2DAA2D;IAC3D,IAAI,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAC1B,iDAAiD;IACjD,KAAK,EAAE,WAAW,CAAC,kBAAkB,CAAC,CAAC;CACxC"}
|
package/package.json
CHANGED
package/dist/tools/factory.d.ts
DELETED
|
@@ -1,109 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @agntk/core - Tool Factory
|
|
3
|
-
*
|
|
4
|
-
* Factory pattern for creating tool sets with dependency injection.
|
|
5
|
-
* Adapted from packages/core/src/tools/factory.ts
|
|
6
|
-
*/
|
|
7
|
-
import type { Tool } from 'ai';
|
|
8
|
-
/**
|
|
9
|
-
* Dependencies that can be injected into tool creators.
|
|
10
|
-
*/
|
|
11
|
-
export interface ToolDependencies {
|
|
12
|
-
/** Workspace root directory for file operations */
|
|
13
|
-
workspaceRoot?: string;
|
|
14
|
-
/** Directories the agent is allowed to access */
|
|
15
|
-
allowedDirectories?: string[];
|
|
16
|
-
/** Optional UI stream writer for transient data */
|
|
17
|
-
streamWriter?: unknown;
|
|
18
|
-
/** Optional memory store instance */
|
|
19
|
-
memoryStore?: unknown;
|
|
20
|
-
/** Custom context data */
|
|
21
|
-
context?: Record<string, unknown>;
|
|
22
|
-
}
|
|
23
|
-
/**
|
|
24
|
-
* A set of tools keyed by name.
|
|
25
|
-
*/
|
|
26
|
-
export type ToolSet = Record<string, Tool>;
|
|
27
|
-
/**
|
|
28
|
-
* Function that creates a set of tools given dependencies.
|
|
29
|
-
*/
|
|
30
|
-
export type ToolCreator = (deps: ToolDependencies) => ToolSet;
|
|
31
|
-
/**
|
|
32
|
-
* Factory for registering and creating tools with dependency injection.
|
|
33
|
-
*
|
|
34
|
-
* @example
|
|
35
|
-
* ```typescript
|
|
36
|
-
* const factory = new ToolFactory();
|
|
37
|
-
*
|
|
38
|
-
* factory.register('search', (deps) => ({
|
|
39
|
-
* glob: createGlobTool({ defaultCwd: deps.workspaceRoot }),
|
|
40
|
-
* grep: createGrepTool({ defaultCwd: deps.workspaceRoot }),
|
|
41
|
-
* }));
|
|
42
|
-
*
|
|
43
|
-
* const tools = factory.createAll({ workspaceRoot: '/my/project' });
|
|
44
|
-
* ```
|
|
45
|
-
*/
|
|
46
|
-
export declare class ToolFactory {
|
|
47
|
-
private factories;
|
|
48
|
-
private creationErrors;
|
|
49
|
-
/**
|
|
50
|
-
* Register a tool creator function.
|
|
51
|
-
*/
|
|
52
|
-
register(name: string, creator: ToolCreator): void;
|
|
53
|
-
/**
|
|
54
|
-
* Unregister a tool creator.
|
|
55
|
-
*/
|
|
56
|
-
unregister(name: string): boolean;
|
|
57
|
-
/**
|
|
58
|
-
* Check if a tool creator is registered.
|
|
59
|
-
*/
|
|
60
|
-
has(name: string): boolean;
|
|
61
|
-
/**
|
|
62
|
-
* Get all registered tool creator names.
|
|
63
|
-
*/
|
|
64
|
-
getRegisteredNames(): string[];
|
|
65
|
-
/**
|
|
66
|
-
* Create tools from a single registered creator.
|
|
67
|
-
*/
|
|
68
|
-
create(name: string, deps: ToolDependencies): ToolSet | null;
|
|
69
|
-
/**
|
|
70
|
-
* Create all registered tools.
|
|
71
|
-
*/
|
|
72
|
-
createAll(deps: ToolDependencies): ToolSet;
|
|
73
|
-
/**
|
|
74
|
-
* Create selected tools by name.
|
|
75
|
-
*/
|
|
76
|
-
createSelected(names: string[], deps: ToolDependencies): ToolSet;
|
|
77
|
-
/**
|
|
78
|
-
* Get errors from the last creation operation.
|
|
79
|
-
*/
|
|
80
|
-
getLastErrors(): Array<{
|
|
81
|
-
name: string;
|
|
82
|
-
error: string;
|
|
83
|
-
}>;
|
|
84
|
-
/**
|
|
85
|
-
* Clear all registered factories.
|
|
86
|
-
*/
|
|
87
|
-
clear(): void;
|
|
88
|
-
}
|
|
89
|
-
/**
|
|
90
|
-
* Default tool factory instance for convenience.
|
|
91
|
-
*/
|
|
92
|
-
export declare const defaultToolFactory: ToolFactory;
|
|
93
|
-
/**
|
|
94
|
-
* Merge multiple tool sets into one.
|
|
95
|
-
*/
|
|
96
|
-
export declare function mergeToolSets(...toolSets: ToolSet[]): ToolSet;
|
|
97
|
-
/**
|
|
98
|
-
* Filter a tool set to only include specified tools.
|
|
99
|
-
*/
|
|
100
|
-
export declare function filterTools(tools: ToolSet, include: string[]): ToolSet;
|
|
101
|
-
/**
|
|
102
|
-
* Exclude specified tools from a tool set.
|
|
103
|
-
*/
|
|
104
|
-
export declare function excludeTools(tools: ToolSet, exclude: string[]): ToolSet;
|
|
105
|
-
/**
|
|
106
|
-
* Get tool names from a tool set.
|
|
107
|
-
*/
|
|
108
|
-
export declare function getToolNames(tools: ToolSet): string[];
|
|
109
|
-
//# sourceMappingURL=factory.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../../src/tools/factory.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,IAAI,CAAC;AAM/B;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,mDAAmD;IACnD,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,iDAAiD;IACjD,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC9B,mDAAmD;IACnD,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,qCAAqC;IACrC,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,0BAA0B;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC;AAED;;GAEG;AACH,MAAM,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;AAE3C;;GAEG;AACH,MAAM,MAAM,WAAW,GAAG,CAAC,IAAI,EAAE,gBAAgB,KAAK,OAAO,CAAC;AAM9D;;;;;;;;;;;;;;GAcG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,SAAS,CAAkC;IACnD,OAAO,CAAC,cAAc,CAA8C;IAEpE;;OAEG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,IAAI;IAIlD;;OAEG;IACH,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAIjC;;OAEG;IACH,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAI1B;;OAEG;IACH,kBAAkB,IAAI,MAAM,EAAE;IAI9B;;OAEG;IACH,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,gBAAgB,GAAG,OAAO,GAAG,IAAI;IAgB5D;;OAEG;IACH,SAAS,CAAC,IAAI,EAAE,gBAAgB,GAAG,OAAO;IAoB1C;;OAEG;IACH,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,gBAAgB,GAAG,OAAO;IAuBhE;;OAEG;IACH,aAAa,IAAI,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAIvD;;OAEG;IACH,KAAK,IAAI,IAAI;CAId;AAMD;;GAEG;AACH,eAAO,MAAM,kBAAkB,aAAoB,CAAC;AAMpD;;GAEG;AACH,wBAAgB,aAAa,CAAC,GAAG,QAAQ,EAAE,OAAO,EAAE,GAAG,OAAO,CAE7D;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,OAAO,CAKtE;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,OAAO,CAKvE;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,EAAE,CAErD"}
|