cognitive-core 0.0.2 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (329) hide show
  1. package/README.md +302 -116
  2. package/SKILL.md +193 -0
  3. package/dist/agents/index.d.ts +3 -0
  4. package/dist/agents/index.d.ts.map +1 -0
  5. package/dist/agents/index.js +5 -0
  6. package/dist/agents/index.js.map +1 -0
  7. package/dist/agents/mock-provider.d.ts +23 -0
  8. package/dist/agents/mock-provider.d.ts.map +1 -0
  9. package/dist/agents/mock-provider.js +71 -0
  10. package/dist/agents/mock-provider.js.map +1 -0
  11. package/dist/agents/types.d.ts +98 -0
  12. package/dist/agents/types.d.ts.map +1 -0
  13. package/dist/agents/types.js +44 -0
  14. package/dist/agents/types.js.map +1 -0
  15. package/dist/atlas.d.ts +196 -0
  16. package/dist/atlas.d.ts.map +1 -0
  17. package/dist/atlas.js +373 -0
  18. package/dist/atlas.js.map +1 -0
  19. package/dist/bin/cognitive-core.d.ts +18 -0
  20. package/dist/bin/cognitive-core.d.ts.map +1 -0
  21. package/dist/bin/cognitive-core.js +419 -0
  22. package/dist/bin/cognitive-core.js.map +1 -0
  23. package/dist/embeddings/bm25.d.ts +104 -0
  24. package/dist/embeddings/bm25.d.ts.map +1 -0
  25. package/dist/embeddings/bm25.js +264 -0
  26. package/dist/embeddings/bm25.js.map +1 -0
  27. package/dist/embeddings/index.d.ts +12 -0
  28. package/dist/embeddings/index.d.ts.map +1 -0
  29. package/dist/embeddings/index.js +16 -0
  30. package/dist/embeddings/index.js.map +1 -0
  31. package/dist/embeddings/manager.d.ts +112 -0
  32. package/dist/embeddings/manager.d.ts.map +1 -0
  33. package/dist/embeddings/manager.js +215 -0
  34. package/dist/embeddings/manager.js.map +1 -0
  35. package/dist/embeddings/provider.d.ts +101 -0
  36. package/dist/embeddings/provider.d.ts.map +1 -0
  37. package/dist/embeddings/provider.js +232 -0
  38. package/dist/embeddings/provider.js.map +1 -0
  39. package/dist/embeddings/vector-store.d.ts +101 -0
  40. package/dist/embeddings/vector-store.d.ts.map +1 -0
  41. package/dist/embeddings/vector-store.js +256 -0
  42. package/dist/embeddings/vector-store.js.map +1 -0
  43. package/dist/factory.d.ts +193 -0
  44. package/dist/factory.d.ts.map +1 -0
  45. package/dist/factory.js +109 -0
  46. package/dist/factory.js.map +1 -0
  47. package/dist/index.d.ts +30 -453
  48. package/dist/index.d.ts.map +1 -0
  49. package/dist/index.js +84 -509
  50. package/dist/index.js.map +1 -0
  51. package/dist/learning/analyzer.d.ts +110 -0
  52. package/dist/learning/analyzer.d.ts.map +1 -0
  53. package/dist/learning/analyzer.js +213 -0
  54. package/dist/learning/analyzer.js.map +1 -0
  55. package/dist/learning/effectiveness.d.ts +158 -0
  56. package/dist/learning/effectiveness.d.ts.map +1 -0
  57. package/dist/learning/effectiveness.js +251 -0
  58. package/dist/learning/effectiveness.js.map +1 -0
  59. package/dist/learning/index.d.ts +8 -0
  60. package/dist/learning/index.d.ts.map +1 -0
  61. package/dist/learning/index.js +11 -0
  62. package/dist/learning/index.js.map +1 -0
  63. package/dist/learning/llm-extractor.d.ts +88 -0
  64. package/dist/learning/llm-extractor.d.ts.map +1 -0
  65. package/dist/learning/llm-extractor.js +372 -0
  66. package/dist/learning/llm-extractor.js.map +1 -0
  67. package/dist/learning/meta-learner.d.ts +80 -0
  68. package/dist/learning/meta-learner.d.ts.map +1 -0
  69. package/dist/learning/meta-learner.js +355 -0
  70. package/dist/learning/meta-learner.js.map +1 -0
  71. package/dist/learning/pipeline.d.ts +65 -0
  72. package/dist/learning/pipeline.d.ts.map +1 -0
  73. package/dist/learning/pipeline.js +170 -0
  74. package/dist/learning/pipeline.js.map +1 -0
  75. package/dist/learning/playbook-extractor.d.ts +113 -0
  76. package/dist/learning/playbook-extractor.d.ts.map +1 -0
  77. package/dist/learning/playbook-extractor.js +523 -0
  78. package/dist/learning/playbook-extractor.js.map +1 -0
  79. package/dist/learning/usage-inference.d.ts +82 -0
  80. package/dist/learning/usage-inference.d.ts.map +1 -0
  81. package/dist/learning/usage-inference.js +261 -0
  82. package/dist/learning/usage-inference.js.map +1 -0
  83. package/dist/mcp/index.d.ts +6 -0
  84. package/dist/mcp/index.d.ts.map +1 -0
  85. package/dist/mcp/index.js +6 -0
  86. package/dist/mcp/index.js.map +1 -0
  87. package/dist/mcp/playbook-server.d.ts +120 -0
  88. package/dist/mcp/playbook-server.d.ts.map +1 -0
  89. package/dist/mcp/playbook-server.js +427 -0
  90. package/dist/mcp/playbook-server.js.map +1 -0
  91. package/dist/memory/curated-loader.d.ts +62 -0
  92. package/dist/memory/curated-loader.d.ts.map +1 -0
  93. package/dist/memory/curated-loader.js +106 -0
  94. package/dist/memory/curated-loader.js.map +1 -0
  95. package/dist/memory/experience.d.ts +122 -0
  96. package/dist/memory/experience.d.ts.map +1 -0
  97. package/dist/memory/experience.js +392 -0
  98. package/dist/memory/experience.js.map +1 -0
  99. package/dist/memory/index.d.ts +6 -0
  100. package/dist/memory/index.d.ts.map +1 -0
  101. package/dist/memory/index.js +9 -0
  102. package/dist/memory/index.js.map +1 -0
  103. package/dist/memory/meta.d.ts +90 -0
  104. package/dist/memory/meta.d.ts.map +1 -0
  105. package/dist/memory/meta.js +362 -0
  106. package/dist/memory/meta.js.map +1 -0
  107. package/dist/memory/playbook.d.ts +133 -0
  108. package/dist/memory/playbook.d.ts.map +1 -0
  109. package/dist/memory/playbook.js +357 -0
  110. package/dist/memory/playbook.js.map +1 -0
  111. package/dist/memory/system.d.ts +167 -0
  112. package/dist/memory/system.d.ts.map +1 -0
  113. package/dist/memory/system.js +383 -0
  114. package/dist/memory/system.js.map +1 -0
  115. package/dist/runtime/backends/acp.d.ts +67 -0
  116. package/dist/runtime/backends/acp.d.ts.map +1 -0
  117. package/dist/runtime/backends/acp.js +290 -0
  118. package/dist/runtime/backends/acp.js.map +1 -0
  119. package/dist/runtime/backends/index.d.ts +5 -0
  120. package/dist/runtime/backends/index.d.ts.map +1 -0
  121. package/dist/runtime/backends/index.js +6 -0
  122. package/dist/runtime/backends/index.js.map +1 -0
  123. package/dist/runtime/backends/mock.d.ts +67 -0
  124. package/dist/runtime/backends/mock.d.ts.map +1 -0
  125. package/dist/runtime/backends/mock.js +153 -0
  126. package/dist/runtime/backends/mock.js.map +1 -0
  127. package/dist/runtime/backends/subprocess.d.ts +56 -0
  128. package/dist/runtime/backends/subprocess.d.ts.map +1 -0
  129. package/dist/runtime/backends/subprocess.js +260 -0
  130. package/dist/runtime/backends/subprocess.js.map +1 -0
  131. package/dist/runtime/flows/learning.d.ts +73 -0
  132. package/dist/runtime/flows/learning.d.ts.map +1 -0
  133. package/dist/runtime/flows/learning.js +116 -0
  134. package/dist/runtime/flows/learning.js.map +1 -0
  135. package/dist/runtime/flows/validation.d.ts +122 -0
  136. package/dist/runtime/flows/validation.d.ts.map +1 -0
  137. package/dist/runtime/flows/validation.js +223 -0
  138. package/dist/runtime/flows/validation.js.map +1 -0
  139. package/dist/runtime/index.d.ts +6 -0
  140. package/dist/runtime/index.d.ts.map +1 -0
  141. package/dist/runtime/index.js +8 -0
  142. package/dist/runtime/index.js.map +1 -0
  143. package/dist/runtime/manager.d.ts +116 -0
  144. package/dist/runtime/manager.d.ts.map +1 -0
  145. package/dist/runtime/manager.js +416 -0
  146. package/dist/runtime/manager.js.map +1 -0
  147. package/dist/runtime/types.d.ts +138 -0
  148. package/dist/runtime/types.d.ts.map +1 -0
  149. package/dist/runtime/types.js +2 -0
  150. package/dist/runtime/types.js.map +1 -0
  151. package/dist/search/evaluator.d.ts +102 -0
  152. package/dist/search/evaluator.d.ts.map +1 -0
  153. package/dist/search/evaluator.js +352 -0
  154. package/dist/search/evaluator.js.map +1 -0
  155. package/dist/search/index.d.ts +7 -0
  156. package/dist/search/index.d.ts.map +1 -0
  157. package/dist/search/index.js +11 -0
  158. package/dist/search/index.js.map +1 -0
  159. package/dist/search/refinement-loop.d.ts +73 -0
  160. package/dist/search/refinement-loop.d.ts.map +1 -0
  161. package/dist/search/refinement-loop.js +245 -0
  162. package/dist/search/refinement-loop.js.map +1 -0
  163. package/dist/search/refinement-types.d.ts +154 -0
  164. package/dist/search/refinement-types.d.ts.map +1 -0
  165. package/dist/search/refinement-types.js +99 -0
  166. package/dist/search/refinement-types.js.map +1 -0
  167. package/dist/search/router.d.ts +61 -0
  168. package/dist/search/router.d.ts.map +1 -0
  169. package/dist/search/router.js +197 -0
  170. package/dist/search/router.js.map +1 -0
  171. package/dist/search/solver.d.ts +75 -0
  172. package/dist/search/solver.d.ts.map +1 -0
  173. package/dist/search/solver.js +216 -0
  174. package/dist/search/solver.js.map +1 -0
  175. package/dist/search/verification-runner.d.ts +125 -0
  176. package/dist/search/verification-runner.d.ts.map +1 -0
  177. package/dist/search/verification-runner.js +440 -0
  178. package/dist/search/verification-runner.js.map +1 -0
  179. package/dist/surfacing/index.d.ts +2 -0
  180. package/dist/surfacing/index.d.ts.map +1 -0
  181. package/dist/surfacing/index.js +2 -0
  182. package/dist/surfacing/index.js.map +1 -0
  183. package/dist/surfacing/skill-library.d.ts +158 -0
  184. package/dist/surfacing/skill-library.d.ts.map +1 -0
  185. package/dist/surfacing/skill-library.js +429 -0
  186. package/dist/surfacing/skill-library.js.map +1 -0
  187. package/dist/types/config.d.ts +1113 -0
  188. package/dist/types/config.d.ts.map +1 -0
  189. package/dist/types/config.js +274 -0
  190. package/dist/types/config.js.map +1 -0
  191. package/dist/types/index.d.ts +9 -0
  192. package/dist/types/index.d.ts.map +1 -0
  193. package/dist/types/index.js +14 -0
  194. package/dist/types/index.js.map +1 -0
  195. package/dist/types/memory.d.ts +339 -0
  196. package/dist/types/memory.d.ts.map +1 -0
  197. package/dist/types/memory.js +207 -0
  198. package/dist/types/memory.js.map +1 -0
  199. package/dist/types/meta.d.ts +146 -0
  200. package/dist/types/meta.d.ts.map +1 -0
  201. package/dist/types/meta.js +51 -0
  202. package/dist/types/meta.js.map +1 -0
  203. package/dist/types/outcome.d.ts +42 -0
  204. package/dist/types/outcome.d.ts.map +1 -0
  205. package/dist/types/outcome.js +50 -0
  206. package/dist/types/outcome.js.map +1 -0
  207. package/dist/types/playbook.d.ts +119 -0
  208. package/dist/types/playbook.d.ts.map +1 -0
  209. package/dist/types/playbook.js +71 -0
  210. package/dist/types/playbook.js.map +1 -0
  211. package/dist/types/step.d.ts +44 -0
  212. package/dist/types/step.d.ts.map +1 -0
  213. package/dist/types/step.js +32 -0
  214. package/dist/types/step.js.map +1 -0
  215. package/dist/types/task.d.ts +91 -0
  216. package/dist/types/task.d.ts.map +1 -0
  217. package/dist/types/task.js +39 -0
  218. package/dist/types/task.js.map +1 -0
  219. package/dist/types/trajectory.d.ts +221 -0
  220. package/dist/types/trajectory.d.ts.map +1 -0
  221. package/dist/types/trajectory.js +60 -0
  222. package/dist/types/trajectory.js.map +1 -0
  223. package/dist/utils/index.d.ts +4 -0
  224. package/dist/utils/index.d.ts.map +1 -0
  225. package/dist/utils/index.js +4 -0
  226. package/dist/utils/index.js.map +1 -0
  227. package/dist/utils/similarity.d.ts +31 -0
  228. package/dist/utils/similarity.d.ts.map +1 -0
  229. package/dist/utils/similarity.js +107 -0
  230. package/dist/utils/similarity.js.map +1 -0
  231. package/dist/utils/storage.d.ts +106 -0
  232. package/dist/utils/storage.d.ts.map +1 -0
  233. package/dist/utils/storage.js +203 -0
  234. package/dist/utils/storage.js.map +1 -0
  235. package/dist/utils/validation.d.ts +129 -0
  236. package/dist/utils/validation.d.ts.map +1 -0
  237. package/dist/utils/validation.js +171 -0
  238. package/dist/utils/validation.js.map +1 -0
  239. package/package.json +50 -34
  240. package/scripts/migrate-to-playbooks.ts +307 -0
  241. package/src/agents/index.ts +14 -0
  242. package/src/agents/mock-provider.ts +93 -0
  243. package/src/agents/types.ts +137 -0
  244. package/src/atlas.ts +560 -0
  245. package/src/bin/cognitive-core.ts +470 -0
  246. package/src/embeddings/bm25.ts +337 -0
  247. package/src/embeddings/index.ts +39 -0
  248. package/src/embeddings/manager.ts +288 -0
  249. package/src/embeddings/provider.ts +311 -0
  250. package/src/embeddings/vector-store.ts +353 -0
  251. package/src/factory.ts +263 -0
  252. package/src/index.ts +246 -0
  253. package/src/learning/analyzer.ts +335 -0
  254. package/src/learning/effectiveness.ts +428 -0
  255. package/src/learning/index.ts +58 -0
  256. package/src/learning/llm-extractor.ts +542 -0
  257. package/src/learning/meta-learner.ts +516 -0
  258. package/src/learning/pipeline.ts +244 -0
  259. package/src/learning/playbook-extractor.ts +702 -0
  260. package/src/learning/usage-inference.ts +372 -0
  261. package/src/mcp/index.ts +12 -0
  262. package/src/mcp/playbook-server.ts +565 -0
  263. package/src/memory/curated-loader.ts +160 -0
  264. package/src/memory/experience.ts +515 -0
  265. package/src/memory/index.ts +27 -0
  266. package/src/memory/meta.ts +506 -0
  267. package/src/memory/playbook.ts +493 -0
  268. package/src/memory/system.ts +551 -0
  269. package/src/runtime/backends/acp.ts +378 -0
  270. package/src/runtime/backends/index.ts +24 -0
  271. package/src/runtime/backends/mock.ts +218 -0
  272. package/src/runtime/backends/subprocess.ts +356 -0
  273. package/src/runtime/flows/learning.ts +183 -0
  274. package/src/runtime/flows/validation.ts +381 -0
  275. package/src/runtime/index.ts +53 -0
  276. package/src/runtime/manager.ts +541 -0
  277. package/src/runtime/types.ts +157 -0
  278. package/src/search/evaluator.ts +474 -0
  279. package/src/search/index.ts +59 -0
  280. package/src/search/refinement-loop.ts +363 -0
  281. package/src/search/refinement-types.ts +159 -0
  282. package/src/search/router.ts +261 -0
  283. package/src/search/solver.ts +303 -0
  284. package/src/search/verification-runner.ts +570 -0
  285. package/src/surfacing/index.ts +6 -0
  286. package/src/surfacing/skill-library.ts +594 -0
  287. package/src/types/config.ts +333 -0
  288. package/src/types/index.ts +130 -0
  289. package/src/types/memory.ts +270 -0
  290. package/src/types/meta.ts +218 -0
  291. package/src/types/outcome.ts +66 -0
  292. package/src/types/playbook.ts +196 -0
  293. package/src/types/step.ts +40 -0
  294. package/src/types/task.ts +52 -0
  295. package/src/types/trajectory.ts +80 -0
  296. package/src/utils/index.ts +38 -0
  297. package/src/utils/similarity.ts +139 -0
  298. package/src/utils/storage.ts +249 -0
  299. package/src/utils/validation.ts +286 -0
  300. package/tests/embeddings/bm25.test.ts +130 -0
  301. package/tests/embeddings/manager.test.ts +205 -0
  302. package/tests/integration/atlas.test.ts +266 -0
  303. package/tests/integration/e2e.test.ts +929 -0
  304. package/tests/learning/analyzer.test.ts +426 -0
  305. package/tests/learning/effectiveness.test.ts +542 -0
  306. package/tests/learning/pipeline.test.ts +176 -0
  307. package/tests/learning/playbook-extractor-provenance.test.ts +114 -0
  308. package/tests/learning/usage-inference.test.ts +254 -0
  309. package/tests/mcp/playbook-server.test.ts +252 -0
  310. package/tests/memory/experience.test.ts +198 -0
  311. package/tests/memory/playbook.test.ts +338 -0
  312. package/tests/memory/provenance.test.ts +639 -0
  313. package/tests/memory/system.test.ts +325 -0
  314. package/tests/runtime/agent-manager.test.ts +512 -0
  315. package/tests/runtime/mock-backend.test.ts +248 -0
  316. package/tests/search/refinement-loop.test.ts +468 -0
  317. package/tests/search/refinement.test.ts +267 -0
  318. package/tests/search/router.test.ts +427 -0
  319. package/tests/surfacing/skill-library.test.ts +292 -0
  320. package/tests/types/outcome.test.ts +147 -0
  321. package/tests/types/step.test.ts +133 -0
  322. package/tests/types/task.test.ts +158 -0
  323. package/tests/types/trajectory.test.ts +253 -0
  324. package/tests/utils/similarity.test.ts +188 -0
  325. package/tests/utils/validation.test.ts +252 -0
  326. package/tsconfig.json +25 -0
  327. package/vitest.config.ts +22 -0
  328. package/dist/index.d.mts +0 -466
  329. package/dist/index.mjs +0 -478
@@ -0,0 +1,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
+ }
@@ -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';