cmdr-agent 2.4.0 → 2.5.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/dist/package.json +1 -1
  2. package/dist/src/cli/progress.d.ts +58 -0
  3. package/dist/src/cli/progress.d.ts.map +1 -0
  4. package/dist/src/cli/progress.js +179 -0
  5. package/dist/src/cli/progress.js.map +1 -0
  6. package/dist/src/cli/spinner.d.ts +2 -0
  7. package/dist/src/cli/spinner.d.ts.map +1 -1
  8. package/dist/src/cli/spinner.js +18 -0
  9. package/dist/src/cli/spinner.js.map +1 -1
  10. package/dist/src/core/agent-runner.d.ts +12 -0
  11. package/dist/src/core/agent-runner.d.ts.map +1 -1
  12. package/dist/src/core/agent-runner.js +176 -5
  13. package/dist/src/core/agent-runner.js.map +1 -1
  14. package/dist/src/core/event-bus.d.ts +12 -0
  15. package/dist/src/core/event-bus.d.ts.map +1 -1
  16. package/dist/src/core/event-bus.js.map +1 -1
  17. package/dist/src/core/types.d.ts +17 -0
  18. package/dist/src/core/types.d.ts.map +1 -1
  19. package/dist/src/core/types.js +8 -1
  20. package/dist/src/core/types.js.map +1 -1
  21. package/dist/src/llm/anthropic.d.ts +1 -0
  22. package/dist/src/llm/anthropic.d.ts.map +1 -1
  23. package/dist/src/llm/anthropic.js +20 -1
  24. package/dist/src/llm/anthropic.js.map +1 -1
  25. package/dist/src/llm/ollama.d.ts +2 -12
  26. package/dist/src/llm/ollama.d.ts.map +1 -1
  27. package/dist/src/llm/ollama.js +46 -250
  28. package/dist/src/llm/ollama.js.map +1 -1
  29. package/dist/src/llm/openai.d.ts +1 -0
  30. package/dist/src/llm/openai.d.ts.map +1 -1
  31. package/dist/src/llm/openai.js +21 -7
  32. package/dist/src/llm/openai.js.map +1 -1
  33. package/dist/src/llm/repair/retry-policy.d.ts +48 -0
  34. package/dist/src/llm/repair/retry-policy.d.ts.map +1 -0
  35. package/dist/src/llm/repair/retry-policy.js +85 -0
  36. package/dist/src/llm/repair/retry-policy.js.map +1 -0
  37. package/dist/src/llm/repair/tool-repair.d.ts +39 -0
  38. package/dist/src/llm/repair/tool-repair.d.ts.map +1 -0
  39. package/dist/src/llm/repair/tool-repair.js +313 -0
  40. package/dist/src/llm/repair/tool-repair.js.map +1 -0
  41. package/dist/src/llm/shared/text-cleanup.d.ts +16 -0
  42. package/dist/src/llm/shared/text-cleanup.d.ts.map +1 -0
  43. package/dist/src/llm/shared/text-cleanup.js +120 -0
  44. package/dist/src/llm/shared/text-cleanup.js.map +1 -0
  45. package/dist/src/llm/shared/tool-parsing.d.ts +70 -0
  46. package/dist/src/llm/shared/tool-parsing.d.ts.map +1 -0
  47. package/dist/src/llm/shared/tool-parsing.js +355 -0
  48. package/dist/src/llm/shared/tool-parsing.js.map +1 -0
  49. package/dist/src/llm/validation/tool-call-schema.d.ts +83 -0
  50. package/dist/src/llm/validation/tool-call-schema.d.ts.map +1 -0
  51. package/dist/src/llm/validation/tool-call-schema.js +145 -0
  52. package/dist/src/llm/validation/tool-call-schema.js.map +1 -0
  53. package/dist/src/tools/built-in/bash.d.ts +5 -1
  54. package/dist/src/tools/built-in/bash.d.ts.map +1 -1
  55. package/dist/src/tools/built-in/bash.js +34 -46
  56. package/dist/src/tools/built-in/bash.js.map +1 -1
  57. package/dist/src/tools/executor.d.ts +7 -1
  58. package/dist/src/tools/executor.d.ts.map +1 -1
  59. package/dist/src/tools/executor.js +20 -5
  60. package/dist/src/tools/executor.js.map +1 -1
  61. package/dist/src/tools/shell/shell-executor.d.ts +71 -0
  62. package/dist/src/tools/shell/shell-executor.d.ts.map +1 -0
  63. package/dist/src/tools/shell/shell-executor.js +238 -0
  64. package/dist/src/tools/shell/shell-executor.js.map +1 -0
  65. package/package.json +1 -1
@@ -0,0 +1,145 @@
1
+ /**
2
+ * Tool call validation layer using Zod schemas.
3
+ *
4
+ * Mirrors Claude Code's approach: every tool call is validated through its
5
+ * registered Zod schema before execution. Malformed calls are rejected
6
+ * early with clear error messages to the model, enabling retry with
7
+ * corrected format.
8
+ */
9
+ import { z } from 'zod';
10
+ // ---------------------------------------------------------------------------
11
+ // Canonical tool call schema — validates the SHAPE of any tool call
12
+ // ---------------------------------------------------------------------------
13
+ /**
14
+ * Schema for a single parsed tool call object.
15
+ * All parsed tool calls (from native API, JSON text, XML text) must conform to this.
16
+ */
17
+ export const ToolCallSchema = z.object({
18
+ name: z.string().min(1, 'Tool name must be a non-empty string'),
19
+ arguments: z.record(z.unknown()).default({}),
20
+ });
21
+ /**
22
+ * Validate a raw parsed tool call against the canonical schema.
23
+ * Returns a normalized tool call or validation errors.
24
+ */
25
+ export function validateToolCallShape(raw) {
26
+ const result = ToolCallSchema.safeParse(raw);
27
+ if (result.success) {
28
+ return { ok: true, toolCall: result.data };
29
+ }
30
+ return {
31
+ ok: false,
32
+ errors: result.error.errors.map(e => `${e.path.join('.')}: ${e.message}`),
33
+ };
34
+ }
35
+ // ---------------------------------------------------------------------------
36
+ // Tool-specific input validation
37
+ // ---------------------------------------------------------------------------
38
+ /**
39
+ * Validate a tool call's arguments against the tool's registered Zod input schema.
40
+ * Returns { ok: true, parsed } or { ok: false, message } with a corrective hint.
41
+ */
42
+ export function validateToolInput(toolName, args, inputSchema) {
43
+ const result = inputSchema.safeParse(args);
44
+ if (result.success) {
45
+ return { ok: true, parsed: result.data };
46
+ }
47
+ return {
48
+ ok: false,
49
+ message: formatZodError(toolName, result.error),
50
+ };
51
+ }
52
+ /**
53
+ * Format a ZodError into a clear corrective message for the model.
54
+ * The message tells the model exactly what was wrong and how to fix it.
55
+ */
56
+ function formatZodError(toolName, error) {
57
+ const issues = error.errors.map(e => {
58
+ const path = e.path.length > 0 ? `"${e.path.join('.')}"` : 'root';
59
+ return ` - ${path}: ${e.message}`;
60
+ }).join('\n');
61
+ return (`Tool "${toolName}" received invalid arguments:\n${issues}\n` +
62
+ `Please retry with corrected arguments matching the tool's input schema.`);
63
+ }
64
+ /**
65
+ * Validate a batch of tool use blocks against registered tool definitions.
66
+ * Separates valid tool calls from rejected ones with clear error messages.
67
+ *
68
+ * Mirrors Claude Code's flow: Zod input validation → tool-specific validateInput → execute
69
+ */
70
+ export function validateToolCallBatch(toolUseBlocks, toolLookup, availableToolNames) {
71
+ const valid = [];
72
+ const rejected = [];
73
+ for (const block of toolUseBlocks) {
74
+ // Check tool exists
75
+ if (!availableToolNames.has(block.name)) {
76
+ rejected.push({
77
+ id: block.id,
78
+ name: block.name,
79
+ error: `Unknown tool "${block.name}". Available tools: ${[...availableToolNames].join(', ')}`,
80
+ });
81
+ continue;
82
+ }
83
+ const toolDef = toolLookup.get(block.name);
84
+ if (!toolDef) {
85
+ rejected.push({
86
+ id: block.id,
87
+ name: block.name,
88
+ error: `Tool "${block.name}" has no registered schema.`,
89
+ });
90
+ continue;
91
+ }
92
+ // Validate input against schema
93
+ const validation = validateToolInput(block.name, block.input, toolDef.inputSchema);
94
+ if (!validation.ok) {
95
+ rejected.push({
96
+ id: block.id,
97
+ name: block.name,
98
+ error: validation.message,
99
+ });
100
+ continue;
101
+ }
102
+ valid.push({
103
+ id: block.id,
104
+ name: block.name,
105
+ input: validation.parsed,
106
+ rawInput: block.input,
107
+ });
108
+ }
109
+ return { valid, rejected };
110
+ }
111
+ // ---------------------------------------------------------------------------
112
+ // Leakage detection — detect when models leak tool format into text
113
+ // ---------------------------------------------------------------------------
114
+ /** Patterns that indicate a model is leaking tool call format into text output. */
115
+ const LEAKAGE_PATTERNS = [
116
+ // JSON tool_call format leaking
117
+ /```tool_call[\s\S]*?```/,
118
+ // XML function format leaking
119
+ /<function=\w+>[\s\S]*?<\/function>/,
120
+ // Invoke format leaking
121
+ /<invoke\s+name="[^"]+">[\s\S]*?<\/invoke>/,
122
+ // MiniMax wrapper leaking
123
+ /<minimax:tool_call>[\s\S]*?<\/minimax:tool_call>/,
124
+ // OpenAI function_call format leaking into text
125
+ /"function_call"\s*:\s*\{/,
126
+ ];
127
+ /**
128
+ * Detect if text contains leaked tool call formatting.
129
+ * When a model outputs tool call syntax in its text response instead of
130
+ * through the proper tool calling mechanism, we detect it here so the
131
+ * parser can try to extract valid tool calls from it.
132
+ */
133
+ export function detectToolCallLeakage(text) {
134
+ return LEAKAGE_PATTERNS.some(p => p.test(text));
135
+ }
136
+ /**
137
+ * Build a corrective system message to send back to the model
138
+ * when tool call leakage is detected.
139
+ */
140
+ export function buildLeakageCorrectionPrompt() {
141
+ return ('Your previous response contained tool call formatting in the text output. ' +
142
+ 'Please use the proper tool calling mechanism instead of embedding tool calls in text. ' +
143
+ 'Use the tool_call format or the native tool use API to call tools.');
144
+ }
145
+ //# sourceMappingURL=tool-call-schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-call-schema.js","sourceRoot":"","sources":["../../../../src/llm/validation/tool-call-schema.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,9 @@
1
1
  /**
2
- * Built-in bash tool — execute shell commands.
2
+ * Built-in bash/shell tool — execute shell commands cross-platform.
3
+ *
4
+ * Uses the ShellExecutor for platform-aware execution.
5
+ * On Unix: uses bash/zsh/sh (auto-detected).
6
+ * On Windows: uses PowerShell or cmd.exe (auto-detected).
3
7
  */
4
8
  export declare const bashTool: import("../registry.js").ToolDefinition<{
5
9
  command: string;
@@ -1 +1 @@
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"}
1
+ {"version":3,"file":"bash.d.ts","sourceRoot":"","sources":["../../../../src/tools/built-in/bash.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAUH,eAAO,MAAM,QAAQ;;;;EAkDnB,CAAA"}
@@ -1,18 +1,23 @@
1
1
  /**
2
- * Built-in bash tool — execute shell commands.
2
+ * Built-in bash/shell tool — execute shell commands cross-platform.
3
+ *
4
+ * Uses the ShellExecutor for platform-aware execution.
5
+ * On Unix: uses bash/zsh/sh (auto-detected).
6
+ * On Windows: uses PowerShell or cmd.exe (auto-detected).
3
7
  */
4
- import { spawn } from 'child_process';
5
8
  import { z } from 'zod';
6
9
  import { defineTool } from '../registry.js';
7
10
  import { sanitizeBashCommand } from './bash-security.js';
11
+ import { execute, detectPlatform } from '../shell/shell-executor.js';
8
12
  const DEFAULT_TIMEOUT_MS = 30_000;
13
+ const MAX_RESULT_SIZE = 30_000; // 30KB — matches Claude Code's BashTool limit
9
14
  export const bashTool = defineTool({
10
15
  name: 'bash',
11
- description: 'Execute a bash command and return stdout/stderr. ' +
16
+ description: 'Execute a shell command and return stdout/stderr. ' +
12
17
  'Use for file operations, running scripts, installing packages, etc. ' +
13
- 'The command runs in a non-interactive shell (bash -c).',
18
+ `Runs in ${detectPlatform() === 'windows' ? 'PowerShell/cmd' : 'bash'} (auto-detected).`,
14
19
  inputSchema: z.object({
15
- command: z.string().describe('The bash command to execute.'),
20
+ command: z.string().describe('The shell command to execute.'),
16
21
  timeout: z.number().optional().describe(`Timeout in ms. Defaults to ${DEFAULT_TIMEOUT_MS}.`),
17
22
  cwd: z.string().optional().describe('Working directory for the command.'),
18
23
  }),
@@ -24,50 +29,33 @@ export const bashTool = defineTool({
24
29
  }
25
30
  const timeoutMs = input.timeout ?? DEFAULT_TIMEOUT_MS;
26
31
  const cwd = input.cwd ?? context.cwd ?? process.cwd();
27
- const { stdout, stderr, exitCode } = await runCommand(check.sanitized, cwd, timeoutMs, context.abortSignal);
32
+ const result = await execute({
33
+ command: check.sanitized,
34
+ cwd,
35
+ timeoutMs,
36
+ signal: context.abortSignal,
37
+ });
28
38
  const parts = [];
29
- if (stdout)
30
- parts.push(stdout);
31
- if (stderr)
32
- parts.push(`[stderr]\n${stderr}`);
33
- if (exitCode !== 0)
34
- parts.push(`[exit code: ${exitCode}]`);
39
+ if (result.stdout)
40
+ parts.push(result.stdout);
41
+ if (result.stderr)
42
+ parts.push(`[stderr]\n${result.stderr}`);
43
+ if (result.timedOut)
44
+ parts.push(`[timed out after ${timeoutMs}ms]`);
45
+ if (result.interrupted)
46
+ parts.push('[interrupted by user]');
47
+ if (result.exitCode !== 0)
48
+ parts.push(`[exit code: ${result.exitCode}]`);
49
+ let output = parts.join('\n') || '(no output)';
50
+ // Truncate large outputs to prevent context overflow
51
+ if (output.length > MAX_RESULT_SIZE) {
52
+ const truncated = output.slice(0, MAX_RESULT_SIZE);
53
+ output = truncated + `\n[output truncated: ${output.length} chars total, showing first ${MAX_RESULT_SIZE}]`;
54
+ }
35
55
  return {
36
- data: parts.join('\n') || '(no output)',
37
- isError: exitCode !== 0,
56
+ data: output,
57
+ isError: result.exitCode !== 0,
38
58
  };
39
59
  },
40
60
  });
41
- function runCommand(command, cwd, timeoutMs, signal) {
42
- return new Promise((resolve) => {
43
- const stdoutChunks = [];
44
- const stderrChunks = [];
45
- const child = spawn('bash', ['-c', command], {
46
- cwd,
47
- env: process.env,
48
- stdio: ['ignore', 'pipe', 'pipe'],
49
- });
50
- child.stdout.on('data', (chunk) => stdoutChunks.push(chunk));
51
- child.stderr.on('data', (chunk) => stderrChunks.push(chunk));
52
- const timer = setTimeout(() => {
53
- child.kill('SIGKILL');
54
- }, timeoutMs);
55
- const onAbort = () => child.kill('SIGKILL');
56
- signal?.addEventListener('abort', onAbort, { once: true });
57
- child.on('close', (code) => {
58
- clearTimeout(timer);
59
- signal?.removeEventListener('abort', onAbort);
60
- resolve({
61
- stdout: Buffer.concat(stdoutChunks).toString('utf-8'),
62
- stderr: Buffer.concat(stderrChunks).toString('utf-8'),
63
- exitCode: code ?? 1,
64
- });
65
- });
66
- child.on('error', (err) => {
67
- clearTimeout(timer);
68
- signal?.removeEventListener('abort', onAbort);
69
- resolve({ stdout: '', stderr: err.message, exitCode: 1 });
70
- });
71
- });
72
- }
73
61
  //# sourceMappingURL=bash.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"bash.js","sourceRoot":"","sources":["../../../../src/tools/built-in/bash.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"bash.js","sourceRoot":"","sources":["../../../../src/tools/built-in/bash.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,11 @@
1
1
  /**
2
- * Tool executor with concurrency control and error isolation.
2
+ * Tool executor with concurrency control, Zod validation, and error isolation.
3
+ *
4
+ * Mirrors Claude Code's tool execution flow:
5
+ * 1. Tool lookup (with unknown tool rejection)
6
+ * 2. Zod schema validation (with corrective error messages)
7
+ * 3. Concurrency-limited execution
8
+ * 4. Error isolation (tool failures don't crash the agent loop)
3
9
  */
4
10
  import type { ToolResult, ToolUseContext } from '../core/types.js';
5
11
  import type { ToolRegistry } from './registry.js';
@@ -1 +1 @@
1
- {"version":3,"file":"executor.d.ts","sourceRoot":"","sources":["../../../src/tools/executor.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AAClE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAEjD,MAAM,WAAW,mBAAmB;IAClC,cAAc,CAAC,EAAE,MAAM,CAAA;CACxB;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAC/B;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAc;IACvC,OAAO,CAAC,MAAM,CAAI;IAClB,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAQ;IACvC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAwB;gBAEtC,QAAQ,EAAE,YAAY,EAAE,OAAO,GAAE,mBAAwB;IAK/D,OAAO,CACX,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,UAAU,CAAC;IAoBhB,YAAY,CAChB,KAAK,EAAE,aAAa,EAAE,EACtB,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IAUnC,OAAO,CAAC,OAAO;IAaf,OAAO,CAAC,OAAO;CAKhB"}
1
+ {"version":3,"file":"executor.d.ts","sourceRoot":"","sources":["../../../src/tools/executor.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AAClE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAGjD,MAAM,WAAW,mBAAmB;IAClC,cAAc,CAAC,EAAE,MAAM,CAAA;CACxB;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAC/B;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAc;IACvC,OAAO,CAAC,MAAM,CAAI;IAClB,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAQ;IACvC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAwB;gBAEtC,QAAQ,EAAE,YAAY,EAAE,OAAO,GAAE,mBAAwB;IAK/D,OAAO,CACX,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,UAAU,CAAC;IA6BhB,YAAY,CAChB,KAAK,EAAE,aAAa,EAAE,EACtB,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IAUnC,OAAO,CAAC,OAAO;IAaf,OAAO,CAAC,OAAO;CAKhB"}
@@ -1,6 +1,13 @@
1
1
  /**
2
- * Tool executor with concurrency control and error isolation.
2
+ * Tool executor with concurrency control, Zod validation, and error isolation.
3
+ *
4
+ * Mirrors Claude Code's tool execution flow:
5
+ * 1. Tool lookup (with unknown tool rejection)
6
+ * 2. Zod schema validation (with corrective error messages)
7
+ * 3. Concurrency-limited execution
8
+ * 4. Error isolation (tool failures don't crash the agent loop)
3
9
  */
10
+ import { validateToolInput } from '../llm/validation/tool-call-schema.js';
4
11
  export class ToolExecutor {
5
12
  registry;
6
13
  active = 0;
@@ -13,13 +20,21 @@ export class ToolExecutor {
13
20
  async execute(name, input, context) {
14
21
  const tool = this.registry.get(name);
15
22
  if (!tool) {
16
- return { data: `Unknown tool: "${name}"`, isError: true };
23
+ const availableTools = this.registry.list().map(t => t.name).join(', ');
24
+ return {
25
+ data: `Unknown tool: "${name}". Available tools: ${availableTools}`,
26
+ isError: true,
27
+ };
28
+ }
29
+ // Validate input through Zod schema with corrective error messages
30
+ const validation = validateToolInput(name, input, tool.inputSchema);
31
+ if (!validation.ok) {
32
+ return { data: validation.message, isError: true };
17
33
  }
18
34
  try {
19
- const parsed = tool.inputSchema.parse(input);
20
35
  await this.acquire();
21
36
  try {
22
- return await tool.execute(parsed, context);
37
+ return await tool.execute(validation.parsed, context);
23
38
  }
24
39
  finally {
25
40
  this.release();
@@ -27,7 +42,7 @@ export class ToolExecutor {
27
42
  }
28
43
  catch (err) {
29
44
  const message = err instanceof Error ? err.message : String(err);
30
- return { data: `Tool "${name}" error: ${message}`, isError: true };
45
+ return { data: `Tool "${name}" execution error: ${message}`, isError: true };
31
46
  }
32
47
  }
33
48
  async executeBatch(calls, context) {
@@ -1 +1 @@
1
- {"version":3,"file":"executor.js","sourceRoot":"","sources":["../../../src/tools/executor.ts"],"names":[],"mappings":"AAAA;;GAEG;AAeH,MAAM,OAAO,YAAY;IACN,QAAQ,CAAc;IAC/B,MAAM,GAAG,CAAC,CAAA;IACD,cAAc,CAAQ;IACtB,SAAS,GAAsB,EAAE,CAAA;IAElD,YAAY,QAAsB,EAAE,UAA+B,EAAE;QACnE,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAA;QACxB,IAAI,CAAC,cAAc,GAAG,OAAO,CAAC,cAAc,IAAI,CAAC,CAAA;IACnD,CAAC;IAED,KAAK,CAAC,OAAO,CACX,IAAY,EACZ,KAA8B,EAC9B,OAAuB;QAEvB,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;QACpC,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,EAAE,IAAI,EAAE,kBAAkB,IAAI,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,CAAA;QAC3D,CAAC;QAED,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;YAC5C,MAAM,IAAI,CAAC,OAAO,EAAE,CAAA;YACpB,IAAI,CAAC;gBACH,OAAO,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;YAC5C,CAAC;oBAAS,CAAC;gBACT,IAAI,CAAC,OAAO,EAAE,CAAA;YAChB,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;YAChE,OAAO,EAAE,IAAI,EAAE,SAAS,IAAI,YAAY,OAAO,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAA;QACpE,CAAC;IACH,CAAC;IAED,KAAK,CAAC,YAAY,CAChB,KAAsB,EACtB,OAAuB;QAEvB,MAAM,OAAO,GAAG,IAAI,GAAG,EAAsB,CAAA;QAC7C,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;YACxC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,CAAA;YACjE,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,MAAM,CAAC,CAAA;QAC9B,CAAC,CAAC,CAAA;QACF,MAAM,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;QAC3B,OAAO,OAAO,CAAA;IAChB,CAAC;IAEO,OAAO;QACb,IAAI,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;YACtC,IAAI,CAAC,MAAM,EAAE,CAAA;YACb,OAAO,OAAO,CAAC,OAAO,EAAE,CAAA;QAC1B,CAAC;QACD,OAAO,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;YACnC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,EAAE;gBACvB,IAAI,CAAC,MAAM,EAAE,CAAA;gBACb,OAAO,EAAE,CAAA;YACX,CAAC,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;IACJ,CAAC;IAEO,OAAO;QACb,IAAI,CAAC,MAAM,EAAE,CAAA;QACb,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAA;QACnC,IAAI,IAAI;YAAE,IAAI,EAAE,CAAA;IAClB,CAAC;CACF"}
1
+ {"version":3,"file":"executor.js","sourceRoot":"","sources":["../../../src/tools/executor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,71 @@
1
+ /**
2
+ * Cross-platform shell executor for cmdr.
3
+ *
4
+ * Mirrors Claude Code's approach: separate BashTool + PowerShellTool with
5
+ * a shared shell abstraction. Detects platform, resolves the correct shell,
6
+ * normalizes paths, and escapes arguments safely.
7
+ */
8
+ export type Platform = 'windows' | 'unix';
9
+ export type ShellType = 'bash' | 'zsh' | 'sh' | 'powershell' | 'cmd';
10
+ export interface ShellConfig {
11
+ readonly executable: string;
12
+ readonly args: string[];
13
+ readonly shellType: ShellType;
14
+ }
15
+ export interface ShellResult {
16
+ readonly stdout: string;
17
+ readonly stderr: string;
18
+ readonly exitCode: number;
19
+ readonly timedOut: boolean;
20
+ readonly interrupted: boolean;
21
+ }
22
+ export interface ShellExecOptions {
23
+ readonly command: string;
24
+ readonly cwd?: string;
25
+ readonly timeoutMs?: number;
26
+ readonly signal?: AbortSignal;
27
+ readonly env?: Record<string, string>;
28
+ /** Force a specific shell type. Auto-detected if omitted. */
29
+ readonly shell?: ShellType;
30
+ }
31
+ export declare function detectPlatform(): Platform;
32
+ /**
33
+ * Resolve the default shell for the current platform.
34
+ * On unix: prefers SHELL env, falls back to bash, then sh.
35
+ * On windows: prefers powershell, falls back to cmd.
36
+ */
37
+ export declare function getDefaultShell(): ShellConfig;
38
+ /**
39
+ * Get a specific shell config by type.
40
+ */
41
+ export declare function getShell(shellType: ShellType): ShellConfig;
42
+ /**
43
+ * Normalize a file path for the current platform.
44
+ * On Windows: converts forward slashes to backslashes.
45
+ * On Unix: converts backslashes to forward slashes.
46
+ */
47
+ export declare function normalizePath(p: string): string;
48
+ /**
49
+ * Escape a shell argument for the current platform.
50
+ * Prevents shell injection by properly quoting arguments.
51
+ */
52
+ export declare function escapeArg(arg: string, shellType?: ShellType): string;
53
+ /**
54
+ * Translate environment variable references between platforms.
55
+ * $VAR / ${VAR} (unix) <-> %VAR% (windows cmd) / $env:VAR (powershell)
56
+ */
57
+ export declare function translateEnvVars(command: string, targetShell: ShellType): string;
58
+ /**
59
+ * Execute a command in the appropriate shell.
60
+ * Mirrors Claude Code's BashTool execution model with:
61
+ * - Platform-aware shell selection
62
+ * - Timeout support
63
+ * - AbortSignal support
64
+ * - Output size limiting
65
+ */
66
+ export declare function execute(options: ShellExecOptions): Promise<ShellResult>;
67
+ /**
68
+ * Check if a command exists on the system.
69
+ */
70
+ export declare function commandExists(cmd: string): Promise<boolean>;
71
+ //# sourceMappingURL=shell-executor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shell-executor.d.ts","sourceRoot":"","sources":["../../../../src/tools/shell/shell-executor.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAWH,MAAM,MAAM,QAAQ,GAAG,SAAS,GAAG,MAAM,CAAA;AACzC,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,KAAK,GAAG,IAAI,GAAG,YAAY,GAAG,KAAK,CAAA;AAEpE,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,CAAA;IACvB,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAA;CAC9B;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAA;IAC1B,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAA;CAC9B;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAA;IAC3B,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAA;IAC7B,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACrC,6DAA6D;IAC7D,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,CAAA;CAC3B;AAQD,wBAAgB,cAAc,IAAI,QAAQ,CAIzC;AAgBD;;;;GAIG;AACH,wBAAgB,eAAe,IAAI,WAAW,CAsC7C;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,SAAS,EAAE,SAAS,GAAG,WAAW,CAE1D;AAMD;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAK/C;AAMD;;;GAGG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,SAAS,GAAG,MAAM,CAepE;AAMD;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,SAAS,GAAG,MAAM,CAiBhF;AASD;;;;;;;GAOG;AACH,wBAAgB,OAAO,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,WAAW,CAAC,CA4FvE;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAQjE"}