This commit is contained in:
110
packages/agent/tests/cognify.test.ts
Normal file
110
packages/agent/tests/cognify.test.ts
Normal file
@@ -0,0 +1,110 @@
|
||||
import { describe, it, expect, beforeEach, afterEach } from 'vitest';
|
||||
import {
|
||||
MindDB,
|
||||
FrameStore,
|
||||
SessionStore,
|
||||
KnowledgeGraph,
|
||||
HybridSearch,
|
||||
} from '@waggle/core';
|
||||
import { MockEmbedder } from '../../hive-mind-core/tests/mind/helpers/mock-embedder.js';
|
||||
import { CognifyPipeline } from '../src/cognify.js';
|
||||
|
||||
describe('CognifyPipeline', () => {
|
||||
let db: MindDB;
|
||||
let frames: FrameStore;
|
||||
let sessions: SessionStore;
|
||||
let knowledge: KnowledgeGraph;
|
||||
let search: HybridSearch;
|
||||
let pipeline: CognifyPipeline;
|
||||
|
||||
beforeEach(() => {
|
||||
db = new MindDB(':memory:');
|
||||
const embedder = new MockEmbedder();
|
||||
frames = new FrameStore(db);
|
||||
sessions = new SessionStore(db);
|
||||
knowledge = new KnowledgeGraph(db);
|
||||
search = new HybridSearch(db, embedder);
|
||||
pipeline = new CognifyPipeline({
|
||||
frames,
|
||||
sessions,
|
||||
knowledge,
|
||||
search,
|
||||
});
|
||||
});
|
||||
|
||||
afterEach(() => {
|
||||
db.close();
|
||||
});
|
||||
|
||||
it('saves memory and extracts entities into knowledge graph', async () => {
|
||||
const result = await pipeline.cognify(
|
||||
'Had a meeting with Alice Johnson about migrating from PostgreSQL to SQLite for the waggle project.'
|
||||
);
|
||||
|
||||
// Should have created a frame
|
||||
expect(result.frameId).toBeGreaterThan(0);
|
||||
|
||||
// Should have extracted entities
|
||||
expect(result.entitiesExtracted).toBeGreaterThanOrEqual(2);
|
||||
|
||||
// Should have created co-occurrence relations
|
||||
expect(result.relationsCreated).toBeGreaterThanOrEqual(1);
|
||||
|
||||
// Verify entities are in the knowledge graph
|
||||
const people = knowledge.getEntitiesByType('person');
|
||||
const techs = knowledge.getEntitiesByType('technology');
|
||||
expect(people.length + techs.length).toBeGreaterThanOrEqual(2);
|
||||
});
|
||||
|
||||
it('indexes the frame for vector search', async () => {
|
||||
const result = await pipeline.cognify(
|
||||
'Working on the PostgreSQL database migration for the backend service.'
|
||||
);
|
||||
|
||||
expect(result.frameId).toBeGreaterThan(0);
|
||||
|
||||
// Should be searchable via hybrid search
|
||||
const searchResults = await search.search('database migration');
|
||||
expect(searchResults.length).toBeGreaterThanOrEqual(1);
|
||||
expect(searchResults[0].frame.id).toBe(result.frameId);
|
||||
});
|
||||
|
||||
it('creates P-frame when I-frame already exists for the session', async () => {
|
||||
// First cognify creates an I-frame
|
||||
const first = await pipeline.cognify('Initial memory about TypeScript.');
|
||||
const firstFrame = frames.getById(first.frameId);
|
||||
expect(firstFrame?.frame_type).toBe('I');
|
||||
|
||||
// Second cognify in same session creates a P-frame
|
||||
const second = await pipeline.cognify('Follow-up about React integration.');
|
||||
const secondFrame = frames.getById(second.frameId);
|
||||
expect(secondFrame?.frame_type).toBe('P');
|
||||
});
|
||||
|
||||
it('respects importance parameter', async () => {
|
||||
const result = await pipeline.cognify(
|
||||
'Critical finding about security vulnerability in the API.',
|
||||
'critical'
|
||||
);
|
||||
const frame = frames.getById(result.frameId);
|
||||
expect(frame?.importance).toBe('critical');
|
||||
});
|
||||
|
||||
it('uses provided gopId when given', async () => {
|
||||
const session = sessions.create();
|
||||
const result = await pipeline.cognify(
|
||||
'Memory tied to a specific session with Docker.',
|
||||
'normal',
|
||||
session.gop_id
|
||||
);
|
||||
const frame = frames.getById(result.frameId);
|
||||
expect(frame?.gop_id).toBe(session.gop_id);
|
||||
});
|
||||
|
||||
it('does not create duplicate entities for repeated mentions', async () => {
|
||||
await pipeline.cognify('Learning about PostgreSQL and PostgreSQL performance tuning.');
|
||||
const techs = knowledge.getEntitiesByType('technology');
|
||||
const pgEntities = techs.filter(e => e.name.toLowerCase().includes('postgresql'));
|
||||
expect(pgEntities).toHaveLength(1);
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user