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,541 @@
|
|
|
1
|
+
import type { Task, Trajectory, Step } from '../types/index.js';
|
|
2
|
+
import {
|
|
3
|
+
createTrajectory,
|
|
4
|
+
createStep,
|
|
5
|
+
successOutcome,
|
|
6
|
+
failureOutcome,
|
|
7
|
+
} from '../types/index.js';
|
|
8
|
+
import type { MemorySystem, MemoryQueryResultV2 } from '../memory/system.js';
|
|
9
|
+
import type {
|
|
10
|
+
AgentBackend,
|
|
11
|
+
AgentSpawnConfig,
|
|
12
|
+
AgentSession,
|
|
13
|
+
AgentResult,
|
|
14
|
+
AgentMessage,
|
|
15
|
+
ToolCall,
|
|
16
|
+
AgentObserverCallbacks,
|
|
17
|
+
KnowledgeInjector,
|
|
18
|
+
TrajectoryExtractor,
|
|
19
|
+
} from './types.js';
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Default knowledge injector - formats memory for context injection
|
|
23
|
+
*/
|
|
24
|
+
export class DefaultKnowledgeInjector implements KnowledgeInjector {
|
|
25
|
+
format(
|
|
26
|
+
knowledge: MemoryQueryResultV2,
|
|
27
|
+
_agentType: string,
|
|
28
|
+
options?: { maxTokens?: number; format?: 'markdown' | 'json' | 'xml' }
|
|
29
|
+
): string {
|
|
30
|
+
const format = options?.format ?? 'markdown';
|
|
31
|
+
|
|
32
|
+
if (format === 'json') {
|
|
33
|
+
return JSON.stringify(knowledge, null, 2);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
if (format === 'xml') {
|
|
37
|
+
return this.formatXml(knowledge);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
return this.formatMarkdown(knowledge);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
private formatMarkdown(knowledge: MemoryQueryResultV2): string {
|
|
44
|
+
const sections: string[] = [];
|
|
45
|
+
|
|
46
|
+
if (knowledge.playbooks.length > 0) {
|
|
47
|
+
sections.push('## Applicable Playbooks\n');
|
|
48
|
+
for (const { playbook, score, matchType } of knowledge.playbooks) {
|
|
49
|
+
sections.push(`### ${playbook.name} (${(score * 100).toFixed(0)}% match via ${matchType})`);
|
|
50
|
+
sections.push(`**Strategy:** ${playbook.guidance.strategy}`);
|
|
51
|
+
if (playbook.guidance.tactics.length > 0) {
|
|
52
|
+
sections.push(`**Tactics:** ${playbook.guidance.tactics.join(', ')}`);
|
|
53
|
+
}
|
|
54
|
+
if (playbook.guidance.steps && playbook.guidance.steps.length > 0) {
|
|
55
|
+
sections.push('**Steps:**');
|
|
56
|
+
playbook.guidance.steps.forEach((step, i) => {
|
|
57
|
+
sections.push(`${i + 1}. ${step}`);
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
sections.push(`*Confidence: ${(playbook.confidence * 100).toFixed(0)}%*\n`);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
if (knowledge.experiences.length > 0) {
|
|
65
|
+
sections.push('## Similar Past Experiences\n');
|
|
66
|
+
for (const { experience, score } of knowledge.experiences) {
|
|
67
|
+
sections.push(`### Experience (relevance: ${(score * 100).toFixed(0)}%)`);
|
|
68
|
+
sections.push(`**Task:** ${experience.taskInput.slice(0, 200)}...`);
|
|
69
|
+
sections.push(`**Outcome:** ${experience.success ? 'Success' : 'Failed'}`);
|
|
70
|
+
sections.push(`**Approach:** ${experience.solutionOutput.slice(0, 300)}...`);
|
|
71
|
+
sections.push('');
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
return sections.join('\n');
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
private formatXml(knowledge: MemoryQueryResultV2): string {
|
|
79
|
+
const parts: string[] = ['<atlas-knowledge>'];
|
|
80
|
+
|
|
81
|
+
if (knowledge.playbooks.length > 0) {
|
|
82
|
+
parts.push(' <playbooks>');
|
|
83
|
+
for (const { playbook, score } of knowledge.playbooks) {
|
|
84
|
+
parts.push(` <playbook name="${this.escapeXml(playbook.name)}" relevance="${score.toFixed(2)}">`);
|
|
85
|
+
parts.push(` <strategy>${this.escapeXml(playbook.guidance.strategy)}</strategy>`);
|
|
86
|
+
if (playbook.guidance.steps && playbook.guidance.steps.length > 0) {
|
|
87
|
+
parts.push(' <steps>');
|
|
88
|
+
playbook.guidance.steps.forEach((step, i) => {
|
|
89
|
+
parts.push(` <step n="${i + 1}">${this.escapeXml(step)}</step>`);
|
|
90
|
+
});
|
|
91
|
+
parts.push(' </steps>');
|
|
92
|
+
}
|
|
93
|
+
parts.push(` <confidence>${playbook.confidence}</confidence>`);
|
|
94
|
+
parts.push(' </playbook>');
|
|
95
|
+
}
|
|
96
|
+
parts.push(' </playbooks>');
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
if (knowledge.experiences.length > 0) {
|
|
100
|
+
parts.push(' <experiences>');
|
|
101
|
+
for (const { experience, score } of knowledge.experiences) {
|
|
102
|
+
parts.push(` <experience relevance="${score.toFixed(2)}">`);
|
|
103
|
+
parts.push(` <task>${this.escapeXml(experience.taskInput.slice(0, 200))}</task>`);
|
|
104
|
+
parts.push(` <outcome>${experience.success ? 'success' : 'failure'}</outcome>`);
|
|
105
|
+
parts.push(' </experience>');
|
|
106
|
+
}
|
|
107
|
+
parts.push(' </experiences>');
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
parts.push('</atlas-knowledge>');
|
|
111
|
+
return parts.join('\n');
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
private escapeXml(str: string): string {
|
|
115
|
+
return str
|
|
116
|
+
.replace(/&/g, '&')
|
|
117
|
+
.replace(/</g, '<')
|
|
118
|
+
.replace(/>/g, '>')
|
|
119
|
+
.replace(/"/g, '"');
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
/**
|
|
124
|
+
* Default trajectory extractor - converts agent sessions to trajectories
|
|
125
|
+
*/
|
|
126
|
+
export class DefaultTrajectoryExtractor implements TrajectoryExtractor {
|
|
127
|
+
extract(session: AgentSession, task: Task): Trajectory {
|
|
128
|
+
const steps: Step[] = [];
|
|
129
|
+
|
|
130
|
+
// Convert tool calls to steps
|
|
131
|
+
for (const toolCall of session.toolCalls) {
|
|
132
|
+
steps.push(
|
|
133
|
+
createStep({
|
|
134
|
+
thought: this.extractThought(session.messages, toolCall),
|
|
135
|
+
action: `${toolCall.name}: ${this.summarizeInput(toolCall.input)}`,
|
|
136
|
+
observation: toolCall.error
|
|
137
|
+
? `Error: ${toolCall.error}`
|
|
138
|
+
: this.summarizeOutput(toolCall.output),
|
|
139
|
+
metadata: {
|
|
140
|
+
toolCallId: toolCall.id,
|
|
141
|
+
toolName: toolCall.name,
|
|
142
|
+
duration: toolCall.endTime
|
|
143
|
+
? toolCall.endTime.getTime() - toolCall.startTime.getTime()
|
|
144
|
+
: undefined,
|
|
145
|
+
},
|
|
146
|
+
})
|
|
147
|
+
);
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
// Determine outcome
|
|
151
|
+
const outcome =
|
|
152
|
+
session.state === 'completed'
|
|
153
|
+
? successOutcome(session.result)
|
|
154
|
+
: failureOutcome(
|
|
155
|
+
session.error ?? 'Session did not complete successfully'
|
|
156
|
+
);
|
|
157
|
+
|
|
158
|
+
return createTrajectory({
|
|
159
|
+
task,
|
|
160
|
+
steps,
|
|
161
|
+
outcome,
|
|
162
|
+
agentId: `${session.agentType}:${session.id}`,
|
|
163
|
+
wallTimeSeconds: session.endTime
|
|
164
|
+
? (session.endTime.getTime() - session.startTime.getTime()) / 1000
|
|
165
|
+
: 0,
|
|
166
|
+
metadata: {
|
|
167
|
+
sessionId: session.id,
|
|
168
|
+
agentType: session.agentType,
|
|
169
|
+
messageCount: session.messages.length,
|
|
170
|
+
...session.metadata,
|
|
171
|
+
},
|
|
172
|
+
});
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
private extractThought(
|
|
176
|
+
messages: AgentMessage[],
|
|
177
|
+
toolCall: ToolCall
|
|
178
|
+
): string | undefined {
|
|
179
|
+
// Find the assistant message just before this tool call
|
|
180
|
+
const toolCallTime = toolCall.startTime.getTime();
|
|
181
|
+
const precedingMessages = messages.filter(
|
|
182
|
+
(m) =>
|
|
183
|
+
m.role === 'assistant' &&
|
|
184
|
+
m.timestamp.getTime() < toolCallTime &&
|
|
185
|
+
m.timestamp.getTime() > toolCallTime - 60000 // Within 1 minute
|
|
186
|
+
);
|
|
187
|
+
|
|
188
|
+
if (precedingMessages.length > 0) {
|
|
189
|
+
const lastMessage = precedingMessages[precedingMessages.length - 1];
|
|
190
|
+
// Extract reasoning/thought from the message
|
|
191
|
+
return lastMessage.content.slice(0, 500);
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
return undefined;
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
private summarizeInput(input: unknown): string {
|
|
198
|
+
if (typeof input === 'string') {
|
|
199
|
+
return input.slice(0, 100);
|
|
200
|
+
}
|
|
201
|
+
if (typeof input === 'object' && input !== null) {
|
|
202
|
+
const str = JSON.stringify(input);
|
|
203
|
+
return str.slice(0, 100) + (str.length > 100 ? '...' : '');
|
|
204
|
+
}
|
|
205
|
+
return String(input);
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
private summarizeOutput(output: unknown): string {
|
|
209
|
+
if (output === undefined) return 'No output';
|
|
210
|
+
if (typeof output === 'string') {
|
|
211
|
+
return output.slice(0, 200) + (output.length > 200 ? '...' : '');
|
|
212
|
+
}
|
|
213
|
+
if (typeof output === 'object' && output !== null) {
|
|
214
|
+
const str = JSON.stringify(output);
|
|
215
|
+
return str.slice(0, 200) + (str.length > 200 ? '...' : '');
|
|
216
|
+
}
|
|
217
|
+
return String(output);
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
/**
|
|
222
|
+
* Agent Manager - orchestrates agent spawning, observation, and learning
|
|
223
|
+
*/
|
|
224
|
+
export class AgentManager {
|
|
225
|
+
private backends: Map<string, AgentBackend> = new Map();
|
|
226
|
+
private memory: MemorySystem;
|
|
227
|
+
private injector: KnowledgeInjector;
|
|
228
|
+
private extractor: TrajectoryExtractor;
|
|
229
|
+
private observers: AgentObserverCallbacks[] = [];
|
|
230
|
+
private activeSessions: Map<string, AgentSession> = new Map();
|
|
231
|
+
|
|
232
|
+
constructor(
|
|
233
|
+
memory: MemorySystem,
|
|
234
|
+
options?: {
|
|
235
|
+
injector?: KnowledgeInjector;
|
|
236
|
+
extractor?: TrajectoryExtractor;
|
|
237
|
+
}
|
|
238
|
+
) {
|
|
239
|
+
this.memory = memory;
|
|
240
|
+
this.injector = options?.injector ?? new DefaultKnowledgeInjector();
|
|
241
|
+
this.extractor = options?.extractor ?? new DefaultTrajectoryExtractor();
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
/**
|
|
245
|
+
* Register an agent backend
|
|
246
|
+
*/
|
|
247
|
+
registerBackend(backend: AgentBackend): void {
|
|
248
|
+
this.backends.set(backend.name, backend);
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
/**
|
|
252
|
+
* Get a registered backend
|
|
253
|
+
*/
|
|
254
|
+
getBackend(name: string): AgentBackend | undefined {
|
|
255
|
+
return this.backends.get(name);
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
/**
|
|
259
|
+
* List available backends
|
|
260
|
+
*/
|
|
261
|
+
listBackends(): string[] {
|
|
262
|
+
return Array.from(this.backends.keys());
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
/**
|
|
266
|
+
* Add an observer for agent events
|
|
267
|
+
*/
|
|
268
|
+
addObserver(callbacks: AgentObserverCallbacks): void {
|
|
269
|
+
this.observers.push(callbacks);
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
/**
|
|
273
|
+
* Remove an observer
|
|
274
|
+
*/
|
|
275
|
+
removeObserver(callbacks: AgentObserverCallbacks): void {
|
|
276
|
+
const index = this.observers.indexOf(callbacks);
|
|
277
|
+
if (index >= 0) {
|
|
278
|
+
this.observers.splice(index, 1);
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
/**
|
|
283
|
+
* Spawn an agent to execute a task
|
|
284
|
+
* This is the main entry point for running agents
|
|
285
|
+
*/
|
|
286
|
+
async spawn(config: AgentSpawnConfig): Promise<AgentResult> {
|
|
287
|
+
// Find appropriate backend
|
|
288
|
+
const backend = this.findBackend(config.agentType);
|
|
289
|
+
if (!backend) {
|
|
290
|
+
throw new Error(
|
|
291
|
+
`No backend found for agent type: ${config.agentType}. ` +
|
|
292
|
+
`Available backends: ${this.listBackends().join(', ')}`
|
|
293
|
+
);
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
// Query memory for relevant knowledge if not provided
|
|
297
|
+
let knowledge = config.injectedKnowledge;
|
|
298
|
+
if (!knowledge) {
|
|
299
|
+
knowledge = await this.memory.queryV2(config.task.description, {
|
|
300
|
+
domains: config.task.domain ? [config.task.domain] : undefined,
|
|
301
|
+
});
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
// Format knowledge for injection
|
|
305
|
+
const formattedKnowledge = this.injector.format(knowledge, config.agentType);
|
|
306
|
+
|
|
307
|
+
// Use a session holder to allow callbacks to reference the session
|
|
308
|
+
// before it's assigned (closures capture the holder object, not the value)
|
|
309
|
+
const sessionHolder: { current: AgentSession | null } = { current: null };
|
|
310
|
+
|
|
311
|
+
// Build full config with knowledge injection
|
|
312
|
+
const fullConfig: AgentSpawnConfig = {
|
|
313
|
+
...config,
|
|
314
|
+
systemPromptAdditions: [
|
|
315
|
+
config.systemPromptAdditions,
|
|
316
|
+
formattedKnowledge
|
|
317
|
+
? `\n## Atlas Knowledge\n${formattedKnowledge}`
|
|
318
|
+
: undefined,
|
|
319
|
+
]
|
|
320
|
+
.filter(Boolean)
|
|
321
|
+
.join('\n\n'),
|
|
322
|
+
onMessage: (message) => {
|
|
323
|
+
config.onMessage?.(message);
|
|
324
|
+
if (sessionHolder.current) {
|
|
325
|
+
this.notifyMessage(sessionHolder.current, message);
|
|
326
|
+
}
|
|
327
|
+
},
|
|
328
|
+
onToolCall: (toolCall) => {
|
|
329
|
+
config.onToolCall?.(toolCall);
|
|
330
|
+
if (sessionHolder.current) {
|
|
331
|
+
this.notifyToolCall(sessionHolder.current, toolCall);
|
|
332
|
+
}
|
|
333
|
+
},
|
|
334
|
+
};
|
|
335
|
+
|
|
336
|
+
// Spawn the agent
|
|
337
|
+
const session = await backend.spawn(fullConfig);
|
|
338
|
+
sessionHolder.current = session;
|
|
339
|
+
this.activeSessions.set(session.id, session);
|
|
340
|
+
this.notifySessionStart(session);
|
|
341
|
+
|
|
342
|
+
// Wait for completion and extract trajectory
|
|
343
|
+
const finalSession = await this.waitForCompletion(backend, session.id);
|
|
344
|
+
this.activeSessions.delete(session.id);
|
|
345
|
+
|
|
346
|
+
const trajectory = this.extractor.extract(finalSession, config.task);
|
|
347
|
+
this.notifySessionEnd(finalSession, trajectory);
|
|
348
|
+
|
|
349
|
+
return {
|
|
350
|
+
session: finalSession,
|
|
351
|
+
trajectory,
|
|
352
|
+
success: finalSession.state === 'completed',
|
|
353
|
+
metrics: {
|
|
354
|
+
totalTime: finalSession.endTime
|
|
355
|
+
? finalSession.endTime.getTime() - finalSession.startTime.getTime()
|
|
356
|
+
: 0,
|
|
357
|
+
toolCallCount: finalSession.toolCalls.length,
|
|
358
|
+
messageCount: finalSession.messages.length,
|
|
359
|
+
},
|
|
360
|
+
};
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
/**
|
|
364
|
+
* Spawn an agent WITHOUT knowledge injection (for baseline/control)
|
|
365
|
+
*/
|
|
366
|
+
async spawnBaseline(
|
|
367
|
+
config: Omit<AgentSpawnConfig, 'injectedKnowledge'>
|
|
368
|
+
): Promise<AgentResult> {
|
|
369
|
+
return this.spawn({
|
|
370
|
+
...config,
|
|
371
|
+
injectedKnowledge: {
|
|
372
|
+
experiences: [],
|
|
373
|
+
playbooks: [],
|
|
374
|
+
},
|
|
375
|
+
});
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
/**
|
|
379
|
+
* Run an A/B comparison: with and without knowledge injection
|
|
380
|
+
*/
|
|
381
|
+
async compareWithKnowledge(
|
|
382
|
+
config: Omit<AgentSpawnConfig, 'injectedKnowledge'>
|
|
383
|
+
): Promise<{
|
|
384
|
+
withKnowledge: AgentResult;
|
|
385
|
+
baseline: AgentResult;
|
|
386
|
+
improvement: {
|
|
387
|
+
timeDelta: number;
|
|
388
|
+
toolCallDelta: number;
|
|
389
|
+
successDelta: number;
|
|
390
|
+
};
|
|
391
|
+
}> {
|
|
392
|
+
// Run baseline first
|
|
393
|
+
const baseline = await this.spawnBaseline(config);
|
|
394
|
+
|
|
395
|
+
// Run with knowledge
|
|
396
|
+
const withKnowledge = await this.spawn(config);
|
|
397
|
+
|
|
398
|
+
return {
|
|
399
|
+
withKnowledge,
|
|
400
|
+
baseline,
|
|
401
|
+
improvement: {
|
|
402
|
+
timeDelta: baseline.metrics.totalTime - withKnowledge.metrics.totalTime,
|
|
403
|
+
toolCallDelta:
|
|
404
|
+
baseline.metrics.toolCallCount - withKnowledge.metrics.toolCallCount,
|
|
405
|
+
successDelta:
|
|
406
|
+
(withKnowledge.success ? 1 : 0) - (baseline.success ? 1 : 0),
|
|
407
|
+
},
|
|
408
|
+
};
|
|
409
|
+
}
|
|
410
|
+
|
|
411
|
+
/**
|
|
412
|
+
* Observe an external agent session and learn from it
|
|
413
|
+
* Use this when you have access to another agent's execution
|
|
414
|
+
*/
|
|
415
|
+
async observeAndLearn(session: AgentSession, task: Task): Promise<Trajectory> {
|
|
416
|
+
const trajectory = this.extractor.extract(session, task);
|
|
417
|
+
|
|
418
|
+
// Store in memory for learning
|
|
419
|
+
await this.memory.storeTrajectory(trajectory);
|
|
420
|
+
|
|
421
|
+
return trajectory;
|
|
422
|
+
}
|
|
423
|
+
|
|
424
|
+
/**
|
|
425
|
+
* Get active sessions
|
|
426
|
+
*/
|
|
427
|
+
getActiveSessions(): AgentSession[] {
|
|
428
|
+
return Array.from(this.activeSessions.values());
|
|
429
|
+
}
|
|
430
|
+
|
|
431
|
+
/**
|
|
432
|
+
* Terminate a session
|
|
433
|
+
*/
|
|
434
|
+
async terminate(sessionId: string): Promise<void> {
|
|
435
|
+
const session = this.activeSessions.get(sessionId);
|
|
436
|
+
if (!session) return;
|
|
437
|
+
|
|
438
|
+
const backend = this.findBackend(session.agentType);
|
|
439
|
+
if (backend?.terminate) {
|
|
440
|
+
await backend.terminate(sessionId);
|
|
441
|
+
}
|
|
442
|
+
|
|
443
|
+
this.activeSessions.delete(sessionId);
|
|
444
|
+
}
|
|
445
|
+
|
|
446
|
+
/**
|
|
447
|
+
* Terminate all active sessions
|
|
448
|
+
*/
|
|
449
|
+
async terminateAll(): Promise<void> {
|
|
450
|
+
const sessionIds = Array.from(this.activeSessions.keys());
|
|
451
|
+
await Promise.all(sessionIds.map((id) => this.terminate(id)));
|
|
452
|
+
}
|
|
453
|
+
|
|
454
|
+
/**
|
|
455
|
+
* Close the manager and clean up resources
|
|
456
|
+
* Terminates all active sessions and clears all state
|
|
457
|
+
*/
|
|
458
|
+
async close(): Promise<void> {
|
|
459
|
+
// Terminate all active sessions
|
|
460
|
+
await this.terminateAll();
|
|
461
|
+
|
|
462
|
+
// Clear backends
|
|
463
|
+
this.backends.clear();
|
|
464
|
+
|
|
465
|
+
// Clear observers
|
|
466
|
+
this.observers = [];
|
|
467
|
+
}
|
|
468
|
+
|
|
469
|
+
// Private helpers
|
|
470
|
+
|
|
471
|
+
private findBackend(agentType: string): AgentBackend | undefined {
|
|
472
|
+
// First try exact match
|
|
473
|
+
for (const backend of this.backends.values()) {
|
|
474
|
+
if (backend.supportedTypes.includes(agentType)) {
|
|
475
|
+
return backend;
|
|
476
|
+
}
|
|
477
|
+
}
|
|
478
|
+
// Then try by backend name
|
|
479
|
+
return this.backends.get(agentType);
|
|
480
|
+
}
|
|
481
|
+
|
|
482
|
+
private async waitForCompletion(
|
|
483
|
+
backend: AgentBackend,
|
|
484
|
+
sessionId: string
|
|
485
|
+
): Promise<AgentSession> {
|
|
486
|
+
// Poll for completion
|
|
487
|
+
while (true) {
|
|
488
|
+
const session = await backend.getSession(sessionId);
|
|
489
|
+
if (!session) {
|
|
490
|
+
throw new Error(`Session ${sessionId} not found`);
|
|
491
|
+
}
|
|
492
|
+
|
|
493
|
+
if (
|
|
494
|
+
session.state === 'completed' ||
|
|
495
|
+
session.state === 'failed'
|
|
496
|
+
) {
|
|
497
|
+
return session;
|
|
498
|
+
}
|
|
499
|
+
|
|
500
|
+
// Wait before polling again
|
|
501
|
+
await new Promise((resolve) => setTimeout(resolve, 1000));
|
|
502
|
+
}
|
|
503
|
+
}
|
|
504
|
+
|
|
505
|
+
private notifySessionStart(session: AgentSession): void {
|
|
506
|
+
for (const observer of this.observers) {
|
|
507
|
+
observer.onSessionStart?.(session);
|
|
508
|
+
}
|
|
509
|
+
}
|
|
510
|
+
|
|
511
|
+
private notifyMessage(session: AgentSession, message: AgentMessage): void {
|
|
512
|
+
for (const observer of this.observers) {
|
|
513
|
+
observer.onMessage?.(session, message);
|
|
514
|
+
}
|
|
515
|
+
}
|
|
516
|
+
|
|
517
|
+
private notifyToolCall(session: AgentSession, toolCall: ToolCall): void {
|
|
518
|
+
for (const observer of this.observers) {
|
|
519
|
+
observer.onToolCall?.(session, toolCall);
|
|
520
|
+
}
|
|
521
|
+
}
|
|
522
|
+
|
|
523
|
+
private notifySessionEnd(session: AgentSession, trajectory: Trajectory): void {
|
|
524
|
+
for (const observer of this.observers) {
|
|
525
|
+
observer.onSessionEnd?.(session, trajectory);
|
|
526
|
+
}
|
|
527
|
+
}
|
|
528
|
+
}
|
|
529
|
+
|
|
530
|
+
/**
|
|
531
|
+
* Create an agent manager
|
|
532
|
+
*/
|
|
533
|
+
export function createAgentManager(
|
|
534
|
+
memory: MemorySystem,
|
|
535
|
+
options?: {
|
|
536
|
+
injector?: KnowledgeInjector;
|
|
537
|
+
extractor?: TrajectoryExtractor;
|
|
538
|
+
}
|
|
539
|
+
): AgentManager {
|
|
540
|
+
return new AgentManager(memory, options);
|
|
541
|
+
}
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
import type { Task, Trajectory } from '../types/index.js';
|
|
2
|
+
import type { MemoryQueryResultV2 } from '../memory/system.js';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Message in an agent conversation
|
|
6
|
+
*/
|
|
7
|
+
export interface AgentMessage {
|
|
8
|
+
role: 'user' | 'assistant' | 'system' | 'tool_use' | 'tool_result';
|
|
9
|
+
content: string;
|
|
10
|
+
toolName?: string;
|
|
11
|
+
toolInput?: unknown;
|
|
12
|
+
toolOutput?: unknown;
|
|
13
|
+
timestamp: Date;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Tool call made by an agent
|
|
18
|
+
*/
|
|
19
|
+
export interface ToolCall {
|
|
20
|
+
id: string;
|
|
21
|
+
name: string;
|
|
22
|
+
input: unknown;
|
|
23
|
+
output?: unknown;
|
|
24
|
+
error?: string;
|
|
25
|
+
startTime: Date;
|
|
26
|
+
endTime?: Date;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Agent execution state
|
|
31
|
+
*/
|
|
32
|
+
export type AgentState = 'idle' | 'running' | 'paused' | 'completed' | 'failed';
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Agent session - represents a running or completed agent execution
|
|
36
|
+
*/
|
|
37
|
+
export interface AgentSession {
|
|
38
|
+
id: string;
|
|
39
|
+
agentType: string;
|
|
40
|
+
task: Task;
|
|
41
|
+
state: AgentState;
|
|
42
|
+
messages: AgentMessage[];
|
|
43
|
+
toolCalls: ToolCall[];
|
|
44
|
+
startTime: Date;
|
|
45
|
+
endTime?: Date;
|
|
46
|
+
result?: unknown;
|
|
47
|
+
error?: string;
|
|
48
|
+
metadata: Record<string, unknown>;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Configuration for spawning an agent
|
|
53
|
+
*/
|
|
54
|
+
export interface AgentSpawnConfig {
|
|
55
|
+
/** Type of agent to spawn (e.g., 'claude-code', 'custom', etc.) */
|
|
56
|
+
agentType: string;
|
|
57
|
+
/** Task for the agent to work on */
|
|
58
|
+
task: Task;
|
|
59
|
+
/** Optional knowledge to inject into the agent's context */
|
|
60
|
+
injectedKnowledge?: MemoryQueryResultV2;
|
|
61
|
+
/** Custom system prompt additions */
|
|
62
|
+
systemPromptAdditions?: string;
|
|
63
|
+
/** Environment variables for the agent */
|
|
64
|
+
env?: Record<string, string>;
|
|
65
|
+
/** Working directory */
|
|
66
|
+
cwd?: string;
|
|
67
|
+
/** Timeout in milliseconds */
|
|
68
|
+
timeout?: number;
|
|
69
|
+
/** Whether to capture detailed tool calls */
|
|
70
|
+
captureToolCalls?: boolean;
|
|
71
|
+
/** Callback for real-time observation */
|
|
72
|
+
onMessage?: (message: AgentMessage) => void;
|
|
73
|
+
onToolCall?: (toolCall: ToolCall) => void;
|
|
74
|
+
/** Additional backend-specific options */
|
|
75
|
+
backendOptions?: Record<string, unknown>;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* Result of agent execution
|
|
80
|
+
*/
|
|
81
|
+
export interface AgentResult {
|
|
82
|
+
session: AgentSession;
|
|
83
|
+
trajectory: Trajectory;
|
|
84
|
+
success: boolean;
|
|
85
|
+
metrics: {
|
|
86
|
+
totalTime: number;
|
|
87
|
+
toolCallCount: number;
|
|
88
|
+
messageCount: number;
|
|
89
|
+
tokenEstimate?: number;
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* Agent backend protocol - implement this for different agent systems
|
|
95
|
+
*/
|
|
96
|
+
export interface AgentBackend {
|
|
97
|
+
/** Unique name for this backend */
|
|
98
|
+
readonly name: string;
|
|
99
|
+
|
|
100
|
+
/** Supported agent types */
|
|
101
|
+
readonly supportedTypes: string[];
|
|
102
|
+
|
|
103
|
+
/** Check if backend is available/configured */
|
|
104
|
+
isAvailable(): Promise<boolean>;
|
|
105
|
+
|
|
106
|
+
/** Spawn and run an agent */
|
|
107
|
+
spawn(config: AgentSpawnConfig): Promise<AgentSession>;
|
|
108
|
+
|
|
109
|
+
/** Get status of a running session */
|
|
110
|
+
getSession(sessionId: string): Promise<AgentSession | undefined>;
|
|
111
|
+
|
|
112
|
+
/** Send a message to a running session */
|
|
113
|
+
sendMessage?(sessionId: string, message: string): Promise<void>;
|
|
114
|
+
|
|
115
|
+
/** Pause a running session */
|
|
116
|
+
pause?(sessionId: string): Promise<void>;
|
|
117
|
+
|
|
118
|
+
/** Resume a paused session */
|
|
119
|
+
resume?(sessionId: string): Promise<void>;
|
|
120
|
+
|
|
121
|
+
/** Terminate a session */
|
|
122
|
+
terminate?(sessionId: string): Promise<void>;
|
|
123
|
+
|
|
124
|
+
/** List active sessions */
|
|
125
|
+
listSessions?(): Promise<AgentSession[]>;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* Knowledge injector - formats knowledge for injection into agents
|
|
130
|
+
*/
|
|
131
|
+
export interface KnowledgeInjector {
|
|
132
|
+
/** Format knowledge for a specific agent type */
|
|
133
|
+
format(
|
|
134
|
+
knowledge: MemoryQueryResultV2,
|
|
135
|
+
agentType: string,
|
|
136
|
+
options?: { maxTokens?: number; format?: 'markdown' | 'json' | 'xml' }
|
|
137
|
+
): string;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
/**
|
|
141
|
+
* Trajectory extractor - extracts trajectories from agent sessions
|
|
142
|
+
*/
|
|
143
|
+
export interface TrajectoryExtractor {
|
|
144
|
+
/** Extract a trajectory from an agent session */
|
|
145
|
+
extract(session: AgentSession, task: Task): Trajectory;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
/**
|
|
149
|
+
* Agent observer callbacks
|
|
150
|
+
*/
|
|
151
|
+
export interface AgentObserverCallbacks {
|
|
152
|
+
onSessionStart?: (session: AgentSession) => void;
|
|
153
|
+
onMessage?: (session: AgentSession, message: AgentMessage) => void;
|
|
154
|
+
onToolCall?: (session: AgentSession, toolCall: ToolCall) => void;
|
|
155
|
+
onSessionEnd?: (session: AgentSession, trajectory: Trajectory) => void;
|
|
156
|
+
onError?: (session: AgentSession, error: Error) => void;
|
|
157
|
+
}
|