agent-manager.session-reuse.test.js
2.24 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
import { describe, it, expect, vi, beforeEach } from 'vitest';
const AgentManager = require('../../core/agent-manager');
// Mock logging to prevent initialization issues
vi.mock('../../core/logging', () => ({
getGlobalLogManager: () => ({
initialized: false,
getOrCreateSession: () => null,
}),
waitForGlobalLogManager: () => Promise.resolve(),
}));
describe('AgentManager ACP session reuse', () => {
let manager;
const testConfig = {
clients: {
'claude-local': {
type: 'process',
command: 'claude',
args: ['--print'],
},
},
agents: {
'claude-coder': {
type: 'executor',
protocol: 'acp',
transport: 'pipe',
client: 'claude-local',
prompt: './agents/coder.md',
},
},
};
beforeEach(() => {
manager = new AgentManager(testConfig, '/tmp/test-workdir');
// Mock hookRunner to return Promises
manager.hookRunner = {
run: vi.fn().mockResolvedValue(undefined),
};
// Mock prompt builder
manager.buildFullPrompt = vi.fn((name, task) => task);
});
it('reuses session pool for repeated calls of the same agent', async () => {
let callCount = 0;
// Mock _runViaProtocol to bypass SessionPool and stream-executor
manager._runViaProtocol = vi.fn(async (agentName, agent, resolved, fullPrompt) => {
callCount++;
return { agent: agentName, output: `OUTPUT:${fullPrompt}`, status: 'success' };
});
const r1 = await manager.callAgent('claude-coder', 'P1');
const r2 = await manager.callAgent('claude-coder', 'P2');
expect(r1.output).toBe('OUTPUT:P1');
expect(r2.output).toBe('OUTPUT:P2');
expect(manager._runViaProtocol).toHaveBeenCalledTimes(2);
});
it('propagates transport error and calls post-task-failure hook', async () => {
const transportError = new Error('Transport closed');
manager._runViaProtocol = vi.fn()
.mockRejectedValueOnce(transportError);
await expect(manager.callAgent('claude-coder', 'P1')).rejects.toThrow('Transport closed');
// post-task-failure hook should have been called
const failureCalls = manager.hookRunner.run.mock.calls.filter(
c => c[0] === 'post-task-failure'
);
expect(failureCalls.length).toBe(1);
});
});