cognitive-core 0.0.1 → 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.
Files changed (329) hide show
  1. package/README.md +363 -2
  2. package/SKILL.md +193 -0
  3. package/dist/agents/index.d.ts +3 -0
  4. package/dist/agents/index.d.ts.map +1 -0
  5. package/dist/agents/index.js +5 -0
  6. package/dist/agents/index.js.map +1 -0
  7. package/dist/agents/mock-provider.d.ts +23 -0
  8. package/dist/agents/mock-provider.d.ts.map +1 -0
  9. package/dist/agents/mock-provider.js +71 -0
  10. package/dist/agents/mock-provider.js.map +1 -0
  11. package/dist/agents/types.d.ts +98 -0
  12. package/dist/agents/types.d.ts.map +1 -0
  13. package/dist/agents/types.js +44 -0
  14. package/dist/agents/types.js.map +1 -0
  15. package/dist/atlas.d.ts +196 -0
  16. package/dist/atlas.d.ts.map +1 -0
  17. package/dist/atlas.js +373 -0
  18. package/dist/atlas.js.map +1 -0
  19. package/dist/bin/cognitive-core.d.ts +18 -0
  20. package/dist/bin/cognitive-core.d.ts.map +1 -0
  21. package/dist/bin/cognitive-core.js +419 -0
  22. package/dist/bin/cognitive-core.js.map +1 -0
  23. package/dist/embeddings/bm25.d.ts +104 -0
  24. package/dist/embeddings/bm25.d.ts.map +1 -0
  25. package/dist/embeddings/bm25.js +264 -0
  26. package/dist/embeddings/bm25.js.map +1 -0
  27. package/dist/embeddings/index.d.ts +12 -0
  28. package/dist/embeddings/index.d.ts.map +1 -0
  29. package/dist/embeddings/index.js +16 -0
  30. package/dist/embeddings/index.js.map +1 -0
  31. package/dist/embeddings/manager.d.ts +112 -0
  32. package/dist/embeddings/manager.d.ts.map +1 -0
  33. package/dist/embeddings/manager.js +215 -0
  34. package/dist/embeddings/manager.js.map +1 -0
  35. package/dist/embeddings/provider.d.ts +101 -0
  36. package/dist/embeddings/provider.d.ts.map +1 -0
  37. package/dist/embeddings/provider.js +232 -0
  38. package/dist/embeddings/provider.js.map +1 -0
  39. package/dist/embeddings/vector-store.d.ts +101 -0
  40. package/dist/embeddings/vector-store.d.ts.map +1 -0
  41. package/dist/embeddings/vector-store.js +256 -0
  42. package/dist/embeddings/vector-store.js.map +1 -0
  43. package/dist/factory.d.ts +193 -0
  44. package/dist/factory.d.ts.map +1 -0
  45. package/dist/factory.js +109 -0
  46. package/dist/factory.js.map +1 -0
  47. package/dist/index.d.ts +43 -0
  48. package/dist/index.d.ts.map +1 -0
  49. package/dist/index.js +84 -0
  50. package/dist/index.js.map +1 -0
  51. package/dist/learning/analyzer.d.ts +110 -0
  52. package/dist/learning/analyzer.d.ts.map +1 -0
  53. package/dist/learning/analyzer.js +213 -0
  54. package/dist/learning/analyzer.js.map +1 -0
  55. package/dist/learning/effectiveness.d.ts +158 -0
  56. package/dist/learning/effectiveness.d.ts.map +1 -0
  57. package/dist/learning/effectiveness.js +251 -0
  58. package/dist/learning/effectiveness.js.map +1 -0
  59. package/dist/learning/index.d.ts +8 -0
  60. package/dist/learning/index.d.ts.map +1 -0
  61. package/dist/learning/index.js +11 -0
  62. package/dist/learning/index.js.map +1 -0
  63. package/dist/learning/llm-extractor.d.ts +88 -0
  64. package/dist/learning/llm-extractor.d.ts.map +1 -0
  65. package/dist/learning/llm-extractor.js +372 -0
  66. package/dist/learning/llm-extractor.js.map +1 -0
  67. package/dist/learning/meta-learner.d.ts +80 -0
  68. package/dist/learning/meta-learner.d.ts.map +1 -0
  69. package/dist/learning/meta-learner.js +355 -0
  70. package/dist/learning/meta-learner.js.map +1 -0
  71. package/dist/learning/pipeline.d.ts +65 -0
  72. package/dist/learning/pipeline.d.ts.map +1 -0
  73. package/dist/learning/pipeline.js +170 -0
  74. package/dist/learning/pipeline.js.map +1 -0
  75. package/dist/learning/playbook-extractor.d.ts +113 -0
  76. package/dist/learning/playbook-extractor.d.ts.map +1 -0
  77. package/dist/learning/playbook-extractor.js +523 -0
  78. package/dist/learning/playbook-extractor.js.map +1 -0
  79. package/dist/learning/usage-inference.d.ts +82 -0
  80. package/dist/learning/usage-inference.d.ts.map +1 -0
  81. package/dist/learning/usage-inference.js +261 -0
  82. package/dist/learning/usage-inference.js.map +1 -0
  83. package/dist/mcp/index.d.ts +6 -0
  84. package/dist/mcp/index.d.ts.map +1 -0
  85. package/dist/mcp/index.js +6 -0
  86. package/dist/mcp/index.js.map +1 -0
  87. package/dist/mcp/playbook-server.d.ts +120 -0
  88. package/dist/mcp/playbook-server.d.ts.map +1 -0
  89. package/dist/mcp/playbook-server.js +427 -0
  90. package/dist/mcp/playbook-server.js.map +1 -0
  91. package/dist/memory/curated-loader.d.ts +62 -0
  92. package/dist/memory/curated-loader.d.ts.map +1 -0
  93. package/dist/memory/curated-loader.js +106 -0
  94. package/dist/memory/curated-loader.js.map +1 -0
  95. package/dist/memory/experience.d.ts +122 -0
  96. package/dist/memory/experience.d.ts.map +1 -0
  97. package/dist/memory/experience.js +392 -0
  98. package/dist/memory/experience.js.map +1 -0
  99. package/dist/memory/index.d.ts +6 -0
  100. package/dist/memory/index.d.ts.map +1 -0
  101. package/dist/memory/index.js +9 -0
  102. package/dist/memory/index.js.map +1 -0
  103. package/dist/memory/meta.d.ts +90 -0
  104. package/dist/memory/meta.d.ts.map +1 -0
  105. package/dist/memory/meta.js +362 -0
  106. package/dist/memory/meta.js.map +1 -0
  107. package/dist/memory/playbook.d.ts +133 -0
  108. package/dist/memory/playbook.d.ts.map +1 -0
  109. package/dist/memory/playbook.js +357 -0
  110. package/dist/memory/playbook.js.map +1 -0
  111. package/dist/memory/system.d.ts +167 -0
  112. package/dist/memory/system.d.ts.map +1 -0
  113. package/dist/memory/system.js +383 -0
  114. package/dist/memory/system.js.map +1 -0
  115. package/dist/runtime/backends/acp.d.ts +67 -0
  116. package/dist/runtime/backends/acp.d.ts.map +1 -0
  117. package/dist/runtime/backends/acp.js +290 -0
  118. package/dist/runtime/backends/acp.js.map +1 -0
  119. package/dist/runtime/backends/index.d.ts +5 -0
  120. package/dist/runtime/backends/index.d.ts.map +1 -0
  121. package/dist/runtime/backends/index.js +6 -0
  122. package/dist/runtime/backends/index.js.map +1 -0
  123. package/dist/runtime/backends/mock.d.ts +67 -0
  124. package/dist/runtime/backends/mock.d.ts.map +1 -0
  125. package/dist/runtime/backends/mock.js +153 -0
  126. package/dist/runtime/backends/mock.js.map +1 -0
  127. package/dist/runtime/backends/subprocess.d.ts +56 -0
  128. package/dist/runtime/backends/subprocess.d.ts.map +1 -0
  129. package/dist/runtime/backends/subprocess.js +260 -0
  130. package/dist/runtime/backends/subprocess.js.map +1 -0
  131. package/dist/runtime/flows/learning.d.ts +73 -0
  132. package/dist/runtime/flows/learning.d.ts.map +1 -0
  133. package/dist/runtime/flows/learning.js +116 -0
  134. package/dist/runtime/flows/learning.js.map +1 -0
  135. package/dist/runtime/flows/validation.d.ts +122 -0
  136. package/dist/runtime/flows/validation.d.ts.map +1 -0
  137. package/dist/runtime/flows/validation.js +223 -0
  138. package/dist/runtime/flows/validation.js.map +1 -0
  139. package/dist/runtime/index.d.ts +6 -0
  140. package/dist/runtime/index.d.ts.map +1 -0
  141. package/dist/runtime/index.js +8 -0
  142. package/dist/runtime/index.js.map +1 -0
  143. package/dist/runtime/manager.d.ts +116 -0
  144. package/dist/runtime/manager.d.ts.map +1 -0
  145. package/dist/runtime/manager.js +416 -0
  146. package/dist/runtime/manager.js.map +1 -0
  147. package/dist/runtime/types.d.ts +138 -0
  148. package/dist/runtime/types.d.ts.map +1 -0
  149. package/dist/runtime/types.js +2 -0
  150. package/dist/runtime/types.js.map +1 -0
  151. package/dist/search/evaluator.d.ts +102 -0
  152. package/dist/search/evaluator.d.ts.map +1 -0
  153. package/dist/search/evaluator.js +352 -0
  154. package/dist/search/evaluator.js.map +1 -0
  155. package/dist/search/index.d.ts +7 -0
  156. package/dist/search/index.d.ts.map +1 -0
  157. package/dist/search/index.js +11 -0
  158. package/dist/search/index.js.map +1 -0
  159. package/dist/search/refinement-loop.d.ts +73 -0
  160. package/dist/search/refinement-loop.d.ts.map +1 -0
  161. package/dist/search/refinement-loop.js +245 -0
  162. package/dist/search/refinement-loop.js.map +1 -0
  163. package/dist/search/refinement-types.d.ts +154 -0
  164. package/dist/search/refinement-types.d.ts.map +1 -0
  165. package/dist/search/refinement-types.js +99 -0
  166. package/dist/search/refinement-types.js.map +1 -0
  167. package/dist/search/router.d.ts +61 -0
  168. package/dist/search/router.d.ts.map +1 -0
  169. package/dist/search/router.js +197 -0
  170. package/dist/search/router.js.map +1 -0
  171. package/dist/search/solver.d.ts +75 -0
  172. package/dist/search/solver.d.ts.map +1 -0
  173. package/dist/search/solver.js +216 -0
  174. package/dist/search/solver.js.map +1 -0
  175. package/dist/search/verification-runner.d.ts +125 -0
  176. package/dist/search/verification-runner.d.ts.map +1 -0
  177. package/dist/search/verification-runner.js +440 -0
  178. package/dist/search/verification-runner.js.map +1 -0
  179. package/dist/surfacing/index.d.ts +2 -0
  180. package/dist/surfacing/index.d.ts.map +1 -0
  181. package/dist/surfacing/index.js +2 -0
  182. package/dist/surfacing/index.js.map +1 -0
  183. package/dist/surfacing/skill-library.d.ts +158 -0
  184. package/dist/surfacing/skill-library.d.ts.map +1 -0
  185. package/dist/surfacing/skill-library.js +429 -0
  186. package/dist/surfacing/skill-library.js.map +1 -0
  187. package/dist/types/config.d.ts +1113 -0
  188. package/dist/types/config.d.ts.map +1 -0
  189. package/dist/types/config.js +274 -0
  190. package/dist/types/config.js.map +1 -0
  191. package/dist/types/index.d.ts +9 -0
  192. package/dist/types/index.d.ts.map +1 -0
  193. package/dist/types/index.js +14 -0
  194. package/dist/types/index.js.map +1 -0
  195. package/dist/types/memory.d.ts +339 -0
  196. package/dist/types/memory.d.ts.map +1 -0
  197. package/dist/types/memory.js +207 -0
  198. package/dist/types/memory.js.map +1 -0
  199. package/dist/types/meta.d.ts +146 -0
  200. package/dist/types/meta.d.ts.map +1 -0
  201. package/dist/types/meta.js +51 -0
  202. package/dist/types/meta.js.map +1 -0
  203. package/dist/types/outcome.d.ts +42 -0
  204. package/dist/types/outcome.d.ts.map +1 -0
  205. package/dist/types/outcome.js +50 -0
  206. package/dist/types/outcome.js.map +1 -0
  207. package/dist/types/playbook.d.ts +119 -0
  208. package/dist/types/playbook.d.ts.map +1 -0
  209. package/dist/types/playbook.js +71 -0
  210. package/dist/types/playbook.js.map +1 -0
  211. package/dist/types/step.d.ts +44 -0
  212. package/dist/types/step.d.ts.map +1 -0
  213. package/dist/types/step.js +32 -0
  214. package/dist/types/step.js.map +1 -0
  215. package/dist/types/task.d.ts +91 -0
  216. package/dist/types/task.d.ts.map +1 -0
  217. package/dist/types/task.js +39 -0
  218. package/dist/types/task.js.map +1 -0
  219. package/dist/types/trajectory.d.ts +221 -0
  220. package/dist/types/trajectory.d.ts.map +1 -0
  221. package/dist/types/trajectory.js +60 -0
  222. package/dist/types/trajectory.js.map +1 -0
  223. package/dist/utils/index.d.ts +4 -0
  224. package/dist/utils/index.d.ts.map +1 -0
  225. package/dist/utils/index.js +4 -0
  226. package/dist/utils/index.js.map +1 -0
  227. package/dist/utils/similarity.d.ts +31 -0
  228. package/dist/utils/similarity.d.ts.map +1 -0
  229. package/dist/utils/similarity.js +107 -0
  230. package/dist/utils/similarity.js.map +1 -0
  231. package/dist/utils/storage.d.ts +106 -0
  232. package/dist/utils/storage.d.ts.map +1 -0
  233. package/dist/utils/storage.js +203 -0
  234. package/dist/utils/storage.js.map +1 -0
  235. package/dist/utils/validation.d.ts +129 -0
  236. package/dist/utils/validation.d.ts.map +1 -0
  237. package/dist/utils/validation.js +171 -0
  238. package/dist/utils/validation.js.map +1 -0
  239. package/package.json +61 -9
  240. package/scripts/migrate-to-playbooks.ts +307 -0
  241. package/src/agents/index.ts +14 -0
  242. package/src/agents/mock-provider.ts +93 -0
  243. package/src/agents/types.ts +137 -0
  244. package/src/atlas.ts +560 -0
  245. package/src/bin/cognitive-core.ts +470 -0
  246. package/src/embeddings/bm25.ts +337 -0
  247. package/src/embeddings/index.ts +39 -0
  248. package/src/embeddings/manager.ts +288 -0
  249. package/src/embeddings/provider.ts +311 -0
  250. package/src/embeddings/vector-store.ts +353 -0
  251. package/src/factory.ts +263 -0
  252. package/src/index.ts +246 -0
  253. package/src/learning/analyzer.ts +335 -0
  254. package/src/learning/effectiveness.ts +428 -0
  255. package/src/learning/index.ts +58 -0
  256. package/src/learning/llm-extractor.ts +542 -0
  257. package/src/learning/meta-learner.ts +516 -0
  258. package/src/learning/pipeline.ts +244 -0
  259. package/src/learning/playbook-extractor.ts +702 -0
  260. package/src/learning/usage-inference.ts +372 -0
  261. package/src/mcp/index.ts +12 -0
  262. package/src/mcp/playbook-server.ts +565 -0
  263. package/src/memory/curated-loader.ts +160 -0
  264. package/src/memory/experience.ts +515 -0
  265. package/src/memory/index.ts +27 -0
  266. package/src/memory/meta.ts +506 -0
  267. package/src/memory/playbook.ts +493 -0
  268. package/src/memory/system.ts +551 -0
  269. package/src/runtime/backends/acp.ts +378 -0
  270. package/src/runtime/backends/index.ts +24 -0
  271. package/src/runtime/backends/mock.ts +218 -0
  272. package/src/runtime/backends/subprocess.ts +356 -0
  273. package/src/runtime/flows/learning.ts +183 -0
  274. package/src/runtime/flows/validation.ts +381 -0
  275. package/src/runtime/index.ts +53 -0
  276. package/src/runtime/manager.ts +541 -0
  277. package/src/runtime/types.ts +157 -0
  278. package/src/search/evaluator.ts +474 -0
  279. package/src/search/index.ts +59 -0
  280. package/src/search/refinement-loop.ts +363 -0
  281. package/src/search/refinement-types.ts +159 -0
  282. package/src/search/router.ts +261 -0
  283. package/src/search/solver.ts +303 -0
  284. package/src/search/verification-runner.ts +570 -0
  285. package/src/surfacing/index.ts +6 -0
  286. package/src/surfacing/skill-library.ts +594 -0
  287. package/src/types/config.ts +333 -0
  288. package/src/types/index.ts +130 -0
  289. package/src/types/memory.ts +270 -0
  290. package/src/types/meta.ts +218 -0
  291. package/src/types/outcome.ts +66 -0
  292. package/src/types/playbook.ts +196 -0
  293. package/src/types/step.ts +40 -0
  294. package/src/types/task.ts +52 -0
  295. package/src/types/trajectory.ts +80 -0
  296. package/src/utils/index.ts +38 -0
  297. package/src/utils/similarity.ts +139 -0
  298. package/src/utils/storage.ts +249 -0
  299. package/src/utils/validation.ts +286 -0
  300. package/tests/embeddings/bm25.test.ts +130 -0
  301. package/tests/embeddings/manager.test.ts +205 -0
  302. package/tests/integration/atlas.test.ts +266 -0
  303. package/tests/integration/e2e.test.ts +929 -0
  304. package/tests/learning/analyzer.test.ts +426 -0
  305. package/tests/learning/effectiveness.test.ts +542 -0
  306. package/tests/learning/pipeline.test.ts +176 -0
  307. package/tests/learning/playbook-extractor-provenance.test.ts +114 -0
  308. package/tests/learning/usage-inference.test.ts +254 -0
  309. package/tests/mcp/playbook-server.test.ts +252 -0
  310. package/tests/memory/experience.test.ts +198 -0
  311. package/tests/memory/playbook.test.ts +338 -0
  312. package/tests/memory/provenance.test.ts +639 -0
  313. package/tests/memory/system.test.ts +325 -0
  314. package/tests/runtime/agent-manager.test.ts +512 -0
  315. package/tests/runtime/mock-backend.test.ts +248 -0
  316. package/tests/search/refinement-loop.test.ts +468 -0
  317. package/tests/search/refinement.test.ts +267 -0
  318. package/tests/search/router.test.ts +427 -0
  319. package/tests/surfacing/skill-library.test.ts +292 -0
  320. package/tests/types/outcome.test.ts +147 -0
  321. package/tests/types/step.test.ts +133 -0
  322. package/tests/types/task.test.ts +158 -0
  323. package/tests/types/trajectory.test.ts +253 -0
  324. package/tests/utils/similarity.test.ts +188 -0
  325. package/tests/utils/validation.test.ts +252 -0
  326. package/tsconfig.json +25 -0
  327. package/vitest.config.ts +22 -0
  328. package/index.d.ts +0 -4
  329. package/index.js +0 -4
@@ -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, '&amp;')
117
+ .replace(/</g, '&lt;')
118
+ .replace(/>/g, '&gt;')
119
+ .replace(/"/g, '&quot;');
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
+ }