@amodalai/runtime 0.1.15 → 0.1.17

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 (121) hide show
  1. package/dist/src/agent/agent-runner.js +13 -1
  2. package/dist/src/agent/agent-runner.js.map +1 -1
  3. package/dist/src/agent/config-watcher.d.ts +2 -2
  4. package/dist/src/agent/config-watcher.js +28 -15
  5. package/dist/src/agent/config-watcher.js.map +1 -1
  6. package/dist/src/agent/config-watcher.test.js +13 -4
  7. package/dist/src/agent/config-watcher.test.js.map +1 -1
  8. package/dist/src/agent/eval-store.d.ts +14 -0
  9. package/dist/src/agent/eval-store.js +44 -0
  10. package/dist/src/agent/eval-store.js.map +1 -1
  11. package/dist/src/agent/feedback-store.d.ts +39 -0
  12. package/dist/src/agent/feedback-store.js +98 -0
  13. package/dist/src/agent/feedback-store.js.map +1 -0
  14. package/dist/src/agent/local-server.d.ts +1 -1
  15. package/dist/src/agent/local-server.js +48 -28
  16. package/dist/src/agent/local-server.js.map +1 -1
  17. package/dist/src/agent/local-server.test.js +2 -1
  18. package/dist/src/agent/local-server.test.js.map +1 -1
  19. package/dist/src/agent/proactive/proactive-runner.d.ts +3 -3
  20. package/dist/src/agent/proactive/proactive-runner.js +3 -3
  21. package/dist/src/agent/proactive/proactive-runner.js.map +1 -1
  22. package/dist/src/agent/proactive/proactive-runner.test.js +2 -2
  23. package/dist/src/agent/proactive/proactive-runner.test.js.map +1 -1
  24. package/dist/src/agent/routes/admin-chat.d.ts +3 -2
  25. package/dist/src/agent/routes/admin-chat.js +3 -3
  26. package/dist/src/agent/routes/admin-chat.js.map +1 -1
  27. package/dist/src/agent/routes/chat.d.ts +6 -6
  28. package/dist/src/agent/routes/chat.js +3 -3
  29. package/dist/src/agent/routes/chat.js.map +1 -1
  30. package/dist/src/agent/routes/chat.test.js +7 -6
  31. package/dist/src/agent/routes/chat.test.js.map +1 -1
  32. package/dist/src/agent/routes/evals.d.ts +2 -2
  33. package/dist/src/agent/routes/evals.js +143 -68
  34. package/dist/src/agent/routes/evals.js.map +1 -1
  35. package/dist/src/agent/routes/feedback.d.ts +11 -0
  36. package/dist/src/agent/routes/feedback.js +72 -0
  37. package/dist/src/agent/routes/feedback.js.map +1 -0
  38. package/dist/src/agent/routes/files.js +118 -12
  39. package/dist/src/agent/routes/files.js.map +1 -1
  40. package/dist/src/agent/routes/inspect.d.ts +2 -2
  41. package/dist/src/agent/routes/inspect.js +44 -22
  42. package/dist/src/agent/routes/inspect.js.map +1 -1
  43. package/dist/src/agent/routes/inspect.test.js +11 -16
  44. package/dist/src/agent/routes/inspect.test.js.map +1 -1
  45. package/dist/src/agent/routes/task.d.ts +2 -2
  46. package/dist/src/agent/routes/task.js +4 -4
  47. package/dist/src/agent/routes/task.js.map +1 -1
  48. package/dist/src/agent/routes/task.test.js.map +1 -1
  49. package/dist/src/agent/session-store.d.ts +2 -2
  50. package/dist/src/agent/session-store.js +9 -6
  51. package/dist/src/agent/session-store.js.map +1 -1
  52. package/dist/src/agent/snapshot-server.js +10 -2
  53. package/dist/src/agent/snapshot-server.js.map +1 -1
  54. package/dist/src/cron/heartbeat-runner.d.ts +3 -6
  55. package/dist/src/cron/heartbeat-runner.js +1 -10
  56. package/dist/src/cron/heartbeat-runner.js.map +1 -1
  57. package/dist/src/index.d.ts +5 -3
  58. package/dist/src/index.js +4 -9
  59. package/dist/src/index.js.map +1 -1
  60. package/dist/src/middleware/auth.d.ts +3 -19
  61. package/dist/src/middleware/auth.js +0 -118
  62. package/dist/src/middleware/auth.js.map +1 -1
  63. package/dist/src/routes/ai-stream.d.ts +8 -7
  64. package/dist/src/routes/ai-stream.js +3 -16
  65. package/dist/src/routes/ai-stream.js.map +1 -1
  66. package/dist/src/routes/chat-stream.d.ts +4 -3
  67. package/dist/src/routes/chat-stream.js +5 -17
  68. package/dist/src/routes/chat-stream.js.map +1 -1
  69. package/dist/src/routes/chat.d.ts +4 -2
  70. package/dist/src/routes/chat.js +2 -14
  71. package/dist/src/routes/chat.js.map +1 -1
  72. package/dist/src/routes/chat.test.js +2 -2
  73. package/dist/src/routes/chat.test.js.map +1 -1
  74. package/dist/src/server.d.ts +16 -3
  75. package/dist/src/server.js +24 -27
  76. package/dist/src/server.js.map +1 -1
  77. package/dist/src/server.test.js +37 -6
  78. package/dist/src/server.test.js.map +1 -1
  79. package/dist/src/session/admin-file-tools.d.ts +136 -0
  80. package/dist/src/session/admin-file-tools.js +240 -0
  81. package/dist/src/session/admin-file-tools.js.map +1 -0
  82. package/dist/src/session/custom-tool-adapter.d.ts +74 -0
  83. package/dist/src/session/custom-tool-adapter.js +149 -0
  84. package/dist/src/session/custom-tool-adapter.js.map +1 -0
  85. package/dist/src/session/session-manager.d.ts +101 -3
  86. package/dist/src/session/session-manager.js +467 -31
  87. package/dist/src/session/session-manager.js.map +1 -1
  88. package/dist/src/session/session-manager.test.js +93 -58
  89. package/dist/src/session/session-manager.test.js.map +1 -1
  90. package/dist/src/session/session-runner.d.ts +29 -13
  91. package/dist/src/session/session-runner.js +40 -91
  92. package/dist/src/session/session-runner.js.map +1 -1
  93. package/dist/src/session/session-runner.test.js +70 -80
  94. package/dist/src/session/session-runner.test.js.map +1 -1
  95. package/dist/src/types.d.ts +1 -0
  96. package/dist/tsconfig.tsbuildinfo +1 -1
  97. package/package.json +2 -2
  98. package/dist/src/agent/agent-runner.test.d.ts +0 -6
  99. package/dist/src/agent/agent-runner.test.js +0 -552
  100. package/dist/src/agent/agent-runner.test.js.map +0 -1
  101. package/dist/src/agent/session-manager.d.ts +0 -88
  102. package/dist/src/agent/session-manager.js +0 -341
  103. package/dist/src/agent/session-manager.js.map +0 -1
  104. package/dist/src/agent/session-manager.test.d.ts +0 -6
  105. package/dist/src/agent/session-manager.test.js +0 -145
  106. package/dist/src/agent/session-manager.test.js.map +0 -1
  107. package/dist/src/audit/audit-client.d.ts +0 -46
  108. package/dist/src/audit/audit-client.js +0 -83
  109. package/dist/src/audit/audit-client.js.map +0 -1
  110. package/dist/src/middleware/auth.test.d.ts +0 -6
  111. package/dist/src/middleware/auth.test.js +0 -260
  112. package/dist/src/middleware/auth.test.js.map +0 -1
  113. package/dist/src/routes/sessions.d.ts +0 -14
  114. package/dist/src/routes/sessions.js +0 -82
  115. package/dist/src/routes/sessions.js.map +0 -1
  116. package/dist/src/utils/jwt-verify.d.ts +0 -19
  117. package/dist/src/utils/jwt-verify.js +0 -32
  118. package/dist/src/utils/jwt-verify.js.map +0 -1
  119. package/dist/src/utils/jwt-verify.test.d.ts +0 -6
  120. package/dist/src/utils/jwt-verify.test.js +0 -150
  121. package/dist/src/utils/jwt-verify.test.js.map +0 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@amodalai/runtime",
3
- "version": "0.1.15",
3
+ "version": "0.1.17",
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.15"
29
+ "@amodalai/core": "0.1.17"
30
30
  },
31
31
  "devDependencies": {
32
32
  "@types/express": "^4.17.21",
@@ -1,6 +0,0 @@
1
- /**
2
- * @license
3
- * Copyright 2025 Amodal Labs, Inc.
4
- * SPDX-License-Identifier: MIT
5
- */
6
- export {};
@@ -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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"}