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.
Files changed (329) hide show
  1. package/README.md +302 -116
  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 +30 -453
  48. package/dist/index.d.ts.map +1 -0
  49. package/dist/index.js +84 -509
  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 +50 -34
  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/dist/index.d.mts +0 -466
  329. package/dist/index.mjs +0 -478
@@ -0,0 +1,325 @@
1
+ import { describe, it, expect, beforeEach, afterEach } from 'vitest';
2
+ import { MemorySystem, createMemorySystem } from '../../src/memory/system.js';
3
+ import { createTrajectory, createStep, createTask, successOutcome, failureOutcome } from '../../src/types/index.js';
4
+ import { createPlaybook } from '../../src/types/playbook.js';
5
+ import * as fs from 'node:fs/promises';
6
+ import * as path from 'node:path';
7
+
8
+ describe('MemorySystem', () => {
9
+ let memory: MemorySystem;
10
+ let testDir: string;
11
+
12
+ beforeEach(async () => {
13
+ testDir = path.join(process.cwd(), '.test-memory-system-' + Date.now());
14
+ await fs.mkdir(testDir, { recursive: true });
15
+ memory = createMemorySystem(testDir, {
16
+ maxExperiences: 4,
17
+ maxStrategies: 3,
18
+ });
19
+ await memory.init();
20
+ });
21
+
22
+ afterEach(async () => {
23
+ await memory.close();
24
+ await fs.rm(testDir, { recursive: true, force: true });
25
+ });
26
+
27
+ describe('storeTrajectory', () => {
28
+ it('should store trajectory and return experience', async () => {
29
+ const trajectory = createTrajectory({
30
+ task: createTask({ domain: 'test', description: 'Test task' }),
31
+ steps: [
32
+ createStep({ thought: 'Step 1', action: 'action1', observation: 'obs1' }),
33
+ ],
34
+ outcome: successOutcome({ result: 'done' }),
35
+ agentId: 'agent-1',
36
+ });
37
+
38
+ const experience = await memory.storeTrajectory(trajectory);
39
+
40
+ expect(experience.taskInput).toBe('Test task');
41
+ expect(experience.success).toBe(true);
42
+ expect(experience.domain).toBe('test');
43
+ expect(experience.trajectoryId).toBe(trajectory.id);
44
+ });
45
+
46
+ it('should preserve trajectory structure in metadata', async () => {
47
+ // Create steps and manually set attributionScore (normally set by analyzer)
48
+ const step1 = createStep({
49
+ thought: 'Analyzing the error',
50
+ action: 'read main.ts',
51
+ observation: 'Found the issue',
52
+ });
53
+ step1.attributionScore = 0.3;
54
+
55
+ const step2 = createStep({
56
+ thought: 'Applying fix',
57
+ action: 'edit main.ts',
58
+ observation: 'Fixed successfully',
59
+ });
60
+ step2.attributionScore = 0.8;
61
+
62
+ const trajectory = createTrajectory({
63
+ task: createTask({
64
+ domain: 'code',
65
+ description: 'Fix the bug',
66
+ context: { file: 'main.ts' },
67
+ }),
68
+ steps: [step1, step2],
69
+ outcome: successOutcome({ linesChanged: 5 }),
70
+ agentId: 'claude-code',
71
+ wallTimeSeconds: 45.5,
72
+ llmCalls: 3,
73
+ metadata: { customField: 'value' },
74
+ });
75
+
76
+ const experience = await memory.storeTrajectory(trajectory);
77
+
78
+ // Check that trajectory structure is preserved in metadata
79
+ expect(experience.metadata).toBeDefined();
80
+ const meta = experience.metadata as Record<string, unknown>;
81
+
82
+ // Steps should be preserved (limited content)
83
+ expect(meta.steps).toBeDefined();
84
+ expect(Array.isArray(meta.steps)).toBe(true);
85
+ const steps = meta.steps as Array<Record<string, unknown>>;
86
+ expect(steps).toHaveLength(2);
87
+ expect(steps[0].thought).toBe('Analyzing the error');
88
+ expect(steps[0].action).toBe('read main.ts');
89
+ expect(steps[0].observation).toBe('Found the issue');
90
+ expect(steps[0].attributionScore).toBe(0.3);
91
+ expect(steps[1].attributionScore).toBe(0.8);
92
+
93
+ // Agent and timing info
94
+ expect(meta.agentId).toBe('claude-code');
95
+ expect(meta.wallTimeSeconds).toBe(45.5);
96
+ expect(meta.llmCalls).toBe(3);
97
+ expect(meta.stepCount).toBe(2);
98
+
99
+ // Task context
100
+ expect(meta.taskContext).toEqual({ file: 'main.ts' });
101
+
102
+ // Custom metadata
103
+ expect(meta.customField).toBe('value');
104
+ });
105
+
106
+ it('should handle failed trajectory', async () => {
107
+ const trajectory = createTrajectory({
108
+ task: createTask({ domain: 'test', description: 'Failing task' }),
109
+ steps: [
110
+ createStep({ thought: 'Trying', action: 'attempt', observation: 'error' }),
111
+ ],
112
+ outcome: failureOutcome('Something went wrong'),
113
+ agentId: 'agent-1',
114
+ });
115
+
116
+ const experience = await memory.storeTrajectory(trajectory);
117
+
118
+ expect(experience.success).toBe(false);
119
+ expect(experience.feedback).toContain('Something went wrong');
120
+
121
+ // Check outcome details in metadata
122
+ const meta = experience.metadata as Record<string, unknown>;
123
+ const outcome = meta.outcome as Record<string, unknown>;
124
+ expect(outcome.errorInfo).toBe('Something went wrong');
125
+ });
126
+
127
+ it('should handle undefined solution in failed trajectory', async () => {
128
+ const trajectory = createTrajectory({
129
+ task: createTask({ domain: 'test', description: 'No solution task' }),
130
+ steps: [],
131
+ outcome: {
132
+ success: false,
133
+ solution: undefined,
134
+ errorInfo: 'No solution found',
135
+ partialScore: 0.2,
136
+ },
137
+ agentId: 'agent-1',
138
+ });
139
+
140
+ const experience = await memory.storeTrajectory(trajectory);
141
+
142
+ expect(experience.success).toBe(false);
143
+ expect(experience.solutionOutput).toContain('No solution found');
144
+ });
145
+ });
146
+
147
+ describe('queryV2', () => {
148
+ beforeEach(async () => {
149
+ // Add test data
150
+ await memory.storeTrajectory(createTrajectory({
151
+ task: createTask({ domain: 'code', description: 'Fix TypeScript error' }),
152
+ steps: [createStep({ thought: 't', action: 'a', observation: 'o' })],
153
+ outcome: successOutcome({ fixed: true }),
154
+ agentId: 'agent',
155
+ }));
156
+
157
+ await memory.playbooks.add(createPlaybook({
158
+ name: 'Debug TypeScript',
159
+ applicability: {
160
+ situations: ['TypeScript errors'],
161
+ triggers: ['typescript', 'type error'],
162
+ antiPatterns: [],
163
+ domains: ['code'],
164
+ },
165
+ guidance: {
166
+ strategy: 'Check types',
167
+ tactics: ['Use strict mode'],
168
+ },
169
+ verification: {
170
+ successIndicators: ['compiles'],
171
+ failureIndicators: [],
172
+ commands: [],
173
+ },
174
+ confidence: 0.8,
175
+ }));
176
+ });
177
+
178
+ it('should query both experiences and playbooks', async () => {
179
+ const result = await memory.queryV2('typescript error');
180
+
181
+ expect(result.experiences).toBeDefined();
182
+ expect(result.playbooks).toBeDefined();
183
+ });
184
+
185
+ it('should filter by domain', async () => {
186
+ const result = await memory.queryV2('error', {
187
+ domains: ['code'],
188
+ });
189
+
190
+ expect(result.experiences.length).toBeGreaterThanOrEqual(0);
191
+ expect(result.playbooks.length).toBeGreaterThanOrEqual(0);
192
+ });
193
+
194
+ it('should respect includeExperiences option', async () => {
195
+ const result = await memory.queryV2('error', {
196
+ includeExperiences: false,
197
+ includePlaybooks: true,
198
+ });
199
+
200
+ expect(result.experiences).toHaveLength(0);
201
+ });
202
+
203
+ it('should respect includePlaybooks option', async () => {
204
+ const result = await memory.queryV2('error', {
205
+ includeExperiences: true,
206
+ includePlaybooks: false,
207
+ });
208
+
209
+ expect(result.playbooks).toHaveLength(0);
210
+ });
211
+ });
212
+
213
+ describe('formatForPromptV2', () => {
214
+ it('should format query results for prompt injection', async () => {
215
+ await memory.playbooks.add(createPlaybook({
216
+ name: 'Test Playbook',
217
+ applicability: {
218
+ situations: ['testing'],
219
+ triggers: ['test'],
220
+ antiPatterns: [],
221
+ domains: ['test'],
222
+ },
223
+ guidance: {
224
+ strategy: 'Test strategy',
225
+ tactics: ['Tactic 1', 'Tactic 2'],
226
+ steps: ['Step 1', 'Step 2'],
227
+ },
228
+ verification: {
229
+ successIndicators: ['success'],
230
+ failureIndicators: [],
231
+ commands: [],
232
+ },
233
+ confidence: 0.9,
234
+ }));
235
+
236
+ const queryResult = await memory.queryV2('test');
237
+ const formatted = memory.formatForPromptV2(queryResult);
238
+
239
+ expect(formatted).toContain('Test Playbook');
240
+ expect(formatted).toContain('Test strategy');
241
+ });
242
+ });
243
+
244
+ describe('getStats', () => {
245
+ it('should return memory statistics', async () => {
246
+ const stats = await memory.getStats();
247
+
248
+ expect(stats).toHaveProperty('experienceCount');
249
+ expect(stats).toHaveProperty('playbookCount');
250
+ expect(stats).toHaveProperty('metaObservationCount');
251
+ expect(typeof stats.experienceCount).toBe('number');
252
+ });
253
+ });
254
+
255
+ describe('capacity management', () => {
256
+ it('should return capacity status', async () => {
257
+ const status = await memory.getCapacityStatus();
258
+
259
+ expect(status.experiences).toHaveProperty('current');
260
+ expect(status.experiences).toHaveProperty('limit');
261
+ expect(status.playbooks).toHaveProperty('current');
262
+ expect(status.pruningEnabled).toBeDefined();
263
+ });
264
+
265
+ it('should update capacity config', () => {
266
+ memory.updateCapacityConfig({
267
+ maxExperiences: 500,
268
+ autoPrune: false,
269
+ });
270
+
271
+ // Config should be updated (tested via capacity status)
272
+ // Note: This is a unit test for the method, full pruning tested elsewhere
273
+ });
274
+ });
275
+
276
+ describe('effectiveness integration', () => {
277
+ it('should include annotationCount in stats', async () => {
278
+ const stats = await memory.getStats();
279
+ expect(stats).toHaveProperty('annotationCount');
280
+ expect(stats.annotationCount).toBe(0);
281
+ });
282
+
283
+ it('should return effectiveness metrics', async () => {
284
+ const metrics = await memory.getEffectivenessMetrics();
285
+
286
+ expect(metrics).toHaveProperty('totalTasks');
287
+ expect(metrics).toHaveProperty('guidedSuccessRate');
288
+ expect(metrics).toHaveProperty('unguidedSuccessRate');
289
+ expect(metrics).toHaveProperty('playbookEffectiveness');
290
+ expect(metrics.totalTasks).toBe(0);
291
+ });
292
+
293
+ it('should expose effectiveness tracker for direct annotation', async () => {
294
+ expect(memory.effectiveness).toBeDefined();
295
+
296
+ const trajectory = createTrajectory({
297
+ task: createTask({ domain: 'test', description: 'Eff test' }),
298
+ steps: [createStep({ thought: 't', action: 'a', observation: 'o' })],
299
+ outcome: successOutcome({ result: 'done' }),
300
+ agentId: 'agent',
301
+ });
302
+
303
+ const annotation = await memory.effectiveness.annotate(trajectory, [], [], []);
304
+ expect(annotation.trajectoryId).toBe(trajectory.id);
305
+
306
+ const stats = await memory.getStats();
307
+ expect(stats.annotationCount).toBe(1);
308
+ });
309
+
310
+ it('should accept time window in getEffectivenessMetrics', async () => {
311
+ const since = new Date('2025-01-01');
312
+ const until = new Date('2025-12-31');
313
+
314
+ const metrics = await memory.getEffectivenessMetrics({ since, until });
315
+ expect(metrics.windowStart).toEqual(since);
316
+ expect(metrics.windowEnd).toEqual(until);
317
+ });
318
+ });
319
+
320
+ describe('close', () => {
321
+ it('should close all stores without error', async () => {
322
+ await expect(memory.close()).resolves.not.toThrow();
323
+ });
324
+ });
325
+ });