Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 18 additions & 0 deletions src/metamemory/context/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -127,6 +127,24 @@ export class ContextAssembler {
content: `Summary of earlier discussion:\n${thread.summary}`
} as ResponseInputItem);
}

// Add summaries of related threads
const relatedThreads = this.threadManager.getRelatedThreads(thread.name);
if (relatedThreads.length > 0) {
let relatedText = 'Related topic summaries:\n';
for (const rel of relatedThreads) {
if (rel.summary) {
relatedText += `Topic: ${rel.name}\nSummary: ${rel.summary}\n`;
}
}
if (relatedText.trim() !== 'Related topic summaries:') {
items.push({
type: 'message',
role: 'system',
content: relatedText.trimEnd()
} as ResponseInputItem);
}
}

// Add recent messages from the thread
const recentMessages = this.threadManager.getRecentMessages(thread, recentMessageCount);
Expand Down
41 changes: 40 additions & 1 deletion test/metamemory-new.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import { TopicThreadManager } from '../src/metamemory/utils/topic-thread-manager
import { InMemoryVectorSearch } from '../src/metamemory/utils/vector-search';
import { MessageTagger, TaggerLLM } from '../src/metamemory/tagger';
import { ThreadCompactor, SummarizerInterface } from '../src/metamemory/compactor';
import { ContextAssembler } from '../src/metamemory/context';
import type {
Message,
TaggedMessage,
Expand Down Expand Up @@ -240,7 +241,45 @@ describe('MetaMemory System', () => {
expect(results[0].relevanceScore).toBeGreaterThan(results[1].relevanceScore);
});
});


describe('ContextAssembler', () => {
let manager: TopicThreadManager;
let assembler: ContextAssembler;

beforeEach(() => {
manager = new TopicThreadManager();
assembler = new ContextAssembler(manager);
});

it('includes summaries of related threads for active topics', async () => {
const active = manager.createThread('active_topic', 'active');
active.summary = 'Active summary';
manager.addMessageToThread('active_topic', {
id: 'a1',
role: 'user',
content: 'hello',
timestamp: Date.now()
});

const related = manager.createThread('related_topic', 'idle');
related.summary = 'Related summary';
manager.addThreadRelationship('active_topic', 'related_topic');

const spy = vi.spyOn(manager, 'getRelatedThreads');

const context = await assembler.buildContext([], {
maxTokens: 1000,
includeIdleSummaries: false,
includeArchivedSearch: false,
recentMessageCount: 5
});

expect(spy).toHaveBeenCalledWith('active_topic');
const combined = context.map(m => ('content' in m ? m.content : '')).join(' ');
expect(combined).toContain('Related summary');
});
});

describe('Metamemory Integration', () => {
let metamemory: Metamemory;

Expand Down