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,506 @@
1
+ /**
2
+ * Meta Memory - Learning about learning
3
+ * Tracks routing decisions, memory effectiveness, and execution patterns
4
+ * to improve future learning and routing decisions
5
+ */
6
+
7
+ import type {
8
+ MetaObservation,
9
+ MetaStrategy,
10
+ RoutingAnalysis,
11
+ RetrievalAnalysis,
12
+ MetaStats,
13
+ MetaContext,
14
+ RoutingDecisionType,
15
+ } from '../types/index.js';
16
+ import { createMetaStrategy } from '../types/index.js';
17
+ import { JsonStore } from '../utils/storage.js';
18
+
19
+ /**
20
+ * Filter options for querying observations
21
+ */
22
+ export interface ObservationFilter {
23
+ routingDecision?: RoutingDecisionType;
24
+ outcome?: 'success' | 'failure';
25
+ minDate?: Date;
26
+ maxDate?: Date;
27
+ limit?: number;
28
+ }
29
+
30
+ /**
31
+ * Meta Memory - Store for meta-learning observations and strategies
32
+ */
33
+ export class MetaMemory {
34
+ private observations: JsonStore<MetaObservation>;
35
+ private strategies: JsonStore<MetaStrategy>;
36
+ private initialized = false;
37
+
38
+ constructor(baseDir: string) {
39
+ this.observations = new JsonStore<MetaObservation>(
40
+ baseDir,
41
+ 'meta-observations',
42
+ {
43
+ autoSaveInterval: 60000,
44
+ pretty: true,
45
+ }
46
+ );
47
+ this.strategies = new JsonStore<MetaStrategy>(baseDir, 'meta-strategies', {
48
+ autoSaveInterval: 60000,
49
+ pretty: true,
50
+ });
51
+ }
52
+
53
+ async init(): Promise<void> {
54
+ if (this.initialized) return;
55
+ await Promise.all([this.observations.init(), this.strategies.init()]);
56
+ this.initialized = true;
57
+ }
58
+
59
+ // === OBSERVATION ===
60
+
61
+ /**
62
+ * Record a meta-observation after task completion
63
+ */
64
+ async recordObservation(observation: MetaObservation): Promise<void> {
65
+ await this.init();
66
+ this.observations.set(observation.id, observation);
67
+ await this.observations.save(observation.id);
68
+ }
69
+
70
+ /**
71
+ * Get observations for analysis
72
+ */
73
+ async getObservations(filter?: ObservationFilter): Promise<MetaObservation[]> {
74
+ await this.init();
75
+
76
+ let observations = this.observations.values();
77
+
78
+ if (filter?.routingDecision) {
79
+ observations = observations.filter(
80
+ (o) => o.routing.decision === filter.routingDecision
81
+ );
82
+ }
83
+
84
+ if (filter?.outcome !== undefined) {
85
+ const isSuccess = filter.outcome === 'success';
86
+ observations = observations.filter((o) => o.outcome.success === isSuccess);
87
+ }
88
+
89
+ if (filter?.minDate) {
90
+ observations = observations.filter(
91
+ (o) => new Date(o.timestamp) >= filter.minDate!
92
+ );
93
+ }
94
+
95
+ if (filter?.maxDate) {
96
+ observations = observations.filter(
97
+ (o) => new Date(o.timestamp) <= filter.maxDate!
98
+ );
99
+ }
100
+
101
+ // Sort by timestamp descending (most recent first)
102
+ observations.sort(
103
+ (a, b) => new Date(b.timestamp).getTime() - new Date(a.timestamp).getTime()
104
+ );
105
+
106
+ if (filter?.limit) {
107
+ observations = observations.slice(0, filter.limit);
108
+ }
109
+
110
+ return observations;
111
+ }
112
+
113
+ /**
114
+ * Get observation by trajectory ID
115
+ */
116
+ async getByTrajectoryId(
117
+ trajectoryId: string
118
+ ): Promise<MetaObservation | undefined> {
119
+ await this.init();
120
+ return this.observations
121
+ .values()
122
+ .find((o) => o.trajectoryId === trajectoryId);
123
+ }
124
+
125
+ // === ANALYSIS ===
126
+
127
+ /**
128
+ * Analyze routing effectiveness
129
+ * Returns: which routing decisions lead to success in which contexts
130
+ */
131
+ async analyzeRoutingEffectiveness(): Promise<RoutingAnalysis> {
132
+ await this.init();
133
+
134
+ const byDecision: Record<string, { total: number; successful: number }> = {
135
+ adapt: { total: 0, successful: 0 },
136
+ direct: { total: 0, successful: 0 },
137
+ explore: { total: 0, successful: 0 },
138
+ fallback: { total: 0, successful: 0 },
139
+ };
140
+
141
+ for (const observation of this.observations.values()) {
142
+ const decision = observation.routing.decision;
143
+ byDecision[decision].total++;
144
+ if (observation.outcome.success) {
145
+ byDecision[decision].successful++;
146
+ }
147
+ }
148
+
149
+ const recommendations: string[] = [];
150
+
151
+ // Generate recommendations based on analysis
152
+ for (const [decision, stats] of Object.entries(byDecision)) {
153
+ if (stats.total >= 5) {
154
+ const successRate = stats.successful / stats.total;
155
+ if (successRate < 0.5) {
156
+ recommendations.push(
157
+ `Consider reducing reliance on '${decision}' routing (${Math.round(successRate * 100)}% success rate)`
158
+ );
159
+ } else if (successRate > 0.8) {
160
+ recommendations.push(
161
+ `'${decision}' routing is highly effective (${Math.round(successRate * 100)}% success rate)`
162
+ );
163
+ }
164
+ }
165
+ }
166
+
167
+ return { byDecision, recommendations };
168
+ }
169
+
170
+ /**
171
+ * Analyze memory retrieval quality
172
+ * Returns: which retrieval patterns help vs mislead
173
+ */
174
+ async analyzeRetrievalQuality(): Promise<RetrievalAnalysis> {
175
+ await this.init();
176
+
177
+ const helpfulPatterns: Map<string, number> = new Map();
178
+ const misleadingPatterns: Map<string, number> = new Map();
179
+
180
+ for (const observation of this.observations.values()) {
181
+ const quality = observation.memoryUsage.retrievalQuality;
182
+ const playbooks = observation.memoryUsage.playbooksApplied;
183
+
184
+ for (const playbookId of playbooks) {
185
+ if (quality === 'helpful') {
186
+ helpfulPatterns.set(
187
+ playbookId,
188
+ (helpfulPatterns.get(playbookId) ?? 0) + 1
189
+ );
190
+ } else if (quality === 'misleading') {
191
+ misleadingPatterns.set(
192
+ playbookId,
193
+ (misleadingPatterns.get(playbookId) ?? 0) + 1
194
+ );
195
+ }
196
+ }
197
+ }
198
+
199
+ const recommendations: string[] = [];
200
+
201
+ // Find consistently misleading playbooks
202
+ for (const [playbookId, count] of misleadingPatterns) {
203
+ const helpfulCount = helpfulPatterns.get(playbookId) ?? 0;
204
+ if (count > helpfulCount && count >= 3) {
205
+ recommendations.push(
206
+ `Playbook ${playbookId} may need refinement (${count} misleading vs ${helpfulCount} helpful uses)`
207
+ );
208
+ }
209
+ }
210
+
211
+ return {
212
+ helpfulPatterns: Array.from(helpfulPatterns.keys()),
213
+ misleadingPatterns: Array.from(misleadingPatterns.keys()),
214
+ recommendations,
215
+ };
216
+ }
217
+
218
+ /**
219
+ * Generate meta-strategies from observations
220
+ * Called periodically to distill learning patterns
221
+ */
222
+ async generateMetaStrategies(): Promise<MetaStrategy[]> {
223
+ await this.init();
224
+
225
+ const newStrategies: MetaStrategy[] = [];
226
+ const observations = this.observations.values();
227
+
228
+ // Pattern 1: Low-confidence routing tends to need exploration
229
+ const lowConfidenceObs = observations.filter(
230
+ (o) => o.routing.confidence < 0.5
231
+ );
232
+ const lowConfidenceSuccessRate =
233
+ lowConfidenceObs.filter((o) => o.outcome.success).length /
234
+ (lowConfidenceObs.length || 1);
235
+
236
+ if (lowConfidenceObs.length >= 5 && lowConfidenceSuccessRate < 0.4) {
237
+ const existing = this.strategies
238
+ .values()
239
+ .find((s) => s.name === 'low-confidence-explore');
240
+ if (!existing) {
241
+ newStrategies.push(
242
+ createMetaStrategy({
243
+ name: 'low-confidence-explore',
244
+ condition: {
245
+ taskCharacteristics: [],
246
+ memoryState: ['low confidence routing'],
247
+ },
248
+ adjustment: {
249
+ routingBias: { explore: 0.2 },
250
+ retrievalModification: 'expand query scope',
251
+ executionHint: 'prefer decomposition',
252
+ },
253
+ })
254
+ );
255
+ }
256
+ }
257
+
258
+ // Pattern 2: Multi-file changes often need decomposition
259
+ const multiFileObs = observations.filter((o) =>
260
+ o.execution.decompositionUsed
261
+ );
262
+ const multiFileSuccessRate =
263
+ multiFileObs.filter((o) => o.outcome.success).length /
264
+ (multiFileObs.length || 1);
265
+
266
+ if (multiFileObs.length >= 5 && multiFileSuccessRate > 0.7) {
267
+ const existing = this.strategies
268
+ .values()
269
+ .find((s) => s.name === 'decomposition-effective');
270
+ if (!existing) {
271
+ newStrategies.push(
272
+ createMetaStrategy({
273
+ name: 'decomposition-effective',
274
+ condition: {
275
+ taskCharacteristics: ['multi-file change', 'complex task'],
276
+ memoryState: [],
277
+ },
278
+ adjustment: {
279
+ routingBias: {},
280
+ retrievalModification: '',
281
+ executionHint: 'use decomposition',
282
+ },
283
+ })
284
+ );
285
+ }
286
+ }
287
+
288
+ // Pattern 3: Refinement iterations correlate with success
289
+ const refinedObs = observations.filter(
290
+ (o) => o.execution.refinementIterations > 0
291
+ );
292
+ const refinedSuccessRate =
293
+ refinedObs.filter((o) => o.outcome.success).length /
294
+ (refinedObs.length || 1);
295
+
296
+ if (refinedObs.length >= 5 && refinedSuccessRate > 0.6) {
297
+ const existing = this.strategies
298
+ .values()
299
+ .find((s) => s.name === 'refinement-beneficial');
300
+ if (!existing) {
301
+ newStrategies.push(
302
+ createMetaStrategy({
303
+ name: 'refinement-beneficial',
304
+ condition: {
305
+ taskCharacteristics: [],
306
+ memoryState: ['moderate confidence'],
307
+ },
308
+ adjustment: {
309
+ routingBias: {},
310
+ retrievalModification: '',
311
+ executionHint: 'allow refinement iterations',
312
+ },
313
+ })
314
+ );
315
+ }
316
+ }
317
+
318
+ // Save new strategies
319
+ for (const strategy of newStrategies) {
320
+ this.strategies.set(strategy.id, strategy);
321
+ await this.strategies.save(strategy.id);
322
+ }
323
+
324
+ return newStrategies;
325
+ }
326
+
327
+ // === APPLICATION ===
328
+
329
+ /**
330
+ * Get routing adjustments for current context
331
+ */
332
+ async getRoutingAdjustments(context: MetaContext): Promise<MetaStrategy[]> {
333
+ await this.init();
334
+
335
+ const applicable: MetaStrategy[] = [];
336
+
337
+ for (const strategy of this.strategies.values()) {
338
+ // Check if task characteristics match
339
+ const taskMatch =
340
+ strategy.condition.taskCharacteristics.length === 0 ||
341
+ strategy.condition.taskCharacteristics.some((tc) =>
342
+ context.taskCharacteristics.some(
343
+ (ctc) => ctc.toLowerCase().includes(tc.toLowerCase())
344
+ )
345
+ );
346
+
347
+ // Check if memory state matches
348
+ const memoryMatch =
349
+ strategy.condition.memoryState.length === 0 ||
350
+ strategy.condition.memoryState.some((ms) =>
351
+ context.memoryState.some(
352
+ (cms) => cms.toLowerCase().includes(ms.toLowerCase())
353
+ )
354
+ );
355
+
356
+ if (taskMatch && memoryMatch) {
357
+ applicable.push(strategy);
358
+ }
359
+ }
360
+
361
+ return applicable;
362
+ }
363
+
364
+ /**
365
+ * Record strategy application result
366
+ */
367
+ async recordStrategyApplication(
368
+ strategyId: string,
369
+ success: boolean
370
+ ): Promise<void> {
371
+ await this.init();
372
+ const strategy = this.strategies.get(strategyId);
373
+ if (!strategy) return;
374
+
375
+ strategy.applicationCount++;
376
+ const alpha = 0.1;
377
+ strategy.successRate =
378
+ strategy.successRate * (1 - alpha) + (success ? 1 : 0) * alpha;
379
+ strategy.updatedAt = new Date();
380
+
381
+ this.strategies.set(strategyId, strategy);
382
+ await this.strategies.save(strategyId);
383
+ }
384
+
385
+ // === LIFECYCLE ===
386
+
387
+ /**
388
+ * Add a meta-strategy
389
+ */
390
+ async addStrategy(strategy: MetaStrategy): Promise<void> {
391
+ await this.init();
392
+ this.strategies.set(strategy.id, strategy);
393
+ await this.strategies.save(strategy.id);
394
+ }
395
+
396
+ /**
397
+ * Get a meta-strategy by ID
398
+ */
399
+ async getStrategy(id: string): Promise<MetaStrategy | undefined> {
400
+ await this.init();
401
+ return this.strategies.get(id);
402
+ }
403
+
404
+ /**
405
+ * Get all meta-strategies
406
+ */
407
+ async getAllStrategies(): Promise<MetaStrategy[]> {
408
+ await this.init();
409
+ return this.strategies.values();
410
+ }
411
+
412
+ /**
413
+ * Get statistics about meta-learning
414
+ */
415
+ async getStats(): Promise<MetaStats> {
416
+ await this.init();
417
+
418
+ const observations = this.observations.values();
419
+ const totalObservations = observations.length;
420
+ const totalStrategies = this.strategies.size();
421
+
422
+ const observationsByRouting: Record<RoutingDecisionType, number> = {
423
+ adapt: 0,
424
+ direct: 0,
425
+ explore: 0,
426
+ fallback: 0,
427
+ };
428
+
429
+ let successCount = 0;
430
+ for (const obs of observations) {
431
+ observationsByRouting[obs.routing.decision]++;
432
+ if (obs.outcome.success) successCount++;
433
+ }
434
+
435
+ const averageSuccessRate =
436
+ totalObservations > 0 ? successCount / totalObservations : 0;
437
+
438
+ // Determine trend from recent observations
439
+ const recent = observations
440
+ .sort(
441
+ (a, b) =>
442
+ new Date(b.timestamp).getTime() - new Date(a.timestamp).getTime()
443
+ )
444
+ .slice(0, 10);
445
+ const older = observations
446
+ .sort(
447
+ (a, b) =>
448
+ new Date(b.timestamp).getTime() - new Date(a.timestamp).getTime()
449
+ )
450
+ .slice(10, 20);
451
+
452
+ let recentTrend: 'improving' | 'stable' | 'declining' = 'stable';
453
+ if (recent.length >= 5 && older.length >= 5) {
454
+ const recentSuccess =
455
+ recent.filter((o) => o.outcome.success).length / recent.length;
456
+ const olderSuccess =
457
+ older.filter((o) => o.outcome.success).length / older.length;
458
+ if (recentSuccess > olderSuccess + 0.1) {
459
+ recentTrend = 'improving';
460
+ } else if (recentSuccess < olderSuccess - 0.1) {
461
+ recentTrend = 'declining';
462
+ }
463
+ }
464
+
465
+ return {
466
+ totalObservations,
467
+ totalStrategies,
468
+ observationsByRouting,
469
+ averageSuccessRate,
470
+ recentTrend,
471
+ };
472
+ }
473
+
474
+ /**
475
+ * Prune old observations to save space
476
+ */
477
+ async pruneOldObservations(maxAge: number = 30 * 24 * 60 * 60 * 1000): Promise<number> {
478
+ await this.init();
479
+
480
+ const cutoff = new Date(Date.now() - maxAge);
481
+ let pruned = 0;
482
+
483
+ for (const observation of this.observations.values()) {
484
+ if (new Date(observation.timestamp) < cutoff) {
485
+ this.observations.delete(observation.id);
486
+ pruned++;
487
+ }
488
+ }
489
+
490
+ return pruned;
491
+ }
492
+
493
+ /**
494
+ * Close the stores
495
+ */
496
+ async close(): Promise<void> {
497
+ await Promise.all([this.observations.close(), this.strategies.close()]);
498
+ }
499
+ }
500
+
501
+ /**
502
+ * Create a meta memory store
503
+ */
504
+ export function createMetaMemory(baseDir: string): MetaMemory {
505
+ return new MetaMemory(baseDir);
506
+ }