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,261 @@
|
|
|
1
|
+
import type { Task, RouterConfig } from '../types/index.js';
|
|
2
|
+
import type { MemorySystem, MemoryQueryResultV2 } from '../memory/system.js';
|
|
3
|
+
import type { MetaLearner } from '../learning/meta-learner.js';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Routing decision with context
|
|
7
|
+
*/
|
|
8
|
+
export interface RoutingDecision {
|
|
9
|
+
/** Selected strategy for solving */
|
|
10
|
+
strategy: 'direct' | 'adapt' | 'explore' | 'fallback';
|
|
11
|
+
/** Confidence in this routing (0-1) */
|
|
12
|
+
confidence: number;
|
|
13
|
+
/** Memory query results (playbook format) */
|
|
14
|
+
memoryContext: MemoryQueryResultV2;
|
|
15
|
+
/** Estimated compute budget (LLM calls) */
|
|
16
|
+
estimatedBudget: number;
|
|
17
|
+
/** Reasoning for the decision */
|
|
18
|
+
reasoning: string;
|
|
19
|
+
/** Meta-strategies that were applied */
|
|
20
|
+
appliedMetaStrategies?: string[];
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Task Router
|
|
25
|
+
* Determines the best approach for solving a task based on memory
|
|
26
|
+
* Now with meta-learning integration for adaptive routing
|
|
27
|
+
*/
|
|
28
|
+
export class TaskRouter {
|
|
29
|
+
private memory: MemorySystem;
|
|
30
|
+
private config: RouterConfig;
|
|
31
|
+
private metaLearner?: MetaLearner;
|
|
32
|
+
|
|
33
|
+
constructor(
|
|
34
|
+
memory: MemorySystem,
|
|
35
|
+
config?: Partial<RouterConfig>,
|
|
36
|
+
metaLearner?: MetaLearner
|
|
37
|
+
) {
|
|
38
|
+
this.memory = memory;
|
|
39
|
+
this.config = {
|
|
40
|
+
similarityThreshold: config?.similarityThreshold ?? 0.85,
|
|
41
|
+
useDomainRouting: config?.useDomainRouting ?? true,
|
|
42
|
+
defaultStrategy: config?.defaultStrategy ?? 'direct',
|
|
43
|
+
};
|
|
44
|
+
this.metaLearner = metaLearner;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Set the meta learner (can be set after construction)
|
|
49
|
+
*/
|
|
50
|
+
setMetaLearner(metaLearner: MetaLearner): void {
|
|
51
|
+
this.metaLearner = metaLearner;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Route a task to determine solving strategy
|
|
56
|
+
* Uses playbook-based memory with meta-learning adjustments
|
|
57
|
+
*/
|
|
58
|
+
async route(task: Task): Promise<RoutingDecision> {
|
|
59
|
+
// Query memory for relevant context
|
|
60
|
+
const memoryContext = await this.memory.queryV2(task.description, {
|
|
61
|
+
domains: task.domain ? [task.domain] : undefined,
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
// Compute base routing from playbook memory
|
|
65
|
+
let decision = this.computeBaseRouting(memoryContext);
|
|
66
|
+
|
|
67
|
+
// Apply meta-learning adjustments if available
|
|
68
|
+
if (this.metaLearner) {
|
|
69
|
+
const taskCharacteristics = this.extractTaskCharacteristics(task);
|
|
70
|
+
const memoryState = this.summarizeMemoryState(memoryContext);
|
|
71
|
+
|
|
72
|
+
try {
|
|
73
|
+
const adjusted = await this.metaLearner.adjustRouting(
|
|
74
|
+
{
|
|
75
|
+
strategy: decision.strategy,
|
|
76
|
+
confidence: decision.confidence,
|
|
77
|
+
estimatedBudget: decision.estimatedBudget,
|
|
78
|
+
reasoning: decision.reasoning,
|
|
79
|
+
},
|
|
80
|
+
taskCharacteristics,
|
|
81
|
+
memoryState
|
|
82
|
+
);
|
|
83
|
+
|
|
84
|
+
// Apply adjustments
|
|
85
|
+
if (adjusted.strategy !== decision.strategy || adjusted.confidence !== decision.confidence) {
|
|
86
|
+
decision.strategy = adjusted.strategy;
|
|
87
|
+
decision.confidence = adjusted.confidence;
|
|
88
|
+
decision.reasoning = adjusted.reasoning;
|
|
89
|
+
decision.appliedMetaStrategies = ['meta-learning adjustment'];
|
|
90
|
+
}
|
|
91
|
+
} catch (error) {
|
|
92
|
+
// Meta-learning failed, continue with base routing
|
|
93
|
+
console.error(
|
|
94
|
+
'[TaskRouter] Meta-learning adjustment failed, using base routing:',
|
|
95
|
+
error instanceof Error ? error.message : String(error)
|
|
96
|
+
);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
return decision;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* Compute base routing decision from memory results
|
|
105
|
+
*/
|
|
106
|
+
private computeBaseRouting(memoryContext: MemoryQueryResultV2): RoutingDecision {
|
|
107
|
+
// Check experience memory
|
|
108
|
+
const hasHighSimilarityExperience = memoryContext.experiences.some(
|
|
109
|
+
(e) => e.score >= this.config.similarityThreshold && e.experience.success
|
|
110
|
+
);
|
|
111
|
+
|
|
112
|
+
// Check playbook memory
|
|
113
|
+
const hasHighConfidencePlaybook = memoryContext.playbooks.some(
|
|
114
|
+
(p) => p.score >= this.config.similarityThreshold && p.playbook.confidence >= 0.7
|
|
115
|
+
);
|
|
116
|
+
|
|
117
|
+
const hasApplicablePlaybook = memoryContext.playbooks.some(
|
|
118
|
+
(p) => p.score >= this.config.similarityThreshold * 0.8
|
|
119
|
+
);
|
|
120
|
+
|
|
121
|
+
// Determine routing strategy
|
|
122
|
+
let strategy: RoutingDecision['strategy'];
|
|
123
|
+
let confidence: number;
|
|
124
|
+
let estimatedBudget: number;
|
|
125
|
+
let reasoning: string;
|
|
126
|
+
|
|
127
|
+
if (hasHighSimilarityExperience) {
|
|
128
|
+
strategy = 'adapt';
|
|
129
|
+
confidence = 0.9;
|
|
130
|
+
estimatedBudget = 1;
|
|
131
|
+
reasoning = 'Found highly similar successful experience to adapt from';
|
|
132
|
+
} else if (hasHighConfidencePlaybook) {
|
|
133
|
+
strategy = 'direct';
|
|
134
|
+
confidence = 0.8;
|
|
135
|
+
estimatedBudget = 2;
|
|
136
|
+
reasoning = 'Found high-confidence playbook for guidance';
|
|
137
|
+
} else if (hasApplicablePlaybook) {
|
|
138
|
+
strategy = 'direct';
|
|
139
|
+
confidence = 0.6;
|
|
140
|
+
estimatedBudget = 4;
|
|
141
|
+
reasoning = 'Found applicable playbook to guide solving';
|
|
142
|
+
} else if (memoryContext.experiences.length > 0) {
|
|
143
|
+
strategy = 'explore';
|
|
144
|
+
confidence = 0.4;
|
|
145
|
+
estimatedBudget = 10;
|
|
146
|
+
reasoning = 'Found some context but need exploration';
|
|
147
|
+
} else {
|
|
148
|
+
strategy = 'fallback';
|
|
149
|
+
confidence = 0.2;
|
|
150
|
+
estimatedBudget = 20;
|
|
151
|
+
reasoning = 'No relevant memory found, using fallback strategy';
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
return {
|
|
155
|
+
strategy,
|
|
156
|
+
confidence,
|
|
157
|
+
memoryContext,
|
|
158
|
+
estimatedBudget,
|
|
159
|
+
reasoning,
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
/**
|
|
164
|
+
* Extract task characteristics for meta-learning
|
|
165
|
+
*/
|
|
166
|
+
private extractTaskCharacteristics(task: Task): string[] {
|
|
167
|
+
const characteristics: string[] = [];
|
|
168
|
+
|
|
169
|
+
// Domain
|
|
170
|
+
if (task.domain) {
|
|
171
|
+
characteristics.push(`domain: ${task.domain}`);
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
// Analyze description
|
|
175
|
+
const desc = task.description.toLowerCase();
|
|
176
|
+
|
|
177
|
+
if (desc.includes('bug') || desc.includes('fix') || desc.includes('error')) {
|
|
178
|
+
characteristics.push('bug fix');
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
if (desc.includes('test') || desc.includes('spec')) {
|
|
182
|
+
characteristics.push('testing');
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
if (desc.includes('refactor') || desc.includes('clean')) {
|
|
186
|
+
characteristics.push('refactoring');
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
if (desc.includes('implement') || desc.includes('create') || desc.includes('add')) {
|
|
190
|
+
characteristics.push('new feature');
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
if (desc.includes('multiple') || desc.includes('files') || desc.includes('across')) {
|
|
194
|
+
characteristics.push('multi-file change');
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
if (desc.length > 500) {
|
|
198
|
+
characteristics.push('complex task');
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
return characteristics;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
/**
|
|
205
|
+
* Summarize memory state for meta-learning
|
|
206
|
+
*/
|
|
207
|
+
private summarizeMemoryState(memoryContext: MemoryQueryResultV2): string[] {
|
|
208
|
+
const state: string[] = [];
|
|
209
|
+
|
|
210
|
+
// Experience state
|
|
211
|
+
if (memoryContext.experiences.length === 0) {
|
|
212
|
+
state.push('no similar experiences');
|
|
213
|
+
} else {
|
|
214
|
+
const maxScore = Math.max(...memoryContext.experiences.map((e) => e.score), 0);
|
|
215
|
+
if (maxScore >= 0.8) {
|
|
216
|
+
state.push('high similarity experience');
|
|
217
|
+
} else if (maxScore >= 0.5) {
|
|
218
|
+
state.push('moderate similarity experience');
|
|
219
|
+
} else {
|
|
220
|
+
state.push('low similarity experiences');
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
// Playbook state
|
|
225
|
+
if (memoryContext.playbooks.length === 0) {
|
|
226
|
+
state.push('no applicable playbooks');
|
|
227
|
+
} else {
|
|
228
|
+
const maxConfidence = Math.max(
|
|
229
|
+
...memoryContext.playbooks.map((p) => p.playbook.confidence),
|
|
230
|
+
0
|
|
231
|
+
);
|
|
232
|
+
if (maxConfidence >= 0.8) {
|
|
233
|
+
state.push('high confidence playbook');
|
|
234
|
+
} else if (maxConfidence >= 0.5) {
|
|
235
|
+
state.push('moderate confidence playbook');
|
|
236
|
+
} else {
|
|
237
|
+
state.push('low confidence playbooks');
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
return state;
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
/**
|
|
245
|
+
* Update configuration
|
|
246
|
+
*/
|
|
247
|
+
updateConfig(config: Partial<RouterConfig>): void {
|
|
248
|
+
this.config = { ...this.config, ...config };
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
/**
|
|
253
|
+
* Create a task router
|
|
254
|
+
*/
|
|
255
|
+
export function createRouter(
|
|
256
|
+
memory: MemorySystem,
|
|
257
|
+
config?: Partial<RouterConfig>,
|
|
258
|
+
metaLearner?: MetaLearner
|
|
259
|
+
): TaskRouter {
|
|
260
|
+
return new TaskRouter(memory, config, metaLearner);
|
|
261
|
+
}
|
|
@@ -0,0 +1,303 @@
|
|
|
1
|
+
import type {
|
|
2
|
+
Task,
|
|
3
|
+
Trajectory,
|
|
4
|
+
Step,
|
|
5
|
+
Outcome,
|
|
6
|
+
} from '../types/index.js';
|
|
7
|
+
import {
|
|
8
|
+
createTrajectory,
|
|
9
|
+
createStep,
|
|
10
|
+
successOutcome,
|
|
11
|
+
failureOutcome,
|
|
12
|
+
} from '../types/index.js';
|
|
13
|
+
import type { MemorySystem } from '../memory/system.js';
|
|
14
|
+
import type { LLMProvider, Message } from '../agents/types.js';
|
|
15
|
+
import type { RoutingDecision } from './router.js';
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Solver configuration
|
|
19
|
+
*/
|
|
20
|
+
export interface SolverConfig {
|
|
21
|
+
maxSteps: number;
|
|
22
|
+
temperature: number;
|
|
23
|
+
agentId: string;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Solver result
|
|
28
|
+
*/
|
|
29
|
+
export interface SolverResult {
|
|
30
|
+
trajectory: Trajectory;
|
|
31
|
+
usedMemory: boolean;
|
|
32
|
+
strategy: string;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Direct Solver
|
|
37
|
+
* Solves tasks using memory-augmented LLM calls
|
|
38
|
+
*
|
|
39
|
+
* @deprecated Use AgentManager.spawn() instead. DirectSolver will be removed in v2.0.
|
|
40
|
+
* The AgentManager provides real action execution through configurable backends (ACP, subprocess).
|
|
41
|
+
*
|
|
42
|
+
* Migration example:
|
|
43
|
+
* ```typescript
|
|
44
|
+
* // Before (deprecated):
|
|
45
|
+
* const solver = createSolver(memory, provider);
|
|
46
|
+
* const result = await solver.solve(task, routing);
|
|
47
|
+
*
|
|
48
|
+
* // After (recommended):
|
|
49
|
+
* const manager = createAgentManager(memory);
|
|
50
|
+
* const result = await manager.spawn({
|
|
51
|
+
* agentType: 'claude-code',
|
|
52
|
+
* task,
|
|
53
|
+
* injectedKnowledge: routing.memoryContext,
|
|
54
|
+
* });
|
|
55
|
+
* ```
|
|
56
|
+
*/
|
|
57
|
+
export class DirectSolver {
|
|
58
|
+
private memory: MemorySystem;
|
|
59
|
+
private provider: LLMProvider;
|
|
60
|
+
private config: SolverConfig;
|
|
61
|
+
|
|
62
|
+
constructor(
|
|
63
|
+
memory: MemorySystem,
|
|
64
|
+
provider: LLMProvider,
|
|
65
|
+
config?: Partial<SolverConfig>
|
|
66
|
+
) {
|
|
67
|
+
this.memory = memory;
|
|
68
|
+
this.provider = provider;
|
|
69
|
+
this.config = {
|
|
70
|
+
maxSteps: config?.maxSteps ?? 10,
|
|
71
|
+
temperature: config?.temperature ?? 0.3,
|
|
72
|
+
agentId: config?.agentId ?? 'direct-solver',
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Solve a task using the routing decision
|
|
78
|
+
*/
|
|
79
|
+
async solve(task: Task, routing: RoutingDecision): Promise<SolverResult> {
|
|
80
|
+
const startTime = Date.now();
|
|
81
|
+
const steps: Step[] = [];
|
|
82
|
+
let llmCalls = 0;
|
|
83
|
+
let totalTokens = 0;
|
|
84
|
+
|
|
85
|
+
try {
|
|
86
|
+
// Build system prompt with memory context
|
|
87
|
+
const systemPrompt = this.buildSystemPrompt(task, routing);
|
|
88
|
+
|
|
89
|
+
// Execute solving loop
|
|
90
|
+
const messages: Message[] = [
|
|
91
|
+
{ role: 'system', content: systemPrompt },
|
|
92
|
+
{ role: 'user', content: this.buildTaskPrompt(task) },
|
|
93
|
+
];
|
|
94
|
+
|
|
95
|
+
let done = false;
|
|
96
|
+
let outcome: Outcome | null = null;
|
|
97
|
+
|
|
98
|
+
while (!done && steps.length < this.config.maxSteps) {
|
|
99
|
+
// Get LLM response
|
|
100
|
+
const response = await this.provider.complete(messages, {
|
|
101
|
+
temperature: this.config.temperature,
|
|
102
|
+
});
|
|
103
|
+
llmCalls++;
|
|
104
|
+
|
|
105
|
+
// Parse response into thought/action
|
|
106
|
+
const { thought, action, isDone, solution } =
|
|
107
|
+
this.parseResponse(response);
|
|
108
|
+
|
|
109
|
+
// Create step
|
|
110
|
+
const step = createStep({
|
|
111
|
+
thought,
|
|
112
|
+
action,
|
|
113
|
+
observation: isDone
|
|
114
|
+
? 'Task completed'
|
|
115
|
+
: 'Awaiting next step',
|
|
116
|
+
});
|
|
117
|
+
steps.push(step);
|
|
118
|
+
|
|
119
|
+
// Check if done
|
|
120
|
+
if (isDone) {
|
|
121
|
+
done = true;
|
|
122
|
+
outcome = successOutcome(solution);
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
// Add to conversation
|
|
126
|
+
messages.push({ role: 'assistant', content: response });
|
|
127
|
+
|
|
128
|
+
if (!isDone) {
|
|
129
|
+
// In a real implementation, we'd execute the action and get observation
|
|
130
|
+
messages.push({
|
|
131
|
+
role: 'user',
|
|
132
|
+
content: 'Continue with the next step.',
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
// If we hit max steps without completing
|
|
138
|
+
if (!outcome) {
|
|
139
|
+
outcome = failureOutcome('Max steps reached without solution', 0.5);
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
const wallTimeSeconds = (Date.now() - startTime) / 1000;
|
|
143
|
+
|
|
144
|
+
const trajectory = createTrajectory({
|
|
145
|
+
task,
|
|
146
|
+
steps,
|
|
147
|
+
outcome,
|
|
148
|
+
agentId: this.config.agentId,
|
|
149
|
+
llmCalls,
|
|
150
|
+
totalTokens,
|
|
151
|
+
wallTimeSeconds,
|
|
152
|
+
});
|
|
153
|
+
|
|
154
|
+
return {
|
|
155
|
+
trajectory,
|
|
156
|
+
usedMemory: routing.memoryContext.experiences.length > 0,
|
|
157
|
+
strategy: routing.strategy,
|
|
158
|
+
};
|
|
159
|
+
} catch (error) {
|
|
160
|
+
const wallTimeSeconds = (Date.now() - startTime) / 1000;
|
|
161
|
+
const errorMessage =
|
|
162
|
+
error instanceof Error ? error.message : 'Unknown error';
|
|
163
|
+
|
|
164
|
+
const trajectory = createTrajectory({
|
|
165
|
+
task,
|
|
166
|
+
steps,
|
|
167
|
+
outcome: failureOutcome(errorMessage),
|
|
168
|
+
agentId: this.config.agentId,
|
|
169
|
+
llmCalls,
|
|
170
|
+
totalTokens,
|
|
171
|
+
wallTimeSeconds,
|
|
172
|
+
});
|
|
173
|
+
|
|
174
|
+
return {
|
|
175
|
+
trajectory,
|
|
176
|
+
usedMemory: routing.memoryContext.experiences.length > 0,
|
|
177
|
+
strategy: routing.strategy,
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
/**
|
|
183
|
+
* Build system prompt with memory context
|
|
184
|
+
*/
|
|
185
|
+
private buildSystemPrompt(_task: Task, routing: RoutingDecision): string {
|
|
186
|
+
const parts: string[] = [
|
|
187
|
+
'You are a problem-solving agent. Your goal is to solve the given task step by step.',
|
|
188
|
+
'',
|
|
189
|
+
'For each step, provide:',
|
|
190
|
+
'1. THOUGHT: Your reasoning about what to do next',
|
|
191
|
+
'2. ACTION: The action to take',
|
|
192
|
+
'',
|
|
193
|
+
'When you have the final solution, output:',
|
|
194
|
+
'DONE: [your solution]',
|
|
195
|
+
'',
|
|
196
|
+
];
|
|
197
|
+
|
|
198
|
+
// Add memory context
|
|
199
|
+
const memoryContext = this.memory.formatForPromptV2(routing.memoryContext);
|
|
200
|
+
if (memoryContext) {
|
|
201
|
+
parts.push('## Relevant Memory');
|
|
202
|
+
parts.push(memoryContext);
|
|
203
|
+
parts.push('');
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
// Add strategy-specific guidance
|
|
207
|
+
switch (routing.strategy) {
|
|
208
|
+
case 'adapt':
|
|
209
|
+
parts.push(
|
|
210
|
+
'## Guidance',
|
|
211
|
+
'A similar task has been solved successfully before. Adapt the previous solution to this task.',
|
|
212
|
+
''
|
|
213
|
+
);
|
|
214
|
+
break;
|
|
215
|
+
case 'direct':
|
|
216
|
+
parts.push(
|
|
217
|
+
'## Guidance',
|
|
218
|
+
'Use the applicable strategies and skills from memory to guide your solution.',
|
|
219
|
+
''
|
|
220
|
+
);
|
|
221
|
+
break;
|
|
222
|
+
case 'explore':
|
|
223
|
+
parts.push(
|
|
224
|
+
'## Guidance',
|
|
225
|
+
'Limited relevant memory found. Explore different approaches carefully.',
|
|
226
|
+
''
|
|
227
|
+
);
|
|
228
|
+
break;
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
return parts.join('\n');
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
/**
|
|
235
|
+
* Build task prompt
|
|
236
|
+
*/
|
|
237
|
+
private buildTaskPrompt(task: Task): string {
|
|
238
|
+
const parts = [
|
|
239
|
+
`## Task`,
|
|
240
|
+
task.description,
|
|
241
|
+
];
|
|
242
|
+
|
|
243
|
+
if (Object.keys(task.context).length > 0) {
|
|
244
|
+
parts.push('');
|
|
245
|
+
parts.push('## Context');
|
|
246
|
+
parts.push(JSON.stringify(task.context, null, 2));
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
return parts.join('\n');
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
/**
|
|
253
|
+
* Parse LLM response into structured components
|
|
254
|
+
*/
|
|
255
|
+
private parseResponse(response: string): {
|
|
256
|
+
thought: string | undefined;
|
|
257
|
+
action: string;
|
|
258
|
+
isDone: boolean;
|
|
259
|
+
solution: unknown;
|
|
260
|
+
} {
|
|
261
|
+
// Check for DONE
|
|
262
|
+
const doneMatch = response.match(/DONE:\s*(.+)/is);
|
|
263
|
+
if (doneMatch) {
|
|
264
|
+
return {
|
|
265
|
+
thought: undefined,
|
|
266
|
+
action: 'complete',
|
|
267
|
+
isDone: true,
|
|
268
|
+
solution: doneMatch[1].trim(),
|
|
269
|
+
};
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
// Parse THOUGHT and ACTION
|
|
273
|
+
const thoughtMatch = response.match(/THOUGHT:\s*(.+?)(?=ACTION:|$)/is);
|
|
274
|
+
const actionMatch = response.match(/ACTION:\s*(.+?)(?=THOUGHT:|$)/is);
|
|
275
|
+
|
|
276
|
+
return {
|
|
277
|
+
thought: thoughtMatch?.[1]?.trim(),
|
|
278
|
+
action: actionMatch?.[1]?.trim() ?? response.trim(),
|
|
279
|
+
isDone: false,
|
|
280
|
+
solution: null,
|
|
281
|
+
};
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
/**
|
|
285
|
+
* Update configuration
|
|
286
|
+
*/
|
|
287
|
+
updateConfig(config: Partial<SolverConfig>): void {
|
|
288
|
+
this.config = { ...this.config, ...config };
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
/**
|
|
293
|
+
* Create a direct solver
|
|
294
|
+
*
|
|
295
|
+
* @deprecated Use createAgentManager() instead. See DirectSolver for migration guide.
|
|
296
|
+
*/
|
|
297
|
+
export function createSolver(
|
|
298
|
+
memory: MemorySystem,
|
|
299
|
+
provider: LLMProvider,
|
|
300
|
+
config?: Partial<SolverConfig>
|
|
301
|
+
): DirectSolver {
|
|
302
|
+
return new DirectSolver(memory, provider, config);
|
|
303
|
+
}
|