@gaunt-sloth/agent 2.0.0-alpha.2 → 2.0.0-alpha.21

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 (86) hide show
  1. package/README.md +10 -0
  2. package/dist/builtInToolsConfig.d.ts +17 -3
  3. package/dist/builtInToolsConfig.js +41 -14
  4. package/dist/builtInToolsConfig.js.map +1 -1
  5. package/dist/core/GthDeepAgent.d.ts +63 -13
  6. package/dist/core/GthDeepAgent.js +360 -130
  7. package/dist/core/GthDeepAgent.js.map +1 -1
  8. package/dist/core/debugCapture.d.ts +8 -49
  9. package/dist/core/debugCapture.js +1 -1
  10. package/dist/core/debugCapture.js.map +1 -1
  11. package/dist/core/deepAgentPermissions.d.ts +73 -13
  12. package/dist/core/deepAgentPermissions.js +191 -29
  13. package/dist/core/deepAgentPermissions.js.map +1 -1
  14. package/dist/core/gthAcpServer.js +11 -0
  15. package/dist/core/gthAcpServer.js.map +1 -1
  16. package/dist/core/gthDeepAgentFactory.d.ts +3 -0
  17. package/dist/core/gthDeepAgentFactory.js +9 -1
  18. package/dist/core/gthDeepAgentFactory.js.map +1 -1
  19. package/dist/core/resolveAgentFactory.d.ts +14 -0
  20. package/dist/core/resolveAgentFactory.js +18 -0
  21. package/dist/core/resolveAgentFactory.js.map +1 -0
  22. package/dist/index.d.ts +1 -0
  23. package/dist/index.js +1 -0
  24. package/dist/index.js.map +1 -1
  25. package/dist/mcp/OAuthClientProviderImpl.js +2 -2
  26. package/dist/mcp/OAuthClientProviderImpl.js.map +1 -1
  27. package/dist/mcp/tlsTrust.d.ts +61 -0
  28. package/dist/mcp/tlsTrust.js +109 -0
  29. package/dist/mcp/tlsTrust.js.map +1 -0
  30. package/dist/middleware/registry.d.ts +1 -1
  31. package/dist/middleware/registry.js +1 -1
  32. package/dist/middleware/types.d.ts +1 -1
  33. package/dist/middleware/types.js +1 -1
  34. package/dist/modules/a2a/A2AClientWrapper.d.ts +46 -0
  35. package/dist/modules/a2a/A2AClientWrapper.js +71 -0
  36. package/dist/modules/a2a/A2AClientWrapper.js.map +1 -1
  37. package/dist/modules/acpModule.d.ts +5 -2
  38. package/dist/modules/acpModule.js +13 -2
  39. package/dist/modules/acpModule.js.map +1 -1
  40. package/dist/modules/apiAgUiModule.js +48 -16
  41. package/dist/modules/apiAgUiModule.js.map +1 -1
  42. package/dist/modules/interactiveSessionModule.js +140 -7
  43. package/dist/modules/interactiveSessionModule.js.map +1 -1
  44. package/dist/resolvers.js +104 -9
  45. package/dist/resolvers.js.map +1 -1
  46. package/dist/tools/GthCustomToolkit.js +24 -9
  47. package/dist/tools/GthCustomToolkit.js.map +1 -1
  48. package/dist/tools/GthDevToolkit.d.ts +45 -1
  49. package/dist/tools/GthDevToolkit.js +229 -31
  50. package/dist/tools/GthDevToolkit.js.map +1 -1
  51. package/dist/tools/GthFileSystemToolkit.d.ts +47 -0
  52. package/dist/tools/GthFileSystemToolkit.js +305 -18
  53. package/dist/tools/GthFileSystemToolkit.js.map +1 -1
  54. package/dist/tools/gthChecklistTool.d.ts +30 -0
  55. package/dist/tools/gthChecklistTool.js +81 -0
  56. package/dist/tools/gthChecklistTool.js.map +1 -0
  57. package/dist/tools/gthGrepTool.d.ts +54 -0
  58. package/dist/tools/gthGrepTool.js +482 -0
  59. package/dist/tools/gthGrepTool.js.map +1 -0
  60. package/dist/tools/shell/allowlist.d.ts +11 -0
  61. package/dist/tools/shell/allowlist.js +12 -0
  62. package/dist/tools/shell/allowlist.js.map +1 -0
  63. package/dist/tools/shell/arity.d.ts +11 -0
  64. package/dist/tools/shell/arity.js +12 -0
  65. package/dist/tools/shell/arity.js.map +1 -0
  66. package/dist/tools/shell/env.d.ts +22 -0
  67. package/dist/tools/shell/env.js +110 -0
  68. package/dist/tools/shell/env.js.map +1 -0
  69. package/dist/tools/shell/hardline.d.ts +15 -0
  70. package/dist/tools/shell/hardline.js +88 -0
  71. package/dist/tools/shell/hardline.js.map +1 -0
  72. package/dist/tools/shell/normalize.d.ts +10 -0
  73. package/dist/tools/shell/normalize.js +11 -0
  74. package/dist/tools/shell/normalize.js.map +1 -0
  75. package/dist/tools/shell/outputBuffer.d.ts +53 -0
  76. package/dist/tools/shell/outputBuffer.js +157 -0
  77. package/dist/tools/shell/outputBuffer.js.map +1 -0
  78. package/dist/tools/shell/workDir.d.ts +11 -0
  79. package/dist/tools/shell/workDir.js +45 -0
  80. package/dist/tools/shell/workDir.js.map +1 -0
  81. package/dist/utils/mcpAuthError.d.ts +36 -0
  82. package/dist/utils/mcpAuthError.js +89 -0
  83. package/dist/utils/mcpAuthError.js.map +1 -0
  84. package/dist/utils/mcpUtils.js +16 -0
  85. package/dist/utils/mcpUtils.js.map +1 -1
  86. package/package.json +14 -13
@@ -7,9 +7,12 @@ import { BaseToolkit, tool } from '@langchain/core/tools';
7
7
  import { z } from 'zod';
8
8
  import { spawn } from 'child_process';
9
9
  import path from 'node:path';
10
- import { displayInfo, displayError, displayWarning } from '@gaunt-sloth/core/utils/consoleUtils.js';
10
+ import { displayError, displayWarning } from '@gaunt-sloth/core/utils/consoleUtils.js';
11
+ import { emitToolOutput } from '@gaunt-sloth/core/core/toolOutputChannel.js';
11
12
  import { createInterface, stdin, stdout } from '@gaunt-sloth/core/utils/systemUtils.js';
12
- // Helper function to create a tool with execute type
13
+ // Helper function to create a tool with execute type. The fn's second parameter is LangChain's
14
+ // ToolRunnableConfig — when the framework invokes the tool with a ToolCall, `config.toolCall.id`
15
+ // identifies the call, which TUI-C17 threads into the live-output channel for attribution.
13
16
  function createCustomTool(fn, config) {
14
17
  const toolInstance = tool(fn, config);
15
18
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
@@ -140,8 +143,17 @@ export default class GthCustomToolkit extends BaseToolkit {
140
143
  }
141
144
  }
142
145
  }
143
- async executeCommand(command, toolName, timeoutSeconds) {
144
- displayInfo(`\n🔧 Executing ${toolName}: ${command}`);
146
+ async executeCommand(command, toolName, timeoutSeconds, toolCallId) {
147
+ // TUI-C17: the "Executing" notice + live child output go through the tool-output channel.
148
+ // With no subscriber (every non-TUI surface) the channel's default sink reproduces the
149
+ // historical behaviour exactly (displayInfo notice, raw stdout chunks); under the Ink TUI
150
+ // the session subscribes and folds them into the managed frame instead.
151
+ emitToolOutput({
152
+ toolCallId,
153
+ toolName,
154
+ kind: 'notice',
155
+ text: `🔧 Executing ${toolName}: ${command}`,
156
+ });
145
157
  return new Promise((resolve, reject) => {
146
158
  const child = spawn(command, {
147
159
  shell: true,
@@ -159,14 +171,14 @@ export default class GthCustomToolkit extends BaseToolkit {
159
171
  if (child.stdout) {
160
172
  child.stdout.on('data', (data) => {
161
173
  const chunk = data.toString();
162
- stdout.write(chunk);
174
+ emitToolOutput({ toolCallId, toolName, kind: 'output', text: chunk });
163
175
  output += chunk;
164
176
  });
165
177
  }
166
178
  if (child.stderr) {
167
179
  child.stderr.on('data', (data) => {
168
180
  const chunk = data.toString();
169
- stdout.write(chunk);
181
+ emitToolOutput({ toolCallId, toolName, kind: 'output', text: chunk });
170
182
  output += chunk;
171
183
  });
172
184
  }
@@ -253,12 +265,15 @@ export default class GthCustomToolkit extends BaseToolkit {
253
265
  createCustomCommandTool(name, config) {
254
266
  const schema = this.createCustomCommandSchema(config);
255
267
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
256
- const toolFn = async (args) => {
268
+ const toolFn = async (args, runnableConfig) => {
257
269
  // All parameters are strings, safe to cast
258
270
  const stringArgs = args;
271
+ // TUI-C17: the invoking framework's tool call id, threaded into the live-output channel
272
+ // so streamed chunks are attributed to this exact call.
273
+ const toolCallId = runnableConfig?.toolCall?.id;
259
274
  try {
260
275
  const command = this.buildCustomCommand(config.command, stringArgs, config.parameters);
261
- return await this.executeCommand(command, name, config.timeout);
276
+ return await this.executeCommand(command, name, config.timeout, toolCallId);
262
277
  }
263
278
  catch (validationError) {
264
279
  // If validation fails, prompt the user for confirmation
@@ -266,7 +281,7 @@ export default class GthCustomToolkit extends BaseToolkit {
266
281
  const displayCommand = this.buildCommandForDisplay(config.command, stringArgs, config.parameters);
267
282
  const userConfirmed = await this.promptUserForValidationOverride(displayCommand, name, errorMessage);
268
283
  if (userConfirmed) {
269
- return await this.executeCommand(displayCommand, name);
284
+ return await this.executeCommand(displayCommand, name, undefined, toolCallId);
270
285
  }
271
286
  throw new Error(`Execution of '${name}' was rejected by user. Validation error: ${errorMessage}`);
272
287
  }
@@ -1 +1 @@
1
- {"version":3,"file":"GthCustomToolkit.js","sourceRoot":"","sources":["../../src/tools/GthCustomToolkit.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"GthCustomToolkit.js","sourceRoot":"","sources":["../../src/tools/GthCustomToolkit.ts"],"names":[],"mappings":"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"}
@@ -3,10 +3,38 @@
3
3
  */
4
4
  import { BaseToolkit, StructuredToolInterface } from '@langchain/core/tools';
5
5
  import { GthDevToolsConfig } from '@gaunt-sloth/core/config.js';
6
+ import type { GthCommand } from '@gaunt-sloth/core/core/types.js';
7
+ export { ShellCommandFailedError } from '@gaunt-sloth/core/core/shell/ShellCommandFailedError.js';
8
+ /**
9
+ * Kill the child AND its descendants on timeout.
10
+ *
11
+ * POSIX: the child is spawned `detached`, so it leads its own process group;
12
+ * signalling the NEGATIVE pid (`-pid`) delivers to the whole group — otherwise a
13
+ * shell's children (e.g. a spawned server) would be orphaned and keep running.
14
+ *
15
+ * Windows (EXT-15): there are no POSIX process groups — `process.kill(-pid)`
16
+ * throws `EINVAL`, and `child.kill()` only terminates the `cmd.exe` wrapper while
17
+ * grandchildren keep the piped stdio handles open, so `'close'` never fires and
18
+ * the tool Promise hangs forever (silently cancelling Windows CI). Use `taskkill
19
+ * /T` to kill the whole tree by pid; `/F` (force) mirrors POSIX SIGKILL, while a
20
+ * graceful taskkill mirrors SIGTERM. Swallows the races where it has already exited.
21
+ *
22
+ * Exported for unit testing the platform branch without a Windows host.
23
+ */
24
+ export declare function killProcessGroup(child: {
25
+ pid?: number;
26
+ kill: (signal?: NodeJS.Signals) => boolean;
27
+ }, signal: NodeJS.Signals): void;
6
28
  export default class GthDevToolkit extends BaseToolkit {
7
29
  tools: StructuredToolInterface[];
8
30
  private commands;
9
- constructor(commands?: GthDevToolsConfig);
31
+ /**
32
+ * The active command, threaded through so the EXT-12 absent-config default for the shell
33
+ * tool (ON in `code`, OFF elsewhere) is resolved consistently with the deep agent's
34
+ * interrupt wiring. Omitted → historical OFF-by-default behaviour.
35
+ */
36
+ private readonly command;
37
+ constructor(commands?: GthDevToolsConfig, command?: GthCommand | undefined);
10
38
  /**
11
39
  * Get tools filtered by operation type
12
40
  */
@@ -19,6 +47,22 @@ export default class GthDevToolkit extends BaseToolkit {
19
47
  * Build the command for running a single test file
20
48
  */
21
49
  private buildSingleTestCommand;
50
+ /**
51
+ * Execute a shell command with the EXT-9 Tier-1 hardening applied:
52
+ * 1. stdin closed + timeout + process-group kill (no hang on interactive
53
+ * commands; runaway commands are killed group-wide on timeout),
54
+ * 2. output capped with a head/tail window + temp-file spillover,
55
+ * 3. provider/LLM credentials scrubbed from the child env,
56
+ * 4. an unbypassable hardline blocklist (refuses catastrophic commands BEFORE
57
+ * spawn — fires even when confirmation is bypassed by yolo).
58
+ *
59
+ * Resolves with a model-facing string on a CLEAN exit (`code === 0`). EXT-20: a non-zero exit
60
+ * and a timeout-kill instead REJECT with a {@link ShellCommandFailedError} that carries the FULL
61
+ * model-facing body — the deep-agent {@link GthDeepShellExitSoftening} middleware converts that
62
+ * throw into an error `ToolMessage` (status:'error' → ✗) while preserving the output, so the
63
+ * model still sees the killed-after-N / exit-code message and can continue. Spawn-level failures
64
+ * (`child.on('error')`) still reject with a plain `Error`.
65
+ */
22
66
  private executeCommand;
23
67
  private createTools;
24
68
  }
@@ -3,11 +3,88 @@
3
3
  */
4
4
  import { BaseToolkit, tool } from '@langchain/core/tools';
5
5
  import { z } from 'zod';
6
- import { spawn } from 'child_process';
6
+ import { spawn, spawnSync } from 'child_process';
7
7
  import path from 'node:path';
8
- import { displayInfo, displayError } from '@gaunt-sloth/core/utils/consoleUtils.js';
9
- import { stdout } from '@gaunt-sloth/core/utils/systemUtils.js';
10
- // Helper function to create a tool with dev type
8
+ import { displayError, displayWarning } from '@gaunt-sloth/core/utils/consoleUtils.js';
9
+ import { getShellMaxOutputBytes, getShellTimeoutMs, isShellToolEnabled, } from '@gaunt-sloth/core/config.js';
10
+ import { emitToolOutput } from '@gaunt-sloth/core/core/toolOutputChannel.js';
11
+ import { ShellCommandFailedError } from '@gaunt-sloth/core/core/shell/ShellCommandFailedError.js';
12
+ import { checkHardline } from '#src/tools/shell/hardline.js';
13
+ import { buildScrubbedEnv } from '#src/tools/shell/env.js';
14
+ import { OutputBuffer } from '#src/tools/shell/outputBuffer.js';
15
+ import { getShellWorkDir } from '#src/tools/shell/workDir.js';
16
+ // EXT-21: `ShellCommandFailedError` moved to core so BOTH agents can recognise a shell failure
17
+ // without breaking the agent→core dependency direction (the lean `GthLangChainAgent` lives in core
18
+ // and cannot import from agent). Re-exported here so the historical import site
19
+ // (`#src/tools/GthDevToolkit.js`) — GthDeepAgent + the existing GthDevToolkit specs — keeps working
20
+ // and every throw below is one and the same core type both agents' softeners catch.
21
+ export { ShellCommandFailedError } from '@gaunt-sloth/core/core/shell/ShellCommandFailedError.js';
22
+ // Grace period (ms) between SIGTERM and the escalation to SIGKILL when a command
23
+ // exceeds its timeout. Mirrors opencode's `forceKillAfter` (3s).
24
+ const KILL_GRACE_MS = 3_000;
25
+ /**
26
+ * Kill the child AND its descendants on timeout.
27
+ *
28
+ * POSIX: the child is spawned `detached`, so it leads its own process group;
29
+ * signalling the NEGATIVE pid (`-pid`) delivers to the whole group — otherwise a
30
+ * shell's children (e.g. a spawned server) would be orphaned and keep running.
31
+ *
32
+ * Windows (EXT-15): there are no POSIX process groups — `process.kill(-pid)`
33
+ * throws `EINVAL`, and `child.kill()` only terminates the `cmd.exe` wrapper while
34
+ * grandchildren keep the piped stdio handles open, so `'close'` never fires and
35
+ * the tool Promise hangs forever (silently cancelling Windows CI). Use `taskkill
36
+ * /T` to kill the whole tree by pid; `/F` (force) mirrors POSIX SIGKILL, while a
37
+ * graceful taskkill mirrors SIGTERM. Swallows the races where it has already exited.
38
+ *
39
+ * Exported for unit testing the platform branch without a Windows host.
40
+ */
41
+ export function killProcessGroup(child, signal) {
42
+ if (typeof child.pid !== 'number')
43
+ return;
44
+ if (process.platform === 'win32') {
45
+ // No process groups on Windows; taskkill /T walks the whole tree by pid.
46
+ const args = ['/PID', String(child.pid), '/T'];
47
+ if (signal === 'SIGKILL')
48
+ args.push('/F');
49
+ // IMPORTANT: spawnSync does NOT throw when it fails to spawn (e.g. ENOENT if taskkill is
50
+ // missing from PATH) — unlike execSync, it returns an object with an `error` property. So a
51
+ // try/catch would never reach the fallback. Inspect `res.error` explicitly and fall back to
52
+ // the direct child kill (best effort). A non-zero exit (process already gone) is NOT a spawn
53
+ // failure, so it correctly does not trigger the fallback. (`res?.` tolerates test mocks.)
54
+ const res = spawnSync('taskkill', args, { stdio: 'ignore', windowsHide: true });
55
+ if (res?.error) {
56
+ try {
57
+ child.kill(signal);
58
+ }
59
+ catch {
60
+ // Already exited — nothing to do.
61
+ }
62
+ }
63
+ return;
64
+ }
65
+ try {
66
+ // Negative pid → signal the entire process group.
67
+ process.kill(-child.pid, signal);
68
+ return;
69
+ }
70
+ catch (e) {
71
+ const code = e?.code;
72
+ // ESRCH: already gone. EPERM: group-kill not permitted — fall through to the
73
+ // direct child kill below. Anything else: also fall back rather than throw.
74
+ if (code === 'ESRCH')
75
+ return;
76
+ }
77
+ // Fallback: kill just the child (best effort).
78
+ try {
79
+ child.kill(signal);
80
+ }
81
+ catch {
82
+ // Already exited — nothing to do.
83
+ }
84
+ }
85
+ // Helper function to create a tool with dev type. The fn's second parameter is LangChain's
86
+ // ToolRunnableConfig — when the framework invokes the tool with a ToolCall, `config.toolCall.id`
87
+ // identifies the call, which TUI-C17 threads into the live-output channel for attribution.
11
88
  function createGthTool(fn, config, gthDevType) {
12
89
  const toolInstance = tool(fn, config);
13
90
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
@@ -21,13 +98,23 @@ const RunBuildArgsSchema = z.object({});
21
98
  const RunSingleTestArgsSchema = z.object({
22
99
  testPath: z.string().describe('Relative path to the test file to run'),
23
100
  });
101
+ const RunShellCommandArgsSchema = z.object({
102
+ command: z.string().describe('The shell command to run'),
103
+ });
24
104
  const TEST_PATH_PLACEHOLDER = '${testPath}';
25
105
  export default class GthDevToolkit extends BaseToolkit {
26
106
  tools;
27
107
  commands;
28
- constructor(commands = {}) {
108
+ /**
109
+ * The active command, threaded through so the EXT-12 absent-config default for the shell
110
+ * tool (ON in `code`, OFF elsewhere) is resolved consistently with the deep agent's
111
+ * interrupt wiring. Omitted → historical OFF-by-default behaviour.
112
+ */
113
+ command;
114
+ constructor(commands = {}, command) {
29
115
  super();
30
116
  this.commands = commands;
117
+ this.command = command;
31
118
  this.tools = this.createTools();
32
119
  }
33
120
  /**
@@ -93,45 +180,140 @@ export default class GthDevToolkit extends BaseToolkit {
93
180
  throw new Error('No test command configured');
94
181
  }
95
182
  }
96
- async executeCommand(command, toolName) {
97
- displayInfo(`\n🔧 Executing ${toolName}: ${command}`);
183
+ /**
184
+ * Execute a shell command with the EXT-9 Tier-1 hardening applied:
185
+ * 1. stdin closed + timeout + process-group kill (no hang on interactive
186
+ * commands; runaway commands are killed group-wide on timeout),
187
+ * 2. output capped with a head/tail window + temp-file spillover,
188
+ * 3. provider/LLM credentials scrubbed from the child env,
189
+ * 4. an unbypassable hardline blocklist (refuses catastrophic commands BEFORE
190
+ * spawn — fires even when confirmation is bypassed by yolo).
191
+ *
192
+ * Resolves with a model-facing string on a CLEAN exit (`code === 0`). EXT-20: a non-zero exit
193
+ * and a timeout-kill instead REJECT with a {@link ShellCommandFailedError} that carries the FULL
194
+ * model-facing body — the deep-agent {@link GthDeepShellExitSoftening} middleware converts that
195
+ * throw into an error `ToolMessage` (status:'error' → ✗) while preserving the output, so the
196
+ * model still sees the killed-after-N / exit-code message and can continue. Spawn-level failures
197
+ * (`child.on('error')`) still reject with a plain `Error`.
198
+ */
199
+ async executeCommand(command, toolName, toolCallId) {
200
+ // TUI-C17: the "Executing" notice + live child output go through the tool-output channel.
201
+ // With no subscriber (every non-TUI surface) the channel's default sink reproduces the
202
+ // historical behaviour exactly (displayInfo notice, raw stdout chunks); under the Ink TUI
203
+ // the session subscribes and folds them into the managed frame instead.
204
+ emitToolOutput({
205
+ toolCallId,
206
+ toolName,
207
+ kind: 'notice',
208
+ text: `🔧 Executing ${toolName}: ${command}`,
209
+ });
210
+ // (4) Hardline blocklist — checked here so it fires regardless of yolo,
211
+ // allow-lists, or any confirmation path. Refuse WITHOUT executing.
212
+ const hardline = checkHardline(command);
213
+ if (hardline) {
214
+ const refusal = `Refusing to execute '${command}': blocked by hardline safety policy ` +
215
+ `(${hardline.description}). This is a catastrophic, non-recoverable command ` +
216
+ `and is blocked even when command confirmation is disabled.`;
217
+ displayWarning(`\n⛔ ${refusal}`);
218
+ return refusal;
219
+ }
220
+ const timeoutMs = getShellTimeoutMs(this.commands);
221
+ const maxOutputBytes = getShellMaxOutputBytes(this.commands);
98
222
  return new Promise((resolve, reject) => {
99
223
  const child = spawn(command, {
100
224
  shell: true,
225
+ // EXT-22 (S4) / EXT-23: spawn in the SAME directory the deepagents FilesystemBackend is
226
+ // rooted at, so the shell tool and the fs tools (ls/read_file/write_file/edit_file/glob/grep)
227
+ // operate on one path namespace instead of diverging. `getShellWorkDir()` returns
228
+ // `getCurrentWorkDir()` on the local code/chat runner + AG-UI (where init() roots the backend
229
+ // at `rootDir: getCurrentWorkDir()`), and the ACP session override on the ACP transport (where
230
+ // `gthAcpServer` re-roots the per-session backend to `session/new.cwd` and updates the
231
+ // override to match — see tools/shell/workDir.ts). Evaluated at call time.
232
+ cwd: getShellWorkDir(),
233
+ // (1) Never let the child block on stdin (e.g. git commit opening $EDITOR).
234
+ stdio: ['ignore', 'pipe', 'pipe'],
235
+ // (1) POSIX: own process group so we can kill the whole tree on timeout
236
+ // (see killProcessGroup). No-op/harmful on Windows, which uses taskkill /T.
237
+ detached: process.platform !== 'win32',
238
+ // (3) Child env with provider/LLM credentials removed.
239
+ env: buildScrubbedEnv(),
101
240
  });
102
- let output = '';
103
- // Capture output if available (when stdio is not 'inherit')
241
+ // (2) Bounded capture for the returned message; live streaming is uncapped.
242
+ const buffer = new OutputBuffer(maxOutputBytes);
243
+ let timedOut = false;
244
+ let settled = false;
245
+ let killTimer;
246
+ const timeoutTimer = setTimeout(() => {
247
+ timedOut = true;
248
+ killProcessGroup(child, 'SIGTERM');
249
+ // Escalate to SIGKILL after a short grace if it didn't die.
250
+ killTimer = setTimeout(() => killProcessGroup(child, 'SIGKILL'), KILL_GRACE_MS);
251
+ // killTimer must not keep the event loop alive on its own.
252
+ killTimer.unref?.();
253
+ }, timeoutMs);
254
+ timeoutTimer.unref?.();
255
+ const clearTimers = () => {
256
+ clearTimeout(timeoutTimer);
257
+ if (killTimer)
258
+ clearTimeout(killTimer);
259
+ };
104
260
  if (child.stdout) {
105
261
  child.stdout.on('data', (data) => {
106
262
  const chunk = data.toString();
107
- stdout.write(chunk);
108
- output += chunk;
263
+ emitToolOutput({ toolCallId, toolName, kind: 'output', text: chunk });
264
+ buffer.append(chunk);
109
265
  });
110
266
  }
111
267
  if (child.stderr) {
112
268
  child.stderr.on('data', (data) => {
113
269
  const chunk = data.toString();
114
- stdout.write(chunk);
115
- output += chunk;
270
+ emitToolOutput({ toolCallId, toolName, kind: 'output', text: chunk });
271
+ buffer.append(chunk);
116
272
  });
117
273
  }
118
274
  child.on('close', (code) => {
275
+ if (settled)
276
+ return;
277
+ settled = true;
278
+ clearTimers();
279
+ const captured = buffer.finalize();
280
+ const body = `Executing '${command}'...\n\n` +
281
+ `<COMMAND_OUTPUT>\n` +
282
+ captured.text +
283
+ `</COMMAND_OUTPUT>\n`;
284
+ if (timedOut) {
285
+ // EXT-20: a timeout-kill is a failure — reject so the deep-agent middleware flips the
286
+ // tool result to status:'error' (✗). The FULL body is preserved on the error so the
287
+ // model's observation is unchanged except for the status.
288
+ reject(new ShellCommandFailedError({
289
+ output: body +
290
+ `\n\nCommand '${command}' was killed after exceeding the ${Math.round(timeoutMs / 1000)}s timeout. ` +
291
+ `If it legitimately needs longer, increase the shell timeout in config.`,
292
+ exitCode: null,
293
+ command,
294
+ toolName,
295
+ }));
296
+ return;
297
+ }
119
298
  if (code === 0) {
120
- resolve(`Executing '${command}'...\n\n` +
121
- `<COMMAND_OUTPUT>\n` +
122
- output +
123
- `</COMMAND_OUTPUT>\n` +
124
- `\n\nCommand '${command}' completed successfully`);
299
+ resolve(body + `\n\nCommand '${command}' completed successfully`);
125
300
  }
126
301
  else {
127
- resolve(`Executing '${command}'...\n\n` +
128
- `<COMMAND_OUTPUT>\n` +
129
- output +
130
- `</COMMAND_OUTPUT>\n` +
131
- `\n\nCommand '${command}' exited with code ${code}`);
302
+ // EXT-20: a non-zero exit is a failure — reject (was resolve) so the softening
303
+ // middleware surfaces the ✗ (isError) signal while preserving the full output body.
304
+ reject(new ShellCommandFailedError({
305
+ output: body + `\n\nCommand '${command}' exited with code ${code}`,
306
+ exitCode: code,
307
+ command,
308
+ toolName,
309
+ }));
132
310
  }
133
311
  });
134
312
  child.on('error', (error) => {
313
+ if (settled)
314
+ return;
315
+ settled = true;
316
+ clearTimers();
135
317
  const errorMsg = `Failed to execute command '${command}': ${error.message}`;
136
318
  displayError(errorMsg);
137
319
  reject(new Error(errorMsg));
@@ -141,8 +323,8 @@ export default class GthDevToolkit extends BaseToolkit {
141
323
  createTools() {
142
324
  const tools = [];
143
325
  if (this.commands.run_tests) {
144
- tools.push(createGthTool(async (_args) => {
145
- return await this.executeCommand(this.commands.run_tests, 'run_tests');
326
+ tools.push(createGthTool(async (_args, config) => {
327
+ return await this.executeCommand(this.commands.run_tests, 'run_tests', config?.toolCall?.id);
146
328
  }, {
147
329
  name: 'run_tests',
148
330
  description: 'Execute the test suite for this project. Runs the configured test command and returns the output.' +
@@ -151,10 +333,10 @@ export default class GthDevToolkit extends BaseToolkit {
151
333
  }, 'execute'));
152
334
  }
153
335
  if (this.commands.run_single_test) {
154
- tools.push(createGthTool(async (args) => {
336
+ tools.push(createGthTool(async (args, config) => {
155
337
  const validatedPath = this.validateParameterValue(args.testPath, 'testPath');
156
338
  const command = this.buildSingleTestCommand(validatedPath);
157
- return await this.executeCommand(command, 'run_single_test');
339
+ return await this.executeCommand(command, 'run_single_test', config?.toolCall?.id);
158
340
  }, {
159
341
  name: 'run_single_test',
160
342
  description: 'Execute a single test file. Runs the configured test command with the specified test file path. ' +
@@ -164,8 +346,8 @@ export default class GthDevToolkit extends BaseToolkit {
164
346
  }, 'execute'));
165
347
  }
166
348
  if (this.commands.run_lint) {
167
- tools.push(createGthTool(async (_args) => {
168
- return await this.executeCommand(this.commands.run_lint, 'run_lint');
349
+ tools.push(createGthTool(async (_args, config) => {
350
+ return await this.executeCommand(this.commands.run_lint, 'run_lint', config?.toolCall?.id);
169
351
  }, {
170
352
  name: 'run_lint',
171
353
  description: 'Run the linter on the project code. Executes the configured lint command and returns any linting errors or warnings.' +
@@ -174,8 +356,8 @@ export default class GthDevToolkit extends BaseToolkit {
174
356
  }, 'execute'));
175
357
  }
176
358
  if (this.commands.run_build) {
177
- tools.push(createGthTool(async (_args) => {
178
- return await this.executeCommand(this.commands.run_build, 'run_build');
359
+ tools.push(createGthTool(async (_args, config) => {
360
+ return await this.executeCommand(this.commands.run_build, 'run_build', config?.toolCall?.id);
179
361
  }, {
180
362
  name: 'run_build',
181
363
  description: 'Build the project. Executes the configured build command and returns the build output.' +
@@ -183,6 +365,22 @@ export default class GthDevToolkit extends BaseToolkit {
183
365
  schema: RunBuildArgsSchema,
184
366
  }, 'execute'));
185
367
  }
368
+ // Opt-in general-purpose shell tool. Unlike the fixed run_* commands, the model supplies
369
+ // the command, so the guardrail is the per-command confirmation dialog wired by the deep
370
+ // agent (createDeepAgent `interruptOn`), not a parameter sanitizer — a real shell command
371
+ // legitimately contains pipes / `$` / `;`, so validateParameterValue must NOT be applied.
372
+ if (isShellToolEnabled(this.commands, this.command)) {
373
+ tools.push(createGthTool(async (args, config) => {
374
+ return await this.executeCommand(args.command, 'run_shell_command', config?.toolCall?.id);
375
+ }, {
376
+ name: 'run_shell_command',
377
+ description: 'Run an arbitrary shell command in the project working directory and return its ' +
378
+ 'combined stdout/stderr and exit status. Use for any task the fixed run_* tools do ' +
379
+ 'not cover (e.g. git, package managers, file inspection). Each call is subject to ' +
380
+ 'human approval before it runs unless approval has been disabled.',
381
+ schema: RunShellCommandArgsSchema,
382
+ }, 'execute'));
383
+ }
186
384
  return tools;
187
385
  }
188
386
  }
@@ -1 +1 @@
1
- {"version":3,"file":"GthDevToolkit.js","sourceRoot":"","sources":["../../src/tools/GthDevToolkit.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"GthDevToolkit.js","sourceRoot":"","sources":["../../src/tools/GthDevToolkit.ts"],"names":[],"mappings":"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"}
@@ -27,10 +27,57 @@ export default class GthFileSystemToolkit extends BaseToolkit {
27
27
  private searchFiles;
28
28
  private normalizeLineEndings;
29
29
  private createUnifiedDiff;
30
+ /**
31
+ * Count non-overlapping exact occurrences of `search` in `content`.
32
+ * Uses an indexOf scan (no regex) so arbitrary text is matched literally.
33
+ */
34
+ private countOccurrences;
30
35
  private applyFileEdits;
31
36
  private formatSize;
32
37
  private tailFile;
33
38
  private headFile;
39
+ /**
40
+ * Returns the first `head` lines and the last `tail` lines of a file, separated by a
41
+ * `... [N lines skipped] ...` marker. When the two windows cover or overlap the whole
42
+ * file (`head + tail >= total`) the entire file is returned unchanged (no marker, no
43
+ * duplicated lines).
44
+ */
45
+ private headAndTailFile;
46
+ /**
47
+ * Return the file's lines from the 1-based `offset` to EOF (GS2-39 paging). Deliberately does
48
+ * NOT apply `limit` here — the caller hands the result to capReadContent with maxLines = limit so
49
+ * that a limit-bounded read is *observable* to the envelope (it can then tell "more file remains
50
+ * past this window" from "reached EOF" and emit the correct resume notice). Pre-slicing to
51
+ * exactly `limit` lines here would hide that signal and silently drop the continuation.
52
+ *
53
+ * Mirrors headAndTailFile's trailing-newline handling so line numbering matches head/tail/full
54
+ * reads: a terminating newline yields a phantom trailing empty element that must not be counted
55
+ * as a real line. Clamps rather than throwing: an offset past EOF returns a short recoverable note
56
+ * (not an empty string, which is indistinguishable from an empty file).
57
+ */
58
+ private windowFile;
59
+ /**
60
+ * Apply the read safety envelope (GS2-39) to already-selected file content:
61
+ * - any single line longer than MAX_LINE_LENGTH is truncated with LINE_TRUNCATED_SUFFIX;
62
+ * - emission stops once `maxLines` lines OR MAX_READ_BYTES bytes have been produced.
63
+ *
64
+ * When nothing exceeds the caps the content is returned verbatim (byte-identical), so normal
65
+ * files behave exactly as before — the change only bites on pathological / huge files.
66
+ *
67
+ * Three truncation signals are kept deliberately separate:
68
+ * - a per-line cut is marked only by the inline LINE_TRUNCATED_SUFFIX (no global notice);
69
+ * - the BYTE cap always appends the global "output truncated" notice, because it is the hard
70
+ * safety envelope regardless of who asked for the read;
71
+ * - the LINE cap appends the global notice only when `lineCapIsHard` is true — i.e. `maxLines`
72
+ * is the hard MAX_READ_LINES envelope (a defaulted or clamped-down window, or the whole-file
73
+ * read), NOT a deliberate small explicit `limit`. This distinguishes a *capped continuation*
74
+ * (notify so the model can page) from a *satisfied explicit window* (stay quiet).
75
+ *
76
+ * `startLine` is the 1-based file line of the first line in `content`; it is used only to put a
77
+ * concrete resume `offset` in the global notice. Pass `undefined` (head/tail paths, where the
78
+ * first emitted line is not line `startLine` of the file) to emit a generic notice instead.
79
+ */
80
+ private capReadContent;
34
81
  private createReadBinaryTool;
35
82
  private createTools;
36
83
  }