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.
- package/README.md +363 -2
- package/SKILL.md +193 -0
- package/dist/agents/index.d.ts +3 -0
- package/dist/agents/index.d.ts.map +1 -0
- package/dist/agents/index.js +5 -0
- package/dist/agents/index.js.map +1 -0
- package/dist/agents/mock-provider.d.ts +23 -0
- package/dist/agents/mock-provider.d.ts.map +1 -0
- package/dist/agents/mock-provider.js +71 -0
- package/dist/agents/mock-provider.js.map +1 -0
- package/dist/agents/types.d.ts +98 -0
- package/dist/agents/types.d.ts.map +1 -0
- package/dist/agents/types.js +44 -0
- package/dist/agents/types.js.map +1 -0
- package/dist/atlas.d.ts +196 -0
- package/dist/atlas.d.ts.map +1 -0
- package/dist/atlas.js +373 -0
- package/dist/atlas.js.map +1 -0
- package/dist/bin/cognitive-core.d.ts +18 -0
- package/dist/bin/cognitive-core.d.ts.map +1 -0
- package/dist/bin/cognitive-core.js +419 -0
- package/dist/bin/cognitive-core.js.map +1 -0
- package/dist/embeddings/bm25.d.ts +104 -0
- package/dist/embeddings/bm25.d.ts.map +1 -0
- package/dist/embeddings/bm25.js +264 -0
- package/dist/embeddings/bm25.js.map +1 -0
- package/dist/embeddings/index.d.ts +12 -0
- package/dist/embeddings/index.d.ts.map +1 -0
- package/dist/embeddings/index.js +16 -0
- package/dist/embeddings/index.js.map +1 -0
- package/dist/embeddings/manager.d.ts +112 -0
- package/dist/embeddings/manager.d.ts.map +1 -0
- package/dist/embeddings/manager.js +215 -0
- package/dist/embeddings/manager.js.map +1 -0
- package/dist/embeddings/provider.d.ts +101 -0
- package/dist/embeddings/provider.d.ts.map +1 -0
- package/dist/embeddings/provider.js +232 -0
- package/dist/embeddings/provider.js.map +1 -0
- package/dist/embeddings/vector-store.d.ts +101 -0
- package/dist/embeddings/vector-store.d.ts.map +1 -0
- package/dist/embeddings/vector-store.js +256 -0
- package/dist/embeddings/vector-store.js.map +1 -0
- package/dist/factory.d.ts +193 -0
- package/dist/factory.d.ts.map +1 -0
- package/dist/factory.js +109 -0
- package/dist/factory.js.map +1 -0
- package/dist/index.d.ts +43 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +84 -0
- package/dist/index.js.map +1 -0
- package/dist/learning/analyzer.d.ts +110 -0
- package/dist/learning/analyzer.d.ts.map +1 -0
- package/dist/learning/analyzer.js +213 -0
- package/dist/learning/analyzer.js.map +1 -0
- package/dist/learning/effectiveness.d.ts +158 -0
- package/dist/learning/effectiveness.d.ts.map +1 -0
- package/dist/learning/effectiveness.js +251 -0
- package/dist/learning/effectiveness.js.map +1 -0
- package/dist/learning/index.d.ts +8 -0
- package/dist/learning/index.d.ts.map +1 -0
- package/dist/learning/index.js +11 -0
- package/dist/learning/index.js.map +1 -0
- package/dist/learning/llm-extractor.d.ts +88 -0
- package/dist/learning/llm-extractor.d.ts.map +1 -0
- package/dist/learning/llm-extractor.js +372 -0
- package/dist/learning/llm-extractor.js.map +1 -0
- package/dist/learning/meta-learner.d.ts +80 -0
- package/dist/learning/meta-learner.d.ts.map +1 -0
- package/dist/learning/meta-learner.js +355 -0
- package/dist/learning/meta-learner.js.map +1 -0
- package/dist/learning/pipeline.d.ts +65 -0
- package/dist/learning/pipeline.d.ts.map +1 -0
- package/dist/learning/pipeline.js +170 -0
- package/dist/learning/pipeline.js.map +1 -0
- package/dist/learning/playbook-extractor.d.ts +113 -0
- package/dist/learning/playbook-extractor.d.ts.map +1 -0
- package/dist/learning/playbook-extractor.js +523 -0
- package/dist/learning/playbook-extractor.js.map +1 -0
- package/dist/learning/usage-inference.d.ts +82 -0
- package/dist/learning/usage-inference.d.ts.map +1 -0
- package/dist/learning/usage-inference.js +261 -0
- package/dist/learning/usage-inference.js.map +1 -0
- package/dist/mcp/index.d.ts +6 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/index.js +6 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/playbook-server.d.ts +120 -0
- package/dist/mcp/playbook-server.d.ts.map +1 -0
- package/dist/mcp/playbook-server.js +427 -0
- package/dist/mcp/playbook-server.js.map +1 -0
- package/dist/memory/curated-loader.d.ts +62 -0
- package/dist/memory/curated-loader.d.ts.map +1 -0
- package/dist/memory/curated-loader.js +106 -0
- package/dist/memory/curated-loader.js.map +1 -0
- package/dist/memory/experience.d.ts +122 -0
- package/dist/memory/experience.d.ts.map +1 -0
- package/dist/memory/experience.js +392 -0
- package/dist/memory/experience.js.map +1 -0
- package/dist/memory/index.d.ts +6 -0
- package/dist/memory/index.d.ts.map +1 -0
- package/dist/memory/index.js +9 -0
- package/dist/memory/index.js.map +1 -0
- package/dist/memory/meta.d.ts +90 -0
- package/dist/memory/meta.d.ts.map +1 -0
- package/dist/memory/meta.js +362 -0
- package/dist/memory/meta.js.map +1 -0
- package/dist/memory/playbook.d.ts +133 -0
- package/dist/memory/playbook.d.ts.map +1 -0
- package/dist/memory/playbook.js +357 -0
- package/dist/memory/playbook.js.map +1 -0
- package/dist/memory/system.d.ts +167 -0
- package/dist/memory/system.d.ts.map +1 -0
- package/dist/memory/system.js +383 -0
- package/dist/memory/system.js.map +1 -0
- package/dist/runtime/backends/acp.d.ts +67 -0
- package/dist/runtime/backends/acp.d.ts.map +1 -0
- package/dist/runtime/backends/acp.js +290 -0
- package/dist/runtime/backends/acp.js.map +1 -0
- package/dist/runtime/backends/index.d.ts +5 -0
- package/dist/runtime/backends/index.d.ts.map +1 -0
- package/dist/runtime/backends/index.js +6 -0
- package/dist/runtime/backends/index.js.map +1 -0
- package/dist/runtime/backends/mock.d.ts +67 -0
- package/dist/runtime/backends/mock.d.ts.map +1 -0
- package/dist/runtime/backends/mock.js +153 -0
- package/dist/runtime/backends/mock.js.map +1 -0
- package/dist/runtime/backends/subprocess.d.ts +56 -0
- package/dist/runtime/backends/subprocess.d.ts.map +1 -0
- package/dist/runtime/backends/subprocess.js +260 -0
- package/dist/runtime/backends/subprocess.js.map +1 -0
- package/dist/runtime/flows/learning.d.ts +73 -0
- package/dist/runtime/flows/learning.d.ts.map +1 -0
- package/dist/runtime/flows/learning.js +116 -0
- package/dist/runtime/flows/learning.js.map +1 -0
- package/dist/runtime/flows/validation.d.ts +122 -0
- package/dist/runtime/flows/validation.d.ts.map +1 -0
- package/dist/runtime/flows/validation.js +223 -0
- package/dist/runtime/flows/validation.js.map +1 -0
- package/dist/runtime/index.d.ts +6 -0
- package/dist/runtime/index.d.ts.map +1 -0
- package/dist/runtime/index.js +8 -0
- package/dist/runtime/index.js.map +1 -0
- package/dist/runtime/manager.d.ts +116 -0
- package/dist/runtime/manager.d.ts.map +1 -0
- package/dist/runtime/manager.js +416 -0
- package/dist/runtime/manager.js.map +1 -0
- package/dist/runtime/types.d.ts +138 -0
- package/dist/runtime/types.d.ts.map +1 -0
- package/dist/runtime/types.js +2 -0
- package/dist/runtime/types.js.map +1 -0
- package/dist/search/evaluator.d.ts +102 -0
- package/dist/search/evaluator.d.ts.map +1 -0
- package/dist/search/evaluator.js +352 -0
- package/dist/search/evaluator.js.map +1 -0
- package/dist/search/index.d.ts +7 -0
- package/dist/search/index.d.ts.map +1 -0
- package/dist/search/index.js +11 -0
- package/dist/search/index.js.map +1 -0
- package/dist/search/refinement-loop.d.ts +73 -0
- package/dist/search/refinement-loop.d.ts.map +1 -0
- package/dist/search/refinement-loop.js +245 -0
- package/dist/search/refinement-loop.js.map +1 -0
- package/dist/search/refinement-types.d.ts +154 -0
- package/dist/search/refinement-types.d.ts.map +1 -0
- package/dist/search/refinement-types.js +99 -0
- package/dist/search/refinement-types.js.map +1 -0
- package/dist/search/router.d.ts +61 -0
- package/dist/search/router.d.ts.map +1 -0
- package/dist/search/router.js +197 -0
- package/dist/search/router.js.map +1 -0
- package/dist/search/solver.d.ts +75 -0
- package/dist/search/solver.d.ts.map +1 -0
- package/dist/search/solver.js +216 -0
- package/dist/search/solver.js.map +1 -0
- package/dist/search/verification-runner.d.ts +125 -0
- package/dist/search/verification-runner.d.ts.map +1 -0
- package/dist/search/verification-runner.js +440 -0
- package/dist/search/verification-runner.js.map +1 -0
- package/dist/surfacing/index.d.ts +2 -0
- package/dist/surfacing/index.d.ts.map +1 -0
- package/dist/surfacing/index.js +2 -0
- package/dist/surfacing/index.js.map +1 -0
- package/dist/surfacing/skill-library.d.ts +158 -0
- package/dist/surfacing/skill-library.d.ts.map +1 -0
- package/dist/surfacing/skill-library.js +429 -0
- package/dist/surfacing/skill-library.js.map +1 -0
- package/dist/types/config.d.ts +1113 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/config.js +274 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types/index.d.ts +9 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +14 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/memory.d.ts +339 -0
- package/dist/types/memory.d.ts.map +1 -0
- package/dist/types/memory.js +207 -0
- package/dist/types/memory.js.map +1 -0
- package/dist/types/meta.d.ts +146 -0
- package/dist/types/meta.d.ts.map +1 -0
- package/dist/types/meta.js +51 -0
- package/dist/types/meta.js.map +1 -0
- package/dist/types/outcome.d.ts +42 -0
- package/dist/types/outcome.d.ts.map +1 -0
- package/dist/types/outcome.js +50 -0
- package/dist/types/outcome.js.map +1 -0
- package/dist/types/playbook.d.ts +119 -0
- package/dist/types/playbook.d.ts.map +1 -0
- package/dist/types/playbook.js +71 -0
- package/dist/types/playbook.js.map +1 -0
- package/dist/types/step.d.ts +44 -0
- package/dist/types/step.d.ts.map +1 -0
- package/dist/types/step.js +32 -0
- package/dist/types/step.js.map +1 -0
- package/dist/types/task.d.ts +91 -0
- package/dist/types/task.d.ts.map +1 -0
- package/dist/types/task.js +39 -0
- package/dist/types/task.js.map +1 -0
- package/dist/types/trajectory.d.ts +221 -0
- package/dist/types/trajectory.d.ts.map +1 -0
- package/dist/types/trajectory.js +60 -0
- package/dist/types/trajectory.js.map +1 -0
- package/dist/utils/index.d.ts +4 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +4 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/similarity.d.ts +31 -0
- package/dist/utils/similarity.d.ts.map +1 -0
- package/dist/utils/similarity.js +107 -0
- package/dist/utils/similarity.js.map +1 -0
- package/dist/utils/storage.d.ts +106 -0
- package/dist/utils/storage.d.ts.map +1 -0
- package/dist/utils/storage.js +203 -0
- package/dist/utils/storage.js.map +1 -0
- package/dist/utils/validation.d.ts +129 -0
- package/dist/utils/validation.d.ts.map +1 -0
- package/dist/utils/validation.js +171 -0
- package/dist/utils/validation.js.map +1 -0
- package/package.json +61 -9
- package/scripts/migrate-to-playbooks.ts +307 -0
- package/src/agents/index.ts +14 -0
- package/src/agents/mock-provider.ts +93 -0
- package/src/agents/types.ts +137 -0
- package/src/atlas.ts +560 -0
- package/src/bin/cognitive-core.ts +470 -0
- package/src/embeddings/bm25.ts +337 -0
- package/src/embeddings/index.ts +39 -0
- package/src/embeddings/manager.ts +288 -0
- package/src/embeddings/provider.ts +311 -0
- package/src/embeddings/vector-store.ts +353 -0
- package/src/factory.ts +263 -0
- package/src/index.ts +246 -0
- package/src/learning/analyzer.ts +335 -0
- package/src/learning/effectiveness.ts +428 -0
- package/src/learning/index.ts +58 -0
- package/src/learning/llm-extractor.ts +542 -0
- package/src/learning/meta-learner.ts +516 -0
- package/src/learning/pipeline.ts +244 -0
- package/src/learning/playbook-extractor.ts +702 -0
- package/src/learning/usage-inference.ts +372 -0
- package/src/mcp/index.ts +12 -0
- package/src/mcp/playbook-server.ts +565 -0
- package/src/memory/curated-loader.ts +160 -0
- package/src/memory/experience.ts +515 -0
- package/src/memory/index.ts +27 -0
- package/src/memory/meta.ts +506 -0
- package/src/memory/playbook.ts +493 -0
- package/src/memory/system.ts +551 -0
- package/src/runtime/backends/acp.ts +378 -0
- package/src/runtime/backends/index.ts +24 -0
- package/src/runtime/backends/mock.ts +218 -0
- package/src/runtime/backends/subprocess.ts +356 -0
- package/src/runtime/flows/learning.ts +183 -0
- package/src/runtime/flows/validation.ts +381 -0
- package/src/runtime/index.ts +53 -0
- package/src/runtime/manager.ts +541 -0
- package/src/runtime/types.ts +157 -0
- package/src/search/evaluator.ts +474 -0
- package/src/search/index.ts +59 -0
- package/src/search/refinement-loop.ts +363 -0
- package/src/search/refinement-types.ts +159 -0
- package/src/search/router.ts +261 -0
- package/src/search/solver.ts +303 -0
- package/src/search/verification-runner.ts +570 -0
- package/src/surfacing/index.ts +6 -0
- package/src/surfacing/skill-library.ts +594 -0
- package/src/types/config.ts +333 -0
- package/src/types/index.ts +130 -0
- package/src/types/memory.ts +270 -0
- package/src/types/meta.ts +218 -0
- package/src/types/outcome.ts +66 -0
- package/src/types/playbook.ts +196 -0
- package/src/types/step.ts +40 -0
- package/src/types/task.ts +52 -0
- package/src/types/trajectory.ts +80 -0
- package/src/utils/index.ts +38 -0
- package/src/utils/similarity.ts +139 -0
- package/src/utils/storage.ts +249 -0
- package/src/utils/validation.ts +286 -0
- package/tests/embeddings/bm25.test.ts +130 -0
- package/tests/embeddings/manager.test.ts +205 -0
- package/tests/integration/atlas.test.ts +266 -0
- package/tests/integration/e2e.test.ts +929 -0
- package/tests/learning/analyzer.test.ts +426 -0
- package/tests/learning/effectiveness.test.ts +542 -0
- package/tests/learning/pipeline.test.ts +176 -0
- package/tests/learning/playbook-extractor-provenance.test.ts +114 -0
- package/tests/learning/usage-inference.test.ts +254 -0
- package/tests/mcp/playbook-server.test.ts +252 -0
- package/tests/memory/experience.test.ts +198 -0
- package/tests/memory/playbook.test.ts +338 -0
- package/tests/memory/provenance.test.ts +639 -0
- package/tests/memory/system.test.ts +325 -0
- package/tests/runtime/agent-manager.test.ts +512 -0
- package/tests/runtime/mock-backend.test.ts +248 -0
- package/tests/search/refinement-loop.test.ts +468 -0
- package/tests/search/refinement.test.ts +267 -0
- package/tests/search/router.test.ts +427 -0
- package/tests/surfacing/skill-library.test.ts +292 -0
- package/tests/types/outcome.test.ts +147 -0
- package/tests/types/step.test.ts +133 -0
- package/tests/types/task.test.ts +158 -0
- package/tests/types/trajectory.test.ts +253 -0
- package/tests/utils/similarity.test.ts +188 -0
- package/tests/utils/validation.test.ts +252 -0
- package/tsconfig.json +25 -0
- package/vitest.config.ts +22 -0
- package/index.d.ts +0 -4
- 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
|
+
}
|