cognitive-core 0.0.1 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (329) hide show
  1. package/README.md +363 -2
  2. package/SKILL.md +193 -0
  3. package/dist/agents/index.d.ts +3 -0
  4. package/dist/agents/index.d.ts.map +1 -0
  5. package/dist/agents/index.js +5 -0
  6. package/dist/agents/index.js.map +1 -0
  7. package/dist/agents/mock-provider.d.ts +23 -0
  8. package/dist/agents/mock-provider.d.ts.map +1 -0
  9. package/dist/agents/mock-provider.js +71 -0
  10. package/dist/agents/mock-provider.js.map +1 -0
  11. package/dist/agents/types.d.ts +98 -0
  12. package/dist/agents/types.d.ts.map +1 -0
  13. package/dist/agents/types.js +44 -0
  14. package/dist/agents/types.js.map +1 -0
  15. package/dist/atlas.d.ts +196 -0
  16. package/dist/atlas.d.ts.map +1 -0
  17. package/dist/atlas.js +373 -0
  18. package/dist/atlas.js.map +1 -0
  19. package/dist/bin/cognitive-core.d.ts +18 -0
  20. package/dist/bin/cognitive-core.d.ts.map +1 -0
  21. package/dist/bin/cognitive-core.js +419 -0
  22. package/dist/bin/cognitive-core.js.map +1 -0
  23. package/dist/embeddings/bm25.d.ts +104 -0
  24. package/dist/embeddings/bm25.d.ts.map +1 -0
  25. package/dist/embeddings/bm25.js +264 -0
  26. package/dist/embeddings/bm25.js.map +1 -0
  27. package/dist/embeddings/index.d.ts +12 -0
  28. package/dist/embeddings/index.d.ts.map +1 -0
  29. package/dist/embeddings/index.js +16 -0
  30. package/dist/embeddings/index.js.map +1 -0
  31. package/dist/embeddings/manager.d.ts +112 -0
  32. package/dist/embeddings/manager.d.ts.map +1 -0
  33. package/dist/embeddings/manager.js +215 -0
  34. package/dist/embeddings/manager.js.map +1 -0
  35. package/dist/embeddings/provider.d.ts +101 -0
  36. package/dist/embeddings/provider.d.ts.map +1 -0
  37. package/dist/embeddings/provider.js +232 -0
  38. package/dist/embeddings/provider.js.map +1 -0
  39. package/dist/embeddings/vector-store.d.ts +101 -0
  40. package/dist/embeddings/vector-store.d.ts.map +1 -0
  41. package/dist/embeddings/vector-store.js +256 -0
  42. package/dist/embeddings/vector-store.js.map +1 -0
  43. package/dist/factory.d.ts +193 -0
  44. package/dist/factory.d.ts.map +1 -0
  45. package/dist/factory.js +109 -0
  46. package/dist/factory.js.map +1 -0
  47. package/dist/index.d.ts +43 -0
  48. package/dist/index.d.ts.map +1 -0
  49. package/dist/index.js +84 -0
  50. package/dist/index.js.map +1 -0
  51. package/dist/learning/analyzer.d.ts +110 -0
  52. package/dist/learning/analyzer.d.ts.map +1 -0
  53. package/dist/learning/analyzer.js +213 -0
  54. package/dist/learning/analyzer.js.map +1 -0
  55. package/dist/learning/effectiveness.d.ts +158 -0
  56. package/dist/learning/effectiveness.d.ts.map +1 -0
  57. package/dist/learning/effectiveness.js +251 -0
  58. package/dist/learning/effectiveness.js.map +1 -0
  59. package/dist/learning/index.d.ts +8 -0
  60. package/dist/learning/index.d.ts.map +1 -0
  61. package/dist/learning/index.js +11 -0
  62. package/dist/learning/index.js.map +1 -0
  63. package/dist/learning/llm-extractor.d.ts +88 -0
  64. package/dist/learning/llm-extractor.d.ts.map +1 -0
  65. package/dist/learning/llm-extractor.js +372 -0
  66. package/dist/learning/llm-extractor.js.map +1 -0
  67. package/dist/learning/meta-learner.d.ts +80 -0
  68. package/dist/learning/meta-learner.d.ts.map +1 -0
  69. package/dist/learning/meta-learner.js +355 -0
  70. package/dist/learning/meta-learner.js.map +1 -0
  71. package/dist/learning/pipeline.d.ts +65 -0
  72. package/dist/learning/pipeline.d.ts.map +1 -0
  73. package/dist/learning/pipeline.js +170 -0
  74. package/dist/learning/pipeline.js.map +1 -0
  75. package/dist/learning/playbook-extractor.d.ts +113 -0
  76. package/dist/learning/playbook-extractor.d.ts.map +1 -0
  77. package/dist/learning/playbook-extractor.js +523 -0
  78. package/dist/learning/playbook-extractor.js.map +1 -0
  79. package/dist/learning/usage-inference.d.ts +82 -0
  80. package/dist/learning/usage-inference.d.ts.map +1 -0
  81. package/dist/learning/usage-inference.js +261 -0
  82. package/dist/learning/usage-inference.js.map +1 -0
  83. package/dist/mcp/index.d.ts +6 -0
  84. package/dist/mcp/index.d.ts.map +1 -0
  85. package/dist/mcp/index.js +6 -0
  86. package/dist/mcp/index.js.map +1 -0
  87. package/dist/mcp/playbook-server.d.ts +120 -0
  88. package/dist/mcp/playbook-server.d.ts.map +1 -0
  89. package/dist/mcp/playbook-server.js +427 -0
  90. package/dist/mcp/playbook-server.js.map +1 -0
  91. package/dist/memory/curated-loader.d.ts +62 -0
  92. package/dist/memory/curated-loader.d.ts.map +1 -0
  93. package/dist/memory/curated-loader.js +106 -0
  94. package/dist/memory/curated-loader.js.map +1 -0
  95. package/dist/memory/experience.d.ts +122 -0
  96. package/dist/memory/experience.d.ts.map +1 -0
  97. package/dist/memory/experience.js +392 -0
  98. package/dist/memory/experience.js.map +1 -0
  99. package/dist/memory/index.d.ts +6 -0
  100. package/dist/memory/index.d.ts.map +1 -0
  101. package/dist/memory/index.js +9 -0
  102. package/dist/memory/index.js.map +1 -0
  103. package/dist/memory/meta.d.ts +90 -0
  104. package/dist/memory/meta.d.ts.map +1 -0
  105. package/dist/memory/meta.js +362 -0
  106. package/dist/memory/meta.js.map +1 -0
  107. package/dist/memory/playbook.d.ts +133 -0
  108. package/dist/memory/playbook.d.ts.map +1 -0
  109. package/dist/memory/playbook.js +357 -0
  110. package/dist/memory/playbook.js.map +1 -0
  111. package/dist/memory/system.d.ts +167 -0
  112. package/dist/memory/system.d.ts.map +1 -0
  113. package/dist/memory/system.js +383 -0
  114. package/dist/memory/system.js.map +1 -0
  115. package/dist/runtime/backends/acp.d.ts +67 -0
  116. package/dist/runtime/backends/acp.d.ts.map +1 -0
  117. package/dist/runtime/backends/acp.js +290 -0
  118. package/dist/runtime/backends/acp.js.map +1 -0
  119. package/dist/runtime/backends/index.d.ts +5 -0
  120. package/dist/runtime/backends/index.d.ts.map +1 -0
  121. package/dist/runtime/backends/index.js +6 -0
  122. package/dist/runtime/backends/index.js.map +1 -0
  123. package/dist/runtime/backends/mock.d.ts +67 -0
  124. package/dist/runtime/backends/mock.d.ts.map +1 -0
  125. package/dist/runtime/backends/mock.js +153 -0
  126. package/dist/runtime/backends/mock.js.map +1 -0
  127. package/dist/runtime/backends/subprocess.d.ts +56 -0
  128. package/dist/runtime/backends/subprocess.d.ts.map +1 -0
  129. package/dist/runtime/backends/subprocess.js +260 -0
  130. package/dist/runtime/backends/subprocess.js.map +1 -0
  131. package/dist/runtime/flows/learning.d.ts +73 -0
  132. package/dist/runtime/flows/learning.d.ts.map +1 -0
  133. package/dist/runtime/flows/learning.js +116 -0
  134. package/dist/runtime/flows/learning.js.map +1 -0
  135. package/dist/runtime/flows/validation.d.ts +122 -0
  136. package/dist/runtime/flows/validation.d.ts.map +1 -0
  137. package/dist/runtime/flows/validation.js +223 -0
  138. package/dist/runtime/flows/validation.js.map +1 -0
  139. package/dist/runtime/index.d.ts +6 -0
  140. package/dist/runtime/index.d.ts.map +1 -0
  141. package/dist/runtime/index.js +8 -0
  142. package/dist/runtime/index.js.map +1 -0
  143. package/dist/runtime/manager.d.ts +116 -0
  144. package/dist/runtime/manager.d.ts.map +1 -0
  145. package/dist/runtime/manager.js +416 -0
  146. package/dist/runtime/manager.js.map +1 -0
  147. package/dist/runtime/types.d.ts +138 -0
  148. package/dist/runtime/types.d.ts.map +1 -0
  149. package/dist/runtime/types.js +2 -0
  150. package/dist/runtime/types.js.map +1 -0
  151. package/dist/search/evaluator.d.ts +102 -0
  152. package/dist/search/evaluator.d.ts.map +1 -0
  153. package/dist/search/evaluator.js +352 -0
  154. package/dist/search/evaluator.js.map +1 -0
  155. package/dist/search/index.d.ts +7 -0
  156. package/dist/search/index.d.ts.map +1 -0
  157. package/dist/search/index.js +11 -0
  158. package/dist/search/index.js.map +1 -0
  159. package/dist/search/refinement-loop.d.ts +73 -0
  160. package/dist/search/refinement-loop.d.ts.map +1 -0
  161. package/dist/search/refinement-loop.js +245 -0
  162. package/dist/search/refinement-loop.js.map +1 -0
  163. package/dist/search/refinement-types.d.ts +154 -0
  164. package/dist/search/refinement-types.d.ts.map +1 -0
  165. package/dist/search/refinement-types.js +99 -0
  166. package/dist/search/refinement-types.js.map +1 -0
  167. package/dist/search/router.d.ts +61 -0
  168. package/dist/search/router.d.ts.map +1 -0
  169. package/dist/search/router.js +197 -0
  170. package/dist/search/router.js.map +1 -0
  171. package/dist/search/solver.d.ts +75 -0
  172. package/dist/search/solver.d.ts.map +1 -0
  173. package/dist/search/solver.js +216 -0
  174. package/dist/search/solver.js.map +1 -0
  175. package/dist/search/verification-runner.d.ts +125 -0
  176. package/dist/search/verification-runner.d.ts.map +1 -0
  177. package/dist/search/verification-runner.js +440 -0
  178. package/dist/search/verification-runner.js.map +1 -0
  179. package/dist/surfacing/index.d.ts +2 -0
  180. package/dist/surfacing/index.d.ts.map +1 -0
  181. package/dist/surfacing/index.js +2 -0
  182. package/dist/surfacing/index.js.map +1 -0
  183. package/dist/surfacing/skill-library.d.ts +158 -0
  184. package/dist/surfacing/skill-library.d.ts.map +1 -0
  185. package/dist/surfacing/skill-library.js +429 -0
  186. package/dist/surfacing/skill-library.js.map +1 -0
  187. package/dist/types/config.d.ts +1113 -0
  188. package/dist/types/config.d.ts.map +1 -0
  189. package/dist/types/config.js +274 -0
  190. package/dist/types/config.js.map +1 -0
  191. package/dist/types/index.d.ts +9 -0
  192. package/dist/types/index.d.ts.map +1 -0
  193. package/dist/types/index.js +14 -0
  194. package/dist/types/index.js.map +1 -0
  195. package/dist/types/memory.d.ts +339 -0
  196. package/dist/types/memory.d.ts.map +1 -0
  197. package/dist/types/memory.js +207 -0
  198. package/dist/types/memory.js.map +1 -0
  199. package/dist/types/meta.d.ts +146 -0
  200. package/dist/types/meta.d.ts.map +1 -0
  201. package/dist/types/meta.js +51 -0
  202. package/dist/types/meta.js.map +1 -0
  203. package/dist/types/outcome.d.ts +42 -0
  204. package/dist/types/outcome.d.ts.map +1 -0
  205. package/dist/types/outcome.js +50 -0
  206. package/dist/types/outcome.js.map +1 -0
  207. package/dist/types/playbook.d.ts +119 -0
  208. package/dist/types/playbook.d.ts.map +1 -0
  209. package/dist/types/playbook.js +71 -0
  210. package/dist/types/playbook.js.map +1 -0
  211. package/dist/types/step.d.ts +44 -0
  212. package/dist/types/step.d.ts.map +1 -0
  213. package/dist/types/step.js +32 -0
  214. package/dist/types/step.js.map +1 -0
  215. package/dist/types/task.d.ts +91 -0
  216. package/dist/types/task.d.ts.map +1 -0
  217. package/dist/types/task.js +39 -0
  218. package/dist/types/task.js.map +1 -0
  219. package/dist/types/trajectory.d.ts +221 -0
  220. package/dist/types/trajectory.d.ts.map +1 -0
  221. package/dist/types/trajectory.js +60 -0
  222. package/dist/types/trajectory.js.map +1 -0
  223. package/dist/utils/index.d.ts +4 -0
  224. package/dist/utils/index.d.ts.map +1 -0
  225. package/dist/utils/index.js +4 -0
  226. package/dist/utils/index.js.map +1 -0
  227. package/dist/utils/similarity.d.ts +31 -0
  228. package/dist/utils/similarity.d.ts.map +1 -0
  229. package/dist/utils/similarity.js +107 -0
  230. package/dist/utils/similarity.js.map +1 -0
  231. package/dist/utils/storage.d.ts +106 -0
  232. package/dist/utils/storage.d.ts.map +1 -0
  233. package/dist/utils/storage.js +203 -0
  234. package/dist/utils/storage.js.map +1 -0
  235. package/dist/utils/validation.d.ts +129 -0
  236. package/dist/utils/validation.d.ts.map +1 -0
  237. package/dist/utils/validation.js +171 -0
  238. package/dist/utils/validation.js.map +1 -0
  239. package/package.json +61 -9
  240. package/scripts/migrate-to-playbooks.ts +307 -0
  241. package/src/agents/index.ts +14 -0
  242. package/src/agents/mock-provider.ts +93 -0
  243. package/src/agents/types.ts +137 -0
  244. package/src/atlas.ts +560 -0
  245. package/src/bin/cognitive-core.ts +470 -0
  246. package/src/embeddings/bm25.ts +337 -0
  247. package/src/embeddings/index.ts +39 -0
  248. package/src/embeddings/manager.ts +288 -0
  249. package/src/embeddings/provider.ts +311 -0
  250. package/src/embeddings/vector-store.ts +353 -0
  251. package/src/factory.ts +263 -0
  252. package/src/index.ts +246 -0
  253. package/src/learning/analyzer.ts +335 -0
  254. package/src/learning/effectiveness.ts +428 -0
  255. package/src/learning/index.ts +58 -0
  256. package/src/learning/llm-extractor.ts +542 -0
  257. package/src/learning/meta-learner.ts +516 -0
  258. package/src/learning/pipeline.ts +244 -0
  259. package/src/learning/playbook-extractor.ts +702 -0
  260. package/src/learning/usage-inference.ts +372 -0
  261. package/src/mcp/index.ts +12 -0
  262. package/src/mcp/playbook-server.ts +565 -0
  263. package/src/memory/curated-loader.ts +160 -0
  264. package/src/memory/experience.ts +515 -0
  265. package/src/memory/index.ts +27 -0
  266. package/src/memory/meta.ts +506 -0
  267. package/src/memory/playbook.ts +493 -0
  268. package/src/memory/system.ts +551 -0
  269. package/src/runtime/backends/acp.ts +378 -0
  270. package/src/runtime/backends/index.ts +24 -0
  271. package/src/runtime/backends/mock.ts +218 -0
  272. package/src/runtime/backends/subprocess.ts +356 -0
  273. package/src/runtime/flows/learning.ts +183 -0
  274. package/src/runtime/flows/validation.ts +381 -0
  275. package/src/runtime/index.ts +53 -0
  276. package/src/runtime/manager.ts +541 -0
  277. package/src/runtime/types.ts +157 -0
  278. package/src/search/evaluator.ts +474 -0
  279. package/src/search/index.ts +59 -0
  280. package/src/search/refinement-loop.ts +363 -0
  281. package/src/search/refinement-types.ts +159 -0
  282. package/src/search/router.ts +261 -0
  283. package/src/search/solver.ts +303 -0
  284. package/src/search/verification-runner.ts +570 -0
  285. package/src/surfacing/index.ts +6 -0
  286. package/src/surfacing/skill-library.ts +594 -0
  287. package/src/types/config.ts +333 -0
  288. package/src/types/index.ts +130 -0
  289. package/src/types/memory.ts +270 -0
  290. package/src/types/meta.ts +218 -0
  291. package/src/types/outcome.ts +66 -0
  292. package/src/types/playbook.ts +196 -0
  293. package/src/types/step.ts +40 -0
  294. package/src/types/task.ts +52 -0
  295. package/src/types/trajectory.ts +80 -0
  296. package/src/utils/index.ts +38 -0
  297. package/src/utils/similarity.ts +139 -0
  298. package/src/utils/storage.ts +249 -0
  299. package/src/utils/validation.ts +286 -0
  300. package/tests/embeddings/bm25.test.ts +130 -0
  301. package/tests/embeddings/manager.test.ts +205 -0
  302. package/tests/integration/atlas.test.ts +266 -0
  303. package/tests/integration/e2e.test.ts +929 -0
  304. package/tests/learning/analyzer.test.ts +426 -0
  305. package/tests/learning/effectiveness.test.ts +542 -0
  306. package/tests/learning/pipeline.test.ts +176 -0
  307. package/tests/learning/playbook-extractor-provenance.test.ts +114 -0
  308. package/tests/learning/usage-inference.test.ts +254 -0
  309. package/tests/mcp/playbook-server.test.ts +252 -0
  310. package/tests/memory/experience.test.ts +198 -0
  311. package/tests/memory/playbook.test.ts +338 -0
  312. package/tests/memory/provenance.test.ts +639 -0
  313. package/tests/memory/system.test.ts +325 -0
  314. package/tests/runtime/agent-manager.test.ts +512 -0
  315. package/tests/runtime/mock-backend.test.ts +248 -0
  316. package/tests/search/refinement-loop.test.ts +468 -0
  317. package/tests/search/refinement.test.ts +267 -0
  318. package/tests/search/router.test.ts +427 -0
  319. package/tests/surfacing/skill-library.test.ts +292 -0
  320. package/tests/types/outcome.test.ts +147 -0
  321. package/tests/types/step.test.ts +133 -0
  322. package/tests/types/task.test.ts +158 -0
  323. package/tests/types/trajectory.test.ts +253 -0
  324. package/tests/utils/similarity.test.ts +188 -0
  325. package/tests/utils/validation.test.ts +252 -0
  326. package/tsconfig.json +25 -0
  327. package/vitest.config.ts +22 -0
  328. package/index.d.ts +0 -4
  329. package/index.js +0 -4
@@ -0,0 +1,335 @@
1
+ import type { Trajectory, CreditStrategy } from '../types/index.js';
2
+
3
+ /**
4
+ * Analysis result from trajectory examination
5
+ */
6
+ export interface AnalysisResult {
7
+ /** Whether the trajectory succeeded */
8
+ success: boolean;
9
+ /** Indices of key steps (above attribution threshold) */
10
+ keySteps: number[];
11
+ /** Attribution score for each step */
12
+ stepAttribution: number[];
13
+ /** Detected error patterns */
14
+ errorPatterns: ErrorPattern[];
15
+ /** Whether this trajectory is worth extracting patterns from */
16
+ abstractable: boolean;
17
+ /** Suggested training examples */
18
+ trainingExamples: TrainingExample[];
19
+ }
20
+
21
+ /**
22
+ * Detected error pattern
23
+ */
24
+ export interface ErrorPattern {
25
+ type: string;
26
+ signature: string;
27
+ description: string;
28
+ suggestedFix?: string;
29
+ }
30
+
31
+ /**
32
+ * Training example extracted from trajectory
33
+ */
34
+ export interface TrainingExample {
35
+ input: string;
36
+ output: string;
37
+ stepIndex: number;
38
+ }
39
+
40
+ /**
41
+ * Configuration for trajectory analyzer
42
+ */
43
+ export interface AnalyzerConfig {
44
+ /** Credit decay factor for exponential decay (default: 0.5) */
45
+ creditDecayFactor: number;
46
+ /** Minimum action repetitions to flag as repetition pattern (default: 3) */
47
+ actionRepetitionThreshold: number;
48
+ /** Attribution threshold for key step identification (default: 0.15) */
49
+ attributionThreshold: number;
50
+ }
51
+
52
+ const DEFAULT_ANALYZER_CONFIG: AnalyzerConfig = {
53
+ creditDecayFactor: 0.5,
54
+ actionRepetitionThreshold: 3,
55
+ attributionThreshold: 0.15,
56
+ };
57
+
58
+ /**
59
+ * Credit assignment strategies
60
+ */
61
+ export type CreditAssignmentFn = (
62
+ trajectory: Trajectory,
63
+ config: AnalyzerConfig
64
+ ) => Promise<number[]>;
65
+
66
+ /**
67
+ * Simple exponential decay credit assignment
68
+ * Last step gets 1.0, decays exponentially backwards
69
+ */
70
+ export function simpleCreditAssignment(
71
+ trajectory: Trajectory,
72
+ config: AnalyzerConfig
73
+ ): Promise<number[]> {
74
+ const n = trajectory.steps.length;
75
+ const scores: number[] = [];
76
+ const decay = config.creditDecayFactor;
77
+
78
+ for (let i = 0; i < n; i++) {
79
+ const distanceFromEnd = n - 1 - i;
80
+ scores.push(Math.pow(decay, distanceFromEnd));
81
+ }
82
+
83
+ return Promise.resolve(scores);
84
+ }
85
+
86
+ /**
87
+ * Outcome-based credit assignment
88
+ * Successful trajectories get higher credit for all steps
89
+ */
90
+ export function outcomeCreditAssignment(
91
+ trajectory: Trajectory,
92
+ _config: AnalyzerConfig
93
+ ): Promise<number[]> {
94
+ const baseScores: number[] = trajectory.steps.map(() =>
95
+ trajectory.outcome.success ? 0.7 : 0.3
96
+ );
97
+
98
+ // Boost last step for successful trajectories
99
+ if (trajectory.outcome.success && baseScores.length > 0) {
100
+ baseScores[baseScores.length - 1] = 1.0;
101
+ }
102
+
103
+ return Promise.resolve(baseScores);
104
+ }
105
+
106
+ /**
107
+ * Get credit assignment function by strategy type
108
+ */
109
+ export function getCreditAssignmentFn(
110
+ strategy: CreditStrategy
111
+ ): CreditAssignmentFn {
112
+ switch (strategy) {
113
+ case 'simple':
114
+ return simpleCreditAssignment;
115
+ case 'llm':
116
+ // LLM-based credit assignment would require an LLM client
117
+ // Fall back to simple for now
118
+ return simpleCreditAssignment;
119
+ case 'counterfactual':
120
+ // Counterfactual requires environment replay
121
+ // Fall back to outcome-based
122
+ return outcomeCreditAssignment;
123
+ default:
124
+ return simpleCreditAssignment;
125
+ }
126
+ }
127
+
128
+ /**
129
+ * Trajectory Analyzer
130
+ * Analyzes trajectories to extract learning signals
131
+ */
132
+ export class TrajectoryAnalyzer {
133
+ private creditFn: CreditAssignmentFn;
134
+ private config: AnalyzerConfig;
135
+
136
+ constructor(strategy: CreditStrategy = 'simple', config?: Partial<AnalyzerConfig>) {
137
+ this.creditFn = getCreditAssignmentFn(strategy);
138
+ this.config = { ...DEFAULT_ANALYZER_CONFIG, ...config };
139
+ }
140
+
141
+ /**
142
+ * Analyze a trajectory
143
+ */
144
+ async analyze(trajectory: Trajectory): Promise<AnalysisResult> {
145
+ // Assign credit to steps
146
+ const stepAttribution = await this.creditFn(trajectory, this.config);
147
+
148
+ // Apply attribution to steps
149
+ for (let i = 0; i < trajectory.steps.length; i++) {
150
+ trajectory.steps[i].attributionScore = stepAttribution[i];
151
+ }
152
+
153
+ // Identify key steps
154
+ const keySteps = stepAttribution
155
+ .map((score, index) => ({ score, index }))
156
+ .filter(({ score }) => score >= this.config.attributionThreshold)
157
+ .map(({ index }) => index);
158
+
159
+ // Detect error patterns
160
+ const errorPatterns = this.detectErrorPatterns(trajectory);
161
+
162
+ // Assess abstractability
163
+ const abstractable = this.assessAbstractability(
164
+ trajectory,
165
+ keySteps,
166
+ errorPatterns
167
+ );
168
+
169
+ // Extract training examples
170
+ const trainingExamples = this.extractTrainingExamples(
171
+ trajectory,
172
+ keySteps
173
+ );
174
+
175
+ return {
176
+ success: trajectory.outcome.success,
177
+ keySteps,
178
+ stepAttribution,
179
+ errorPatterns,
180
+ abstractable,
181
+ trainingExamples,
182
+ };
183
+ }
184
+
185
+ /**
186
+ * Detect error patterns in failed trajectories
187
+ */
188
+ private detectErrorPatterns(trajectory: Trajectory): ErrorPattern[] {
189
+ const patterns: ErrorPattern[] = [];
190
+
191
+ if (!trajectory.outcome.success && trajectory.outcome.errorInfo) {
192
+ // Extract error type from error info
193
+ const errorInfo = trajectory.outcome.errorInfo;
194
+
195
+ // Common error patterns
196
+ const errorTypes: Array<[RegExp, string, string]> = [
197
+ [/timeout/i, 'timeout', 'Operation timed out'],
198
+ [/not found/i, 'not_found', 'Resource not found'],
199
+ [/permission denied/i, 'permission', 'Permission denied'],
200
+ [/syntax error/i, 'syntax', 'Syntax error in code'],
201
+ [/type error/i, 'type', 'Type mismatch error'],
202
+ [/assertion|assert/i, 'assertion', 'Assertion failed'],
203
+ [/exception|error/i, 'general', 'General error'],
204
+ ];
205
+
206
+ for (const [pattern, type, desc] of errorTypes) {
207
+ if (pattern.test(errorInfo)) {
208
+ patterns.push({
209
+ type,
210
+ signature: errorInfo.slice(0, 100),
211
+ description: desc,
212
+ });
213
+ break;
214
+ }
215
+ }
216
+ }
217
+
218
+ // Check for repeated failed actions
219
+ const actionCounts = new Map<string, number>();
220
+ for (const step of trajectory.steps) {
221
+ const count = (actionCounts.get(step.action) ?? 0) + 1;
222
+ actionCounts.set(step.action, count);
223
+ }
224
+
225
+ for (const [action, count] of actionCounts) {
226
+ if (count >= this.config.actionRepetitionThreshold) {
227
+ patterns.push({
228
+ type: 'repetition',
229
+ signature: action,
230
+ description: `Action repeated ${count} times`,
231
+ suggestedFix: 'Try a different approach',
232
+ });
233
+ }
234
+ }
235
+
236
+ return patterns;
237
+ }
238
+
239
+ /**
240
+ * Assess whether a trajectory is worth abstracting patterns from
241
+ */
242
+ private assessAbstractability(
243
+ trajectory: Trajectory,
244
+ keySteps: number[],
245
+ errorPatterns: ErrorPattern[]
246
+ ): boolean {
247
+ // Successful trajectories are generally abstractable
248
+ if (trajectory.outcome.success) {
249
+ // Must have enough meaningful steps
250
+ return keySteps.length >= 2;
251
+ }
252
+
253
+ // Failed trajectories with clear error patterns might be useful
254
+ // for learning what NOT to do
255
+ if (errorPatterns.length > 0) {
256
+ return (
257
+ errorPatterns.some((p) => p.suggestedFix) ||
258
+ trajectory.outcome.partialScore >= 0.3
259
+ );
260
+ }
261
+
262
+ return false;
263
+ }
264
+
265
+ /**
266
+ * Extract training examples from trajectory
267
+ */
268
+ private extractTrainingExamples(
269
+ trajectory: Trajectory,
270
+ keySteps: number[]
271
+ ): TrainingExample[] {
272
+ const examples: TrainingExample[] = [];
273
+
274
+ // Extract from key steps
275
+ for (const index of keySteps) {
276
+ const step = trajectory.steps[index];
277
+ if (step.thought && step.action) {
278
+ examples.push({
279
+ input: step.thought,
280
+ output: step.action,
281
+ stepIndex: index,
282
+ });
283
+ }
284
+ }
285
+
286
+ // Add final step as input-output pair
287
+ if (trajectory.steps.length > 0 && trajectory.outcome.success) {
288
+ examples.push({
289
+ input: trajectory.task.description,
290
+ output: JSON.stringify(trajectory.outcome.solution),
291
+ stepIndex: trajectory.steps.length - 1,
292
+ });
293
+ }
294
+
295
+ return examples;
296
+ }
297
+
298
+ /**
299
+ * Set credit assignment strategy
300
+ */
301
+ setStrategy(strategy: CreditStrategy): void {
302
+ this.creditFn = getCreditAssignmentFn(strategy);
303
+ }
304
+
305
+ /**
306
+ * Set attribution threshold
307
+ */
308
+ setThreshold(threshold: number): void {
309
+ this.config.attributionThreshold = threshold;
310
+ }
311
+
312
+ /**
313
+ * Update configuration
314
+ */
315
+ updateConfig(config: Partial<AnalyzerConfig>): void {
316
+ this.config = { ...this.config, ...config };
317
+ }
318
+
319
+ /**
320
+ * Get current configuration
321
+ */
322
+ getConfig(): AnalyzerConfig {
323
+ return { ...this.config };
324
+ }
325
+ }
326
+
327
+ /**
328
+ * Create a trajectory analyzer
329
+ */
330
+ export function createAnalyzer(
331
+ strategy: CreditStrategy = 'simple',
332
+ config?: Partial<AnalyzerConfig>
333
+ ): TrajectoryAnalyzer {
334
+ return new TrajectoryAnalyzer(strategy, config);
335
+ }