@amodalai/runtime 0.1.14 → 0.1.16
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/src/agent/agent-runner.d.ts +20 -0
- package/dist/src/agent/agent-runner.js +165 -1
- package/dist/src/agent/agent-runner.js.map +1 -1
- package/dist/src/agent/config-watcher.d.ts +2 -2
- package/dist/src/agent/config-watcher.js +28 -15
- package/dist/src/agent/config-watcher.js.map +1 -1
- package/dist/src/agent/config-watcher.test.js +13 -4
- package/dist/src/agent/config-watcher.test.js.map +1 -1
- package/dist/src/agent/eval-store.d.ts +50 -0
- package/dist/src/agent/eval-store.js +137 -0
- package/dist/src/agent/eval-store.js.map +1 -0
- package/dist/src/agent/local-server.d.ts +1 -1
- package/dist/src/agent/local-server.js +44 -26
- package/dist/src/agent/local-server.js.map +1 -1
- package/dist/src/agent/local-server.test.js +2 -1
- package/dist/src/agent/local-server.test.js.map +1 -1
- package/dist/src/agent/proactive/proactive-runner.d.ts +3 -3
- package/dist/src/agent/proactive/proactive-runner.js +3 -3
- package/dist/src/agent/proactive/proactive-runner.js.map +1 -1
- package/dist/src/agent/proactive/proactive-runner.test.js +2 -2
- package/dist/src/agent/proactive/proactive-runner.test.js.map +1 -1
- package/dist/src/agent/routes/admin-chat.d.ts +2 -2
- package/dist/src/agent/routes/admin-chat.js +2 -2
- package/dist/src/agent/routes/admin-chat.js.map +1 -1
- package/dist/src/agent/routes/chat.d.ts +6 -6
- package/dist/src/agent/routes/chat.js +3 -3
- package/dist/src/agent/routes/chat.js.map +1 -1
- package/dist/src/agent/routes/chat.test.js +7 -6
- package/dist/src/agent/routes/chat.test.js.map +1 -1
- package/dist/src/agent/routes/evals.d.ts +16 -0
- package/dist/src/agent/routes/evals.js +383 -0
- package/dist/src/agent/routes/evals.js.map +1 -0
- package/dist/src/agent/routes/inspect.d.ts +2 -2
- package/dist/src/agent/routes/inspect.js +11 -22
- package/dist/src/agent/routes/inspect.js.map +1 -1
- package/dist/src/agent/routes/inspect.test.js +11 -16
- package/dist/src/agent/routes/inspect.test.js.map +1 -1
- package/dist/src/agent/routes/task.d.ts +2 -2
- package/dist/src/agent/routes/task.js +4 -4
- package/dist/src/agent/routes/task.js.map +1 -1
- package/dist/src/agent/routes/task.test.js.map +1 -1
- package/dist/src/agent/session-store.d.ts +2 -2
- package/dist/src/agent/session-store.js +9 -6
- package/dist/src/agent/session-store.js.map +1 -1
- package/dist/src/agent/snapshot-server.js +10 -2
- package/dist/src/agent/snapshot-server.js.map +1 -1
- package/dist/src/agent/{agent-runner.test.d.ts → write-repo-file.test.d.ts} +1 -1
- package/dist/src/agent/write-repo-file.test.js +270 -0
- package/dist/src/agent/write-repo-file.test.js.map +1 -0
- package/dist/src/index.d.ts +4 -1
- package/dist/src/index.js +3 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/routes/chat-stream.js +2 -1
- package/dist/src/routes/chat-stream.js.map +1 -1
- package/dist/src/server.js +0 -2
- package/dist/src/server.js.map +1 -1
- package/dist/src/server.test.js +37 -6
- package/dist/src/server.test.js.map +1 -1
- package/dist/src/session/custom-tool-adapter.d.ts +74 -0
- package/dist/src/session/custom-tool-adapter.js +149 -0
- package/dist/src/session/custom-tool-adapter.js.map +1 -0
- package/dist/src/session/session-manager.d.ts +67 -3
- package/dist/src/session/session-manager.js +313 -7
- package/dist/src/session/session-manager.js.map +1 -1
- package/dist/src/session/session-manager.test.js +63 -6
- package/dist/src/session/session-manager.test.js.map +1 -1
- package/dist/src/session/session-runner.js +12 -0
- package/dist/src/session/session-runner.js.map +1 -1
- package/dist/src/types.d.ts +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +2 -2
- package/dist/src/agent/agent-runner.test.js +0 -552
- package/dist/src/agent/agent-runner.test.js.map +0 -1
- package/dist/src/agent/session-manager.d.ts +0 -88
- package/dist/src/agent/session-manager.js +0 -341
- package/dist/src/agent/session-manager.js.map +0 -1
- package/dist/src/agent/session-manager.test.d.ts +0 -6
- package/dist/src/agent/session-manager.test.js +0 -145
- package/dist/src/agent/session-manager.test.js.map +0 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@amodalai/runtime",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.16",
|
|
4
4
|
"description": "Agent Runtime Platform — HTTP server for repo and platform modes",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -26,7 +26,7 @@
|
|
|
26
26
|
"node-cron": "^3.0.3",
|
|
27
27
|
"zod": "^3.25.0",
|
|
28
28
|
"express-rate-limit": "^7.5.0",
|
|
29
|
-
"@amodalai/core": "0.1.
|
|
29
|
+
"@amodalai/core": "0.1.16"
|
|
30
30
|
},
|
|
31
31
|
"devDependencies": {
|
|
32
32
|
"@types/express": "^4.17.21",
|
|
@@ -1,552 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @license
|
|
3
|
-
* Copyright 2025 Amodal Labs, Inc.
|
|
4
|
-
* SPDX-License-Identifier: MIT
|
|
5
|
-
*/
|
|
6
|
-
import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
|
|
7
|
-
import { runAgentTurn } from './agent-runner.js';
|
|
8
|
-
import { SSEEventType } from '../types.js';
|
|
9
|
-
// Mock the FailoverProvider via @amodalai/core
|
|
10
|
-
// Must use vi.hoisted so the mock fn is available inside the factory
|
|
11
|
-
const { mockChat, mockFailoverConstructor } = vi.hoisted(() => {
|
|
12
|
-
const chat = vi.fn();
|
|
13
|
-
const constructor = vi.fn().mockImplementation(() => ({ chat, chatStream: undefined }));
|
|
14
|
-
return { mockChat: chat, mockFailoverConstructor: constructor };
|
|
15
|
-
});
|
|
16
|
-
vi.mock('@amodalai/core', async (importOriginal) => {
|
|
17
|
-
// eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion -- needed when core is not pre-built
|
|
18
|
-
const actual = await importOriginal();
|
|
19
|
-
return {
|
|
20
|
-
...actual,
|
|
21
|
-
FailoverProvider: mockFailoverConstructor,
|
|
22
|
-
};
|
|
23
|
-
});
|
|
24
|
-
function makeSession(overrides) {
|
|
25
|
-
return {
|
|
26
|
-
id: 'session-1',
|
|
27
|
-
appId: 'tenant-1',
|
|
28
|
-
conversationHistory: [],
|
|
29
|
-
createdAt: Date.now(),
|
|
30
|
-
lastAccessedAt: Date.now(),
|
|
31
|
-
runtime: {
|
|
32
|
-
repo: {
|
|
33
|
-
source: 'local',
|
|
34
|
-
origin: '/test',
|
|
35
|
-
config: {
|
|
36
|
-
name: 'test',
|
|
37
|
-
version: '1.0.0',
|
|
38
|
-
models: { main: { provider: 'anthropic', model: 'claude-sonnet-4-20250514' } },
|
|
39
|
-
},
|
|
40
|
-
connections: new Map(),
|
|
41
|
-
skills: [],
|
|
42
|
-
agents: {},
|
|
43
|
-
automations: [],
|
|
44
|
-
knowledge: [],
|
|
45
|
-
evals: [],
|
|
46
|
-
tools: [],
|
|
47
|
-
stores: [],
|
|
48
|
-
},
|
|
49
|
-
compiledContext: {
|
|
50
|
-
systemPrompt: 'You are a test agent.',
|
|
51
|
-
tokenUsage: { total: 100000, used: 100, remaining: 99900, sectionBreakdown: {} },
|
|
52
|
-
sections: [],
|
|
53
|
-
},
|
|
54
|
-
exploreContext: {
|
|
55
|
-
systemPrompt: 'Explore agent.',
|
|
56
|
-
tokenUsage: { total: 100000, used: 50, remaining: 99950, sectionBreakdown: {} },
|
|
57
|
-
sections: [],
|
|
58
|
-
},
|
|
59
|
-
outputPipeline: {
|
|
60
|
-
process: vi.fn((text) => ({ output: text, modified: false, blocked: false, findings: [] })),
|
|
61
|
-
createStreamProcessor: vi.fn(),
|
|
62
|
-
},
|
|
63
|
-
connectionsMap: {},
|
|
64
|
-
fieldScrubber: { scrub: vi.fn((data) => ({ data, records: [], strippedCount: 0, redactableCount: 0 })) },
|
|
65
|
-
actionGate: { evaluate: vi.fn(() => ({ decision: 'allow', escalated: false, endpointPath: '' })) },
|
|
66
|
-
telemetry: { logScrub: vi.fn(), logGuard: vi.fn(), logGate: vi.fn(), logExplore: vi.fn() },
|
|
67
|
-
scrubTracker: {},
|
|
68
|
-
outputGuard: {},
|
|
69
|
-
contextCompiler: {},
|
|
70
|
-
userRoles: [],
|
|
71
|
-
sessionId: 'test-session',
|
|
72
|
-
isDelegated: false,
|
|
73
|
-
},
|
|
74
|
-
planModeManager: {
|
|
75
|
-
isActive: vi.fn(() => false),
|
|
76
|
-
getApprovedPlan: vi.fn(() => null),
|
|
77
|
-
getReason: vi.fn(() => null),
|
|
78
|
-
enter: vi.fn(),
|
|
79
|
-
approve: vi.fn(),
|
|
80
|
-
exit: vi.fn(),
|
|
81
|
-
getPlanningReminder: vi.fn(() => null),
|
|
82
|
-
getApprovedPlanContext: vi.fn(() => null),
|
|
83
|
-
},
|
|
84
|
-
exploreConfig: {
|
|
85
|
-
systemPrompt: 'explore',
|
|
86
|
-
model: { provider: 'anthropic', model: 'claude-sonnet-4-20250514' },
|
|
87
|
-
connectionsMap: {},
|
|
88
|
-
readOnly: true,
|
|
89
|
-
maxTurns: 10,
|
|
90
|
-
maxDepth: 2,
|
|
91
|
-
},
|
|
92
|
-
...overrides,
|
|
93
|
-
};
|
|
94
|
-
}
|
|
95
|
-
describe('runAgentTurn', () => {
|
|
96
|
-
beforeEach(() => {
|
|
97
|
-
mockChat.mockReset();
|
|
98
|
-
// Re-apply constructor implementation after clearing — mockClear only
|
|
99
|
-
// clears history, not implementation, but we need to ensure the constructor
|
|
100
|
-
// still returns an object with our mockChat reference
|
|
101
|
-
mockFailoverConstructor.mockClear();
|
|
102
|
-
mockFailoverConstructor.mockImplementation(() => ({ chat: mockChat, chatStream: undefined }));
|
|
103
|
-
});
|
|
104
|
-
afterEach(() => {
|
|
105
|
-
vi.unstubAllEnvs();
|
|
106
|
-
});
|
|
107
|
-
it('should yield error when provider initialization fails', async () => {
|
|
108
|
-
mockFailoverConstructor.mockImplementationOnce(() => {
|
|
109
|
-
throw new Error('ANTHROPIC_API_KEY is not set');
|
|
110
|
-
});
|
|
111
|
-
const session = makeSession();
|
|
112
|
-
const events = [];
|
|
113
|
-
for await (const event of runAgentTurn(session, 'hello', new AbortController().signal)) {
|
|
114
|
-
events.push(event);
|
|
115
|
-
}
|
|
116
|
-
expect(events.length).toBeGreaterThanOrEqual(2);
|
|
117
|
-
expect(events[0]?.type).toBe(SSEEventType.Error);
|
|
118
|
-
if (events[0]?.type === SSEEventType.Error) {
|
|
119
|
-
expect(events[0].message).toContain('Provider initialization failed');
|
|
120
|
-
}
|
|
121
|
-
expect(events[events.length - 1]?.type).toBe(SSEEventType.Done);
|
|
122
|
-
});
|
|
123
|
-
it('should append user message to conversation history', async () => {
|
|
124
|
-
mockChat.mockRejectedValue(new Error('test error'));
|
|
125
|
-
const session = makeSession();
|
|
126
|
-
const events = [];
|
|
127
|
-
for await (const event of runAgentTurn(session, 'hello', new AbortController().signal)) {
|
|
128
|
-
events.push(event);
|
|
129
|
-
}
|
|
130
|
-
expect(session.conversationHistory[0]).toEqual({ role: 'user', content: 'hello' });
|
|
131
|
-
});
|
|
132
|
-
it('should yield text delta for text responses', async () => {
|
|
133
|
-
mockChat.mockResolvedValue({
|
|
134
|
-
content: [{ type: 'text', text: 'Hello there!' }],
|
|
135
|
-
stopReason: 'end_turn',
|
|
136
|
-
usage: { inputTokens: 10, outputTokens: 5 },
|
|
137
|
-
});
|
|
138
|
-
const session = makeSession();
|
|
139
|
-
const events = [];
|
|
140
|
-
for await (const event of runAgentTurn(session, 'hello', new AbortController().signal)) {
|
|
141
|
-
events.push(event);
|
|
142
|
-
}
|
|
143
|
-
const textEvent = events.find((e) => e.type === SSEEventType.TextDelta);
|
|
144
|
-
expect(textEvent).toBeDefined();
|
|
145
|
-
if (textEvent && textEvent.type === SSEEventType.TextDelta) {
|
|
146
|
-
expect(textEvent.content).toBe('Hello there!');
|
|
147
|
-
}
|
|
148
|
-
const doneEvent = events.find((e) => e.type === SSEEventType.Done);
|
|
149
|
-
expect(doneEvent).toBeDefined();
|
|
150
|
-
});
|
|
151
|
-
it('should yield tool call events for tool use responses', async () => {
|
|
152
|
-
mockChat
|
|
153
|
-
.mockResolvedValueOnce({
|
|
154
|
-
content: [
|
|
155
|
-
{ type: 'tool_use', id: 'tool-1', name: 'enter_plan_mode', input: { reason: 'testing' } },
|
|
156
|
-
],
|
|
157
|
-
stopReason: 'tool_use',
|
|
158
|
-
})
|
|
159
|
-
.mockResolvedValueOnce({
|
|
160
|
-
content: [{ type: 'text', text: 'Plan mode activated.' }],
|
|
161
|
-
stopReason: 'end_turn',
|
|
162
|
-
});
|
|
163
|
-
const session = makeSession();
|
|
164
|
-
const events = [];
|
|
165
|
-
for await (const event of runAgentTurn(session, 'enter plan mode', new AbortController().signal)) {
|
|
166
|
-
events.push(event);
|
|
167
|
-
}
|
|
168
|
-
const toolStart = events.find((e) => e.type === SSEEventType.ToolCallStart);
|
|
169
|
-
expect(toolStart).toBeDefined();
|
|
170
|
-
if (toolStart && toolStart.type === SSEEventType.ToolCallStart) {
|
|
171
|
-
expect(toolStart.tool_name).toBe('enter_plan_mode');
|
|
172
|
-
}
|
|
173
|
-
const toolResult = events.find((e) => e.type === SSEEventType.ToolCallResult);
|
|
174
|
-
expect(toolResult).toBeDefined();
|
|
175
|
-
if (toolResult && toolResult.type === SSEEventType.ToolCallResult) {
|
|
176
|
-
expect(toolResult.status).toBe('success');
|
|
177
|
-
}
|
|
178
|
-
});
|
|
179
|
-
it('should handle abort signal', async () => {
|
|
180
|
-
const session = makeSession();
|
|
181
|
-
const controller = new AbortController();
|
|
182
|
-
controller.abort();
|
|
183
|
-
const events = [];
|
|
184
|
-
for await (const event of runAgentTurn(session, 'hello', controller.signal)) {
|
|
185
|
-
events.push(event);
|
|
186
|
-
}
|
|
187
|
-
expect(events.some((e) => e.type === SSEEventType.Error || e.type === SSEEventType.Done)).toBe(true);
|
|
188
|
-
});
|
|
189
|
-
it('should handle LLM errors gracefully', async () => {
|
|
190
|
-
mockChat.mockRejectedValue(new Error('Rate limited'));
|
|
191
|
-
const session = makeSession();
|
|
192
|
-
const events = [];
|
|
193
|
-
for await (const event of runAgentTurn(session, 'hello', new AbortController().signal)) {
|
|
194
|
-
events.push(event);
|
|
195
|
-
}
|
|
196
|
-
const errorEvent = events.find((e) => e.type === SSEEventType.Error);
|
|
197
|
-
expect(errorEvent).toBeDefined();
|
|
198
|
-
if (errorEvent && errorEvent.type === SSEEventType.Error) {
|
|
199
|
-
expect(errorEvent.message).toContain('Rate limited');
|
|
200
|
-
}
|
|
201
|
-
});
|
|
202
|
-
it('should execute plan mode tools', async () => {
|
|
203
|
-
mockChat
|
|
204
|
-
.mockResolvedValueOnce({
|
|
205
|
-
content: [{ type: 'tool_use', id: 'tool-1', name: 'enter_plan_mode', input: { reason: 'complex write' } }],
|
|
206
|
-
stopReason: 'tool_use',
|
|
207
|
-
})
|
|
208
|
-
.mockResolvedValueOnce({
|
|
209
|
-
content: [{ type: 'text', text: 'Plan mode entered.' }],
|
|
210
|
-
stopReason: 'end_turn',
|
|
211
|
-
});
|
|
212
|
-
const enterFn = vi.fn();
|
|
213
|
-
const session = makeSession({
|
|
214
|
-
planModeManager: {
|
|
215
|
-
isActive: vi.fn(() => false),
|
|
216
|
-
getApprovedPlan: vi.fn(() => null),
|
|
217
|
-
getReason: vi.fn(() => null),
|
|
218
|
-
enter: enterFn,
|
|
219
|
-
approve: vi.fn(),
|
|
220
|
-
exit: vi.fn(),
|
|
221
|
-
getPlanningReminder: vi.fn(() => null),
|
|
222
|
-
getApprovedPlanContext: vi.fn(() => null),
|
|
223
|
-
},
|
|
224
|
-
});
|
|
225
|
-
const events = [];
|
|
226
|
-
for await (const event of runAgentTurn(session, 'enter plan mode', new AbortController().signal)) {
|
|
227
|
-
events.push(event);
|
|
228
|
-
}
|
|
229
|
-
expect(enterFn).toHaveBeenCalledWith('complex write');
|
|
230
|
-
});
|
|
231
|
-
it('should store structured assistant messages in history', async () => {
|
|
232
|
-
mockChat.mockResolvedValue({
|
|
233
|
-
content: [
|
|
234
|
-
{ type: 'text', text: 'Let me check.' },
|
|
235
|
-
{ type: 'tool_use', id: 'tc-1', name: 'enter_plan_mode', input: {} },
|
|
236
|
-
],
|
|
237
|
-
stopReason: 'tool_use',
|
|
238
|
-
});
|
|
239
|
-
// Second call returns text to end the loop
|
|
240
|
-
mockChat.mockResolvedValueOnce({
|
|
241
|
-
content: [
|
|
242
|
-
{ type: 'text', text: 'Let me check.' },
|
|
243
|
-
{ type: 'tool_use', id: 'tc-1', name: 'enter_plan_mode', input: {} },
|
|
244
|
-
],
|
|
245
|
-
stopReason: 'tool_use',
|
|
246
|
-
}).mockResolvedValueOnce({
|
|
247
|
-
content: [{ type: 'text', text: 'Done.' }],
|
|
248
|
-
stopReason: 'end_turn',
|
|
249
|
-
});
|
|
250
|
-
const session = makeSession();
|
|
251
|
-
const events = [];
|
|
252
|
-
for await (const event of runAgentTurn(session, 'test', new AbortController().signal)) {
|
|
253
|
-
events.push(event);
|
|
254
|
-
}
|
|
255
|
-
// History should contain: user, assistant (structured), tool_result, ...
|
|
256
|
-
const assistantMsg = session.conversationHistory.find((m) => m.role === 'assistant');
|
|
257
|
-
expect(assistantMsg).toBeDefined();
|
|
258
|
-
if (assistantMsg && assistantMsg.role === 'assistant') {
|
|
259
|
-
expect(Array.isArray(assistantMsg.content)).toBe(true);
|
|
260
|
-
expect(assistantMsg.content).toHaveLength(2);
|
|
261
|
-
}
|
|
262
|
-
});
|
|
263
|
-
it('should store tool results with structured format', async () => {
|
|
264
|
-
mockChat
|
|
265
|
-
.mockResolvedValueOnce({
|
|
266
|
-
content: [{ type: 'tool_use', id: 'tc-1', name: 'enter_plan_mode', input: { reason: 'test' } }],
|
|
267
|
-
stopReason: 'tool_use',
|
|
268
|
-
})
|
|
269
|
-
.mockResolvedValueOnce({
|
|
270
|
-
content: [{ type: 'text', text: 'Done.' }],
|
|
271
|
-
stopReason: 'end_turn',
|
|
272
|
-
});
|
|
273
|
-
const session = makeSession();
|
|
274
|
-
for await (const _event of runAgentTurn(session, 'test', new AbortController().signal)) {
|
|
275
|
-
// consume events
|
|
276
|
-
}
|
|
277
|
-
// Should have: user, assistant, tool_result, assistant
|
|
278
|
-
const toolResultMsg = session.conversationHistory.find((m) => m.role === 'tool_result');
|
|
279
|
-
expect(toolResultMsg).toBeDefined();
|
|
280
|
-
if (toolResultMsg && toolResultMsg.role === 'tool_result') {
|
|
281
|
-
expect(toolResultMsg.toolCallId).toBe('tc-1');
|
|
282
|
-
expect(toolResultMsg.content).toContain('Plan mode activated');
|
|
283
|
-
}
|
|
284
|
-
});
|
|
285
|
-
it('should pass model config to FailoverProvider', async () => {
|
|
286
|
-
mockChat.mockResolvedValue({
|
|
287
|
-
content: [{ type: 'text', text: 'ok' }],
|
|
288
|
-
stopReason: 'end_turn',
|
|
289
|
-
});
|
|
290
|
-
const session = makeSession();
|
|
291
|
-
for await (const _event of runAgentTurn(session, 'test', new AbortController().signal)) {
|
|
292
|
-
// consume
|
|
293
|
-
}
|
|
294
|
-
expect(mockFailoverConstructor).toHaveBeenCalledWith({ provider: 'anthropic', model: 'claude-sonnet-4-20250514' });
|
|
295
|
-
});
|
|
296
|
-
describe('explore sub-agent', () => {
|
|
297
|
-
it('should spawn sub-agent and emit SubagentEvents + ExploreStart/End', async () => {
|
|
298
|
-
// Parent call: LLM returns explore tool use
|
|
299
|
-
mockChat
|
|
300
|
-
.mockResolvedValueOnce({
|
|
301
|
-
content: [{ type: 'tool_use', id: 'explore-1', name: 'explore', input: { query: 'check alerts' } }],
|
|
302
|
-
stopReason: 'tool_use',
|
|
303
|
-
})
|
|
304
|
-
// Sub-agent call: returns text summary directly (no tool use)
|
|
305
|
-
.mockResolvedValueOnce({
|
|
306
|
-
content: [{ type: 'text', text: 'Found 3 critical alerts.' }],
|
|
307
|
-
stopReason: 'end_turn',
|
|
308
|
-
usage: { inputTokens: 100, outputTokens: 50 },
|
|
309
|
-
})
|
|
310
|
-
// Parent continues after explore result
|
|
311
|
-
.mockResolvedValueOnce({
|
|
312
|
-
content: [{ type: 'text', text: 'Based on findings, there are 3 alerts.' }],
|
|
313
|
-
stopReason: 'end_turn',
|
|
314
|
-
});
|
|
315
|
-
const session = makeSession();
|
|
316
|
-
const events = [];
|
|
317
|
-
for await (const event of runAgentTurn(session, 'investigate alerts', new AbortController().signal)) {
|
|
318
|
-
events.push(event);
|
|
319
|
-
}
|
|
320
|
-
// Should have ExploreStart
|
|
321
|
-
const exploreStart = events.find((e) => e.type === SSEEventType.ExploreStart);
|
|
322
|
-
expect(exploreStart).toBeDefined();
|
|
323
|
-
if (exploreStart && exploreStart.type === SSEEventType.ExploreStart) {
|
|
324
|
-
expect(exploreStart.query).toBe('check alerts');
|
|
325
|
-
}
|
|
326
|
-
// Should have SubagentEvents
|
|
327
|
-
const subagentEvents = events.filter((e) => e.type === SSEEventType.SubagentEvent);
|
|
328
|
-
expect(subagentEvents.length).toBeGreaterThanOrEqual(1);
|
|
329
|
-
// Should have a 'thought' event with the summary
|
|
330
|
-
const thoughtEvent = subagentEvents.find((e) => e.type === SSEEventType.SubagentEvent && e.event_type === 'thought');
|
|
331
|
-
expect(thoughtEvent).toBeDefined();
|
|
332
|
-
// Should have a 'complete' event
|
|
333
|
-
const completeEvent = subagentEvents.find((e) => e.type === SSEEventType.SubagentEvent && e.event_type === 'complete');
|
|
334
|
-
expect(completeEvent).toBeDefined();
|
|
335
|
-
// Should have ExploreEnd
|
|
336
|
-
const exploreEnd = events.find((e) => e.type === SSEEventType.ExploreEnd);
|
|
337
|
-
expect(exploreEnd).toBeDefined();
|
|
338
|
-
if (exploreEnd && exploreEnd.type === SSEEventType.ExploreEnd) {
|
|
339
|
-
expect(exploreEnd.summary).toBe('Found 3 critical alerts.');
|
|
340
|
-
expect(exploreEnd.tokens_used).toBe(150);
|
|
341
|
-
}
|
|
342
|
-
// Should have ToolCallResult for explore
|
|
343
|
-
const toolResult = events.find((e) => e.type === SSEEventType.ToolCallResult && e.tool_id === 'explore-1');
|
|
344
|
-
expect(toolResult).toBeDefined();
|
|
345
|
-
if (toolResult && toolResult.type === SSEEventType.ToolCallResult) {
|
|
346
|
-
expect(toolResult.status).toBe('success');
|
|
347
|
-
expect(toolResult.result).toBe('Found 3 critical alerts.');
|
|
348
|
-
}
|
|
349
|
-
});
|
|
350
|
-
it('should force read-only intent on sub-agent requests', async () => {
|
|
351
|
-
// We need to intercept the fetch call to verify the method
|
|
352
|
-
const fetchSpy = vi.spyOn(globalThis, 'fetch').mockResolvedValue(new Response(JSON.stringify({ data: 'test' }), { status: 200 }));
|
|
353
|
-
// Parent calls explore
|
|
354
|
-
mockChat
|
|
355
|
-
.mockResolvedValueOnce({
|
|
356
|
-
content: [{ type: 'tool_use', id: 'explore-1', name: 'explore', input: { query: 'check data' } }],
|
|
357
|
-
stopReason: 'tool_use',
|
|
358
|
-
})
|
|
359
|
-
// Sub-agent calls request with POST (should be forced to GET)
|
|
360
|
-
.mockResolvedValueOnce({
|
|
361
|
-
content: [{
|
|
362
|
-
type: 'tool_use', id: 'sub-req-1', name: 'request',
|
|
363
|
-
input: { connection: 'test-api', method: 'POST', endpoint: '/data', intent: 'write' },
|
|
364
|
-
}],
|
|
365
|
-
stopReason: 'tool_use',
|
|
366
|
-
usage: { inputTokens: 50, outputTokens: 30 },
|
|
367
|
-
})
|
|
368
|
-
// Sub-agent returns summary
|
|
369
|
-
.mockResolvedValueOnce({
|
|
370
|
-
content: [{ type: 'text', text: 'Got the data.' }],
|
|
371
|
-
stopReason: 'end_turn',
|
|
372
|
-
usage: { inputTokens: 60, outputTokens: 20 },
|
|
373
|
-
})
|
|
374
|
-
// Parent continues
|
|
375
|
-
.mockResolvedValueOnce({
|
|
376
|
-
content: [{ type: 'text', text: 'Done.' }],
|
|
377
|
-
stopReason: 'end_turn',
|
|
378
|
-
});
|
|
379
|
-
const session = makeSession({
|
|
380
|
-
runtime: {
|
|
381
|
-
...makeSession().runtime,
|
|
382
|
-
connectionsMap: {
|
|
383
|
-
'test-api': {
|
|
384
|
-
base_url: 'https://api.test.com',
|
|
385
|
-
_request_config: { auth: [] },
|
|
386
|
-
},
|
|
387
|
-
},
|
|
388
|
-
},
|
|
389
|
-
});
|
|
390
|
-
const events = [];
|
|
391
|
-
for await (const event of runAgentTurn(session, 'check', new AbortController().signal)) {
|
|
392
|
-
events.push(event);
|
|
393
|
-
}
|
|
394
|
-
// Verify fetch was called with GET (not POST)
|
|
395
|
-
expect(fetchSpy).toHaveBeenCalled();
|
|
396
|
-
const fetchCall = fetchSpy.mock.calls[0];
|
|
397
|
-
if (fetchCall) {
|
|
398
|
-
const fetchOpts = fetchCall[1];
|
|
399
|
-
expect(fetchOpts?.method).toBe('GET');
|
|
400
|
-
}
|
|
401
|
-
fetchSpy.mockRestore();
|
|
402
|
-
});
|
|
403
|
-
it('should enforce depth limiting — sub-agent at max depth cannot call explore', async () => {
|
|
404
|
-
// Parent calls explore
|
|
405
|
-
mockChat
|
|
406
|
-
.mockResolvedValueOnce({
|
|
407
|
-
content: [{ type: 'tool_use', id: 'explore-1', name: 'explore', input: { query: 'level 1' } }],
|
|
408
|
-
stopReason: 'tool_use',
|
|
409
|
-
})
|
|
410
|
-
// Sub-agent at depth 0 calls explore (depth 0 + 1 < maxDepth=2, allowed)
|
|
411
|
-
.mockResolvedValueOnce({
|
|
412
|
-
content: [{ type: 'tool_use', id: 'sub-explore-1', name: 'explore', input: { query: 'level 2' } }],
|
|
413
|
-
stopReason: 'tool_use',
|
|
414
|
-
usage: { inputTokens: 50, outputTokens: 30 },
|
|
415
|
-
})
|
|
416
|
-
// Nested sub-agent at depth 1 — should NOT have explore tool, only text
|
|
417
|
-
.mockResolvedValueOnce({
|
|
418
|
-
content: [{ type: 'text', text: 'Deep findings.' }],
|
|
419
|
-
stopReason: 'end_turn',
|
|
420
|
-
usage: { inputTokens: 40, outputTokens: 20 },
|
|
421
|
-
})
|
|
422
|
-
// Back to depth-0 sub-agent with nested result
|
|
423
|
-
.mockResolvedValueOnce({
|
|
424
|
-
content: [{ type: 'text', text: 'Level 1 summary with nested data.' }],
|
|
425
|
-
stopReason: 'end_turn',
|
|
426
|
-
usage: { inputTokens: 60, outputTokens: 25 },
|
|
427
|
-
})
|
|
428
|
-
// Parent continues
|
|
429
|
-
.mockResolvedValueOnce({
|
|
430
|
-
content: [{ type: 'text', text: 'Final answer.' }],
|
|
431
|
-
stopReason: 'end_turn',
|
|
432
|
-
});
|
|
433
|
-
const session = makeSession();
|
|
434
|
-
const events = [];
|
|
435
|
-
for await (const event of runAgentTurn(session, 'deep investigate', new AbortController().signal)) {
|
|
436
|
-
events.push(event);
|
|
437
|
-
}
|
|
438
|
-
// Should complete without error
|
|
439
|
-
const doneEvent = events.find((e) => e.type === SSEEventType.Done);
|
|
440
|
-
expect(doneEvent).toBeDefined();
|
|
441
|
-
// The second FailoverProvider call (depth=1) should have been created
|
|
442
|
-
// Verify the sub-agent called explore and got nested results
|
|
443
|
-
const completeEvents = events.filter((e) => e.type === SSEEventType.SubagentEvent && e.event_type === 'complete');
|
|
444
|
-
expect(completeEvents.length).toBeGreaterThanOrEqual(1);
|
|
445
|
-
});
|
|
446
|
-
it('should propagate abort signal to sub-agent', async () => {
|
|
447
|
-
const controller = new AbortController();
|
|
448
|
-
// Parent calls explore
|
|
449
|
-
mockChat
|
|
450
|
-
.mockResolvedValueOnce({
|
|
451
|
-
content: [{ type: 'tool_use', id: 'explore-1', name: 'explore', input: { query: 'check' } }],
|
|
452
|
-
stopReason: 'tool_use',
|
|
453
|
-
})
|
|
454
|
-
// Sub-agent — abort before it can respond
|
|
455
|
-
.mockImplementationOnce(async () => {
|
|
456
|
-
controller.abort();
|
|
457
|
-
throw new Error('Request aborted');
|
|
458
|
-
});
|
|
459
|
-
const session = makeSession();
|
|
460
|
-
const events = [];
|
|
461
|
-
for await (const event of runAgentTurn(session, 'check', controller.signal)) {
|
|
462
|
-
events.push(event);
|
|
463
|
-
}
|
|
464
|
-
// Should have an error event from the sub-agent
|
|
465
|
-
const subagentError = events.find((e) => e.type === SSEEventType.SubagentEvent && e.event_type === 'error');
|
|
466
|
-
expect(subagentError).toBeDefined();
|
|
467
|
-
});
|
|
468
|
-
it('should stop sub-agent after maxTurns', async () => {
|
|
469
|
-
const chatCalls = [];
|
|
470
|
-
// Parent calls explore
|
|
471
|
-
mockChat
|
|
472
|
-
.mockResolvedValueOnce({
|
|
473
|
-
content: [{ type: 'tool_use', id: 'explore-1', name: 'explore', input: { query: 'loop test' } }],
|
|
474
|
-
stopReason: 'tool_use',
|
|
475
|
-
});
|
|
476
|
-
// Sub-agent keeps making tool calls for maxTurns (10)
|
|
477
|
-
for (let i = 0; i < 10; i++) {
|
|
478
|
-
mockChat.mockResolvedValueOnce({
|
|
479
|
-
content: [{
|
|
480
|
-
type: 'tool_use', id: `sub-req-${i}`, name: 'request',
|
|
481
|
-
input: { connection: 'test-api', method: 'GET', endpoint: `/data/${i}`, intent: 'read' },
|
|
482
|
-
}],
|
|
483
|
-
stopReason: 'tool_use',
|
|
484
|
-
usage: { inputTokens: 10, outputTokens: 5 },
|
|
485
|
-
});
|
|
486
|
-
}
|
|
487
|
-
// Parent after explore returns
|
|
488
|
-
mockChat.mockResolvedValueOnce({
|
|
489
|
-
content: [{ type: 'text', text: 'Done.' }],
|
|
490
|
-
stopReason: 'end_turn',
|
|
491
|
-
});
|
|
492
|
-
const session = makeSession({
|
|
493
|
-
runtime: {
|
|
494
|
-
...makeSession().runtime,
|
|
495
|
-
connectionsMap: {
|
|
496
|
-
'test-api': {
|
|
497
|
-
base_url: 'https://api.test.com',
|
|
498
|
-
_request_config: { auth: [] },
|
|
499
|
-
},
|
|
500
|
-
},
|
|
501
|
-
},
|
|
502
|
-
});
|
|
503
|
-
const fetchSpy = vi.spyOn(globalThis, 'fetch').mockResolvedValue(new Response(JSON.stringify({ ok: true }), { status: 200 }));
|
|
504
|
-
const events = [];
|
|
505
|
-
for await (const event of runAgentTurn(session, 'loop', new AbortController().signal)) {
|
|
506
|
-
events.push(event);
|
|
507
|
-
chatCalls.push({ type: event.type });
|
|
508
|
-
}
|
|
509
|
-
// Sub-agent should have made at most maxTurns (10) chat calls
|
|
510
|
-
// Total mockChat calls: 1 (parent explore) + 10 (sub-agent turns) + 1 (parent continue) = 12
|
|
511
|
-
// But the sub-agent stops at turn 10 (it keeps calling tools without text, no break)
|
|
512
|
-
// The result should be "No findings." since it never produced text
|
|
513
|
-
const toolResult = events.find((e) => e.type === SSEEventType.ToolCallResult && e.tool_id === 'explore-1');
|
|
514
|
-
expect(toolResult).toBeDefined();
|
|
515
|
-
fetchSpy.mockRestore();
|
|
516
|
-
});
|
|
517
|
-
it('should handle sub-agent LLM errors gracefully', async () => {
|
|
518
|
-
// Parent calls explore
|
|
519
|
-
mockChat
|
|
520
|
-
.mockResolvedValueOnce({
|
|
521
|
-
content: [{ type: 'tool_use', id: 'explore-1', name: 'explore', input: { query: 'fail test' } }],
|
|
522
|
-
stopReason: 'tool_use',
|
|
523
|
-
})
|
|
524
|
-
// Sub-agent LLM call fails
|
|
525
|
-
.mockRejectedValueOnce(new Error('Sub-agent rate limited'))
|
|
526
|
-
// Parent continues with error result
|
|
527
|
-
.mockResolvedValueOnce({
|
|
528
|
-
content: [{ type: 'text', text: 'Explore failed, trying directly.' }],
|
|
529
|
-
stopReason: 'end_turn',
|
|
530
|
-
});
|
|
531
|
-
const session = makeSession();
|
|
532
|
-
const events = [];
|
|
533
|
-
for await (const event of runAgentTurn(session, 'fail test', new AbortController().signal)) {
|
|
534
|
-
events.push(event);
|
|
535
|
-
}
|
|
536
|
-
// Should have a subagent error event
|
|
537
|
-
const subagentError = events.find((e) => e.type === SSEEventType.SubagentEvent && e.event_type === 'error');
|
|
538
|
-
expect(subagentError).toBeDefined();
|
|
539
|
-
if (subagentError && subagentError.type === SSEEventType.SubagentEvent) {
|
|
540
|
-
expect(subagentError.error).toContain('Sub-agent rate limited');
|
|
541
|
-
}
|
|
542
|
-
// ToolCallResult should indicate error
|
|
543
|
-
const toolResult = events.find((e) => e.type === SSEEventType.ToolCallResult && e.tool_id === 'explore-1');
|
|
544
|
-
expect(toolResult).toBeDefined();
|
|
545
|
-
if (toolResult && toolResult.type === SSEEventType.ToolCallResult) {
|
|
546
|
-
expect(toolResult.status).toBe('error');
|
|
547
|
-
expect(toolResult.error).toContain('Sub-agent rate limited');
|
|
548
|
-
}
|
|
549
|
-
});
|
|
550
|
-
});
|
|
551
|
-
});
|
|
552
|
-
//# sourceMappingURL=agent-runner.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"agent-runner.test.js","sourceRoot":"","sources":["../../../src/agent/agent-runner.test.ts"],"names":[],"mappings":"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"}
|