@element47/ag 4.5.1 → 4.5.2

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 (48) hide show
  1. package/README.md +106 -4
  2. package/dist/cli/repl.d.ts +7 -2
  3. package/dist/cli/repl.d.ts.map +1 -1
  4. package/dist/cli/repl.js +180 -22
  5. package/dist/cli/repl.js.map +1 -1
  6. package/dist/cli.js +8 -8
  7. package/dist/cli.js.map +1 -1
  8. package/dist/core/__tests__/agent.test.js +42 -1
  9. package/dist/core/__tests__/agent.test.js.map +1 -1
  10. package/dist/core/__tests__/context.test.js +37 -0
  11. package/dist/core/__tests__/context.test.js.map +1 -1
  12. package/dist/core/__tests__/guardrails.test.d.ts +2 -0
  13. package/dist/core/__tests__/guardrails.test.d.ts.map +1 -0
  14. package/dist/core/__tests__/guardrails.test.js +400 -0
  15. package/dist/core/__tests__/guardrails.test.js.map +1 -0
  16. package/dist/core/__tests__/permission-manager.test.d.ts +2 -0
  17. package/dist/core/__tests__/permission-manager.test.d.ts.map +1 -0
  18. package/dist/core/__tests__/permission-manager.test.js +246 -0
  19. package/dist/core/__tests__/permission-manager.test.js.map +1 -0
  20. package/dist/core/__tests__/streaming.test.js +8 -1
  21. package/dist/core/__tests__/streaming.test.js.map +1 -1
  22. package/dist/core/agent.d.ts +9 -0
  23. package/dist/core/agent.d.ts.map +1 -1
  24. package/dist/core/agent.js +50 -15
  25. package/dist/core/agent.js.map +1 -1
  26. package/dist/core/guardrails.d.ts +32 -0
  27. package/dist/core/guardrails.d.ts.map +1 -0
  28. package/dist/core/guardrails.js +149 -0
  29. package/dist/core/guardrails.js.map +1 -0
  30. package/dist/core/loader.d.ts +6 -2
  31. package/dist/core/loader.d.ts.map +1 -1
  32. package/dist/core/loader.js +23 -9
  33. package/dist/core/loader.js.map +1 -1
  34. package/dist/core/permissions.d.ts +60 -0
  35. package/dist/core/permissions.d.ts.map +1 -0
  36. package/dist/core/permissions.js +252 -0
  37. package/dist/core/permissions.js.map +1 -0
  38. package/dist/core/registry.d.ts.map +1 -1
  39. package/dist/core/registry.js +16 -0
  40. package/dist/core/registry.js.map +1 -1
  41. package/dist/core/skills.d.ts.map +1 -1
  42. package/dist/core/skills.js +26 -3
  43. package/dist/core/skills.js.map +1 -1
  44. package/dist/core/types.d.ts +15 -1
  45. package/dist/core/types.d.ts.map +1 -1
  46. package/dist/memory/__tests__/memory.test.js +28 -0
  47. package/dist/memory/__tests__/memory.test.js.map +1 -1
  48. package/package.json +1 -1
@@ -0,0 +1,246 @@
1
+ import { describe, it, expect, beforeEach, afterEach } from 'vitest';
2
+ import { mkdirSync, writeFileSync, rmSync, existsSync } from 'node:fs';
3
+ import { join } from 'node:path';
4
+ import { tmpdir } from 'node:os';
5
+ import { globMatch, parsePattern, extractMatchKey, inferPattern, PermissionManager, } from '../permissions.js';
6
+ // ── globMatch ───────────────────────────────────────────────────────────────
7
+ describe('globMatch', () => {
8
+ it('matches literal strings', () => {
9
+ expect(globMatch('npm test', 'npm test')).toBe(true);
10
+ expect(globMatch('npm test', 'npm run')).toBe(false);
11
+ });
12
+ it('* matches any non-slash sequence', () => {
13
+ expect(globMatch('npm *', 'npm test')).toBe(true); // space is literal, * matches "test"
14
+ expect(globMatch('npm*', 'npmtest')).toBe(true);
15
+ expect(globMatch('*', 'anything')).toBe(true);
16
+ expect(globMatch('*', 'path/with/slashes')).toBe(true); // bare * is special — globMatch returns true early
17
+ });
18
+ it('* in path context does not cross slashes', () => {
19
+ expect(globMatch('src/*', 'src/foo.ts')).toBe(true);
20
+ expect(globMatch('src/*', 'src/deep/foo.ts')).toBe(false);
21
+ });
22
+ it('** matches across slashes', () => {
23
+ expect(globMatch('src/**', 'src/foo.ts')).toBe(true);
24
+ expect(globMatch('src/**', 'src/deep/nested/foo.ts')).toBe(true);
25
+ });
26
+ it('? matches single character', () => {
27
+ expect(globMatch('?.ts', 'a.ts')).toBe(true);
28
+ expect(globMatch('?.ts', 'ab.ts')).toBe(false);
29
+ });
30
+ it('handles mixed patterns', () => {
31
+ expect(globMatch('*github.com*', 'api.github.com')).toBe(true);
32
+ expect(globMatch('*github.com*', 'github.com')).toBe(true);
33
+ expect(globMatch('*github.com*', 'example.com')).toBe(false);
34
+ });
35
+ it('handles empty pattern and value', () => {
36
+ expect(globMatch('', '')).toBe(true);
37
+ expect(globMatch('*', '')).toBe(true);
38
+ expect(globMatch('a', '')).toBe(false);
39
+ });
40
+ });
41
+ // ── parsePattern ────────────────────────────────────────────────────────────
42
+ describe('parsePattern', () => {
43
+ it('parses full Tool(qualifier:glob) syntax', () => {
44
+ expect(parsePattern('bash(npm:*)')).toEqual({ tool: 'bash', qualifier: 'npm', glob: '*' });
45
+ expect(parsePattern('file(write:src/**)')).toEqual({ tool: 'file', qualifier: 'write', glob: 'src/**' });
46
+ });
47
+ it('parses qualifier-only Tool(qualifier)', () => {
48
+ expect(parsePattern('git(commit)')).toEqual({ tool: 'git', qualifier: 'commit', glob: null });
49
+ });
50
+ it('parses Tool(*) shorthand', () => {
51
+ expect(parsePattern('bash(*)')).toEqual({ tool: 'bash', qualifier: '*', glob: null });
52
+ });
53
+ it('parses wildcard *', () => {
54
+ expect(parsePattern('*')).toEqual({ tool: '*', qualifier: '*', glob: null });
55
+ });
56
+ it('parses bare tool name', () => {
57
+ expect(parsePattern('bash')).toEqual({ tool: 'bash', qualifier: '*', glob: null });
58
+ });
59
+ it('normalizes tool name to lowercase', () => {
60
+ expect(parsePattern('Bash(npm:*)')).toEqual({ tool: 'bash', qualifier: 'npm', glob: '*' });
61
+ expect(parsePattern('FILE(write:*)')).toEqual({ tool: 'file', qualifier: 'write', glob: '*' });
62
+ });
63
+ });
64
+ // ── extractMatchKey ─────────────────────────────────────────────────────────
65
+ describe('extractMatchKey', () => {
66
+ it('extracts bash: first word as qualifier, full command as value', () => {
67
+ const key = extractMatchKey('bash', { command: 'npm test --verbose' });
68
+ expect(key).toEqual({ qualifier: 'npm', value: 'npm test --verbose' });
69
+ });
70
+ it('extracts file: action + path', () => {
71
+ const key = extractMatchKey('file', { action: 'write', path: 'src/foo.ts' });
72
+ expect(key).toEqual({ qualifier: 'write', value: 'src/foo.ts' });
73
+ });
74
+ it('extracts git: action only', () => {
75
+ const key = extractMatchKey('git', { action: 'commit', message: 'fix' });
76
+ expect(key).toEqual({ qualifier: 'commit', value: '' });
77
+ });
78
+ it('extracts web fetch: action + hostname', () => {
79
+ const key = extractMatchKey('web', { action: 'fetch', url: 'https://api.github.com/repos' });
80
+ expect(key).toEqual({ qualifier: 'fetch', value: 'api.github.com' });
81
+ });
82
+ it('extracts web search: action + query', () => {
83
+ const key = extractMatchKey('web', { action: 'search', query: 'typescript generics' });
84
+ expect(key).toEqual({ qualifier: 'search', value: 'typescript generics' });
85
+ });
86
+ it('uses permissionKey for custom tools', () => {
87
+ const key = extractMatchKey('deploy', { target: 'staging', branch: 'main' }, { qualifier: 'target' });
88
+ expect(key).toEqual({ qualifier: 'staging', value: '' });
89
+ });
90
+ it('uses permissionKey with value field', () => {
91
+ const key = extractMatchKey('mytool', { action: 'read', path: '/etc/hosts' }, { qualifier: 'action', value: 'path' });
92
+ expect(key).toEqual({ qualifier: 'read', value: '/etc/hosts' });
93
+ });
94
+ it('returns wildcard for unknown tools without permissionKey', () => {
95
+ const key = extractMatchKey('weather', { city: 'London' });
96
+ expect(key).toEqual({ qualifier: '*', value: '' });
97
+ });
98
+ });
99
+ // ── inferPattern ────────────────────────────────────────────────────────────
100
+ describe('inferPattern', () => {
101
+ it('infers bash pattern: firstWord:*', () => {
102
+ expect(inferPattern('bash', { command: 'npm test' })).toBe('bash(npm:*)');
103
+ expect(inferPattern('bash', { command: 'git push origin main' })).toBe('bash(git:*)');
104
+ });
105
+ it('infers file pattern: action:dir/**', () => {
106
+ expect(inferPattern('file', { action: 'write', path: 'src/core/foo.ts' })).toBe('file(write:src/**)');
107
+ });
108
+ it('infers file pattern: action:* for root files', () => {
109
+ expect(inferPattern('file', { action: 'edit', path: 'README.md' })).toBe('file(edit:*)');
110
+ });
111
+ it('infers git pattern: action only', () => {
112
+ expect(inferPattern('git', { action: 'commit' })).toBe('git(commit)');
113
+ expect(inferPattern('git', { action: 'push' })).toBe('git(push)');
114
+ });
115
+ it('infers web fetch pattern with hostname', () => {
116
+ expect(inferPattern('web', { action: 'fetch', url: 'https://api.github.com/repos' })).toBe('web(fetch:*api.github.com*)');
117
+ });
118
+ it('infers web search pattern', () => {
119
+ expect(inferPattern('web', { action: 'search', query: 'test' })).toBe('web(search:*)');
120
+ });
121
+ it('infers custom tool with permissionKey', () => {
122
+ expect(inferPattern('deploy', { target: 'staging' }, { qualifier: 'target' })).toBe('deploy(staging)');
123
+ });
124
+ it('infers custom tool with permissionKey + value', () => {
125
+ expect(inferPattern('deploy', { target: 'staging', branch: 'main' }, { qualifier: 'target', value: 'branch' })).toBe('deploy(staging:*)');
126
+ });
127
+ it('infers opaque custom tool without permissionKey', () => {
128
+ expect(inferPattern('weather', { city: 'London' })).toBe('weather(*)');
129
+ });
130
+ });
131
+ // ── PermissionManager ───────────────────────────────────────────────────────
132
+ describe('PermissionManager', () => {
133
+ let tmpDir;
134
+ beforeEach(() => {
135
+ tmpDir = join(tmpdir(), `ag-perm-test-${Date.now()}-${Math.random().toString(36).slice(2)}`);
136
+ mkdirSync(tmpDir, { recursive: true });
137
+ });
138
+ afterEach(() => {
139
+ rmSync(tmpDir, { recursive: true, force: true });
140
+ });
141
+ function createPm(projectRules, globalRules) {
142
+ // Write project permissions
143
+ if (projectRules) {
144
+ const agDir = join(tmpDir, '.ag');
145
+ mkdirSync(agDir, { recursive: true });
146
+ writeFileSync(join(agDir, 'permissions.json'), JSON.stringify(projectRules));
147
+ }
148
+ // We can't easily override global path, so we test project + session only
149
+ return new PermissionManager(tmpDir);
150
+ }
151
+ it('returns ask when no rules match', () => {
152
+ const pm = createPm();
153
+ expect(pm.check('bash', { command: 'npm test' })).toBe('ask');
154
+ });
155
+ it('returns allow when an allow rule matches', () => {
156
+ const pm = createPm({ allow: ['bash(npm:*)'] });
157
+ expect(pm.check('bash', { command: 'npm test' })).toBe('allow');
158
+ });
159
+ it('returns deny when a deny rule matches', () => {
160
+ const pm = createPm({ deny: ['bash(rm:*)'] });
161
+ expect(pm.check('bash', { command: 'rm -rf /' })).toBe('deny');
162
+ });
163
+ it('deny overrides allow for the same tool call', () => {
164
+ const pm = createPm({ allow: ['bash(*)'], deny: ['bash(rm:*)'] });
165
+ expect(pm.check('bash', { command: 'rm -rf /' })).toBe('deny');
166
+ expect(pm.check('bash', { command: 'npm test' })).toBe('allow');
167
+ });
168
+ it('session rules work via addRule', () => {
169
+ const pm = createPm();
170
+ expect(pm.check('bash', { command: 'npm test' })).toBe('ask');
171
+ pm.addRule({ pattern: 'bash(npm:*)', effect: 'allow' }, 'session');
172
+ expect(pm.check('bash', { command: 'npm test' })).toBe('allow');
173
+ expect(pm.check('bash', { command: 'npm run build' })).toBe('allow');
174
+ });
175
+ it('does not duplicate rules', () => {
176
+ const pm = createPm();
177
+ pm.addRule({ pattern: 'bash(npm:*)', effect: 'allow' }, 'session');
178
+ pm.addRule({ pattern: 'bash(npm:*)', effect: 'allow' }, 'session');
179
+ expect(pm.getRules('session')).toHaveLength(1);
180
+ });
181
+ it('removeRule works', () => {
182
+ const pm = createPm();
183
+ pm.addRule({ pattern: 'bash(npm:*)', effect: 'allow' }, 'session');
184
+ expect(pm.removeRule('bash(npm:*)', 'session')).toBe(true);
185
+ expect(pm.getRules('session')).toHaveLength(0);
186
+ expect(pm.removeRule('nonexistent', 'session')).toBe(false);
187
+ });
188
+ it('getRules returns rules from all scopes', () => {
189
+ const pm = createPm({ allow: ['file(write:src/**)'] });
190
+ pm.addRule({ pattern: 'bash(npm:*)', effect: 'allow' }, 'session');
191
+ const all = pm.getRules();
192
+ expect(all.length).toBeGreaterThanOrEqual(2);
193
+ expect(all.some(r => r.scope === 'session' && r.pattern === 'bash(npm:*)')).toBe(true);
194
+ expect(all.some(r => r.scope === 'project' && r.pattern === 'file(write:src/**)')).toBe(true);
195
+ });
196
+ it('save persists project rules to disk', () => {
197
+ const pm = createPm();
198
+ pm.addRule({ pattern: 'bash(npm:*)', effect: 'allow' }, 'project');
199
+ pm.save('project');
200
+ expect(existsSync(join(tmpDir, '.ag', 'permissions.json'))).toBe(true);
201
+ // Reload and verify
202
+ const pm2 = new PermissionManager(tmpDir);
203
+ expect(pm2.check('bash', { command: 'npm test' })).toBe('allow');
204
+ });
205
+ it('clear removes rules for a scope', () => {
206
+ const pm = createPm({ allow: ['bash(npm:*)'] });
207
+ pm.addRule({ pattern: 'git(commit)', effect: 'allow' }, 'session');
208
+ pm.clear('session');
209
+ expect(pm.getRules('session')).toHaveLength(0);
210
+ expect(pm.getRules('project')).toHaveLength(1);
211
+ });
212
+ it('handles missing permission files gracefully', () => {
213
+ const emptyDir = join(tmpDir, 'empty');
214
+ mkdirSync(emptyDir, { recursive: true });
215
+ const pm = new PermissionManager(emptyDir);
216
+ expect(pm.check('bash', { command: 'ls' })).toBe('ask');
217
+ });
218
+ it('wildcard * pattern allows everything', () => {
219
+ const pm = createPm({ allow: ['*'] });
220
+ expect(pm.check('bash', { command: 'rm -rf /' })).toBe('allow');
221
+ expect(pm.check('file', { action: 'write', path: 'foo.ts' })).toBe('allow');
222
+ expect(pm.check('unknown', { anything: true })).toBe('allow');
223
+ });
224
+ it('custom tool with permissionKey checks correctly', () => {
225
+ const pm = createPm({ allow: ['deploy(staging)'] });
226
+ expect(pm.check('deploy', { target: 'staging' }, { qualifier: 'target' })).toBe('allow');
227
+ expect(pm.check('deploy', { target: 'production' }, { qualifier: 'target' })).toBe('ask');
228
+ });
229
+ it('custom tool without permissionKey: toolname(*) allows all', () => {
230
+ const pm = createPm({ allow: ['weather(*)'] });
231
+ expect(pm.check('weather', { city: 'London' })).toBe('allow');
232
+ expect(pm.check('weather', { city: 'Tokyo' })).toBe('allow');
233
+ });
234
+ it('file path patterns with ** work', () => {
235
+ const pm = createPm({ allow: ['file(write:src/**)'] });
236
+ expect(pm.check('file', { action: 'write', path: 'src/core/foo.ts' })).toBe('allow');
237
+ expect(pm.check('file', { action: 'write', path: 'src/deep/nested/bar.ts' })).toBe('allow');
238
+ expect(pm.check('file', { action: 'write', path: 'test/foo.ts' })).toBe('ask');
239
+ });
240
+ it('web fetch hostname patterns work', () => {
241
+ const pm = createPm({ allow: ['web(fetch:*github.com*)'] });
242
+ expect(pm.check('web', { action: 'fetch', url: 'https://api.github.com/repos' })).toBe('allow');
243
+ expect(pm.check('web', { action: 'fetch', url: 'https://evil.com' })).toBe('ask');
244
+ });
245
+ });
246
+ //# sourceMappingURL=permission-manager.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"permission-manager.test.js","sourceRoot":"","sources":["../../../src/core/__tests__/permission-manager.test.ts"],"names":[],"mappings":"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"}
@@ -36,8 +36,13 @@ describe('StreamChunk types', () => {
36
36
  expect(chunk.type).toBe('thinking');
37
37
  expect(chunk.content).toBe('thinking [1/25]');
38
38
  });
39
+ it('interrupted chunk has correct shape', () => {
40
+ const chunk = { type: 'interrupted', content: '2 completed, 1 cancelled' };
41
+ expect(chunk.type).toBe('interrupted');
42
+ expect(chunk.content).toBe('2 completed, 1 cancelled');
43
+ });
39
44
  it('all chunk types are covered', () => {
40
- const validTypes = ['thinking', 'text', 'tool_start', 'tool_end', 'done', 'max_iterations'];
45
+ const validTypes = ['thinking', 'text', 'tool_start', 'tool_end', 'done', 'max_iterations', 'interrupted'];
41
46
  const chunks = [
42
47
  { type: 'thinking', content: 'thinking' },
43
48
  { type: 'text', content: 'a' },
@@ -45,10 +50,12 @@ describe('StreamChunk types', () => {
45
50
  { type: 'tool_end', toolName: 'x', success: true },
46
51
  { type: 'done' },
47
52
  { type: 'max_iterations' },
53
+ { type: 'interrupted', content: 'stopped' },
48
54
  ];
49
55
  for (const chunk of chunks) {
50
56
  expect(validTypes).toContain(chunk.type);
51
57
  }
58
+ expect(chunks.length).toBe(validTypes.length);
52
59
  });
53
60
  });
54
61
  //# sourceMappingURL=streaming.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"streaming.test.js","sourceRoot":"","sources":["../../../src/core/__tests__/streaming.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"streaming.test.js","sourceRoot":"","sources":["../../../src/core/__tests__/streaming.test.ts"],"names":[],"mappings":"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"}
@@ -7,6 +7,8 @@ export declare const MAX_ITERATIONS_REACHED = "[Max iterations reached]";
7
7
  export declare function getEnvironmentContext(cwd: string): string;
8
8
  export declare function isReadOnlyToolCall(toolName: string, args: Record<string, unknown>): boolean;
9
9
  export declare function truncateToolResult(result: string): string;
10
+ /** Yield promise results as they resolve (like Promise.all but streaming) */
11
+ export declare function raceAll<T>(promises: Promise<T>[]): AsyncGenerator<T>;
10
12
  export declare class Agent implements SkillHost {
11
13
  private readonly apiKey;
12
14
  private model;
@@ -22,6 +24,7 @@ export declare class Agent implements SkillHost {
22
24
  private cachedCatalog;
23
25
  private cachedAlwaysOn;
24
26
  private readonly builtinToolNames;
27
+ private readonly toolFailures;
25
28
  private contextTracker;
26
29
  private compactionInProgress;
27
30
  private confirmToolCall;
@@ -44,6 +47,12 @@ export declare class Agent implements SkillHost {
44
47
  getTools(): Array<{
45
48
  name: string;
46
49
  description: string;
50
+ isBuiltin: boolean;
51
+ }>;
52
+ getToolFailures(): Array<{
53
+ file: string;
54
+ name?: string;
55
+ reason: string;
47
56
  }>;
48
57
  getModel(): string;
49
58
  getBaseURL(): string;
@@ -1 +1 @@
1
- {"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../../src/core/agent.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../../src/core/agent.ts"],"names":[],"mappings":"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"}
@@ -119,7 +119,7 @@ export function truncateToolResult(result) {
119
119
  return [...head, `\n... [${omitted} lines truncated] ...\n`, ...tail].join('\n');
120
120
  }
121
121
  /** Yield promise results as they resolve (like Promise.all but streaming) */
122
- async function* raceAll(promises) {
122
+ export async function* raceAll(promises) {
123
123
  const wrapped = promises.map((p, i) => p.then(v => ({ i, v })));
124
124
  const settled = new Set();
125
125
  while (settled.size < promises.length) {
@@ -143,6 +143,7 @@ export class Agent {
143
143
  cachedCatalog = '';
144
144
  cachedAlwaysOn = '';
145
145
  builtinToolNames = new Set();
146
+ toolFailures;
146
147
  contextTracker;
147
148
  compactionInProgress = false;
148
149
  confirmToolCall;
@@ -222,6 +223,7 @@ export class Agent {
222
223
  this.builtinToolNames = new Set(this.tools.keys());
223
224
  for (const t of config.extraTools ?? [])
224
225
  this.addTool(t);
226
+ this.toolFailures = config.toolFailures ?? [];
225
227
  // Context window tracking
226
228
  this.contextTracker = new ContextTracker(this.model);
227
229
  // Cache context and skill catalog (invalidated on skill activation/refresh)
@@ -464,7 +466,24 @@ export class Agent {
464
466
  if (!msg.tool_calls?.length) {
465
467
  return msg.content || '';
466
468
  }
467
- // Execute tool calls in parallel
469
+ // Permission checks run sequentially so prompts don't overlap
470
+ const permissionDecisions = new Map();
471
+ for (const call of msg.tool_calls) {
472
+ const tool = this.tools.get(call.function.name);
473
+ if (!tool)
474
+ continue;
475
+ let args;
476
+ try {
477
+ args = JSON.parse(call.function.arguments || '{}');
478
+ }
479
+ catch {
480
+ continue;
481
+ }
482
+ if (this.confirmToolCall && !isReadOnlyToolCall(call.function.name, args)) {
483
+ permissionDecisions.set(call.id, await this.confirmToolCall(call.function.name, args, tool.permissionKey));
484
+ }
485
+ }
486
+ // Execute tool calls in parallel (permissions already resolved)
468
487
  const toolPromises = msg.tool_calls.map(async (call) => {
469
488
  const tool = this.tools.get(call.function.name);
470
489
  if (!tool) {
@@ -477,12 +496,8 @@ export class Agent {
477
496
  catch {
478
497
  return { call, content: 'Error: malformed tool arguments' };
479
498
  }
480
- // Permission check
481
- if (this.confirmToolCall && !isReadOnlyToolCall(call.function.name, args)) {
482
- const decision = await this.confirmToolCall(call.function.name, args);
483
- if (decision === 'deny') {
484
- return { call, content: 'Tool call denied by user.' };
485
- }
499
+ if (permissionDecisions.get(call.id) === 'deny') {
500
+ return { call, content: 'Tool call denied by user.' };
486
501
  }
487
502
  const summary = args.command ?? args.action ?? JSON.stringify(args).slice(0, 80);
488
503
  const stopToolSpinner = startSpinner(`[${call.function.name}] ${summary}`);
@@ -686,6 +701,25 @@ export class Agent {
686
701
  const summary = args.command ?? args.action ?? call.function.name;
687
702
  yield { type: 'tool_start', toolName: call.function.name, toolCallId: call.id, content: summary };
688
703
  }
704
+ // Permission checks — run sequentially so prompts don't overlap
705
+ const permissionDecisions = new Map();
706
+ for (const call of msg.tool_calls) {
707
+ if (signal?.aborted)
708
+ break;
709
+ const tool = this.tools.get(call.function.name);
710
+ if (!tool)
711
+ continue;
712
+ let args;
713
+ try {
714
+ args = JSON.parse(call.function.arguments || '{}');
715
+ }
716
+ catch {
717
+ continue;
718
+ }
719
+ if (this.confirmToolCall && !isReadOnlyToolCall(call.function.name, args)) {
720
+ permissionDecisions.set(call.id, await this.confirmToolCall(call.function.name, args, tool.permissionKey));
721
+ }
722
+ }
689
723
  // Execute tool calls — yield results as they complete (not Promise.all)
690
724
  const execPromises = msg.tool_calls.map(async (call) => {
691
725
  if (signal?.aborted)
@@ -700,12 +734,8 @@ export class Agent {
700
734
  catch {
701
735
  return { call, content: 'Error: malformed tool arguments', isError: true };
702
736
  }
703
- // Permission check
704
- if (this.confirmToolCall && !isReadOnlyToolCall(call.function.name, args)) {
705
- const decision = await this.confirmToolCall(call.function.name, args);
706
- if (decision === 'deny') {
707
- return { call, content: 'Tool call denied by user.', isError: true };
708
- }
737
+ if (permissionDecisions.get(call.id) === 'deny') {
738
+ return { call, content: 'Tool call denied by user.', isError: true };
709
739
  }
710
740
  try {
711
741
  const rawResult = await tool.execute(args);
@@ -793,8 +823,13 @@ export class Agent {
793
823
  return parts;
794
824
  }
795
825
  getTools() {
796
- return Array.from(this.tools.values()).map(t => ({ name: t.function.name, description: t.function.description }));
826
+ return Array.from(this.tools.values()).map(t => ({
827
+ name: t.function.name,
828
+ description: t.function.description,
829
+ isBuiltin: this.builtinToolNames.has(t.function.name),
830
+ }));
797
831
  }
832
+ getToolFailures() { return this.toolFailures; }
798
833
  getModel() { return this.model; }
799
834
  getBaseURL() { return this.baseURL; }
800
835
  setModel(model) { this.model = model; this.contextTracker = new ContextTracker(model); }