feat(session): add optional end-of-session summarization

This commit is contained in:
William Valentin
2026-02-16 13:18:42 -08:00
parent 01ee6ba53f
commit 3f627cc1ad
8 changed files with 307 additions and 0 deletions
+46
View File
@@ -244,6 +244,52 @@ describe('configSchema — backup', () => {
});
});
describe('configSchema — sessions', () => {
const minimalConfig = {
telegram: { bot_token: 'test', allowed_chat_ids: [1] },
models: { default: { provider: 'anthropic', model: 'claude-3' } },
};
it('defaults end_summary settings', () => {
const result = configSchema.parse(minimalConfig);
expect(result.sessions.ttl).toBe('30d');
expect(result.sessions.end_summary.enabled).toBe(false);
expect(result.sessions.end_summary.tier).toBe('fast');
expect(result.sessions.end_summary.max_messages).toBe(50);
expect(result.sessions.end_summary.max_input_chars).toBe(20000);
expect(result.sessions.end_summary.max_tokens).toBe(512);
expect(result.sessions.end_summary.write_to_memory).toBe(true);
expect(result.sessions.end_summary.memory_namespace).toBe('session/summaries');
});
it('accepts custom end_summary settings', () => {
const result = configSchema.parse({
...minimalConfig,
sessions: {
ttl: '7d',
end_summary: {
enabled: true,
tier: 'complex',
max_messages: 100,
max_input_chars: 50000,
max_tokens: 1024,
write_to_memory: false,
memory_namespace: 'notes/session',
},
},
});
expect(result.sessions.ttl).toBe('7d');
expect(result.sessions.end_summary.enabled).toBe(true);
expect(result.sessions.end_summary.tier).toBe('complex');
expect(result.sessions.end_summary.max_messages).toBe(100);
expect(result.sessions.end_summary.max_input_chars).toBe(50000);
expect(result.sessions.end_summary.max_tokens).toBe(1024);
expect(result.sessions.end_summary.write_to_memory).toBe(false);
expect(result.sessions.end_summary.memory_namespace).toBe('notes/session');
});
});
describe('configSchema — agent_configs', () => {
const minimalConfig = {
telegram: { bot_token: 'test', allowed_chat_ids: [1] },
+9
View File
@@ -670,6 +670,15 @@ const promptSchema = z.object({
const sessionsSchema = z.object({
ttl: z.string().default('30d'),
end_summary: z.object({
enabled: z.boolean().default(false),
tier: modelTierEnum.default('fast'),
max_messages: z.number().min(2).max(500).default(50),
max_input_chars: z.number().min(500).max(200000).default(20000),
max_tokens: z.number().min(64).max(4096).default(512),
write_to_memory: z.boolean().default(true),
memory_namespace: z.string().default('session/summaries'),
}).default({}),
}).default({});
const backupSchema = z.object({