cmdr-agent 1.2.2 → 2.0.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/README.md +19 -0
- package/dist/bin/cmdr.js +3 -1
- package/dist/bin/cmdr.js.map +1 -1
- package/dist/src/agents/executor.d.ts +32 -0
- package/dist/src/agents/executor.d.ts.map +1 -0
- package/dist/src/agents/executor.js +50 -0
- package/dist/src/agents/executor.js.map +1 -0
- package/dist/src/agents/index.d.ts +7 -0
- package/dist/src/agents/index.d.ts.map +1 -0
- package/dist/src/agents/index.js +7 -0
- package/dist/src/agents/index.js.map +1 -0
- package/dist/src/agents/registry.d.ts +36 -0
- package/dist/src/agents/registry.d.ts.map +1 -0
- package/dist/src/agents/registry.js +168 -0
- package/dist/src/agents/registry.js.map +1 -0
- package/dist/src/agents/subagent-tool.d.ts +27 -0
- package/dist/src/agents/subagent-tool.d.ts.map +1 -0
- package/dist/src/agents/subagent-tool.js +36 -0
- package/dist/src/agents/subagent-tool.js.map +1 -0
- package/dist/src/cli/args.d.ts +2 -0
- package/dist/src/cli/args.d.ts.map +1 -1
- package/dist/src/cli/args.js +8 -0
- package/dist/src/cli/args.js.map +1 -1
- package/dist/src/cli/commands.d.ts.map +1 -1
- package/dist/src/cli/commands.js +92 -4
- package/dist/src/cli/commands.js.map +1 -1
- package/dist/src/cli/ink/App.d.ts +4 -0
- package/dist/src/cli/ink/App.d.ts.map +1 -1
- package/dist/src/cli/ink/App.js +164 -20
- package/dist/src/cli/ink/App.js.map +1 -1
- package/dist/src/cli/ink/StatusBar.d.ts +17 -0
- package/dist/src/cli/ink/StatusBar.d.ts.map +1 -0
- package/dist/src/cli/ink/StatusBar.js +32 -0
- package/dist/src/cli/ink/StatusBar.js.map +1 -0
- package/dist/src/cli/repl.d.ts +2 -0
- package/dist/src/cli/repl.d.ts.map +1 -1
- package/dist/src/cli/repl.js +117 -4
- package/dist/src/cli/repl.js.map +1 -1
- package/dist/src/cli/theme.d.ts +42 -22
- package/dist/src/cli/theme.d.ts.map +1 -1
- package/dist/src/cli/theme.js +25 -1
- package/dist/src/cli/theme.js.map +1 -1
- package/dist/src/cli/themes.d.ts +57 -0
- package/dist/src/cli/themes.d.ts.map +1 -0
- package/dist/src/cli/themes.js +98 -0
- package/dist/src/cli/themes.js.map +1 -0
- package/dist/src/commands/index.d.ts +3 -0
- package/dist/src/commands/index.d.ts.map +1 -0
- package/dist/src/commands/index.js +2 -0
- package/dist/src/commands/index.js.map +1 -0
- package/dist/src/commands/loader.d.ts +35 -0
- package/dist/src/commands/loader.d.ts.map +1 -0
- package/dist/src/commands/loader.js +134 -0
- package/dist/src/commands/loader.js.map +1 -0
- package/dist/src/config/config-loader.d.ts.map +1 -1
- package/dist/src/config/config-loader.js +2 -0
- package/dist/src/config/config-loader.js.map +1 -1
- package/dist/src/config/defaults.d.ts.map +1 -1
- package/dist/src/config/defaults.js +1 -0
- package/dist/src/config/defaults.js.map +1 -1
- package/dist/src/config/schema.d.ts +3 -0
- package/dist/src/config/schema.d.ts.map +1 -1
- package/dist/src/config/schema.js +1 -0
- package/dist/src/config/schema.js.map +1 -1
- package/dist/src/core/agent-runner.d.ts.map +1 -1
- package/dist/src/core/agent-runner.js +39 -5
- package/dist/src/core/agent-runner.js.map +1 -1
- package/dist/src/core/agent.d.ts +1 -1
- package/dist/src/core/agent.d.ts.map +1 -1
- package/dist/src/core/agent.js +4 -3
- package/dist/src/core/agent.js.map +1 -1
- package/dist/src/core/intent.d.ts +2 -0
- package/dist/src/core/intent.d.ts.map +1 -1
- package/dist/src/core/intent.js +12 -0
- package/dist/src/core/intent.js.map +1 -1
- package/dist/src/core/presets.d.ts.map +1 -1
- package/dist/src/core/presets.js +49 -15
- package/dist/src/core/presets.js.map +1 -1
- package/dist/src/core/types.d.ts +5 -0
- package/dist/src/core/types.d.ts.map +1 -1
- package/dist/src/index.d.ts +3 -2
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +2 -2
- package/dist/src/index.js.map +1 -1
- package/dist/src/llm/model-registry.d.ts +25 -0
- package/dist/src/llm/model-registry.d.ts.map +1 -1
- package/dist/src/llm/model-registry.js +223 -22
- package/dist/src/llm/model-registry.js.map +1 -1
- package/dist/src/llm/model-watcher.d.ts +26 -0
- package/dist/src/llm/model-watcher.d.ts.map +1 -0
- package/dist/src/llm/model-watcher.js +130 -0
- package/dist/src/llm/model-watcher.js.map +1 -0
- package/dist/src/llm/ollama.d.ts +13 -1
- package/dist/src/llm/ollama.d.ts.map +1 -1
- package/dist/src/llm/ollama.js +309 -93
- package/dist/src/llm/ollama.js.map +1 -1
- package/dist/src/session/compaction.js +4 -0
- package/dist/src/session/compaction.js.map +1 -1
- package/dist/src/session/project-context.d.ts.map +1 -1
- package/dist/src/session/project-context.js +54 -4
- package/dist/src/session/project-context.js.map +1 -1
- package/dist/src/session/prompt-builder.d.ts +28 -1
- package/dist/src/session/prompt-builder.d.ts.map +1 -1
- package/dist/src/session/prompt-builder.js +97 -23
- package/dist/src/session/prompt-builder.js.map +1 -1
- package/dist/src/session/session-manager.d.ts +10 -3
- package/dist/src/session/session-manager.d.ts.map +1 -1
- package/dist/src/session/session-manager.js +53 -16
- package/dist/src/session/session-manager.js.map +1 -1
- package/dist/src/session/session-persistence.d.ts +12 -0
- package/dist/src/session/session-persistence.d.ts.map +1 -1
- package/dist/src/session/session-persistence.js +94 -4
- package/dist/src/session/session-persistence.js.map +1 -1
- package/dist/src/tools/built-in/bash-security.d.ts +13 -0
- package/dist/src/tools/built-in/bash-security.d.ts.map +1 -0
- package/dist/src/tools/built-in/bash-security.js +53 -0
- package/dist/src/tools/built-in/bash-security.js.map +1 -0
- package/dist/src/tools/built-in/bash.d.ts.map +1 -1
- package/dist/src/tools/built-in/bash.js +7 -1
- package/dist/src/tools/built-in/bash.js.map +1 -1
- package/package.json +2 -1
|
@@ -1,7 +1,14 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Session persistence — save/load conversation sessions to ~/.cmdr/sessions/.
|
|
3
|
+
*
|
|
4
|
+
* Uses append-only JSONL (one JSON object per line) for crash-safe writes.
|
|
5
|
+
* Each line is one of:
|
|
6
|
+
* {"type":"meta","sessionId":"...","model":"...","projectRoot":"...","createdAt":"..."}
|
|
7
|
+
* {"type":"message","role":"user","content":[...],"timestamp":"..."}
|
|
8
|
+
* {"type":"compact","boundaryIndex":42,"summary":"...","timestamp":"..."}
|
|
3
9
|
*/
|
|
4
|
-
import { readFile, writeFile, mkdir, readdir } from 'fs/promises';
|
|
10
|
+
import { readFile, writeFile, mkdir, readdir, appendFile } from 'fs/promises';
|
|
11
|
+
import { existsSync } from 'fs';
|
|
5
12
|
import { join } from 'path';
|
|
6
13
|
import { homedir } from 'os';
|
|
7
14
|
const CMDR_DIR = join(homedir(), '.cmdr');
|
|
@@ -37,6 +44,49 @@ function extractSummary(messages) {
|
|
|
37
44
|
}
|
|
38
45
|
return '';
|
|
39
46
|
}
|
|
47
|
+
function journalPath(sessionId) {
|
|
48
|
+
return join(SESSIONS_DIR, `${sessionId}.jsonl`);
|
|
49
|
+
}
|
|
50
|
+
/** Append a single message to the JSONL session file. */
|
|
51
|
+
export async function appendSessionMessage(sessionId, msg) {
|
|
52
|
+
await ensureDir(SESSIONS_DIR);
|
|
53
|
+
const line = {
|
|
54
|
+
type: 'message',
|
|
55
|
+
role: msg.role,
|
|
56
|
+
content: msg.content,
|
|
57
|
+
timestamp: new Date().toISOString(),
|
|
58
|
+
...(msg.isCompactSummary ? { isCompactSummary: true } : {}),
|
|
59
|
+
...(msg.isCompactBoundary ? { isCompactBoundary: true } : {}),
|
|
60
|
+
...(msg.isVisibleInTranscriptOnly ? { isVisibleInTranscriptOnly: true } : {}),
|
|
61
|
+
...(msg.isMeta ? { isMeta: true } : {}),
|
|
62
|
+
};
|
|
63
|
+
await appendFile(journalPath(sessionId), JSON.stringify(line) + '\n', 'utf-8');
|
|
64
|
+
}
|
|
65
|
+
/** Write session meta header (called once at session start). */
|
|
66
|
+
export async function writeSessionMeta(sessionId, model, projectRoot) {
|
|
67
|
+
await ensureDir(SESSIONS_DIR);
|
|
68
|
+
const line = {
|
|
69
|
+
type: 'meta',
|
|
70
|
+
sessionId,
|
|
71
|
+
model,
|
|
72
|
+
projectRoot,
|
|
73
|
+
createdAt: new Date().toISOString(),
|
|
74
|
+
};
|
|
75
|
+
await appendFile(journalPath(sessionId), JSON.stringify(line) + '\n', 'utf-8');
|
|
76
|
+
}
|
|
77
|
+
/** Append a compaction marker to the journal. */
|
|
78
|
+
export async function appendCompactMarker(sessionId, boundaryIndex, summary) {
|
|
79
|
+
const line = {
|
|
80
|
+
type: 'compact',
|
|
81
|
+
boundaryIndex,
|
|
82
|
+
summary,
|
|
83
|
+
timestamp: new Date().toISOString(),
|
|
84
|
+
};
|
|
85
|
+
await appendFile(journalPath(sessionId), JSON.stringify(line) + '\n', 'utf-8');
|
|
86
|
+
}
|
|
87
|
+
// ---------------------------------------------------------------------------
|
|
88
|
+
// Save / Load
|
|
89
|
+
// ---------------------------------------------------------------------------
|
|
40
90
|
export async function saveSession(sessionState, model) {
|
|
41
91
|
await ensureDir(SESSIONS_DIR);
|
|
42
92
|
const saved = {
|
|
@@ -49,15 +99,55 @@ export async function saveSession(sessionState, model) {
|
|
|
49
99
|
toolsUsed: extractToolsUsed(sessionState.messages),
|
|
50
100
|
summary: extractSummary(sessionState.messages),
|
|
51
101
|
};
|
|
102
|
+
// Write atomic JSON snapshot (for listSessions/quick load)
|
|
52
103
|
const filePath = join(SESSIONS_DIR, `${sessionState.id}.json`);
|
|
53
104
|
await writeFile(filePath, JSON.stringify(saved, null, 2), 'utf-8');
|
|
54
105
|
return sessionState.id;
|
|
55
106
|
}
|
|
56
107
|
export async function loadSession(sessionId) {
|
|
57
108
|
try {
|
|
58
|
-
|
|
59
|
-
const
|
|
60
|
-
|
|
109
|
+
// Try JSON snapshot first (faster)
|
|
110
|
+
const jsonPath = join(SESSIONS_DIR, `${sessionId}.json`);
|
|
111
|
+
if (existsSync(jsonPath)) {
|
|
112
|
+
const data = await readFile(jsonPath, 'utf-8');
|
|
113
|
+
return JSON.parse(data);
|
|
114
|
+
}
|
|
115
|
+
// Fallback: reconstruct from JSONL journal
|
|
116
|
+
const jPath = journalPath(sessionId);
|
|
117
|
+
if (!existsSync(jPath))
|
|
118
|
+
return null;
|
|
119
|
+
const content = await readFile(jPath, 'utf-8');
|
|
120
|
+
const lines = content.trim().split('\n').filter(Boolean);
|
|
121
|
+
let meta = null;
|
|
122
|
+
const messages = [];
|
|
123
|
+
for (const line of lines) {
|
|
124
|
+
const entry = JSON.parse(line);
|
|
125
|
+
if (entry.type === 'meta') {
|
|
126
|
+
meta = entry;
|
|
127
|
+
}
|
|
128
|
+
else if (entry.type === 'message') {
|
|
129
|
+
messages.push({
|
|
130
|
+
role: entry.role,
|
|
131
|
+
content: entry.content,
|
|
132
|
+
...(entry.isCompactSummary ? { isCompactSummary: true } : {}),
|
|
133
|
+
...(entry.isCompactBoundary ? { isCompactBoundary: true } : {}),
|
|
134
|
+
...(entry.isVisibleInTranscriptOnly ? { isVisibleInTranscriptOnly: true } : {}),
|
|
135
|
+
...(entry.isMeta ? { isMeta: true } : {}),
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
if (!meta)
|
|
140
|
+
return null;
|
|
141
|
+
return {
|
|
142
|
+
id: meta.sessionId,
|
|
143
|
+
messages,
|
|
144
|
+
projectRoot: meta.projectRoot,
|
|
145
|
+
model: meta.model,
|
|
146
|
+
createdAt: meta.createdAt,
|
|
147
|
+
lastActivity: new Date().toISOString(),
|
|
148
|
+
toolsUsed: extractToolsUsed(messages),
|
|
149
|
+
summary: extractSummary(messages),
|
|
150
|
+
};
|
|
61
151
|
}
|
|
62
152
|
catch {
|
|
63
153
|
return null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-persistence.js","sourceRoot":"","sources":["../../../src/session/session-persistence.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"session-persistence.js","sourceRoot":"","sources":["../../../src/session/session-persistence.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bash command security checks.
|
|
3
|
+
*
|
|
4
|
+
* Derived from Claude Code's 23 security checks — blocks destructive ops,
|
|
5
|
+
* data exfiltration, and shell injection vectors.
|
|
6
|
+
*/
|
|
7
|
+
export interface SecurityResult {
|
|
8
|
+
safe: boolean;
|
|
9
|
+
reason?: string;
|
|
10
|
+
sanitized: string;
|
|
11
|
+
}
|
|
12
|
+
export declare function sanitizeBashCommand(command: string): SecurityResult;
|
|
13
|
+
//# sourceMappingURL=bash-security.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bash-security.d.ts","sourceRoot":"","sources":["../../../../src/tools/built-in/bash-security.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AA+BH,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,OAAO,CAAA;IACb,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,cAAc,CA0BnE"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bash command security checks.
|
|
3
|
+
*
|
|
4
|
+
* Derived from Claude Code's 23 security checks — blocks destructive ops,
|
|
5
|
+
* data exfiltration, and shell injection vectors.
|
|
6
|
+
*/
|
|
7
|
+
// Destructive or dangerous command patterns
|
|
8
|
+
const BLOCKED_PATTERNS = [
|
|
9
|
+
// Destructive commands
|
|
10
|
+
{ pattern: /\brm\s+(-[a-zA-Z]*f[a-zA-Z]*\s+)?\/\s*$/, label: 'rm -rf /' },
|
|
11
|
+
{ pattern: /\bchmod\s+(-R\s+)?777\s+\//, label: 'chmod 777 /' },
|
|
12
|
+
{ pattern: /\bmkfs\b/, label: 'filesystem format' },
|
|
13
|
+
{ pattern: /\bdd\s+.*of=\/dev\//, label: 'dd to device' },
|
|
14
|
+
// Data exfiltration
|
|
15
|
+
{ pattern: /\bcurl\s+.*-d\s+.*@/, label: 'curl posting file contents' },
|
|
16
|
+
{ pattern: /\bwget\s+.*--post-file/, label: 'wget posting files' },
|
|
17
|
+
// Sensitive file access via subshell
|
|
18
|
+
{ pattern: /\$\(.*\bcat\b.*\/etc\/(passwd|shadow)/, label: 'reading sensitive files' },
|
|
19
|
+
];
|
|
20
|
+
// Zsh builtins that should never come from an LLM
|
|
21
|
+
const BLOCKED_ZSH_BUILTINS = new Set([
|
|
22
|
+
'bindkey', 'compdef', 'compadd', 'zmodload', 'autoload',
|
|
23
|
+
'zle', 'zstyle', 'typeset', 'setopt', 'unsetopt',
|
|
24
|
+
'functions', 'aliases', 'disable', 'enable', 'emulate',
|
|
25
|
+
]);
|
|
26
|
+
// Zero-width characters (from Claude Code HackerOne finding)
|
|
27
|
+
const ZERO_WIDTH_REGEX = /[\u200B\u200C\u200D\u2060\uFEFF]/g;
|
|
28
|
+
// Zsh equals expansion: =curl → /usr/bin/curl
|
|
29
|
+
const ZSH_EQUALS_REGEX = /(?:^|\s)=[a-zA-Z]/;
|
|
30
|
+
export function sanitizeBashCommand(command) {
|
|
31
|
+
// Strip zero-width characters
|
|
32
|
+
const cleaned = command.replace(ZERO_WIDTH_REGEX, '');
|
|
33
|
+
// Check zsh equals expansion
|
|
34
|
+
if (ZSH_EQUALS_REGEX.test(cleaned)) {
|
|
35
|
+
return { safe: false, reason: 'Zsh equals expansion detected', sanitized: cleaned };
|
|
36
|
+
}
|
|
37
|
+
// Check blocked patterns
|
|
38
|
+
for (const { pattern, label } of BLOCKED_PATTERNS) {
|
|
39
|
+
if (pattern.test(cleaned)) {
|
|
40
|
+
return { safe: false, reason: `Blocked: ${label}`, sanitized: cleaned };
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
// Check blocked zsh builtins at start of each segment
|
|
44
|
+
const segments = cleaned.split(/[;|&]/);
|
|
45
|
+
for (const segment of segments) {
|
|
46
|
+
const firstWord = segment.trim().split(/\s/)[0];
|
|
47
|
+
if (BLOCKED_ZSH_BUILTINS.has(firstWord)) {
|
|
48
|
+
return { safe: false, reason: `Blocked shell builtin: ${firstWord}`, sanitized: cleaned };
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
return { safe: true, sanitized: cleaned };
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=bash-security.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bash-security.js","sourceRoot":"","sources":["../../../../src/tools/built-in/bash-security.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,4CAA4C;AAC5C,MAAM,gBAAgB,GAAyC;IAC7D,uBAAuB;IACvB,EAAE,OAAO,EAAE,yCAAyC,EAAE,KAAK,EAAE,UAAU,EAAE;IACzE,EAAE,OAAO,EAAE,4BAA4B,EAAE,KAAK,EAAE,aAAa,EAAE;IAC/D,EAAE,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,mBAAmB,EAAE;IACnD,EAAE,OAAO,EAAE,qBAAqB,EAAE,KAAK,EAAE,cAAc,EAAE;IAEzD,oBAAoB;IACpB,EAAE,OAAO,EAAE,qBAAqB,EAAE,KAAK,EAAE,4BAA4B,EAAE;IACvE,EAAE,OAAO,EAAE,wBAAwB,EAAE,KAAK,EAAE,oBAAoB,EAAE;IAElE,qCAAqC;IACrC,EAAE,OAAO,EAAE,uCAAuC,EAAE,KAAK,EAAE,yBAAyB,EAAE;CACvF,CAAA;AAED,kDAAkD;AAClD,MAAM,oBAAoB,GAAG,IAAI,GAAG,CAAC;IACnC,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU;IACvD,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU;IAChD,WAAW,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS;CACvD,CAAC,CAAA;AAEF,6DAA6D;AAC7D,MAAM,gBAAgB,GAAG,mCAAmC,CAAA;AAE5D,8CAA8C;AAC9C,MAAM,gBAAgB,GAAG,mBAAmB,CAAA;AAQ5C,MAAM,UAAU,mBAAmB,CAAC,OAAe;IACjD,8BAA8B;IAC9B,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,gBAAgB,EAAE,EAAE,CAAC,CAAA;IAErD,6BAA6B;IAC7B,IAAI,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QACnC,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,+BAA+B,EAAE,SAAS,EAAE,OAAO,EAAE,CAAA;IACrF,CAAC;IAED,yBAAyB;IACzB,KAAK,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,gBAAgB,EAAE,CAAC;QAClD,IAAI,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YAC1B,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,KAAK,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,CAAA;QACzE,CAAC;IACH,CAAC;IAED,sDAAsD;IACtD,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;IACvC,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAA;QAC/C,IAAI,oBAAoB,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;YACxC,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,0BAA0B,SAAS,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,CAAA;QAC3F,CAAC;IACH,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,CAAA;AAC3C,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bash.d.ts","sourceRoot":"","sources":["../../../../src/tools/built-in/bash.ts"],"names":[],"mappings":"AAAA;;GAEG;
|
|
1
|
+
{"version":3,"file":"bash.d.ts","sourceRoot":"","sources":["../../../../src/tools/built-in/bash.ts"],"names":[],"mappings":"AAAA;;GAEG;AASH,eAAO,MAAM,QAAQ;;;;EAmCnB,CAAA"}
|
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
import { spawn } from 'child_process';
|
|
5
5
|
import { z } from 'zod';
|
|
6
6
|
import { defineTool } from '../registry.js';
|
|
7
|
+
import { sanitizeBashCommand } from './bash-security.js';
|
|
7
8
|
const DEFAULT_TIMEOUT_MS = 30_000;
|
|
8
9
|
export const bashTool = defineTool({
|
|
9
10
|
name: 'bash',
|
|
@@ -16,9 +17,14 @@ export const bashTool = defineTool({
|
|
|
16
17
|
cwd: z.string().optional().describe('Working directory for the command.'),
|
|
17
18
|
}),
|
|
18
19
|
execute: async (input, context) => {
|
|
20
|
+
// Security check
|
|
21
|
+
const check = sanitizeBashCommand(input.command);
|
|
22
|
+
if (!check.safe) {
|
|
23
|
+
return { data: `Command blocked: ${check.reason}`, isError: true };
|
|
24
|
+
}
|
|
19
25
|
const timeoutMs = input.timeout ?? DEFAULT_TIMEOUT_MS;
|
|
20
26
|
const cwd = input.cwd ?? context.cwd ?? process.cwd();
|
|
21
|
-
const { stdout, stderr, exitCode } = await runCommand(
|
|
27
|
+
const { stdout, stderr, exitCode } = await runCommand(check.sanitized, cwd, timeoutMs, context.abortSignal);
|
|
22
28
|
const parts = [];
|
|
23
29
|
if (stdout)
|
|
24
30
|
parts.push(stdout);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bash.js","sourceRoot":"","sources":["../../../../src/tools/built-in/bash.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAA;AACrC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAA;
|
|
1
|
+
{"version":3,"file":"bash.js","sourceRoot":"","sources":["../../../../src/tools/built-in/bash.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAA;AACrC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAC3C,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAA;AAExD,MAAM,kBAAkB,GAAG,MAAM,CAAA;AAEjC,MAAM,CAAC,MAAM,QAAQ,GAAG,UAAU,CAAC;IACjC,IAAI,EAAE,MAAM;IACZ,WAAW,EACT,mDAAmD;QACnD,sEAAsE;QACtE,wDAAwD;IAE1D,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;QACpB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,8BAA8B,CAAC;QAC5D,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,8BAA8B,kBAAkB,GAAG,CAAC;QAC5F,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,oCAAoC,CAAC;KAC1E,CAAC;IAEF,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;QAChC,iBAAiB;QACjB,MAAM,KAAK,GAAG,mBAAmB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;QAChD,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;YAChB,OAAO,EAAE,IAAI,EAAE,oBAAoB,KAAK,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAA;QACpE,CAAC;QAED,MAAM,SAAS,GAAG,KAAK,CAAC,OAAO,IAAI,kBAAkB,CAAA;QACrD,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAA;QAErD,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,UAAU,CAAC,KAAK,CAAC,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,OAAO,CAAC,WAAW,CAAC,CAAA;QAE3G,MAAM,KAAK,GAAa,EAAE,CAAA;QAC1B,IAAI,MAAM;YAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;QAC9B,IAAI,MAAM;YAAE,KAAK,CAAC,IAAI,CAAC,aAAa,MAAM,EAAE,CAAC,CAAA;QAC7C,IAAI,QAAQ,KAAK,CAAC;YAAE,KAAK,CAAC,IAAI,CAAC,eAAe,QAAQ,GAAG,CAAC,CAAA;QAE1D,OAAO;YACL,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,aAAa;YACvC,OAAO,EAAE,QAAQ,KAAK,CAAC;SACxB,CAAA;IACH,CAAC;CACF,CAAC,CAAA;AAIF,SAAS,UAAU,CACjB,OAAe,EACf,GAAW,EACX,SAAiB,EACjB,MAAoB;IAEpB,OAAO,IAAI,OAAO,CAAY,CAAC,OAAO,EAAE,EAAE;QACxC,MAAM,YAAY,GAAa,EAAE,CAAA;QACjC,MAAM,YAAY,GAAa,EAAE,CAAA;QAEjC,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE;YAC3C,GAAG;YACH,GAAG,EAAE,OAAO,CAAC,GAAG;YAChB,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;SAClC,CAAC,CAAA;QAEF,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAA;QACpE,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAA;QAEpE,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;YAC5B,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;QACvB,CAAC,EAAE,SAAS,CAAC,CAAA;QAEb,MAAM,OAAO,GAAG,GAAG,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;QAC3C,MAAM,EAAE,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAA;QAE1D,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;YACzB,YAAY,CAAC,KAAK,CAAC,CAAA;YACnB,MAAM,EAAE,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;YAC7C,OAAO,CAAC;gBACN,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC;gBACrD,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC;gBACrD,QAAQ,EAAE,IAAI,IAAI,CAAC;aACpB,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;QAEF,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YACxB,YAAY,CAAC,KAAK,CAAC,CAAA;YACnB,MAAM,EAAE,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;YAC7C,OAAO,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,CAAC,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAA;QAC3D,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;AACJ,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "cmdr-agent",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "2.0.0",
|
|
4
4
|
"description": "Open-source multi-agent coding tool for your terminal. Powered by Ollama.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -46,6 +46,7 @@
|
|
|
46
46
|
"devDependencies": {
|
|
47
47
|
"@types/node": "^22.0.0",
|
|
48
48
|
"@types/react": "^18.3.28",
|
|
49
|
+
"tsx": "^4.21.0",
|
|
49
50
|
"typescript": "^5.6.0",
|
|
50
51
|
"vitest": "^2.1.0"
|
|
51
52
|
},
|