@sdsrs/codeagent 0.2.0 → 0.3.0
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/LICENSE +0 -0
- package/README.md +18 -6
- package/dist/adapters/__tests__/code-graph.test.d.ts +2 -0
- package/dist/adapters/__tests__/code-graph.test.d.ts.map +1 -0
- package/dist/adapters/__tests__/code-graph.test.js +83 -0
- package/dist/adapters/__tests__/code-graph.test.js.map +1 -0
- package/dist/adapters/__tests__/memory.test.d.ts +2 -0
- package/dist/adapters/__tests__/memory.test.d.ts.map +1 -0
- package/dist/adapters/__tests__/memory.test.js +150 -0
- package/dist/adapters/__tests__/memory.test.js.map +1 -0
- package/dist/adapters/code-graph.d.ts +3 -0
- package/dist/adapters/code-graph.d.ts.map +1 -1
- package/dist/adapters/code-graph.js +23 -19
- package/dist/adapters/code-graph.js.map +1 -1
- package/dist/adapters/memory.d.ts +1 -0
- package/dist/adapters/memory.d.ts.map +1 -1
- package/dist/adapters/memory.js +12 -7
- package/dist/adapters/memory.js.map +1 -1
- package/dist/adapters/orchestration/gsd.d.ts +0 -0
- package/dist/adapters/orchestration/gsd.d.ts.map +1 -1
- package/dist/adapters/orchestration/gsd.js +18 -1
- package/dist/adapters/orchestration/gsd.js.map +1 -1
- package/dist/adapters/orchestration/interface.d.ts +0 -0
- package/dist/adapters/orchestration/interface.d.ts.map +0 -0
- package/dist/adapters/orchestration/interface.js +0 -0
- package/dist/adapters/orchestration/interface.js.map +0 -0
- package/dist/adapters/orchestration/superpowers.d.ts +0 -0
- package/dist/adapters/orchestration/superpowers.d.ts.map +0 -0
- package/dist/adapters/orchestration/superpowers.js +1 -1
- package/dist/adapters/orchestration/superpowers.js.map +1 -1
- package/dist/broker/__tests__/broker.test.d.ts +2 -0
- package/dist/broker/__tests__/broker.test.d.ts.map +1 -0
- package/dist/broker/__tests__/broker.test.js +125 -0
- package/dist/broker/__tests__/broker.test.js.map +1 -0
- package/dist/broker/__tests__/compressor.test.d.ts +2 -0
- package/dist/broker/__tests__/compressor.test.d.ts.map +1 -0
- package/dist/broker/__tests__/compressor.test.js +145 -0
- package/dist/broker/__tests__/compressor.test.js.map +1 -0
- package/dist/broker/__tests__/query-parser.test.d.ts +2 -0
- package/dist/broker/__tests__/query-parser.test.d.ts.map +1 -0
- package/dist/broker/__tests__/query-parser.test.js +101 -0
- package/dist/broker/__tests__/query-parser.test.js.map +1 -0
- package/dist/broker/broker.d.ts +0 -0
- package/dist/broker/broker.d.ts.map +1 -1
- package/dist/broker/broker.js +21 -14
- package/dist/broker/broker.js.map +1 -1
- package/dist/broker/compressor.d.ts +0 -0
- package/dist/broker/compressor.d.ts.map +1 -1
- package/dist/broker/compressor.js +35 -1
- package/dist/broker/compressor.js.map +1 -1
- package/dist/broker/context-pack.d.ts +0 -0
- package/dist/broker/context-pack.d.ts.map +0 -0
- package/dist/broker/context-pack.js +0 -0
- package/dist/broker/context-pack.js.map +0 -0
- package/dist/broker/query-parser.d.ts +0 -0
- package/dist/broker/query-parser.d.ts.map +0 -0
- package/dist/broker/query-parser.js +1 -1
- package/dist/broker/query-parser.js.map +1 -1
- package/dist/cli/commands/chat.d.ts +0 -0
- package/dist/cli/commands/chat.d.ts.map +1 -1
- package/dist/cli/commands/chat.js +19 -4
- package/dist/cli/commands/chat.js.map +1 -1
- package/dist/cli/commands/config.d.ts +1 -2
- package/dist/cli/commands/config.d.ts.map +1 -1
- package/dist/cli/commands/config.js +0 -0
- package/dist/cli/commands/config.js.map +0 -0
- package/dist/cli/commands/memory.d.ts +0 -0
- package/dist/cli/commands/memory.d.ts.map +0 -0
- package/dist/cli/commands/memory.js +0 -0
- package/dist/cli/commands/memory.js.map +0 -0
- package/dist/cli/commands/search.d.ts +0 -0
- package/dist/cli/commands/search.d.ts.map +1 -1
- package/dist/cli/commands/search.js +6 -4
- package/dist/cli/commands/search.js.map +1 -1
- package/dist/cli/commands/session.d.ts +0 -0
- package/dist/cli/commands/session.d.ts.map +0 -0
- package/dist/cli/commands/session.js +0 -0
- package/dist/cli/commands/session.js.map +0 -0
- package/dist/cli/index.d.ts +0 -0
- package/dist/cli/index.d.ts.map +0 -0
- package/dist/cli/index.js +10 -5
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/tui/renderer.d.ts +0 -0
- package/dist/cli/tui/renderer.d.ts.map +1 -1
- package/dist/cli/tui/renderer.js +4 -1
- package/dist/cli/tui/renderer.js.map +1 -1
- package/dist/hooks/post-compact.d.ts +0 -0
- package/dist/hooks/post-compact.d.ts.map +0 -0
- package/dist/hooks/post-compact.js +1 -1
- package/dist/hooks/post-compact.js.map +1 -1
- package/dist/hooks/session-start.d.ts +0 -0
- package/dist/hooks/session-start.d.ts.map +0 -0
- package/dist/hooks/session-start.js +2 -1
- package/dist/hooks/session-start.js.map +1 -1
- package/dist/hooks/stop.d.ts +0 -0
- package/dist/hooks/stop.d.ts.map +0 -0
- package/dist/hooks/stop.js +1 -1
- package/dist/hooks/stop.js.map +1 -1
- package/dist/hooks/user-prompt.d.ts +0 -0
- package/dist/hooks/user-prompt.d.ts.map +0 -0
- package/dist/hooks/user-prompt.js +1 -1
- package/dist/hooks/user-prompt.js.map +1 -1
- package/dist/providers/__tests__/anthropic-api.test.d.ts +2 -0
- package/dist/providers/__tests__/anthropic-api.test.d.ts.map +1 -0
- package/dist/providers/__tests__/anthropic-api.test.js +113 -0
- package/dist/providers/__tests__/anthropic-api.test.js.map +1 -0
- package/dist/providers/__tests__/claude-sdk.test.d.ts +2 -0
- package/dist/providers/__tests__/claude-sdk.test.d.ts.map +1 -0
- package/dist/providers/__tests__/claude-sdk.test.js +121 -0
- package/dist/providers/__tests__/claude-sdk.test.js.map +1 -0
- package/dist/providers/anthropic-api.d.ts +1 -0
- package/dist/providers/anthropic-api.d.ts.map +1 -1
- package/dist/providers/anthropic-api.js +16 -4
- package/dist/providers/anthropic-api.js.map +1 -1
- package/dist/providers/claude-cli.d.ts +0 -0
- package/dist/providers/claude-cli.d.ts.map +0 -0
- package/dist/providers/claude-cli.js +0 -0
- package/dist/providers/claude-cli.js.map +0 -0
- package/dist/providers/claude-sdk.d.ts +0 -0
- package/dist/providers/claude-sdk.d.ts.map +0 -0
- package/dist/providers/claude-sdk.js +2 -2
- package/dist/providers/claude-sdk.js.map +1 -1
- package/dist/providers/interface.d.ts +1 -0
- package/dist/providers/interface.d.ts.map +1 -1
- package/dist/providers/interface.js +0 -0
- package/dist/providers/interface.js.map +0 -0
- package/dist/scripts/install-hooks.d.ts +2 -2
- package/dist/scripts/install-hooks.d.ts.map +0 -0
- package/dist/scripts/install-hooks.js +6 -9
- package/dist/scripts/install-hooks.js.map +1 -1
- package/dist/session/__tests__/manager.test.d.ts +2 -0
- package/dist/session/__tests__/manager.test.d.ts.map +1 -0
- package/dist/session/__tests__/manager.test.js +108 -0
- package/dist/session/__tests__/manager.test.js.map +1 -0
- package/dist/session/manager.d.ts +0 -0
- package/dist/session/manager.d.ts.map +1 -1
- package/dist/session/manager.js +3 -2
- package/dist/session/manager.js.map +1 -1
- package/dist/session/schema.d.ts +0 -0
- package/dist/session/schema.d.ts.map +1 -1
- package/dist/session/schema.js +14 -6
- package/dist/session/schema.js.map +1 -1
- package/dist/utils/__tests__/exec.test.d.ts +2 -0
- package/dist/utils/__tests__/exec.test.d.ts.map +1 -0
- package/dist/utils/__tests__/exec.test.js +104 -0
- package/dist/utils/__tests__/exec.test.js.map +1 -0
- package/dist/utils/__tests__/tokens.test.d.ts +2 -0
- package/dist/utils/__tests__/tokens.test.d.ts.map +1 -0
- package/dist/utils/__tests__/tokens.test.js +64 -0
- package/dist/utils/__tests__/tokens.test.js.map +1 -0
- package/dist/utils/exec.d.ts +16 -0
- package/dist/utils/exec.d.ts.map +1 -1
- package/dist/utils/exec.js +33 -3
- package/dist/utils/exec.js.map +1 -1
- package/dist/utils/tokens.d.ts +0 -0
- package/dist/utils/tokens.d.ts.map +1 -1
- package/dist/utils/tokens.js +2 -0
- package/dist/utils/tokens.js.map +1 -1
- package/package.json +3 -2
- package/src/skills/brainstorm.md +0 -0
- package/src/skills/remember.md +0 -0
- package/src/skills/review.md +0 -0
- package/src/skills/spec.md +0 -0
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import { describe, it, expect, vi, beforeEach } from 'vitest';
|
|
2
|
+
// Mock the Anthropic SDK
|
|
3
|
+
vi.mock('@anthropic-ai/sdk', () => {
|
|
4
|
+
return {
|
|
5
|
+
default: vi.fn().mockImplementation(() => ({
|
|
6
|
+
messages: {
|
|
7
|
+
stream: vi.fn(),
|
|
8
|
+
},
|
|
9
|
+
})),
|
|
10
|
+
};
|
|
11
|
+
});
|
|
12
|
+
import { AnthropicAPIProvider } from '../anthropic-api.js';
|
|
13
|
+
function createMockStream(text, usage = { input_tokens: 100, output_tokens: 50 }) {
|
|
14
|
+
const events = [
|
|
15
|
+
{ type: 'content_block_delta', delta: { type: 'text_delta', text } },
|
|
16
|
+
];
|
|
17
|
+
return {
|
|
18
|
+
[Symbol.asyncIterator]: async function* () {
|
|
19
|
+
for (const e of events)
|
|
20
|
+
yield e;
|
|
21
|
+
},
|
|
22
|
+
finalMessage: async () => ({
|
|
23
|
+
usage,
|
|
24
|
+
model: 'claude-sonnet-4-20250514',
|
|
25
|
+
}),
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
describe('AnthropicAPIProvider', () => {
|
|
29
|
+
let provider;
|
|
30
|
+
beforeEach(() => {
|
|
31
|
+
vi.clearAllMocks();
|
|
32
|
+
provider = new AnthropicAPIProvider({ apiKey: 'test-key' });
|
|
33
|
+
});
|
|
34
|
+
it('starts a session with api- prefix', async () => {
|
|
35
|
+
const handle = await provider.startSession();
|
|
36
|
+
expect(handle.sessionId).toMatch(/^api-/);
|
|
37
|
+
});
|
|
38
|
+
it('streams text from API response', async () => {
|
|
39
|
+
const handle = await provider.startSession();
|
|
40
|
+
// Get the mock client from the provider
|
|
41
|
+
const client = provider.client;
|
|
42
|
+
client.messages.stream.mockReturnValue(createMockStream('Hello from API'));
|
|
43
|
+
const events = [];
|
|
44
|
+
for await (const event of provider.sendTurn(handle, { userMessage: 'hello' })) {
|
|
45
|
+
events.push(event);
|
|
46
|
+
}
|
|
47
|
+
expect(events.find((e) => e.type === 'text')).toBeDefined();
|
|
48
|
+
expect(events.find((e) => e.type === 'text').content).toBe('Hello from API');
|
|
49
|
+
const done = events.find((e) => e.type === 'done');
|
|
50
|
+
expect(done).toBeDefined();
|
|
51
|
+
expect(done.metadata?.inputTokens).toBe(100);
|
|
52
|
+
expect(done.metadata?.outputTokens).toBe(50);
|
|
53
|
+
});
|
|
54
|
+
it('maintains message history per session', async () => {
|
|
55
|
+
const handle = await provider.startSession();
|
|
56
|
+
const client = provider.client;
|
|
57
|
+
// First turn
|
|
58
|
+
client.messages.stream.mockReturnValue(createMockStream('First response'));
|
|
59
|
+
for await (const _ of provider.sendTurn(handle, { userMessage: 'first' })) { /* consume */ }
|
|
60
|
+
// Second turn — should include history
|
|
61
|
+
client.messages.stream.mockReturnValue(createMockStream('Second response'));
|
|
62
|
+
for await (const _ of provider.sendTurn(handle, { userMessage: 'second' })) { /* consume */ }
|
|
63
|
+
// Check that the second call included history
|
|
64
|
+
const calls = client.messages.stream.mock.calls;
|
|
65
|
+
expect(calls).toHaveLength(2);
|
|
66
|
+
expect(calls[1][0].messages).toHaveLength(4); // user, assistant, user, assistant accumulated
|
|
67
|
+
});
|
|
68
|
+
it('uses per-session model', async () => {
|
|
69
|
+
const handle1 = await provider.startSession({ model: 'claude-opus-4-6' });
|
|
70
|
+
const handle2 = await provider.startSession({ model: 'claude-haiku-4-5-20251001' });
|
|
71
|
+
const client = provider.client;
|
|
72
|
+
client.messages.stream.mockReturnValue(createMockStream('r'));
|
|
73
|
+
for await (const _ of provider.sendTurn(handle1, { userMessage: 'x' })) { /* consume */ }
|
|
74
|
+
expect(client.messages.stream.mock.calls[0][0].model).toBe('claude-opus-4-6');
|
|
75
|
+
client.messages.stream.mockReturnValue(createMockStream('r'));
|
|
76
|
+
for await (const _ of provider.sendTurn(handle2, { userMessage: 'x' })) { /* consume */ }
|
|
77
|
+
expect(client.messages.stream.mock.calls[1][0].model).toBe('claude-haiku-4-5-20251001');
|
|
78
|
+
});
|
|
79
|
+
it('handles API errors gracefully', async () => {
|
|
80
|
+
const handle = await provider.startSession();
|
|
81
|
+
const client = provider.client;
|
|
82
|
+
client.messages.stream.mockImplementation(() => {
|
|
83
|
+
throw new Error('Rate limited');
|
|
84
|
+
});
|
|
85
|
+
const events = [];
|
|
86
|
+
for await (const event of provider.sendTurn(handle, { userMessage: 'test' })) {
|
|
87
|
+
events.push(event);
|
|
88
|
+
}
|
|
89
|
+
expect(events[0].type).toBe('error');
|
|
90
|
+
expect(events[0].content).toContain('Rate limited');
|
|
91
|
+
});
|
|
92
|
+
it('cleans up on endSession', async () => {
|
|
93
|
+
const handle = await provider.startSession();
|
|
94
|
+
await provider.endSession(handle);
|
|
95
|
+
// Verify internal maps are cleaned
|
|
96
|
+
const history = provider.messageHistory;
|
|
97
|
+
const models = provider.sessionModels;
|
|
98
|
+
expect(history.has(handle.sessionId)).toBe(false);
|
|
99
|
+
expect(models.has(handle.sessionId)).toBe(false);
|
|
100
|
+
});
|
|
101
|
+
it('caps message history at 50', async () => {
|
|
102
|
+
const handle = await provider.startSession();
|
|
103
|
+
const client = provider.client;
|
|
104
|
+
// Simulate 30 turns (60 messages)
|
|
105
|
+
for (let i = 0; i < 30; i++) {
|
|
106
|
+
client.messages.stream.mockReturnValue(createMockStream(`r${i}`));
|
|
107
|
+
for await (const _ of provider.sendTurn(handle, { userMessage: `m${i}` })) { /* consume */ }
|
|
108
|
+
}
|
|
109
|
+
const history = provider.messageHistory;
|
|
110
|
+
expect(history.get(handle.sessionId).length).toBeLessThanOrEqual(50);
|
|
111
|
+
});
|
|
112
|
+
});
|
|
113
|
+
//# sourceMappingURL=anthropic-api.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"anthropic-api.test.js","sourceRoot":"","sources":["../../../src/providers/__tests__/anthropic-api.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-sdk.test.d.ts","sourceRoot":"","sources":["../../../src/providers/__tests__/claude-sdk.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import { describe, it, expect, vi, beforeEach } from 'vitest';
|
|
2
|
+
import { ClaudeSDKProvider } from '../claude-sdk.js';
|
|
3
|
+
// Mock the Agent SDK — query() returns an async generator
|
|
4
|
+
vi.mock('@anthropic-ai/claude-agent-sdk', () => ({
|
|
5
|
+
query: vi.fn(),
|
|
6
|
+
}));
|
|
7
|
+
import { query } from '@anthropic-ai/claude-agent-sdk';
|
|
8
|
+
const mockQuery = vi.mocked(query);
|
|
9
|
+
function createMockQuery(messages) {
|
|
10
|
+
const gen = (async function* () {
|
|
11
|
+
for (const msg of messages)
|
|
12
|
+
yield msg;
|
|
13
|
+
})();
|
|
14
|
+
return Object.assign(gen, {
|
|
15
|
+
close: vi.fn(),
|
|
16
|
+
interrupt: vi.fn(),
|
|
17
|
+
rewindFiles: vi.fn(),
|
|
18
|
+
setPermissionMode: vi.fn(),
|
|
19
|
+
setModel: vi.fn(),
|
|
20
|
+
initializationResult: vi.fn(),
|
|
21
|
+
supportedCommands: vi.fn(),
|
|
22
|
+
supportedModels: vi.fn(),
|
|
23
|
+
supportedAgents: vi.fn(),
|
|
24
|
+
mcpServerStatus: vi.fn(),
|
|
25
|
+
reconnectMcpServer: vi.fn(),
|
|
26
|
+
toggleMcpServer: vi.fn(),
|
|
27
|
+
setMcpServers: vi.fn(),
|
|
28
|
+
streamInput: vi.fn(),
|
|
29
|
+
stopTask: vi.fn(),
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
describe('ClaudeSDKProvider', () => {
|
|
33
|
+
let provider;
|
|
34
|
+
beforeEach(() => {
|
|
35
|
+
vi.clearAllMocks();
|
|
36
|
+
provider = new ClaudeSDKProvider();
|
|
37
|
+
});
|
|
38
|
+
it('starts a session with sdk- prefix ID', async () => {
|
|
39
|
+
const handle = await provider.startSession();
|
|
40
|
+
expect(handle.sessionId).toMatch(/^sdk-/);
|
|
41
|
+
});
|
|
42
|
+
it('resumes a session preserving provider ID', async () => {
|
|
43
|
+
const handle = await provider.resumeSession('prev-session-123');
|
|
44
|
+
expect(handle.providerSessionId).toBe('prev-session-123');
|
|
45
|
+
});
|
|
46
|
+
it('streams text events from assistant messages', async () => {
|
|
47
|
+
const q = createMockQuery([
|
|
48
|
+
{ type: 'system', session_id: 'real-id-123' },
|
|
49
|
+
{
|
|
50
|
+
type: 'assistant',
|
|
51
|
+
message: {
|
|
52
|
+
content: [{ type: 'text', text: 'Hello world' }],
|
|
53
|
+
},
|
|
54
|
+
},
|
|
55
|
+
{ type: 'result', subtype: 'success', result: 'Done', total_cost_usd: 0.01 },
|
|
56
|
+
]);
|
|
57
|
+
mockQuery.mockReturnValue(q);
|
|
58
|
+
const handle = await provider.startSession();
|
|
59
|
+
const events = [];
|
|
60
|
+
for await (const event of provider.sendTurn(handle, { userMessage: 'hi' })) {
|
|
61
|
+
events.push(event);
|
|
62
|
+
}
|
|
63
|
+
expect(events).toContainEqual({ type: 'text', content: 'Hello world' });
|
|
64
|
+
expect(events.find((e) => e.type === 'done')).toBeDefined();
|
|
65
|
+
expect(handle.providerSessionId).toBe('real-id-123');
|
|
66
|
+
});
|
|
67
|
+
it('streams tool_use events', async () => {
|
|
68
|
+
const q = createMockQuery([
|
|
69
|
+
{
|
|
70
|
+
type: 'assistant',
|
|
71
|
+
message: {
|
|
72
|
+
content: [{ type: 'tool_use', name: 'Read', id: 'tool-1', input: { file: 'foo.ts' } }],
|
|
73
|
+
},
|
|
74
|
+
},
|
|
75
|
+
{ type: 'result', subtype: 'success', result: '' },
|
|
76
|
+
]);
|
|
77
|
+
mockQuery.mockReturnValue(q);
|
|
78
|
+
const handle = await provider.startSession();
|
|
79
|
+
const events = [];
|
|
80
|
+
for await (const event of provider.sendTurn(handle, { userMessage: 'read foo' })) {
|
|
81
|
+
events.push(event);
|
|
82
|
+
}
|
|
83
|
+
const toolEvent = events.find((e) => e.type === 'tool_use');
|
|
84
|
+
expect(toolEvent).toBeDefined();
|
|
85
|
+
expect(toolEvent.content).toContain('Read');
|
|
86
|
+
});
|
|
87
|
+
it('handles error results', async () => {
|
|
88
|
+
const q = createMockQuery([
|
|
89
|
+
{ type: 'result', subtype: 'error_api', errors: ['API rate limited'] },
|
|
90
|
+
]);
|
|
91
|
+
mockQuery.mockReturnValue(q);
|
|
92
|
+
const handle = await provider.startSession();
|
|
93
|
+
const events = [];
|
|
94
|
+
for await (const event of provider.sendTurn(handle, { userMessage: 'test' })) {
|
|
95
|
+
events.push(event);
|
|
96
|
+
}
|
|
97
|
+
expect(events.find((e) => e.type === 'error')).toBeDefined();
|
|
98
|
+
});
|
|
99
|
+
it('yields error when query() throws', async () => {
|
|
100
|
+
mockQuery.mockImplementation(() => { throw new Error('SDK unavailable'); });
|
|
101
|
+
const handle = await provider.startSession();
|
|
102
|
+
const events = [];
|
|
103
|
+
for await (const event of provider.sendTurn(handle, { userMessage: 'test' })) {
|
|
104
|
+
events.push(event);
|
|
105
|
+
}
|
|
106
|
+
expect(events[0].type).toBe('error');
|
|
107
|
+
expect(events[0].content).toContain('SDK unavailable');
|
|
108
|
+
});
|
|
109
|
+
it('cleans up on endSession', async () => {
|
|
110
|
+
const q = createMockQuery([]);
|
|
111
|
+
mockQuery.mockReturnValue(q);
|
|
112
|
+
const handle = await provider.startSession();
|
|
113
|
+
// Consume the turn to register the query
|
|
114
|
+
for await (const _event of provider.sendTurn(handle, { userMessage: 'x' })) {
|
|
115
|
+
// consume
|
|
116
|
+
}
|
|
117
|
+
await provider.endSession(handle);
|
|
118
|
+
// Should not throw
|
|
119
|
+
});
|
|
120
|
+
});
|
|
121
|
+
//# sourceMappingURL=claude-sdk.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-sdk.test.js","sourceRoot":"","sources":["../../../src/providers/__tests__/claude-sdk.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"anthropic-api.d.ts","sourceRoot":"","sources":["../../src/providers/anthropic-api.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,aAAa,EACb,aAAa,EACb,WAAW,EACX,SAAS,EACT,SAAS,EACV,MAAM,gBAAgB,CAAC;AAExB;;;;;;;;GAQG;AACH,qBAAa,oBAAqB,YAAW,aAAa;IACxD,QAAQ,CAAC,IAAI,mBAAmB;IAChC,OAAO,CAAC,MAAM,CAAY;IAC1B,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,aAAa,CAA6B;IAClD,OAAO,CAAC,cAAc,CAA6E;gBAEvF,IAAI,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE;IAOhD,YAAY,CAAC,IAAI,GAAE,WAAgB,GAAG,OAAO,CAAC,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"anthropic-api.d.ts","sourceRoot":"","sources":["../../src/providers/anthropic-api.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,aAAa,EACb,aAAa,EACb,WAAW,EACX,SAAS,EACT,SAAS,EACV,MAAM,gBAAgB,CAAC;AAExB;;;;;;;;GAQG;AACH,qBAAa,oBAAqB,YAAW,aAAa;IACxD,QAAQ,CAAC,IAAI,mBAAmB;IAChC,OAAO,CAAC,MAAM,CAAY;IAC1B,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,aAAa,CAA6B;IAClD,OAAO,CAAC,gBAAgB,CAA6B;IACrD,OAAO,CAAC,cAAc,CAA6E;gBAEvF,IAAI,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE;IAOhD,YAAY,CAAC,IAAI,GAAE,WAAgB,GAAG,OAAO,CAAC,aAAa,CAAC;IAQ5D,aAAa,CACjB,iBAAiB,EAAE,MAAM,EACzB,IAAI,GAAE,WAAgB,GACrB,OAAO,CAAC,aAAa,CAAC;IASlB,QAAQ,CACb,MAAM,EAAE,aAAa,EACrB,KAAK,EAAE,SAAS,GACf,aAAa,CAAC,SAAS,CAAC;IAoErB,UAAU,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;CAKvD"}
|
|
@@ -15,6 +15,7 @@ export class AnthropicAPIProvider {
|
|
|
15
15
|
client;
|
|
16
16
|
defaultModel;
|
|
17
17
|
sessionModels = new Map();
|
|
18
|
+
sessionMaxTokens = new Map();
|
|
18
19
|
messageHistory = new Map();
|
|
19
20
|
constructor(opts) {
|
|
20
21
|
this.client = new Anthropic({
|
|
@@ -23,15 +24,19 @@ export class AnthropicAPIProvider {
|
|
|
23
24
|
this.defaultModel = opts?.model || 'claude-sonnet-4-20250514';
|
|
24
25
|
}
|
|
25
26
|
async startSession(opts = {}) {
|
|
26
|
-
const sessionId = `api-${
|
|
27
|
+
const sessionId = `api-${globalThis.crypto.randomUUID()}`;
|
|
27
28
|
this.messageHistory.set(sessionId, []);
|
|
28
29
|
if (opts.model)
|
|
29
30
|
this.sessionModels.set(sessionId, opts.model);
|
|
31
|
+
if (opts.maxOutputTokens != null)
|
|
32
|
+
this.sessionMaxTokens.set(sessionId, opts.maxOutputTokens);
|
|
30
33
|
return { sessionId };
|
|
31
34
|
}
|
|
32
35
|
async resumeSession(providerSessionId, opts = {}) {
|
|
33
36
|
if (opts.model)
|
|
34
37
|
this.sessionModels.set(providerSessionId, opts.model);
|
|
38
|
+
if (opts.maxOutputTokens != null)
|
|
39
|
+
this.sessionMaxTokens.set(providerSessionId, opts.maxOutputTokens);
|
|
35
40
|
if (!this.messageHistory.has(providerSessionId)) {
|
|
36
41
|
this.messageHistory.set(providerSessionId, []);
|
|
37
42
|
}
|
|
@@ -48,17 +53,23 @@ export class AnthropicAPIProvider {
|
|
|
48
53
|
}
|
|
49
54
|
// Get or create message history (cap at 50 messages to prevent unbounded growth)
|
|
50
55
|
const MAX_HISTORY = 50;
|
|
56
|
+
const TRIM_TARGET = 40; // Trim to 40 so we don't re-trim every turn at cap
|
|
51
57
|
let history = this.messageHistory.get(handle.sessionId) || [];
|
|
52
58
|
if (history.length >= MAX_HISTORY) {
|
|
53
|
-
//
|
|
54
|
-
|
|
59
|
+
// Trim to TRIM_TARGET, ensure we start on a user message
|
|
60
|
+
let startIdx = history.length - TRIM_TARGET;
|
|
61
|
+
while (startIdx < history.length && history[startIdx]?.role !== 'user') {
|
|
62
|
+
startIdx++;
|
|
63
|
+
}
|
|
64
|
+
history = history.slice(startIdx);
|
|
65
|
+
this.messageHistory.set(handle.sessionId, history);
|
|
55
66
|
}
|
|
56
67
|
history.push({ role: 'user', content: userMessage });
|
|
57
68
|
try {
|
|
58
69
|
// Stream the response
|
|
59
70
|
const stream = this.client.messages.stream({
|
|
60
71
|
model: this.sessionModels.get(handle.sessionId) || this.defaultModel,
|
|
61
|
-
max_tokens: 4096,
|
|
72
|
+
max_tokens: this.sessionMaxTokens.get(handle.sessionId) || 4096,
|
|
62
73
|
system: input.systemPrompt || 'You are a helpful coding assistant with deep project context.',
|
|
63
74
|
messages: history,
|
|
64
75
|
});
|
|
@@ -94,6 +105,7 @@ export class AnthropicAPIProvider {
|
|
|
94
105
|
async endSession(handle) {
|
|
95
106
|
this.messageHistory.delete(handle.sessionId);
|
|
96
107
|
this.sessionModels.delete(handle.sessionId);
|
|
108
|
+
this.sessionMaxTokens.delete(handle.sessionId);
|
|
97
109
|
}
|
|
98
110
|
}
|
|
99
111
|
//# sourceMappingURL=anthropic-api.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"anthropic-api.js","sourceRoot":"","sources":["../../src/providers/anthropic-api.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,mBAAmB,CAAC;AAC1C,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AASvD;;;;;;;;GAQG;AACH,MAAM,OAAO,oBAAoB;IACtB,IAAI,GAAG,eAAe,CAAC;IACxB,MAAM,CAAY;IAClB,YAAY,CAAS;IACrB,aAAa,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC1C,cAAc,GAAG,IAAI,GAAG,EAAkE,CAAC;IAEnG,YAAY,IAA0C;QACpD,IAAI,CAAC,MAAM,GAAG,IAAI,SAAS,CAAC;YAC1B,MAAM,EAAE,IAAI,EAAE,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,iBAAiB;SACtD,CAAC,CAAC;QACH,IAAI,CAAC,YAAY,GAAG,IAAI,EAAE,KAAK,IAAI,0BAA0B,CAAC;IAChE,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,OAAoB,EAAE;QACvC,MAAM,SAAS,GAAG,OAAO,
|
|
1
|
+
{"version":3,"file":"anthropic-api.js","sourceRoot":"","sources":["../../src/providers/anthropic-api.ts"],"names":[],"mappings":"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"}
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
@@ -15,12 +15,12 @@ export class ClaudeSDKProvider {
|
|
|
15
15
|
async startSession(_opts = {}) {
|
|
16
16
|
// We don't actually start the session until the first turn.
|
|
17
17
|
// The session ID will come back from the SDK's init message.
|
|
18
|
-
const sessionId = `sdk-${
|
|
18
|
+
const sessionId = `sdk-${globalThis.crypto.randomUUID()}`;
|
|
19
19
|
return { sessionId };
|
|
20
20
|
}
|
|
21
21
|
async resumeSession(providerSessionId, _opts = {}) {
|
|
22
22
|
return {
|
|
23
|
-
sessionId: `sdk-resume-${
|
|
23
|
+
sessionId: `sdk-resume-${globalThis.crypto.randomUUID()}`,
|
|
24
24
|
providerSessionId,
|
|
25
25
|
};
|
|
26
26
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"claude-sdk.js","sourceRoot":"","sources":["../../src/providers/claude-sdk.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAc,MAAM,gCAAgC,CAAC;AACnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AASvD;;;;;;;GAOG;AACH,MAAM,OAAO,iBAAiB;IACnB,IAAI,GAAG,YAAY,CAAC;IACrB,aAAa,GAAG,IAAI,GAAG,EAAiB,CAAC;IAEjD,KAAK,CAAC,YAAY,CAAC,QAAqB,EAAE;QACxC,4DAA4D;QAC5D,6DAA6D;QAC7D,MAAM,SAAS,GAAG,OAAO,
|
|
1
|
+
{"version":3,"file":"claude-sdk.js","sourceRoot":"","sources":["../../src/providers/claude-sdk.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interface.d.ts","sourceRoot":"","sources":["../../src/providers/interface.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAI7D,MAAM,MAAM,aAAa,GACrB,MAAM,GACN,UAAU,GACV,aAAa,GACb,cAAc,GACd,OAAO,GACP,MAAM,CAAC;AAEX,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,aAAa,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAID,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAID,MAAM,WAAW,SAAS;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAID,MAAM,WAAW,WAAW;IAC1B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,cAAc,CAAC,EAAE,SAAS,GAAG,aAAa,GAAG,mBAAmB,GAAG,MAAM,GAAG,SAAS,CAAC;CACvF;AAID,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB,0BAA0B;IAC1B,YAAY,CAAC,IAAI,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;IAEzD,iCAAiC;IACjC,aAAa,CAAC,iBAAiB,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;IAErF,yCAAyC;IACzC,QAAQ,CAAC,MAAM,EAAE,aAAa,EAAE,KAAK,EAAE,SAAS,GAAG,aAAa,CAAC,SAAS,CAAC,CAAC;IAE5E,gCAAgC;IAChC,UAAU,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAClD"}
|
|
1
|
+
{"version":3,"file":"interface.d.ts","sourceRoot":"","sources":["../../src/providers/interface.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAI7D,MAAM,MAAM,aAAa,GACrB,MAAM,GACN,UAAU,GACV,aAAa,GACb,cAAc,GACd,OAAO,GACP,MAAM,CAAC;AAEX,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,aAAa,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAID,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAID,MAAM,WAAW,SAAS;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAID,MAAM,WAAW,WAAW;IAC1B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,cAAc,CAAC,EAAE,SAAS,GAAG,aAAa,GAAG,mBAAmB,GAAG,MAAM,GAAG,SAAS,CAAC;CACvF;AAID,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB,0BAA0B;IAC1B,YAAY,CAAC,IAAI,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;IAEzD,iCAAiC;IACjC,aAAa,CAAC,iBAAiB,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;IAErF,yCAAyC;IACzC,QAAQ,CAAC,MAAM,EAAE,aAAa,EAAE,KAAK,EAAE,SAAS,GAAG,aAAa,CAAC,SAAS,CAAC,CAAC;IAE5E,gCAAgC;IAChC,UAAU,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAClD"}
|
|
File without changes
|
|
File without changes
|
|
@@ -4,8 +4,8 @@
|
|
|
4
4
|
*
|
|
5
5
|
* Usage: node dist/scripts/install-hooks.js [--global | --project]
|
|
6
6
|
*
|
|
7
|
-
*
|
|
8
|
-
* ~/.claude/settings.json
|
|
7
|
+
* --project (default): .claude/settings.json in current directory
|
|
8
|
+
* --global: ~/.claude/settings.json
|
|
9
9
|
*/
|
|
10
10
|
export {};
|
|
11
11
|
//# sourceMappingURL=install-hooks.d.ts.map
|
|
File without changes
|
|
@@ -4,8 +4,8 @@
|
|
|
4
4
|
*
|
|
5
5
|
* Usage: node dist/scripts/install-hooks.js [--global | --project]
|
|
6
6
|
*
|
|
7
|
-
*
|
|
8
|
-
* ~/.claude/settings.json
|
|
7
|
+
* --project (default): .claude/settings.json in current directory
|
|
8
|
+
* --global: ~/.claude/settings.json
|
|
9
9
|
*/
|
|
10
10
|
import fs from 'node:fs';
|
|
11
11
|
import path from 'node:path';
|
|
@@ -40,18 +40,15 @@ const HOOK_DEFINITIONS = {
|
|
|
40
40
|
};
|
|
41
41
|
function main() {
|
|
42
42
|
const args = process.argv.slice(2);
|
|
43
|
+
// --project is the default; --global installs to ~/.claude/settings.json
|
|
43
44
|
const isGlobal = args.includes('--global');
|
|
44
45
|
// Determine dist directory (where compiled hooks live)
|
|
45
46
|
const scriptDir = path.dirname(new URL(import.meta.url).pathname);
|
|
46
47
|
const distDir = path.resolve(scriptDir, '..');
|
|
47
48
|
// Determine settings file location
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
}
|
|
52
|
-
else {
|
|
53
|
-
settingsPath = path.join(process.cwd(), '.claude', 'settings.json');
|
|
54
|
-
}
|
|
49
|
+
const settingsPath = isGlobal
|
|
50
|
+
? path.join(os.homedir(), '.claude', 'settings.json')
|
|
51
|
+
: path.join(process.cwd(), '.claude', 'settings.json');
|
|
55
52
|
// Read existing settings
|
|
56
53
|
let settings = {};
|
|
57
54
|
try {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"install-hooks.js","sourceRoot":"","sources":["../../src/scripts/install-hooks.ts"],"names":[],"mappings":";AACA;;;;;;;GAOG;AAEH,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAC;AAEzB,MAAM,gBAAgB,GAAG;IACvB,KAAK,EAAE;QACL,gBAAgB,EAAE;YAChB;gBACE,IAAI,EAAE,SAAkB;gBACxB,OAAO,EAAE,wCAAwC;aAClD;SACF;QACD,YAAY,EAAE;YACZ;gBACE,IAAI,EAAE,SAAkB;gBACxB,OAAO,EAAE,0CAA0C;aACpD;SACF;QACD,IAAI,EAAE;YACJ;gBACE,IAAI,EAAE,SAAkB;gBACxB,OAAO,EAAE,iCAAiC;aAC3C;SACF;QACD,WAAW,EAAE;YACX;gBACE,IAAI,EAAE,SAAkB;gBACxB,OAAO,EAAE,yCAAyC;aACnD;SACF;KACF;CACF,CAAC;AAEF,SAAS,IAAI;IACX,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACnC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;IAE3C,uDAAuD;IACvD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC;IAClE,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IAE9C,mCAAmC;IACnC,
|
|
1
|
+
{"version":3,"file":"install-hooks.js","sourceRoot":"","sources":["../../src/scripts/install-hooks.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manager.test.d.ts","sourceRoot":"","sources":["../../../src/session/__tests__/manager.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { describe, it, expect, beforeEach, afterEach } from 'vitest';
|
|
2
|
+
import { SessionManager } from '../manager.js';
|
|
3
|
+
import fs from 'node:fs';
|
|
4
|
+
import path from 'node:path';
|
|
5
|
+
import os from 'node:os';
|
|
6
|
+
describe('SessionManager', () => {
|
|
7
|
+
let manager;
|
|
8
|
+
let dbPath;
|
|
9
|
+
beforeEach(() => {
|
|
10
|
+
dbPath = path.join(os.tmpdir(), `codeagent-test-${Date.now()}.db`);
|
|
11
|
+
manager = new SessionManager(dbPath);
|
|
12
|
+
});
|
|
13
|
+
afterEach(() => {
|
|
14
|
+
manager.close();
|
|
15
|
+
try {
|
|
16
|
+
fs.unlinkSync(dbPath);
|
|
17
|
+
}
|
|
18
|
+
catch { /* ok */ }
|
|
19
|
+
try {
|
|
20
|
+
fs.unlinkSync(dbPath + '-wal');
|
|
21
|
+
}
|
|
22
|
+
catch { /* ok */ }
|
|
23
|
+
try {
|
|
24
|
+
fs.unlinkSync(dbPath + '-shm');
|
|
25
|
+
}
|
|
26
|
+
catch { /* ok */ }
|
|
27
|
+
});
|
|
28
|
+
it('creates a session', () => {
|
|
29
|
+
const session = manager.create({ repoRoot: '/tmp/test-repo' });
|
|
30
|
+
expect(session.id).toMatch(/^sess-/);
|
|
31
|
+
expect(session.repoRoot).toBe('/tmp/test-repo');
|
|
32
|
+
expect(session.status).toBe('active');
|
|
33
|
+
expect(session.provider).toBe('sdk');
|
|
34
|
+
expect(session.orchestration).toBe('gsd');
|
|
35
|
+
expect(session.stage).toBe('general');
|
|
36
|
+
});
|
|
37
|
+
it('gets a session by ID', () => {
|
|
38
|
+
const created = manager.create({ repoRoot: '/tmp/test-repo' });
|
|
39
|
+
const fetched = manager.get(created.id);
|
|
40
|
+
expect(fetched).not.toBeNull();
|
|
41
|
+
expect(fetched.id).toBe(created.id);
|
|
42
|
+
});
|
|
43
|
+
it('returns null for nonexistent session', () => {
|
|
44
|
+
expect(manager.get('nonexistent')).toBeNull();
|
|
45
|
+
});
|
|
46
|
+
it('lists sessions', () => {
|
|
47
|
+
manager.create({ repoRoot: '/tmp/repo1' });
|
|
48
|
+
manager.create({ repoRoot: '/tmp/repo2' });
|
|
49
|
+
manager.create({ repoRoot: '/tmp/repo1' });
|
|
50
|
+
const all = manager.list();
|
|
51
|
+
expect(all).toHaveLength(3);
|
|
52
|
+
const repo1 = manager.list({ repoRoot: '/tmp/repo1' });
|
|
53
|
+
expect(repo1).toHaveLength(2);
|
|
54
|
+
});
|
|
55
|
+
it('gets active session for a repo', () => {
|
|
56
|
+
const s1 = manager.create({ repoRoot: '/tmp/repo' });
|
|
57
|
+
const s2 = manager.create({ repoRoot: '/tmp/repo' });
|
|
58
|
+
const active = manager.getActive('/tmp/repo');
|
|
59
|
+
expect(active).not.toBeNull();
|
|
60
|
+
// Should return one of the active sessions
|
|
61
|
+
expect([s1.id, s2.id]).toContain(active.id);
|
|
62
|
+
});
|
|
63
|
+
it('updates session fields', () => {
|
|
64
|
+
const session = manager.create({ repoRoot: '/tmp/repo' });
|
|
65
|
+
manager.update(session.id, {
|
|
66
|
+
stage: 'implement',
|
|
67
|
+
title: 'Build payment feature',
|
|
68
|
+
providerSessionId: 'sdk-123',
|
|
69
|
+
});
|
|
70
|
+
const updated = manager.get(session.id);
|
|
71
|
+
expect(updated.stage).toBe('implement');
|
|
72
|
+
expect(updated.title).toBe('Build payment feature');
|
|
73
|
+
expect(updated.providerSessionId).toBe('sdk-123');
|
|
74
|
+
});
|
|
75
|
+
it('records and retrieves events', () => {
|
|
76
|
+
const session = manager.create({ repoRoot: '/tmp/repo' });
|
|
77
|
+
manager.addEvent(session.id, 'session_start');
|
|
78
|
+
manager.addEvent(session.id, 'user_turn', { message: 'hello' });
|
|
79
|
+
manager.addEvent(session.id, 'agent_turn', { tokens: 100 });
|
|
80
|
+
const events = manager.getEvents(session.id);
|
|
81
|
+
expect(events).toHaveLength(3);
|
|
82
|
+
expect(events[0].eventType).toBe('agent_turn'); // DESC order
|
|
83
|
+
});
|
|
84
|
+
it('filters events by type', () => {
|
|
85
|
+
const session = manager.create({ repoRoot: '/tmp/repo' });
|
|
86
|
+
manager.addEvent(session.id, 'user_turn', { message: 'a' });
|
|
87
|
+
manager.addEvent(session.id, 'agent_turn');
|
|
88
|
+
manager.addEvent(session.id, 'user_turn', { message: 'b' });
|
|
89
|
+
const userEvents = manager.getEvents(session.id, { types: ['user_turn'] });
|
|
90
|
+
expect(userEvents).toHaveLength(2);
|
|
91
|
+
});
|
|
92
|
+
it('deletes a session with cascade', () => {
|
|
93
|
+
const session = manager.create({ repoRoot: '/tmp/repo' });
|
|
94
|
+
manager.addEvent(session.id, 'session_start');
|
|
95
|
+
manager.delete(session.id);
|
|
96
|
+
expect(manager.get(session.id)).toBeNull();
|
|
97
|
+
expect(manager.getEvents(session.id)).toHaveLength(0);
|
|
98
|
+
});
|
|
99
|
+
it('marks session as completed', () => {
|
|
100
|
+
const session = manager.create({ repoRoot: '/tmp/repo' });
|
|
101
|
+
manager.update(session.id, { status: 'completed' });
|
|
102
|
+
const updated = manager.get(session.id);
|
|
103
|
+
expect(updated.status).toBe('completed');
|
|
104
|
+
// Should not show as active
|
|
105
|
+
expect(manager.getActive('/tmp/repo')).toBeNull();
|
|
106
|
+
});
|
|
107
|
+
});
|
|
108
|
+
//# sourceMappingURL=manager.test.js.map
|