cognitive-core 0.0.2 → 0.1.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/README.md +302 -116
- package/SKILL.md +193 -0
- package/dist/agents/index.d.ts +3 -0
- package/dist/agents/index.d.ts.map +1 -0
- package/dist/agents/index.js +5 -0
- package/dist/agents/index.js.map +1 -0
- package/dist/agents/mock-provider.d.ts +23 -0
- package/dist/agents/mock-provider.d.ts.map +1 -0
- package/dist/agents/mock-provider.js +71 -0
- package/dist/agents/mock-provider.js.map +1 -0
- package/dist/agents/types.d.ts +98 -0
- package/dist/agents/types.d.ts.map +1 -0
- package/dist/agents/types.js +44 -0
- package/dist/agents/types.js.map +1 -0
- package/dist/atlas.d.ts +196 -0
- package/dist/atlas.d.ts.map +1 -0
- package/dist/atlas.js +373 -0
- package/dist/atlas.js.map +1 -0
- package/dist/bin/cognitive-core.d.ts +18 -0
- package/dist/bin/cognitive-core.d.ts.map +1 -0
- package/dist/bin/cognitive-core.js +419 -0
- package/dist/bin/cognitive-core.js.map +1 -0
- package/dist/embeddings/bm25.d.ts +104 -0
- package/dist/embeddings/bm25.d.ts.map +1 -0
- package/dist/embeddings/bm25.js +264 -0
- package/dist/embeddings/bm25.js.map +1 -0
- package/dist/embeddings/index.d.ts +12 -0
- package/dist/embeddings/index.d.ts.map +1 -0
- package/dist/embeddings/index.js +16 -0
- package/dist/embeddings/index.js.map +1 -0
- package/dist/embeddings/manager.d.ts +112 -0
- package/dist/embeddings/manager.d.ts.map +1 -0
- package/dist/embeddings/manager.js +215 -0
- package/dist/embeddings/manager.js.map +1 -0
- package/dist/embeddings/provider.d.ts +101 -0
- package/dist/embeddings/provider.d.ts.map +1 -0
- package/dist/embeddings/provider.js +232 -0
- package/dist/embeddings/provider.js.map +1 -0
- package/dist/embeddings/vector-store.d.ts +101 -0
- package/dist/embeddings/vector-store.d.ts.map +1 -0
- package/dist/embeddings/vector-store.js +256 -0
- package/dist/embeddings/vector-store.js.map +1 -0
- package/dist/factory.d.ts +193 -0
- package/dist/factory.d.ts.map +1 -0
- package/dist/factory.js +109 -0
- package/dist/factory.js.map +1 -0
- package/dist/index.d.ts +30 -453
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +84 -509
- package/dist/index.js.map +1 -0
- package/dist/learning/analyzer.d.ts +110 -0
- package/dist/learning/analyzer.d.ts.map +1 -0
- package/dist/learning/analyzer.js +213 -0
- package/dist/learning/analyzer.js.map +1 -0
- package/dist/learning/effectiveness.d.ts +158 -0
- package/dist/learning/effectiveness.d.ts.map +1 -0
- package/dist/learning/effectiveness.js +251 -0
- package/dist/learning/effectiveness.js.map +1 -0
- package/dist/learning/index.d.ts +8 -0
- package/dist/learning/index.d.ts.map +1 -0
- package/dist/learning/index.js +11 -0
- package/dist/learning/index.js.map +1 -0
- package/dist/learning/llm-extractor.d.ts +88 -0
- package/dist/learning/llm-extractor.d.ts.map +1 -0
- package/dist/learning/llm-extractor.js +372 -0
- package/dist/learning/llm-extractor.js.map +1 -0
- package/dist/learning/meta-learner.d.ts +80 -0
- package/dist/learning/meta-learner.d.ts.map +1 -0
- package/dist/learning/meta-learner.js +355 -0
- package/dist/learning/meta-learner.js.map +1 -0
- package/dist/learning/pipeline.d.ts +65 -0
- package/dist/learning/pipeline.d.ts.map +1 -0
- package/dist/learning/pipeline.js +170 -0
- package/dist/learning/pipeline.js.map +1 -0
- package/dist/learning/playbook-extractor.d.ts +113 -0
- package/dist/learning/playbook-extractor.d.ts.map +1 -0
- package/dist/learning/playbook-extractor.js +523 -0
- package/dist/learning/playbook-extractor.js.map +1 -0
- package/dist/learning/usage-inference.d.ts +82 -0
- package/dist/learning/usage-inference.d.ts.map +1 -0
- package/dist/learning/usage-inference.js +261 -0
- package/dist/learning/usage-inference.js.map +1 -0
- package/dist/mcp/index.d.ts +6 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/index.js +6 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/playbook-server.d.ts +120 -0
- package/dist/mcp/playbook-server.d.ts.map +1 -0
- package/dist/mcp/playbook-server.js +427 -0
- package/dist/mcp/playbook-server.js.map +1 -0
- package/dist/memory/curated-loader.d.ts +62 -0
- package/dist/memory/curated-loader.d.ts.map +1 -0
- package/dist/memory/curated-loader.js +106 -0
- package/dist/memory/curated-loader.js.map +1 -0
- package/dist/memory/experience.d.ts +122 -0
- package/dist/memory/experience.d.ts.map +1 -0
- package/dist/memory/experience.js +392 -0
- package/dist/memory/experience.js.map +1 -0
- package/dist/memory/index.d.ts +6 -0
- package/dist/memory/index.d.ts.map +1 -0
- package/dist/memory/index.js +9 -0
- package/dist/memory/index.js.map +1 -0
- package/dist/memory/meta.d.ts +90 -0
- package/dist/memory/meta.d.ts.map +1 -0
- package/dist/memory/meta.js +362 -0
- package/dist/memory/meta.js.map +1 -0
- package/dist/memory/playbook.d.ts +133 -0
- package/dist/memory/playbook.d.ts.map +1 -0
- package/dist/memory/playbook.js +357 -0
- package/dist/memory/playbook.js.map +1 -0
- package/dist/memory/system.d.ts +167 -0
- package/dist/memory/system.d.ts.map +1 -0
- package/dist/memory/system.js +383 -0
- package/dist/memory/system.js.map +1 -0
- package/dist/runtime/backends/acp.d.ts +67 -0
- package/dist/runtime/backends/acp.d.ts.map +1 -0
- package/dist/runtime/backends/acp.js +290 -0
- package/dist/runtime/backends/acp.js.map +1 -0
- package/dist/runtime/backends/index.d.ts +5 -0
- package/dist/runtime/backends/index.d.ts.map +1 -0
- package/dist/runtime/backends/index.js +6 -0
- package/dist/runtime/backends/index.js.map +1 -0
- package/dist/runtime/backends/mock.d.ts +67 -0
- package/dist/runtime/backends/mock.d.ts.map +1 -0
- package/dist/runtime/backends/mock.js +153 -0
- package/dist/runtime/backends/mock.js.map +1 -0
- package/dist/runtime/backends/subprocess.d.ts +56 -0
- package/dist/runtime/backends/subprocess.d.ts.map +1 -0
- package/dist/runtime/backends/subprocess.js +260 -0
- package/dist/runtime/backends/subprocess.js.map +1 -0
- package/dist/runtime/flows/learning.d.ts +73 -0
- package/dist/runtime/flows/learning.d.ts.map +1 -0
- package/dist/runtime/flows/learning.js +116 -0
- package/dist/runtime/flows/learning.js.map +1 -0
- package/dist/runtime/flows/validation.d.ts +122 -0
- package/dist/runtime/flows/validation.d.ts.map +1 -0
- package/dist/runtime/flows/validation.js +223 -0
- package/dist/runtime/flows/validation.js.map +1 -0
- package/dist/runtime/index.d.ts +6 -0
- package/dist/runtime/index.d.ts.map +1 -0
- package/dist/runtime/index.js +8 -0
- package/dist/runtime/index.js.map +1 -0
- package/dist/runtime/manager.d.ts +116 -0
- package/dist/runtime/manager.d.ts.map +1 -0
- package/dist/runtime/manager.js +416 -0
- package/dist/runtime/manager.js.map +1 -0
- package/dist/runtime/types.d.ts +138 -0
- package/dist/runtime/types.d.ts.map +1 -0
- package/dist/runtime/types.js +2 -0
- package/dist/runtime/types.js.map +1 -0
- package/dist/search/evaluator.d.ts +102 -0
- package/dist/search/evaluator.d.ts.map +1 -0
- package/dist/search/evaluator.js +352 -0
- package/dist/search/evaluator.js.map +1 -0
- package/dist/search/index.d.ts +7 -0
- package/dist/search/index.d.ts.map +1 -0
- package/dist/search/index.js +11 -0
- package/dist/search/index.js.map +1 -0
- package/dist/search/refinement-loop.d.ts +73 -0
- package/dist/search/refinement-loop.d.ts.map +1 -0
- package/dist/search/refinement-loop.js +245 -0
- package/dist/search/refinement-loop.js.map +1 -0
- package/dist/search/refinement-types.d.ts +154 -0
- package/dist/search/refinement-types.d.ts.map +1 -0
- package/dist/search/refinement-types.js +99 -0
- package/dist/search/refinement-types.js.map +1 -0
- package/dist/search/router.d.ts +61 -0
- package/dist/search/router.d.ts.map +1 -0
- package/dist/search/router.js +197 -0
- package/dist/search/router.js.map +1 -0
- package/dist/search/solver.d.ts +75 -0
- package/dist/search/solver.d.ts.map +1 -0
- package/dist/search/solver.js +216 -0
- package/dist/search/solver.js.map +1 -0
- package/dist/search/verification-runner.d.ts +125 -0
- package/dist/search/verification-runner.d.ts.map +1 -0
- package/dist/search/verification-runner.js +440 -0
- package/dist/search/verification-runner.js.map +1 -0
- package/dist/surfacing/index.d.ts +2 -0
- package/dist/surfacing/index.d.ts.map +1 -0
- package/dist/surfacing/index.js +2 -0
- package/dist/surfacing/index.js.map +1 -0
- package/dist/surfacing/skill-library.d.ts +158 -0
- package/dist/surfacing/skill-library.d.ts.map +1 -0
- package/dist/surfacing/skill-library.js +429 -0
- package/dist/surfacing/skill-library.js.map +1 -0
- package/dist/types/config.d.ts +1113 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/config.js +274 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types/index.d.ts +9 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +14 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/memory.d.ts +339 -0
- package/dist/types/memory.d.ts.map +1 -0
- package/dist/types/memory.js +207 -0
- package/dist/types/memory.js.map +1 -0
- package/dist/types/meta.d.ts +146 -0
- package/dist/types/meta.d.ts.map +1 -0
- package/dist/types/meta.js +51 -0
- package/dist/types/meta.js.map +1 -0
- package/dist/types/outcome.d.ts +42 -0
- package/dist/types/outcome.d.ts.map +1 -0
- package/dist/types/outcome.js +50 -0
- package/dist/types/outcome.js.map +1 -0
- package/dist/types/playbook.d.ts +119 -0
- package/dist/types/playbook.d.ts.map +1 -0
- package/dist/types/playbook.js +71 -0
- package/dist/types/playbook.js.map +1 -0
- package/dist/types/step.d.ts +44 -0
- package/dist/types/step.d.ts.map +1 -0
- package/dist/types/step.js +32 -0
- package/dist/types/step.js.map +1 -0
- package/dist/types/task.d.ts +91 -0
- package/dist/types/task.d.ts.map +1 -0
- package/dist/types/task.js +39 -0
- package/dist/types/task.js.map +1 -0
- package/dist/types/trajectory.d.ts +221 -0
- package/dist/types/trajectory.d.ts.map +1 -0
- package/dist/types/trajectory.js +60 -0
- package/dist/types/trajectory.js.map +1 -0
- package/dist/utils/index.d.ts +4 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +4 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/similarity.d.ts +31 -0
- package/dist/utils/similarity.d.ts.map +1 -0
- package/dist/utils/similarity.js +107 -0
- package/dist/utils/similarity.js.map +1 -0
- package/dist/utils/storage.d.ts +106 -0
- package/dist/utils/storage.d.ts.map +1 -0
- package/dist/utils/storage.js +203 -0
- package/dist/utils/storage.js.map +1 -0
- package/dist/utils/validation.d.ts +129 -0
- package/dist/utils/validation.d.ts.map +1 -0
- package/dist/utils/validation.js +171 -0
- package/dist/utils/validation.js.map +1 -0
- package/package.json +50 -34
- package/scripts/migrate-to-playbooks.ts +307 -0
- package/src/agents/index.ts +14 -0
- package/src/agents/mock-provider.ts +93 -0
- package/src/agents/types.ts +137 -0
- package/src/atlas.ts +560 -0
- package/src/bin/cognitive-core.ts +470 -0
- package/src/embeddings/bm25.ts +337 -0
- package/src/embeddings/index.ts +39 -0
- package/src/embeddings/manager.ts +288 -0
- package/src/embeddings/provider.ts +311 -0
- package/src/embeddings/vector-store.ts +353 -0
- package/src/factory.ts +263 -0
- package/src/index.ts +246 -0
- package/src/learning/analyzer.ts +335 -0
- package/src/learning/effectiveness.ts +428 -0
- package/src/learning/index.ts +58 -0
- package/src/learning/llm-extractor.ts +542 -0
- package/src/learning/meta-learner.ts +516 -0
- package/src/learning/pipeline.ts +244 -0
- package/src/learning/playbook-extractor.ts +702 -0
- package/src/learning/usage-inference.ts +372 -0
- package/src/mcp/index.ts +12 -0
- package/src/mcp/playbook-server.ts +565 -0
- package/src/memory/curated-loader.ts +160 -0
- package/src/memory/experience.ts +515 -0
- package/src/memory/index.ts +27 -0
- package/src/memory/meta.ts +506 -0
- package/src/memory/playbook.ts +493 -0
- package/src/memory/system.ts +551 -0
- package/src/runtime/backends/acp.ts +378 -0
- package/src/runtime/backends/index.ts +24 -0
- package/src/runtime/backends/mock.ts +218 -0
- package/src/runtime/backends/subprocess.ts +356 -0
- package/src/runtime/flows/learning.ts +183 -0
- package/src/runtime/flows/validation.ts +381 -0
- package/src/runtime/index.ts +53 -0
- package/src/runtime/manager.ts +541 -0
- package/src/runtime/types.ts +157 -0
- package/src/search/evaluator.ts +474 -0
- package/src/search/index.ts +59 -0
- package/src/search/refinement-loop.ts +363 -0
- package/src/search/refinement-types.ts +159 -0
- package/src/search/router.ts +261 -0
- package/src/search/solver.ts +303 -0
- package/src/search/verification-runner.ts +570 -0
- package/src/surfacing/index.ts +6 -0
- package/src/surfacing/skill-library.ts +594 -0
- package/src/types/config.ts +333 -0
- package/src/types/index.ts +130 -0
- package/src/types/memory.ts +270 -0
- package/src/types/meta.ts +218 -0
- package/src/types/outcome.ts +66 -0
- package/src/types/playbook.ts +196 -0
- package/src/types/step.ts +40 -0
- package/src/types/task.ts +52 -0
- package/src/types/trajectory.ts +80 -0
- package/src/utils/index.ts +38 -0
- package/src/utils/similarity.ts +139 -0
- package/src/utils/storage.ts +249 -0
- package/src/utils/validation.ts +286 -0
- package/tests/embeddings/bm25.test.ts +130 -0
- package/tests/embeddings/manager.test.ts +205 -0
- package/tests/integration/atlas.test.ts +266 -0
- package/tests/integration/e2e.test.ts +929 -0
- package/tests/learning/analyzer.test.ts +426 -0
- package/tests/learning/effectiveness.test.ts +542 -0
- package/tests/learning/pipeline.test.ts +176 -0
- package/tests/learning/playbook-extractor-provenance.test.ts +114 -0
- package/tests/learning/usage-inference.test.ts +254 -0
- package/tests/mcp/playbook-server.test.ts +252 -0
- package/tests/memory/experience.test.ts +198 -0
- package/tests/memory/playbook.test.ts +338 -0
- package/tests/memory/provenance.test.ts +639 -0
- package/tests/memory/system.test.ts +325 -0
- package/tests/runtime/agent-manager.test.ts +512 -0
- package/tests/runtime/mock-backend.test.ts +248 -0
- package/tests/search/refinement-loop.test.ts +468 -0
- package/tests/search/refinement.test.ts +267 -0
- package/tests/search/router.test.ts +427 -0
- package/tests/surfacing/skill-library.test.ts +292 -0
- package/tests/types/outcome.test.ts +147 -0
- package/tests/types/step.test.ts +133 -0
- package/tests/types/task.test.ts +158 -0
- package/tests/types/trajectory.test.ts +253 -0
- package/tests/utils/similarity.test.ts +188 -0
- package/tests/utils/validation.test.ts +252 -0
- package/tsconfig.json +25 -0
- package/vitest.config.ts +22 -0
- package/dist/index.d.mts +0 -466
- package/dist/index.mjs +0 -478
|
@@ -0,0 +1,512 @@
|
|
|
1
|
+
import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
|
|
2
|
+
import { AgentManager, createAgentManager, DefaultKnowledgeInjector, DefaultTrajectoryExtractor } from '../../src/runtime/manager.js';
|
|
3
|
+
import { MockBackend, createMockBackend } from '../../src/runtime/backends/mock.js';
|
|
4
|
+
import { createMemorySystem } from '../../src/memory/system.js';
|
|
5
|
+
import { createTask } from '../../src/types/task.js';
|
|
6
|
+
import type { MemorySystem } from '../../src/memory/system.js';
|
|
7
|
+
import type { AgentSession, ToolCall, AgentMessage } from '../../src/runtime/types.js';
|
|
8
|
+
import { mkdtemp, rm } from 'node:fs/promises';
|
|
9
|
+
import { join } from 'node:path';
|
|
10
|
+
import { tmpdir } from 'node:os';
|
|
11
|
+
|
|
12
|
+
describe('AgentManager', () => {
|
|
13
|
+
let tempDir: string;
|
|
14
|
+
let memory: MemorySystem;
|
|
15
|
+
let manager: AgentManager;
|
|
16
|
+
let mockBackend: MockBackend;
|
|
17
|
+
|
|
18
|
+
beforeEach(async () => {
|
|
19
|
+
tempDir = await mkdtemp(join(tmpdir(), 'agent-manager-test-'));
|
|
20
|
+
memory = createMemorySystem(tempDir);
|
|
21
|
+
await memory.init();
|
|
22
|
+
|
|
23
|
+
manager = createAgentManager(memory);
|
|
24
|
+
mockBackend = createMockBackend({
|
|
25
|
+
success: true,
|
|
26
|
+
result: 'Test result',
|
|
27
|
+
durationMs: 50,
|
|
28
|
+
});
|
|
29
|
+
manager.registerBackend(mockBackend);
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
afterEach(async () => {
|
|
33
|
+
await memory.close();
|
|
34
|
+
await rm(tempDir, { recursive: true, force: true });
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
describe('backend registration', () => {
|
|
38
|
+
it('should register and retrieve backends', () => {
|
|
39
|
+
expect(manager.getBackend('mock')).toBe(mockBackend);
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
it('should list registered backends', () => {
|
|
43
|
+
const backends = manager.listBackends();
|
|
44
|
+
expect(backends).toContain('mock');
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
it('should return undefined for unregistered backend', () => {
|
|
48
|
+
expect(manager.getBackend('nonexistent')).toBeUndefined();
|
|
49
|
+
});
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
describe('spawn', () => {
|
|
53
|
+
it('should spawn an agent and return result', async () => {
|
|
54
|
+
const task = createTask({
|
|
55
|
+
domain: 'test',
|
|
56
|
+
description: 'Test task',
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
const result = await manager.spawn({
|
|
60
|
+
agentType: 'mock',
|
|
61
|
+
task,
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
expect(result.success).toBe(true);
|
|
65
|
+
expect(result.trajectory).toBeDefined();
|
|
66
|
+
expect(result.trajectory.task).toEqual(task);
|
|
67
|
+
expect(result.session.state).toBe('completed');
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
it('should throw error for unsupported agent type', async () => {
|
|
71
|
+
const task = createTask({ domain: 'test', description: 'Test' });
|
|
72
|
+
|
|
73
|
+
await expect(
|
|
74
|
+
manager.spawn({ agentType: 'unsupported', task })
|
|
75
|
+
).rejects.toThrow('No backend found for agent type: unsupported');
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
it('should inject knowledge into system prompt', async () => {
|
|
79
|
+
// Provide custom knowledge directly to ensure injection
|
|
80
|
+
const customKnowledge = {
|
|
81
|
+
experiences: [{
|
|
82
|
+
experience: {
|
|
83
|
+
id: 'exp-1',
|
|
84
|
+
taskInput: 'Similar test task',
|
|
85
|
+
solutionOutput: 'Solution approach',
|
|
86
|
+
feedback: 'Success',
|
|
87
|
+
success: true,
|
|
88
|
+
domain: 'test',
|
|
89
|
+
trajectoryId: 'traj-1',
|
|
90
|
+
usageCount: 0,
|
|
91
|
+
createdAt: new Date(),
|
|
92
|
+
metadata: {},
|
|
93
|
+
},
|
|
94
|
+
score: 0.9,
|
|
95
|
+
}],
|
|
96
|
+
playbooks: [],
|
|
97
|
+
};
|
|
98
|
+
|
|
99
|
+
const task = createTask({
|
|
100
|
+
domain: 'test',
|
|
101
|
+
description: 'Test task matching experience',
|
|
102
|
+
});
|
|
103
|
+
|
|
104
|
+
const result = await manager.spawn({
|
|
105
|
+
agentType: 'mock',
|
|
106
|
+
task,
|
|
107
|
+
injectedKnowledge: customKnowledge,
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
expect(result.session.metadata.injectedKnowledge).toBe(true);
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
it('should use provided injectedKnowledge instead of querying memory', async () => {
|
|
114
|
+
const customKnowledge = {
|
|
115
|
+
experiences: [],
|
|
116
|
+
playbooks: [{
|
|
117
|
+
playbook: {
|
|
118
|
+
id: 'playbook-1',
|
|
119
|
+
name: 'Test Playbook',
|
|
120
|
+
guidance: { strategy: 'Custom strategy', tactics: [] },
|
|
121
|
+
applicability: { situations: [], triggers: [], antiPatterns: [], domains: ['test'] },
|
|
122
|
+
verification: { successIndicators: [], failureIndicators: [] },
|
|
123
|
+
evolution: { version: '1.0.0', createdFrom: [], failures: [], refinements: [], successCount: 0, failureCount: 0 },
|
|
124
|
+
confidence: 0.8,
|
|
125
|
+
complexity: 'simple' as const,
|
|
126
|
+
estimatedEffort: 1,
|
|
127
|
+
createdAt: new Date(),
|
|
128
|
+
updatedAt: new Date(),
|
|
129
|
+
},
|
|
130
|
+
score: 0.9,
|
|
131
|
+
matchType: 'situation' as const,
|
|
132
|
+
}],
|
|
133
|
+
};
|
|
134
|
+
|
|
135
|
+
const task = createTask({ domain: 'test', description: 'Test' });
|
|
136
|
+
|
|
137
|
+
const result = await manager.spawn({
|
|
138
|
+
agentType: 'mock',
|
|
139
|
+
task,
|
|
140
|
+
injectedKnowledge: customKnowledge,
|
|
141
|
+
});
|
|
142
|
+
|
|
143
|
+
expect(result.session.metadata.injectedKnowledge).toBe(true);
|
|
144
|
+
});
|
|
145
|
+
|
|
146
|
+
it('should pass systemPromptAdditions to backend', async () => {
|
|
147
|
+
const task = createTask({ domain: 'test', description: 'Test' });
|
|
148
|
+
|
|
149
|
+
const result = await manager.spawn({
|
|
150
|
+
agentType: 'mock',
|
|
151
|
+
task,
|
|
152
|
+
systemPromptAdditions: 'Custom instructions',
|
|
153
|
+
});
|
|
154
|
+
|
|
155
|
+
expect(result.session.metadata.hasSystemPromptAdditions).toBe(true);
|
|
156
|
+
});
|
|
157
|
+
|
|
158
|
+
it('should invoke callbacks during execution', async () => {
|
|
159
|
+
const onMessage = vi.fn();
|
|
160
|
+
const onToolCall = vi.fn();
|
|
161
|
+
|
|
162
|
+
mockBackend.setDefaultBehavior({
|
|
163
|
+
success: true,
|
|
164
|
+
messages: [{ role: 'assistant', content: 'Working...' }],
|
|
165
|
+
toolCalls: [{ name: 'read_file', input: { path: 'test.ts' }, output: 'content' }],
|
|
166
|
+
durationMs: 50,
|
|
167
|
+
});
|
|
168
|
+
|
|
169
|
+
const task = createTask({ domain: 'test', description: 'Test with callbacks' });
|
|
170
|
+
|
|
171
|
+
await manager.spawn({
|
|
172
|
+
agentType: 'mock',
|
|
173
|
+
task,
|
|
174
|
+
onMessage,
|
|
175
|
+
onToolCall,
|
|
176
|
+
});
|
|
177
|
+
|
|
178
|
+
expect(onMessage).toHaveBeenCalled();
|
|
179
|
+
expect(onToolCall).toHaveBeenCalled();
|
|
180
|
+
});
|
|
181
|
+
|
|
182
|
+
it('should handle failed agent execution', async () => {
|
|
183
|
+
mockBackend.setDefaultBehavior({
|
|
184
|
+
success: false,
|
|
185
|
+
error: 'Execution failed',
|
|
186
|
+
durationMs: 50,
|
|
187
|
+
});
|
|
188
|
+
|
|
189
|
+
const task = createTask({ domain: 'test', description: 'Failing task' });
|
|
190
|
+
|
|
191
|
+
const result = await manager.spawn({
|
|
192
|
+
agentType: 'mock',
|
|
193
|
+
task,
|
|
194
|
+
});
|
|
195
|
+
|
|
196
|
+
expect(result.success).toBe(false);
|
|
197
|
+
expect(result.trajectory.outcome.success).toBe(false);
|
|
198
|
+
});
|
|
199
|
+
|
|
200
|
+
it('should extract trajectory from completed session', async () => {
|
|
201
|
+
mockBackend.setDefaultBehavior({
|
|
202
|
+
success: true,
|
|
203
|
+
result: 'Final result',
|
|
204
|
+
messages: [
|
|
205
|
+
{ role: 'assistant', content: 'Analyzing task...' },
|
|
206
|
+
{ role: 'assistant', content: 'Implementing solution...' },
|
|
207
|
+
],
|
|
208
|
+
toolCalls: [
|
|
209
|
+
{ name: 'read_file', input: { path: 'src/main.ts' }, output: 'code content' },
|
|
210
|
+
{ name: 'write_file', input: { path: 'src/main.ts', content: 'new code' }, output: 'written' },
|
|
211
|
+
],
|
|
212
|
+
durationMs: 100,
|
|
213
|
+
});
|
|
214
|
+
|
|
215
|
+
const task = createTask({ domain: 'code', description: 'Modify file' });
|
|
216
|
+
|
|
217
|
+
const result = await manager.spawn({
|
|
218
|
+
agentType: 'mock',
|
|
219
|
+
task,
|
|
220
|
+
});
|
|
221
|
+
|
|
222
|
+
expect(result.trajectory.steps.length).toBe(2);
|
|
223
|
+
expect(result.trajectory.outcome.success).toBe(true);
|
|
224
|
+
expect(result.metrics.toolCallCount).toBe(2);
|
|
225
|
+
});
|
|
226
|
+
});
|
|
227
|
+
|
|
228
|
+
describe('spawnBaseline', () => {
|
|
229
|
+
it('should spawn without knowledge injection', async () => {
|
|
230
|
+
// Add experience that would normally be injected
|
|
231
|
+
await memory.experiences.add({
|
|
232
|
+
id: 'exp-baseline',
|
|
233
|
+
taskInput: 'Baseline test task',
|
|
234
|
+
solutionOutput: 'Solution',
|
|
235
|
+
feedback: 'Success',
|
|
236
|
+
success: true,
|
|
237
|
+
domain: 'test',
|
|
238
|
+
trajectoryId: 'traj-baseline',
|
|
239
|
+
usageCount: 0,
|
|
240
|
+
createdAt: new Date(),
|
|
241
|
+
metadata: {},
|
|
242
|
+
});
|
|
243
|
+
|
|
244
|
+
const task = createTask({ domain: 'test', description: 'Baseline test task' });
|
|
245
|
+
|
|
246
|
+
const result = await manager.spawnBaseline({
|
|
247
|
+
agentType: 'mock',
|
|
248
|
+
task,
|
|
249
|
+
});
|
|
250
|
+
|
|
251
|
+
// Should still succeed but with empty knowledge
|
|
252
|
+
expect(result.success).toBe(true);
|
|
253
|
+
});
|
|
254
|
+
});
|
|
255
|
+
|
|
256
|
+
describe('compareWithKnowledge', () => {
|
|
257
|
+
it('should run both baseline and knowledge-enhanced executions', async () => {
|
|
258
|
+
const task = createTask({ domain: 'test', description: 'Comparison task' });
|
|
259
|
+
|
|
260
|
+
const comparison = await manager.compareWithKnowledge({
|
|
261
|
+
agentType: 'mock',
|
|
262
|
+
task,
|
|
263
|
+
});
|
|
264
|
+
|
|
265
|
+
expect(comparison.baseline).toBeDefined();
|
|
266
|
+
expect(comparison.withKnowledge).toBeDefined();
|
|
267
|
+
expect(comparison.improvement).toBeDefined();
|
|
268
|
+
expect(comparison.improvement.timeDelta).toBeDefined();
|
|
269
|
+
expect(comparison.improvement.toolCallDelta).toBeDefined();
|
|
270
|
+
expect(comparison.improvement.successDelta).toBeDefined();
|
|
271
|
+
});
|
|
272
|
+
});
|
|
273
|
+
|
|
274
|
+
describe('observers', () => {
|
|
275
|
+
it('should notify observers on session events', async () => {
|
|
276
|
+
const onSessionStart = vi.fn();
|
|
277
|
+
const onSessionEnd = vi.fn();
|
|
278
|
+
|
|
279
|
+
manager.addObserver({
|
|
280
|
+
onSessionStart,
|
|
281
|
+
onSessionEnd,
|
|
282
|
+
});
|
|
283
|
+
|
|
284
|
+
mockBackend.setDefaultBehavior({
|
|
285
|
+
success: true,
|
|
286
|
+
result: 'Done',
|
|
287
|
+
durationMs: 50,
|
|
288
|
+
});
|
|
289
|
+
|
|
290
|
+
const task = createTask({ domain: 'test', description: 'Observer test' });
|
|
291
|
+
await manager.spawn({ agentType: 'mock', task });
|
|
292
|
+
|
|
293
|
+
expect(onSessionStart).toHaveBeenCalled();
|
|
294
|
+
expect(onSessionEnd).toHaveBeenCalled();
|
|
295
|
+
});
|
|
296
|
+
|
|
297
|
+
it('should remove observers', async () => {
|
|
298
|
+
const observer = {
|
|
299
|
+
onSessionStart: vi.fn(),
|
|
300
|
+
onSessionEnd: vi.fn(),
|
|
301
|
+
};
|
|
302
|
+
|
|
303
|
+
manager.addObserver(observer);
|
|
304
|
+
manager.removeObserver(observer);
|
|
305
|
+
|
|
306
|
+
const task = createTask({ domain: 'test', description: 'Test' });
|
|
307
|
+
await manager.spawn({ agentType: 'mock', task });
|
|
308
|
+
|
|
309
|
+
expect(observer.onSessionStart).not.toHaveBeenCalled();
|
|
310
|
+
});
|
|
311
|
+
});
|
|
312
|
+
|
|
313
|
+
describe('session management', () => {
|
|
314
|
+
it('should track active sessions', async () => {
|
|
315
|
+
mockBackend.setDefaultBehavior({ success: true, durationMs: 200 });
|
|
316
|
+
|
|
317
|
+
const task = createTask({ domain: 'test', description: 'Long task' });
|
|
318
|
+
|
|
319
|
+
// Start spawn but don't await yet
|
|
320
|
+
const spawnPromise = manager.spawn({ agentType: 'mock', task });
|
|
321
|
+
|
|
322
|
+
// Give it a moment to start
|
|
323
|
+
await new Promise(resolve => setTimeout(resolve, 50));
|
|
324
|
+
|
|
325
|
+
const activeSessions = manager.getActiveSessions();
|
|
326
|
+
expect(activeSessions.length).toBeGreaterThanOrEqual(0);
|
|
327
|
+
|
|
328
|
+
// Wait for completion
|
|
329
|
+
await spawnPromise;
|
|
330
|
+
});
|
|
331
|
+
|
|
332
|
+
it('should terminate active sessions', async () => {
|
|
333
|
+
mockBackend.setDefaultBehavior({ success: true, durationMs: 500 });
|
|
334
|
+
|
|
335
|
+
const task = createTask({ domain: 'test', description: 'Terminable task' });
|
|
336
|
+
|
|
337
|
+
const spawnPromise = manager.spawn({ agentType: 'mock', task });
|
|
338
|
+
|
|
339
|
+
// Give it a moment to start
|
|
340
|
+
await new Promise(resolve => setTimeout(resolve, 50));
|
|
341
|
+
|
|
342
|
+
const sessions = manager.getActiveSessions();
|
|
343
|
+
if (sessions.length > 0) {
|
|
344
|
+
await manager.terminate(sessions[0].id);
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
// Complete spawn (may have been terminated)
|
|
348
|
+
try {
|
|
349
|
+
await spawnPromise;
|
|
350
|
+
} catch {
|
|
351
|
+
// Expected if terminated
|
|
352
|
+
}
|
|
353
|
+
});
|
|
354
|
+
});
|
|
355
|
+
|
|
356
|
+
describe('observeAndLearn', () => {
|
|
357
|
+
it('should extract trajectory from external session and store in memory', async () => {
|
|
358
|
+
const externalSession: AgentSession = {
|
|
359
|
+
id: 'external-session-1',
|
|
360
|
+
agentType: 'external',
|
|
361
|
+
task: createTask({ domain: 'test', description: 'External task' }),
|
|
362
|
+
state: 'completed',
|
|
363
|
+
messages: [],
|
|
364
|
+
toolCalls: [
|
|
365
|
+
{
|
|
366
|
+
id: 'tc-1',
|
|
367
|
+
name: 'read_file',
|
|
368
|
+
input: { path: 'test.ts' },
|
|
369
|
+
output: 'file content',
|
|
370
|
+
startTime: new Date(),
|
|
371
|
+
endTime: new Date(),
|
|
372
|
+
},
|
|
373
|
+
],
|
|
374
|
+
startTime: new Date(),
|
|
375
|
+
endTime: new Date(),
|
|
376
|
+
result: 'External result',
|
|
377
|
+
metadata: {},
|
|
378
|
+
};
|
|
379
|
+
|
|
380
|
+
const task = createTask({ domain: 'test', description: 'External task' });
|
|
381
|
+
const trajectory = await manager.observeAndLearn(externalSession, task);
|
|
382
|
+
|
|
383
|
+
expect(trajectory).toBeDefined();
|
|
384
|
+
expect(trajectory.agentId).toContain('external');
|
|
385
|
+
expect(trajectory.steps.length).toBe(1);
|
|
386
|
+
});
|
|
387
|
+
});
|
|
388
|
+
});
|
|
389
|
+
|
|
390
|
+
describe('DefaultKnowledgeInjector', () => {
|
|
391
|
+
const injector = new DefaultKnowledgeInjector();
|
|
392
|
+
|
|
393
|
+
it('should format markdown by default', () => {
|
|
394
|
+
const knowledge = {
|
|
395
|
+
experiences: [{
|
|
396
|
+
experience: {
|
|
397
|
+
id: 'exp-1',
|
|
398
|
+
taskInput: 'Test task',
|
|
399
|
+
solutionOutput: 'Test solution',
|
|
400
|
+
feedback: 'Good',
|
|
401
|
+
success: true,
|
|
402
|
+
domain: 'test',
|
|
403
|
+
trajectoryId: 'traj-1',
|
|
404
|
+
usageCount: 1,
|
|
405
|
+
createdAt: new Date(),
|
|
406
|
+
metadata: {},
|
|
407
|
+
},
|
|
408
|
+
score: 0.85,
|
|
409
|
+
}],
|
|
410
|
+
playbooks: [],
|
|
411
|
+
};
|
|
412
|
+
|
|
413
|
+
const formatted = injector.format(knowledge, 'test');
|
|
414
|
+
expect(formatted).toContain('Similar Past Experiences');
|
|
415
|
+
expect(formatted).toContain('85%');
|
|
416
|
+
});
|
|
417
|
+
|
|
418
|
+
it('should format JSON when specified', () => {
|
|
419
|
+
const knowledge = {
|
|
420
|
+
experiences: [],
|
|
421
|
+
playbooks: [],
|
|
422
|
+
};
|
|
423
|
+
|
|
424
|
+
const formatted = injector.format(knowledge, 'test', { format: 'json' });
|
|
425
|
+
expect(() => JSON.parse(formatted)).not.toThrow();
|
|
426
|
+
});
|
|
427
|
+
|
|
428
|
+
it('should format XML when specified', () => {
|
|
429
|
+
const knowledge = {
|
|
430
|
+
experiences: [],
|
|
431
|
+
playbooks: [{
|
|
432
|
+
playbook: {
|
|
433
|
+
id: 'pb-1',
|
|
434
|
+
name: 'Test Playbook',
|
|
435
|
+
guidance: { strategy: 'Test strategy', tactics: ['tactic1'] },
|
|
436
|
+
applicability: { situations: [], triggers: [], antiPatterns: [], domains: ['test'] },
|
|
437
|
+
verification: { successIndicators: [], failureIndicators: [] },
|
|
438
|
+
evolution: { version: '1.0.0', createdFrom: [], failures: [], refinements: [], successCount: 0, failureCount: 0 },
|
|
439
|
+
confidence: 0.8,
|
|
440
|
+
complexity: 'simple' as const,
|
|
441
|
+
estimatedEffort: 1,
|
|
442
|
+
createdAt: new Date(),
|
|
443
|
+
updatedAt: new Date(),
|
|
444
|
+
},
|
|
445
|
+
score: 0.9,
|
|
446
|
+
matchType: 'situation' as const,
|
|
447
|
+
}],
|
|
448
|
+
};
|
|
449
|
+
|
|
450
|
+
const formatted = injector.format(knowledge, 'test', { format: 'xml' });
|
|
451
|
+
expect(formatted).toContain('<atlas-knowledge>');
|
|
452
|
+
expect(formatted).toContain('<playbooks>');
|
|
453
|
+
});
|
|
454
|
+
});
|
|
455
|
+
|
|
456
|
+
describe('DefaultTrajectoryExtractor', () => {
|
|
457
|
+
const extractor = new DefaultTrajectoryExtractor();
|
|
458
|
+
|
|
459
|
+
it('should extract trajectory from session', () => {
|
|
460
|
+
const session: AgentSession = {
|
|
461
|
+
id: 'session-1',
|
|
462
|
+
agentType: 'test',
|
|
463
|
+
task: createTask({ domain: 'test', description: 'Test task' }),
|
|
464
|
+
state: 'completed',
|
|
465
|
+
messages: [
|
|
466
|
+
{ role: 'assistant', content: 'Thinking about solution', timestamp: new Date() },
|
|
467
|
+
],
|
|
468
|
+
toolCalls: [
|
|
469
|
+
{
|
|
470
|
+
id: 'tc-1',
|
|
471
|
+
name: 'write_code',
|
|
472
|
+
input: { code: 'console.log("hello")' },
|
|
473
|
+
output: 'success',
|
|
474
|
+
startTime: new Date(),
|
|
475
|
+
endTime: new Date(),
|
|
476
|
+
},
|
|
477
|
+
],
|
|
478
|
+
startTime: new Date(),
|
|
479
|
+
endTime: new Date(),
|
|
480
|
+
result: 'Done',
|
|
481
|
+
metadata: {},
|
|
482
|
+
};
|
|
483
|
+
|
|
484
|
+
const task = createTask({ domain: 'test', description: 'Test task' });
|
|
485
|
+
const trajectory = extractor.extract(session, task);
|
|
486
|
+
|
|
487
|
+
expect(trajectory.steps.length).toBe(1);
|
|
488
|
+
expect(trajectory.outcome.success).toBe(true);
|
|
489
|
+
expect(trajectory.agentId).toContain('test:session-1');
|
|
490
|
+
});
|
|
491
|
+
|
|
492
|
+
it('should handle failed sessions', () => {
|
|
493
|
+
const session: AgentSession = {
|
|
494
|
+
id: 'session-fail',
|
|
495
|
+
agentType: 'test',
|
|
496
|
+
task: createTask({ domain: 'test', description: 'Failing task' }),
|
|
497
|
+
state: 'failed',
|
|
498
|
+
messages: [],
|
|
499
|
+
toolCalls: [],
|
|
500
|
+
startTime: new Date(),
|
|
501
|
+
endTime: new Date(),
|
|
502
|
+
error: 'Something went wrong',
|
|
503
|
+
metadata: {},
|
|
504
|
+
};
|
|
505
|
+
|
|
506
|
+
const task = createTask({ domain: 'test', description: 'Failing task' });
|
|
507
|
+
const trajectory = extractor.extract(session, task);
|
|
508
|
+
|
|
509
|
+
expect(trajectory.outcome.success).toBe(false);
|
|
510
|
+
expect(trajectory.outcome.errorInfo).toBe('Something went wrong');
|
|
511
|
+
});
|
|
512
|
+
});
|