cognitive-core 0.0.2 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +302 -116
- 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 +30 -453
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +84 -509
- 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 +50 -34
- 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/dist/index.d.mts +0 -466
- package/dist/index.mjs +0 -478
|
@@ -0,0 +1,372 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Playbook Usage Inference
|
|
3
|
+
* Infers which playbooks were used and whether they helped
|
|
4
|
+
* from trajectory analysis (no explicit agent reporting needed)
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import type { Trajectory, Step, Playbook } from '../types/index.js';
|
|
8
|
+
import { textSimilarity } from '../utils/similarity.js';
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Result of playbook usage inference
|
|
12
|
+
*/
|
|
13
|
+
export interface PlaybookUsageResult {
|
|
14
|
+
playbookId: string;
|
|
15
|
+
playbookName: string;
|
|
16
|
+
/** Did agent follow this playbook? */
|
|
17
|
+
wasUsed: boolean;
|
|
18
|
+
/** How confident are we it was used? */
|
|
19
|
+
usageConfidence: number;
|
|
20
|
+
/** Did it lead to success? */
|
|
21
|
+
wasSuccessful: boolean;
|
|
22
|
+
/** Which trajectory steps matched */
|
|
23
|
+
matchedSteps: number[];
|
|
24
|
+
/** Relevant context for refinement */
|
|
25
|
+
context?: string;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Internal result of matching steps to playbook
|
|
30
|
+
*/
|
|
31
|
+
interface PlaybookMatchResult {
|
|
32
|
+
matched: boolean;
|
|
33
|
+
matchedTactics: number;
|
|
34
|
+
totalTactics: number;
|
|
35
|
+
matchedSteps: number[];
|
|
36
|
+
confidence: number;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Configuration for usage inference
|
|
41
|
+
*/
|
|
42
|
+
export interface UsageInferenceConfig {
|
|
43
|
+
/** Minimum similarity for tactic matching */
|
|
44
|
+
tacticMatchThreshold: number;
|
|
45
|
+
/** Minimum tactics matched to consider playbook used */
|
|
46
|
+
minTacticsMatchRatio: number;
|
|
47
|
+
/** Minimum confidence to report as used */
|
|
48
|
+
minUsageConfidence: number;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
const DEFAULT_CONFIG: UsageInferenceConfig = {
|
|
52
|
+
tacticMatchThreshold: 0.5,
|
|
53
|
+
minTacticsMatchRatio: 0.3,
|
|
54
|
+
minUsageConfidence: 0.4,
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Playbook Usage Inference
|
|
59
|
+
* Analyzes trajectories to determine if playbooks were used
|
|
60
|
+
*/
|
|
61
|
+
export class PlaybookUsageInference {
|
|
62
|
+
private config: UsageInferenceConfig;
|
|
63
|
+
|
|
64
|
+
constructor(config?: Partial<UsageInferenceConfig>) {
|
|
65
|
+
this.config = { ...DEFAULT_CONFIG, ...config };
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Analyze trajectory to infer playbook usage
|
|
70
|
+
*/
|
|
71
|
+
async inferUsage(
|
|
72
|
+
trajectory: Trajectory,
|
|
73
|
+
injectedPlaybooks: Playbook[]
|
|
74
|
+
): Promise<PlaybookUsageResult[]> {
|
|
75
|
+
const results: PlaybookUsageResult[] = [];
|
|
76
|
+
|
|
77
|
+
for (const playbook of injectedPlaybooks) {
|
|
78
|
+
const matchResult = this.matchStepsToPlaybook(
|
|
79
|
+
trajectory.steps,
|
|
80
|
+
playbook
|
|
81
|
+
);
|
|
82
|
+
|
|
83
|
+
const wasUsed =
|
|
84
|
+
matchResult.matched &&
|
|
85
|
+
matchResult.confidence >= this.config.minUsageConfidence;
|
|
86
|
+
|
|
87
|
+
const wasSuccessful = wasUsed
|
|
88
|
+
? this.inferSuccess(trajectory, playbook, matchResult)
|
|
89
|
+
: false;
|
|
90
|
+
|
|
91
|
+
const context = wasUsed
|
|
92
|
+
? this.extractRelevantContext(trajectory, playbook, matchResult)
|
|
93
|
+
: undefined;
|
|
94
|
+
|
|
95
|
+
results.push({
|
|
96
|
+
playbookId: playbook.id,
|
|
97
|
+
playbookName: playbook.name,
|
|
98
|
+
wasUsed,
|
|
99
|
+
usageConfidence: matchResult.confidence,
|
|
100
|
+
wasSuccessful,
|
|
101
|
+
matchedSteps: matchResult.matchedSteps,
|
|
102
|
+
context,
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
return results;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* Match trajectory steps against playbook guidance
|
|
111
|
+
*/
|
|
112
|
+
private matchStepsToPlaybook(
|
|
113
|
+
steps: Step[],
|
|
114
|
+
playbook: Playbook
|
|
115
|
+
): PlaybookMatchResult {
|
|
116
|
+
const tactics = playbook.guidance.tactics;
|
|
117
|
+
|
|
118
|
+
if (tactics.length === 0) {
|
|
119
|
+
// No tactics to match - check strategy
|
|
120
|
+
const strategyMatch = this.matchAgainstStrategy(steps, playbook);
|
|
121
|
+
return {
|
|
122
|
+
matched: strategyMatch.confidence > 0.3,
|
|
123
|
+
matchedTactics: 0,
|
|
124
|
+
totalTactics: 0,
|
|
125
|
+
matchedSteps: strategyMatch.matchedSteps,
|
|
126
|
+
confidence: strategyMatch.confidence,
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
const matchedSteps: number[] = [];
|
|
131
|
+
let matchedTactics = 0;
|
|
132
|
+
|
|
133
|
+
// Try to match each tactic to trajectory steps
|
|
134
|
+
for (const tactic of tactics) {
|
|
135
|
+
const tacticWords = this.extractKeywords(tactic);
|
|
136
|
+
|
|
137
|
+
for (let i = 0; i < steps.length; i++) {
|
|
138
|
+
if (matchedSteps.includes(i)) continue;
|
|
139
|
+
|
|
140
|
+
const step = steps[i];
|
|
141
|
+
const stepText = `${step.thought ?? ''} ${step.action}`.toLowerCase();
|
|
142
|
+
const stepWords = this.extractKeywords(stepText);
|
|
143
|
+
|
|
144
|
+
// Check word overlap
|
|
145
|
+
const overlap = tacticWords.filter((w) => stepWords.includes(w)).length;
|
|
146
|
+
const overlapRatio = overlap / Math.max(tacticWords.length, 1);
|
|
147
|
+
|
|
148
|
+
// Also check semantic similarity
|
|
149
|
+
const similarity = textSimilarity(tactic, stepText);
|
|
150
|
+
|
|
151
|
+
if (
|
|
152
|
+
overlapRatio >= this.config.tacticMatchThreshold ||
|
|
153
|
+
similarity >= this.config.tacticMatchThreshold
|
|
154
|
+
) {
|
|
155
|
+
matchedTactics++;
|
|
156
|
+
matchedSteps.push(i);
|
|
157
|
+
break;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
const matchRatio = matchedTactics / tactics.length;
|
|
163
|
+
const matched = matchRatio >= this.config.minTacticsMatchRatio;
|
|
164
|
+
|
|
165
|
+
// Calculate confidence based on match ratio and step coverage
|
|
166
|
+
const stepCoverage = matchedSteps.length / Math.max(steps.length, 1);
|
|
167
|
+
const confidence = matched ? (matchRatio * 0.7 + stepCoverage * 0.3) : 0;
|
|
168
|
+
|
|
169
|
+
return {
|
|
170
|
+
matched,
|
|
171
|
+
matchedTactics,
|
|
172
|
+
totalTactics: tactics.length,
|
|
173
|
+
matchedSteps,
|
|
174
|
+
confidence,
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
/**
|
|
179
|
+
* Match steps against playbook strategy (when no tactics)
|
|
180
|
+
*/
|
|
181
|
+
private matchAgainstStrategy(
|
|
182
|
+
steps: Step[],
|
|
183
|
+
playbook: Playbook
|
|
184
|
+
): { confidence: number; matchedSteps: number[] } {
|
|
185
|
+
const strategy = playbook.guidance.strategy;
|
|
186
|
+
const strategyWords = this.extractKeywords(strategy);
|
|
187
|
+
const matchedSteps: number[] = [];
|
|
188
|
+
|
|
189
|
+
for (let i = 0; i < steps.length; i++) {
|
|
190
|
+
const step = steps[i];
|
|
191
|
+
const stepText = `${step.thought ?? ''} ${step.action}`.toLowerCase();
|
|
192
|
+
const stepWords = this.extractKeywords(stepText);
|
|
193
|
+
|
|
194
|
+
const overlap = strategyWords.filter((w) => stepWords.includes(w)).length;
|
|
195
|
+
const similarity = textSimilarity(strategy, stepText);
|
|
196
|
+
|
|
197
|
+
if (overlap >= 2 || similarity >= 0.4) {
|
|
198
|
+
matchedSteps.push(i);
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
const confidence =
|
|
203
|
+
matchedSteps.length > 0
|
|
204
|
+
? Math.min(0.6, matchedSteps.length / steps.length + 0.2)
|
|
205
|
+
: 0;
|
|
206
|
+
|
|
207
|
+
return { confidence, matchedSteps };
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
/**
|
|
211
|
+
* Extract keywords from text
|
|
212
|
+
*/
|
|
213
|
+
private extractKeywords(text: string): string[] {
|
|
214
|
+
return text
|
|
215
|
+
.toLowerCase()
|
|
216
|
+
.replace(/[^\w\s]/g, ' ')
|
|
217
|
+
.split(/\s+/)
|
|
218
|
+
.filter((w) => w.length > 2 && !this.isStopWord(w));
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
/**
|
|
222
|
+
* Check if word is a stop word
|
|
223
|
+
*/
|
|
224
|
+
private isStopWord(word: string): boolean {
|
|
225
|
+
const stopWords = new Set([
|
|
226
|
+
'the',
|
|
227
|
+
'a',
|
|
228
|
+
'an',
|
|
229
|
+
'and',
|
|
230
|
+
'or',
|
|
231
|
+
'but',
|
|
232
|
+
'is',
|
|
233
|
+
'are',
|
|
234
|
+
'was',
|
|
235
|
+
'were',
|
|
236
|
+
'be',
|
|
237
|
+
'been',
|
|
238
|
+
'have',
|
|
239
|
+
'has',
|
|
240
|
+
'had',
|
|
241
|
+
'do',
|
|
242
|
+
'does',
|
|
243
|
+
'did',
|
|
244
|
+
'will',
|
|
245
|
+
'would',
|
|
246
|
+
'could',
|
|
247
|
+
'should',
|
|
248
|
+
'can',
|
|
249
|
+
'to',
|
|
250
|
+
'of',
|
|
251
|
+
'in',
|
|
252
|
+
'for',
|
|
253
|
+
'on',
|
|
254
|
+
'with',
|
|
255
|
+
'at',
|
|
256
|
+
'by',
|
|
257
|
+
'from',
|
|
258
|
+
'as',
|
|
259
|
+
'then',
|
|
260
|
+
'that',
|
|
261
|
+
'this',
|
|
262
|
+
'these',
|
|
263
|
+
'those',
|
|
264
|
+
'you',
|
|
265
|
+
'your',
|
|
266
|
+
'they',
|
|
267
|
+
'their',
|
|
268
|
+
]);
|
|
269
|
+
return stopWords.has(word);
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
/**
|
|
273
|
+
* Determine if playbook application was successful
|
|
274
|
+
*/
|
|
275
|
+
private inferSuccess(
|
|
276
|
+
trajectory: Trajectory,
|
|
277
|
+
playbook: Playbook,
|
|
278
|
+
matchResult: PlaybookMatchResult
|
|
279
|
+
): boolean {
|
|
280
|
+
// Primary: Check trajectory outcome
|
|
281
|
+
if (!trajectory.outcome.success) {
|
|
282
|
+
return false;
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
// Check if success indicators are present
|
|
286
|
+
const successIndicators = playbook.verification.successIndicators;
|
|
287
|
+
if (successIndicators.length > 0) {
|
|
288
|
+
const outcomeText = JSON.stringify(trajectory.outcome).toLowerCase();
|
|
289
|
+
const hasIndicator = successIndicators.some((indicator) =>
|
|
290
|
+
outcomeText.includes(indicator.toLowerCase())
|
|
291
|
+
);
|
|
292
|
+
if (hasIndicator) return true;
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
// Check if failure indicators are absent
|
|
296
|
+
const failureIndicators = playbook.verification.failureIndicators;
|
|
297
|
+
if (failureIndicators.length > 0) {
|
|
298
|
+
const trajectoryText = trajectory.steps
|
|
299
|
+
.map((s: Step) => `${s.action} ${s.observation ?? ''}`)
|
|
300
|
+
.join(' ')
|
|
301
|
+
.toLowerCase();
|
|
302
|
+
|
|
303
|
+
const hasFailureIndicator = failureIndicators.some((indicator) =>
|
|
304
|
+
trajectoryText.includes(indicator.toLowerCase())
|
|
305
|
+
);
|
|
306
|
+
|
|
307
|
+
if (hasFailureIndicator) return false;
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
// Default to trajectory success with high match confidence
|
|
311
|
+
return matchResult.confidence >= 0.5;
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
/**
|
|
315
|
+
* Extract relevant context for potential refinement
|
|
316
|
+
*/
|
|
317
|
+
private extractRelevantContext(
|
|
318
|
+
trajectory: Trajectory,
|
|
319
|
+
_playbook: Playbook,
|
|
320
|
+
_matchResult: PlaybookMatchResult
|
|
321
|
+
): string | undefined {
|
|
322
|
+
// Look for context in task metadata
|
|
323
|
+
const metadata = trajectory.task.metadata ?? {};
|
|
324
|
+
|
|
325
|
+
if (metadata.fileType) return `${metadata.fileType} files`;
|
|
326
|
+
if (metadata.framework) return `${metadata.framework} project`;
|
|
327
|
+
if (metadata.language) return `${metadata.language} codebase`;
|
|
328
|
+
|
|
329
|
+
// Check for specific patterns in steps
|
|
330
|
+
const allText = trajectory.steps
|
|
331
|
+
.map((s: Step) => `${s.thought ?? ''} ${s.action} ${s.observation ?? ''}`)
|
|
332
|
+
.join(' ')
|
|
333
|
+
.toLowerCase();
|
|
334
|
+
|
|
335
|
+
if (allText.includes('monorepo')) return 'monorepo';
|
|
336
|
+
if (allText.includes('typescript')) return 'typescript';
|
|
337
|
+
if (allText.includes('react')) return 'react';
|
|
338
|
+
if (allText.includes('node')) return 'nodejs';
|
|
339
|
+
if (allText.includes('python')) return 'python';
|
|
340
|
+
|
|
341
|
+
// Fall back to domain
|
|
342
|
+
return trajectory.task.domain || undefined;
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
/**
|
|
346
|
+
* Batch analyze multiple trajectories
|
|
347
|
+
*/
|
|
348
|
+
async inferUsageBatch(
|
|
349
|
+
trajectories: Array<{
|
|
350
|
+
trajectory: Trajectory;
|
|
351
|
+
injectedPlaybooks: Playbook[];
|
|
352
|
+
}>
|
|
353
|
+
): Promise<Map<string, PlaybookUsageResult[]>> {
|
|
354
|
+
const results = new Map<string, PlaybookUsageResult[]>();
|
|
355
|
+
|
|
356
|
+
for (const { trajectory, injectedPlaybooks } of trajectories) {
|
|
357
|
+
const usage = await this.inferUsage(trajectory, injectedPlaybooks);
|
|
358
|
+
results.set(trajectory.id, usage);
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
return results;
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
/**
|
|
366
|
+
* Create a playbook usage inference instance
|
|
367
|
+
*/
|
|
368
|
+
export function createUsageInference(
|
|
369
|
+
config?: Partial<UsageInferenceConfig>
|
|
370
|
+
): PlaybookUsageInference {
|
|
371
|
+
return new PlaybookUsageInference(config);
|
|
372
|
+
}
|
package/src/mcp/index.ts
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @deprecated The MCP server is deprecated in favor of the CLI + SKILL.md approach.
|
|
3
|
+
* See /SKILL.md for agent instructions and use bin/cognitive-core CLI instead.
|
|
4
|
+
*/
|
|
5
|
+
export {
|
|
6
|
+
PlaybookMCPServer,
|
|
7
|
+
createPlaybookMCPServer,
|
|
8
|
+
type MCPTool,
|
|
9
|
+
type MCPToolCall,
|
|
10
|
+
type MCPToolResult,
|
|
11
|
+
type PlaybookSearchResult,
|
|
12
|
+
} from './playbook-server.js';
|