refactor: integrate SessionManager into daemon and agent

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
William Valentin
2026-02-05 00:43:09 -08:00
parent f671ea5ab5
commit fb7575f850
3 changed files with 78 additions and 86 deletions
+45 -55
View File
@@ -1,79 +1,69 @@
import { describe, it, expect, vi } from 'vitest';
import { describe, it, expect, vi, beforeEach } from 'vitest';
import { NativeAgent } from './agent.js';
import type { ModelClient, ChatResponse } from '../../models/types.js';
describe('NativeAgent', () => {
it('processes message and returns response', async () => {
const mockClient: ModelClient = {
chat: vi.fn().mockResolvedValue({
content: 'Hello! How can I help you?',
stopReason: 'end_turn',
usage: { inputTokens: 10, outputTokens: 8 },
} satisfies ChatResponse),
};
const agent = new NativeAgent({
modelClient: mockClient,
systemPrompt: 'You are Flynn, a helpful assistant.',
});
const response = await agent.process('Hello');
expect(response).toBe('Hello! How can I help you?');
expect(mockClient.chat).toHaveBeenCalledWith({
messages: [{ role: 'user', content: 'Hello' }],
system: 'You are Flynn, a helpful assistant.',
});
const createMockClient = (): ModelClient => ({
chat: vi.fn().mockResolvedValue({
content: 'Hello!',
stopReason: 'end_turn',
usage: { inputTokens: 10, outputTokens: 5 },
} satisfies ChatResponse),
});
it('maintains conversation history', async () => {
const mockClient: ModelClient = {
chat: vi.fn().mockResolvedValue({
content: 'Response',
stopReason: 'end_turn',
usage: { inputTokens: 10, outputTokens: 5 },
} satisfies ChatResponse),
};
it('processes messages and maintains history', async () => {
const mockClient = createMockClient();
const agent = new NativeAgent({
modelClient: mockClient,
systemPrompt: 'System',
systemPrompt: 'You are helpful.',
});
await agent.process('First message');
await agent.process('Second message');
const response = await agent.process('Hi');
expect(mockClient.chat).toHaveBeenLastCalledWith({
messages: [
{ role: 'user', content: 'First message' },
{ role: 'assistant', content: 'Response' },
{ role: 'user', content: 'Second message' },
],
system: 'System',
expect(response).toBe('Hello!');
expect(mockClient.chat).toHaveBeenCalledWith({
messages: [{ role: 'user', content: 'Hi' }],
system: 'You are helpful.',
});
const history = agent.getHistory();
expect(history).toHaveLength(2);
expect(history[0]).toEqual({ role: 'user', content: 'Hi' });
expect(history[1]).toEqual({ role: 'assistant', content: 'Hello!' });
});
it('resets conversation history', async () => {
const mockClient: ModelClient = {
chat: vi.fn().mockResolvedValue({
content: 'Response',
stopReason: 'end_turn',
usage: { inputTokens: 10, outputTokens: 5 },
} satisfies ChatResponse),
const mockClient = createMockClient();
const agent = new NativeAgent({
modelClient: mockClient,
systemPrompt: 'You are helpful.',
});
await agent.process('Hi');
agent.reset();
expect(agent.getHistory()).toHaveLength(0);
});
it('uses session when provided', async () => {
const mockClient = createMockClient();
const mockSession = {
id: 'test-session',
getHistory: vi.fn().mockReturnValue([]),
addMessage: vi.fn(),
clear: vi.fn(),
};
const agent = new NativeAgent({
modelClient: mockClient,
systemPrompt: 'System',
systemPrompt: 'You are helpful.',
session: mockSession,
});
await agent.process('Message 1');
agent.reset();
await agent.process('Message 2');
await agent.process('Hi');
expect(mockClient.chat).toHaveBeenLastCalledWith({
messages: [{ role: 'user', content: 'Message 2' }],
system: 'System',
});
expect(mockSession.addMessage).toHaveBeenCalledTimes(2);
expect(mockSession.addMessage).toHaveBeenNthCalledWith(1, { role: 'user', content: 'Hi' });
expect(mockSession.addMessage).toHaveBeenNthCalledWith(2, { role: 'assistant', content: 'Hello!' });
});
});