claude-conversation-memory-mcp 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 (116) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +223 -0
  3. package/dist/ConversationMemory.d.ts +80 -0
  4. package/dist/ConversationMemory.d.ts.map +1 -0
  5. package/dist/ConversationMemory.js +203 -0
  6. package/dist/ConversationMemory.js.map +1 -0
  7. package/dist/documentation/CodeAnalyzer.d.ts +29 -0
  8. package/dist/documentation/CodeAnalyzer.d.ts.map +1 -0
  9. package/dist/documentation/CodeAnalyzer.js +122 -0
  10. package/dist/documentation/CodeAnalyzer.js.map +1 -0
  11. package/dist/documentation/ConversationAnalyzer.d.ts +19 -0
  12. package/dist/documentation/ConversationAnalyzer.d.ts.map +1 -0
  13. package/dist/documentation/ConversationAnalyzer.js +156 -0
  14. package/dist/documentation/ConversationAnalyzer.js.map +1 -0
  15. package/dist/documentation/CrossReferencer.d.ts +67 -0
  16. package/dist/documentation/CrossReferencer.d.ts.map +1 -0
  17. package/dist/documentation/CrossReferencer.js +247 -0
  18. package/dist/documentation/CrossReferencer.js.map +1 -0
  19. package/dist/documentation/DocumentationGenerator.d.ts +22 -0
  20. package/dist/documentation/DocumentationGenerator.d.ts.map +1 -0
  21. package/dist/documentation/DocumentationGenerator.js +57 -0
  22. package/dist/documentation/DocumentationGenerator.js.map +1 -0
  23. package/dist/documentation/MarkdownFormatter.d.ts +26 -0
  24. package/dist/documentation/MarkdownFormatter.d.ts.map +1 -0
  25. package/dist/documentation/MarkdownFormatter.js +301 -0
  26. package/dist/documentation/MarkdownFormatter.js.map +1 -0
  27. package/dist/documentation/types.d.ts +176 -0
  28. package/dist/documentation/types.d.ts.map +1 -0
  29. package/dist/documentation/types.js +5 -0
  30. package/dist/documentation/types.js.map +1 -0
  31. package/dist/embeddings/EmbeddingConfig.d.ts +39 -0
  32. package/dist/embeddings/EmbeddingConfig.d.ts.map +1 -0
  33. package/dist/embeddings/EmbeddingConfig.js +132 -0
  34. package/dist/embeddings/EmbeddingConfig.js.map +1 -0
  35. package/dist/embeddings/EmbeddingGenerator.d.ts +45 -0
  36. package/dist/embeddings/EmbeddingGenerator.d.ts.map +1 -0
  37. package/dist/embeddings/EmbeddingGenerator.js +129 -0
  38. package/dist/embeddings/EmbeddingGenerator.js.map +1 -0
  39. package/dist/embeddings/EmbeddingProvider.d.ts +34 -0
  40. package/dist/embeddings/EmbeddingProvider.d.ts.map +1 -0
  41. package/dist/embeddings/EmbeddingProvider.js +6 -0
  42. package/dist/embeddings/EmbeddingProvider.js.map +1 -0
  43. package/dist/embeddings/VectorStore.d.ts +75 -0
  44. package/dist/embeddings/VectorStore.d.ts.map +1 -0
  45. package/dist/embeddings/VectorStore.js +220 -0
  46. package/dist/embeddings/VectorStore.js.map +1 -0
  47. package/dist/embeddings/providers/OllamaEmbeddings.d.ts +38 -0
  48. package/dist/embeddings/providers/OllamaEmbeddings.d.ts.map +1 -0
  49. package/dist/embeddings/providers/OllamaEmbeddings.js +132 -0
  50. package/dist/embeddings/providers/OllamaEmbeddings.js.map +1 -0
  51. package/dist/embeddings/providers/OpenAIEmbeddings.d.ts +40 -0
  52. package/dist/embeddings/providers/OpenAIEmbeddings.d.ts.map +1 -0
  53. package/dist/embeddings/providers/OpenAIEmbeddings.js +128 -0
  54. package/dist/embeddings/providers/OpenAIEmbeddings.js.map +1 -0
  55. package/dist/embeddings/providers/TransformersEmbeddings.d.ts +38 -0
  56. package/dist/embeddings/providers/TransformersEmbeddings.d.ts.map +1 -0
  57. package/dist/embeddings/providers/TransformersEmbeddings.js +114 -0
  58. package/dist/embeddings/providers/TransformersEmbeddings.js.map +1 -0
  59. package/dist/index.d.ts +7 -0
  60. package/dist/index.d.ts.map +1 -0
  61. package/dist/index.js +127 -0
  62. package/dist/index.js.map +1 -0
  63. package/dist/parsers/ConversationParser.d.ts +138 -0
  64. package/dist/parsers/ConversationParser.d.ts.map +1 -0
  65. package/dist/parsers/ConversationParser.js +325 -0
  66. package/dist/parsers/ConversationParser.js.map +1 -0
  67. package/dist/parsers/DecisionExtractor.d.ts +76 -0
  68. package/dist/parsers/DecisionExtractor.d.ts.map +1 -0
  69. package/dist/parsers/DecisionExtractor.js +305 -0
  70. package/dist/parsers/DecisionExtractor.js.map +1 -0
  71. package/dist/parsers/GitIntegrator.d.ts +71 -0
  72. package/dist/parsers/GitIntegrator.d.ts.map +1 -0
  73. package/dist/parsers/GitIntegrator.js +283 -0
  74. package/dist/parsers/GitIntegrator.js.map +1 -0
  75. package/dist/parsers/MistakeExtractor.d.ts +86 -0
  76. package/dist/parsers/MistakeExtractor.d.ts.map +1 -0
  77. package/dist/parsers/MistakeExtractor.js +341 -0
  78. package/dist/parsers/MistakeExtractor.js.map +1 -0
  79. package/dist/parsers/RequirementsExtractor.d.ts +70 -0
  80. package/dist/parsers/RequirementsExtractor.d.ts.map +1 -0
  81. package/dist/parsers/RequirementsExtractor.js +252 -0
  82. package/dist/parsers/RequirementsExtractor.js.map +1 -0
  83. package/dist/search/SemanticSearch.d.ts +90 -0
  84. package/dist/search/SemanticSearch.d.ts.map +1 -0
  85. package/dist/search/SemanticSearch.js +352 -0
  86. package/dist/search/SemanticSearch.js.map +1 -0
  87. package/dist/storage/ConversationStorage.d.ts +53 -0
  88. package/dist/storage/ConversationStorage.d.ts.map +1 -0
  89. package/dist/storage/ConversationStorage.js +249 -0
  90. package/dist/storage/ConversationStorage.js.map +1 -0
  91. package/dist/storage/SQLiteManager.d.ts +88 -0
  92. package/dist/storage/SQLiteManager.d.ts.map +1 -0
  93. package/dist/storage/SQLiteManager.js +281 -0
  94. package/dist/storage/SQLiteManager.js.map +1 -0
  95. package/dist/storage/migrations.d.ts +54 -0
  96. package/dist/storage/migrations.d.ts.map +1 -0
  97. package/dist/storage/migrations.js +153 -0
  98. package/dist/storage/migrations.js.map +1 -0
  99. package/dist/storage/schema.sql +321 -0
  100. package/dist/tools/ToolDefinitions.d.ts +265 -0
  101. package/dist/tools/ToolDefinitions.d.ts.map +1 -0
  102. package/dist/tools/ToolDefinitions.js +261 -0
  103. package/dist/tools/ToolDefinitions.js.map +1 -0
  104. package/dist/tools/ToolHandlers.d.ts +56 -0
  105. package/dist/tools/ToolHandlers.d.ts.map +1 -0
  106. package/dist/tools/ToolHandlers.js +431 -0
  107. package/dist/tools/ToolHandlers.js.map +1 -0
  108. package/dist/types/ToolTypes.d.ts +333 -0
  109. package/dist/types/ToolTypes.d.ts.map +1 -0
  110. package/dist/types/ToolTypes.js +6 -0
  111. package/dist/types/ToolTypes.js.map +1 -0
  112. package/dist/utils/sanitization.d.ts +35 -0
  113. package/dist/utils/sanitization.d.ts.map +1 -0
  114. package/dist/utils/sanitization.js +97 -0
  115. package/dist/utils/sanitization.js.map +1 -0
  116. package/package.json +87 -0
@@ -0,0 +1,76 @@
1
+ /**
2
+ * Decision Extractor
3
+ * Identifies and extracts decisions from conversations to prevent regressions
4
+ */
5
+ import type { Message, ThinkingBlock } from "./ConversationParser.js";
6
+ export interface Decision {
7
+ id: string;
8
+ conversation_id: string;
9
+ message_id: string;
10
+ decision_text: string;
11
+ rationale?: string;
12
+ alternatives_considered: string[];
13
+ rejected_reasons: Record<string, string>;
14
+ context?: string;
15
+ related_files: string[];
16
+ related_commits: string[];
17
+ timestamp: number;
18
+ }
19
+ export declare class DecisionExtractor {
20
+ private readonly DECISION_PATTERNS;
21
+ private readonly CORRECTION_PATTERNS;
22
+ private readonly CONTEXT_KEYWORDS;
23
+ /**
24
+ * Extract decisions from messages and thinking blocks
25
+ */
26
+ extractDecisions(messages: Message[], thinkingBlocks: ThinkingBlock[]): Decision[];
27
+ /**
28
+ * Extract explicit decisions from assistant messages
29
+ */
30
+ private extractExplicitDecisions;
31
+ /**
32
+ * Parse a regex match into a Decision object
33
+ */
34
+ private parseDecisionMatch;
35
+ /**
36
+ * Extract structured decisions (e.g., "Decision: ..." format)
37
+ */
38
+ private extractStructuredDecisions;
39
+ /**
40
+ * Extract decisions from user corrections
41
+ */
42
+ private extractCorrections;
43
+ /**
44
+ * Extract decision text from matched pattern
45
+ */
46
+ private extractDecisionText;
47
+ /**
48
+ * Extract rationale from decision text
49
+ */
50
+ private extractRationale;
51
+ /**
52
+ * Extract alternative approaches that were considered
53
+ */
54
+ private extractAlternatives;
55
+ /**
56
+ * Extract reasons for rejecting alternatives
57
+ */
58
+ private extractRejectedReasons;
59
+ /**
60
+ * Identify what context/area this decision relates to
61
+ */
62
+ private identifyContext;
63
+ /**
64
+ * Extract related files from message metadata
65
+ */
66
+ private extractRelatedFiles;
67
+ /**
68
+ * Deduplicate similar decisions
69
+ */
70
+ private deduplicateDecisions;
71
+ /**
72
+ * Score a decision's importance (for prioritization)
73
+ */
74
+ scoreDecisionImportance(decision: Decision): number;
75
+ }
76
+ //# sourceMappingURL=DecisionExtractor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DecisionExtractor.d.ts","sourceRoot":"","sources":["../../src/parsers/DecisionExtractor.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAEtE,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,uBAAuB,EAAE,MAAM,EAAE,CAAC;IAClC,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACzC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,qBAAa,iBAAiB;IAE5B,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAMhC;IAGF,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAMlC;IAGF,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAgB/B;IAEF;;OAEG;IACH,gBAAgB,CACd,QAAQ,EAAE,OAAO,EAAE,EACnB,cAAc,EAAE,aAAa,EAAE,GAC9B,QAAQ,EAAE;IAwBb;;OAEG;IACH,OAAO,CAAC,wBAAwB;IAgChC;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAgC1B;;OAEG;IACH,OAAO,CAAC,0BAA0B;IA0ClC;;OAEG;IACH,OAAO,CAAC,kBAAkB;IA8B1B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAa3B;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAKxB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAmB3B;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAoB9B;;OAEG;IACH,OAAO,CAAC,eAAe;IAYvB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAkB3B;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAoB5B;;OAEG;IACH,uBAAuB,CAAC,QAAQ,EAAE,QAAQ,GAAG,MAAM;CAuBpD"}
@@ -0,0 +1,305 @@
1
+ /**
2
+ * Decision Extractor
3
+ * Identifies and extracts decisions from conversations to prevent regressions
4
+ */
5
+ import { nanoid } from "nanoid";
6
+ export class DecisionExtractor {
7
+ // Decision pattern indicators
8
+ DECISION_PATTERNS = [
9
+ /(?:we|i|let's)\s+(?:decided|choose|chose|went with|picked|selected)\s+(?:to\s+)?(.+?(?:because|since|as|for|due to))/gi,
10
+ /(?:using|use|implement|go with|adopt)\s+(.+?)\s+(?:instead of|over|rather than)\s+(.+?)\s+(?:because|since|as)/gi,
11
+ /(?:decision|chose|selected|picked):\s*(.+?)(?:\.|$)/gi,
12
+ /(?:rationale|reason|why):\s*(.+?)(?:\.|$)/gi,
13
+ /(?:rejected|dismissed|avoided|didn't use)\s+(.+?)\s+(?:because|due to|since)/gi,
14
+ ];
15
+ // Correction patterns (user correcting assistant)
16
+ CORRECTION_PATTERNS = [
17
+ /^no[,\s]+/i,
18
+ /that'?s?\s+(?:wrong|incorrect|not right)/i,
19
+ /actually[,\s]+/i,
20
+ /instead[,\s]+(?:we should|you should|do)/i,
21
+ /don't\s+(?:do that|use that)/i,
22
+ ];
23
+ // Context keywords to identify what the decision is about
24
+ CONTEXT_KEYWORDS = [
25
+ "authentication",
26
+ "auth",
27
+ "database",
28
+ "api",
29
+ "frontend",
30
+ "backend",
31
+ "testing",
32
+ "deployment",
33
+ "security",
34
+ "performance",
35
+ "architecture",
36
+ "design pattern",
37
+ "library",
38
+ "framework",
39
+ "optimization",
40
+ ];
41
+ /**
42
+ * Extract decisions from messages and thinking blocks
43
+ */
44
+ extractDecisions(messages, thinkingBlocks) {
45
+ const decisions = [];
46
+ // Extract from assistant messages with thinking blocks
47
+ for (const message of messages) {
48
+ if (message.role === "assistant" && message.content) {
49
+ const thinking = thinkingBlocks.find((t) => t.message_id === message.id);
50
+ // Check for explicit decisions in message content
51
+ const explicitDecisions = this.extractExplicitDecisions(message, thinking);
52
+ decisions.push(...explicitDecisions);
53
+ }
54
+ // Extract from user corrections
55
+ if (message.role === "user" && message.content) {
56
+ const corrections = this.extractCorrections(message);
57
+ decisions.push(...corrections);
58
+ }
59
+ }
60
+ // Deduplicate similar decisions
61
+ return this.deduplicateDecisions(decisions);
62
+ }
63
+ /**
64
+ * Extract explicit decisions from assistant messages
65
+ */
66
+ extractExplicitDecisions(message, thinkingBlock) {
67
+ const decisions = [];
68
+ const content = message.content || "";
69
+ const thinkingContent = thinkingBlock?.thinking_content || "";
70
+ const combinedContent = `${content}\n${thinkingContent}`;
71
+ // Look for decision patterns
72
+ for (const pattern of this.DECISION_PATTERNS) {
73
+ const matches = Array.from(combinedContent.matchAll(pattern));
74
+ for (const match of matches) {
75
+ const decision = this.parseDecisionMatch(match, message, thinkingBlock);
76
+ if (decision) {
77
+ decisions.push(decision);
78
+ }
79
+ }
80
+ }
81
+ // Extract from structured decision statements
82
+ const structuredDecisions = this.extractStructuredDecisions(combinedContent, message, thinkingBlock);
83
+ decisions.push(...structuredDecisions);
84
+ return decisions;
85
+ }
86
+ /**
87
+ * Parse a regex match into a Decision object
88
+ */
89
+ parseDecisionMatch(match, message, _thinking) {
90
+ if (!match[0]) {
91
+ return null;
92
+ }
93
+ const fullText = match[0];
94
+ const decisionText = this.extractDecisionText(fullText);
95
+ const rationale = this.extractRationale(fullText);
96
+ // Extract context (what this decision is about)
97
+ const context = this.identifyContext(fullText);
98
+ // Extract related files from message metadata
99
+ const relatedFiles = this.extractRelatedFiles(message);
100
+ return {
101
+ id: nanoid(),
102
+ conversation_id: message.conversation_id,
103
+ message_id: message.id,
104
+ decision_text: decisionText,
105
+ rationale,
106
+ alternatives_considered: this.extractAlternatives(fullText),
107
+ rejected_reasons: this.extractRejectedReasons(fullText),
108
+ context,
109
+ related_files: relatedFiles,
110
+ related_commits: [], // Will be filled by GitIntegrator
111
+ timestamp: message.timestamp,
112
+ };
113
+ }
114
+ /**
115
+ * Extract structured decisions (e.g., "Decision: ..." format)
116
+ */
117
+ extractStructuredDecisions(content, message, _thinking) {
118
+ const decisions = [];
119
+ // Look for structured decision blocks
120
+ const decisionBlockPattern = /(?:Decision|Chose|Selected|Using):\s*([^\n]+)(?:\s*Rationale:\s*([^\n]+))?(?:\s*Alternatives:\s*([^\n]+))?/gi;
121
+ const matches = Array.from(content.matchAll(decisionBlockPattern));
122
+ for (const match of matches) {
123
+ const decisionText = match[1]?.trim();
124
+ if (!decisionText) {
125
+ continue;
126
+ }
127
+ const rationale = match[2]?.trim();
128
+ const alternativesText = match[3]?.trim();
129
+ const alternatives = alternativesText
130
+ ? alternativesText.split(/,|;/).map((a) => a.trim())
131
+ : [];
132
+ decisions.push({
133
+ id: nanoid(),
134
+ conversation_id: message.conversation_id,
135
+ message_id: message.id,
136
+ decision_text: decisionText,
137
+ rationale,
138
+ alternatives_considered: alternatives,
139
+ rejected_reasons: {},
140
+ context: this.identifyContext(content),
141
+ related_files: this.extractRelatedFiles(message),
142
+ related_commits: [],
143
+ timestamp: message.timestamp,
144
+ });
145
+ }
146
+ return decisions;
147
+ }
148
+ /**
149
+ * Extract decisions from user corrections
150
+ */
151
+ extractCorrections(message) {
152
+ const content = message.content || "";
153
+ // Check if this is a correction
154
+ const isCorrection = this.CORRECTION_PATTERNS.some((pattern) => pattern.test(content));
155
+ if (!isCorrection) {
156
+ return [];
157
+ }
158
+ // Extract what the correction is about
159
+ const correctionText = content.replace(/^(no[,\s]+|actually[,\s]+)/i, "").trim();
160
+ return [
161
+ {
162
+ id: nanoid(),
163
+ conversation_id: message.conversation_id,
164
+ message_id: message.id,
165
+ decision_text: correctionText,
166
+ rationale: "User correction - previous approach was incorrect",
167
+ alternatives_considered: [],
168
+ rejected_reasons: { "previous approach": "user rejected" },
169
+ context: this.identifyContext(content),
170
+ related_files: this.extractRelatedFiles(message),
171
+ related_commits: [],
172
+ timestamp: message.timestamp,
173
+ },
174
+ ];
175
+ }
176
+ /**
177
+ * Extract decision text from matched pattern
178
+ */
179
+ extractDecisionText(text) {
180
+ // Remove common prefixes
181
+ let cleaned = text.replace(/^(?:we|i|let's)\s+(?:decided|choose|chose|went with|picked|selected)\s+(?:to\s+)?/i, "");
182
+ // Remove trailing explanation
183
+ cleaned = cleaned.replace(/\s+(?:because|since|as|for|due to).+$/i, "");
184
+ return cleaned.trim();
185
+ }
186
+ /**
187
+ * Extract rationale from decision text
188
+ */
189
+ extractRationale(text) {
190
+ const rationaleMatch = text.match(/(?:because|since|as|for|due to)\s+(.+?)(?:\.|$)/i);
191
+ return rationaleMatch?.[1]?.trim();
192
+ }
193
+ /**
194
+ * Extract alternative approaches that were considered
195
+ */
196
+ extractAlternatives(text) {
197
+ const alternatives = [];
198
+ // Look for "instead of X" patterns
199
+ const insteadOfMatch = text.match(/(?:instead of|over|rather than)\s+(.+?)(?:\s+because|$)/i);
200
+ if (insteadOfMatch) {
201
+ alternatives.push(insteadOfMatch[1].trim());
202
+ }
203
+ // Look for "considered X, Y, and Z"
204
+ const consideredMatch = text.match(/considered\s+(.+?)(?:\s+but|$)/i);
205
+ if (consideredMatch) {
206
+ const items = consideredMatch[1].split(/,|and/).map((s) => s.trim());
207
+ alternatives.push(...items);
208
+ }
209
+ return alternatives;
210
+ }
211
+ /**
212
+ * Extract reasons for rejecting alternatives
213
+ */
214
+ extractRejectedReasons(text) {
215
+ const reasons = {};
216
+ // Look for "rejected X because Y" patterns
217
+ const rejectedPattern = /(?:rejected|dismissed|avoided|didn't use)\s+(.+?)\s+(?:because|due to|since)\s+(.+?)(?:\.|$)/gi;
218
+ const matches = Array.from(text.matchAll(rejectedPattern));
219
+ for (const match of matches) {
220
+ const alternative = match[1]?.trim();
221
+ const reason = match[2]?.trim();
222
+ if (alternative && reason) {
223
+ reasons[alternative] = reason;
224
+ }
225
+ }
226
+ return reasons;
227
+ }
228
+ /**
229
+ * Identify what context/area this decision relates to
230
+ */
231
+ identifyContext(text) {
232
+ const lowerText = text.toLowerCase();
233
+ for (const keyword of this.CONTEXT_KEYWORDS) {
234
+ if (lowerText.includes(keyword)) {
235
+ return keyword;
236
+ }
237
+ }
238
+ return undefined;
239
+ }
240
+ /**
241
+ * Extract related files from message metadata
242
+ */
243
+ extractRelatedFiles(message) {
244
+ const files = [];
245
+ // Check message metadata for file references
246
+ if (message.metadata) {
247
+ // Look for file paths in various metadata fields
248
+ const metadataStr = JSON.stringify(message.metadata);
249
+ const filePathPattern = /(?:\/[\w-]+)+\.[\w]+/g;
250
+ const matches = metadataStr.match(filePathPattern);
251
+ if (matches) {
252
+ files.push(...matches);
253
+ }
254
+ }
255
+ return [...new Set(files)]; // Deduplicate
256
+ }
257
+ /**
258
+ * Deduplicate similar decisions
259
+ */
260
+ deduplicateDecisions(decisions) {
261
+ const unique = [];
262
+ const seen = new Set();
263
+ for (const decision of decisions) {
264
+ // Create a signature for the decision
265
+ const signature = `${decision.decision_text.toLowerCase()}_${decision.timestamp}`.substring(0, 100);
266
+ if (!seen.has(signature)) {
267
+ seen.add(signature);
268
+ unique.push(decision);
269
+ }
270
+ }
271
+ return unique;
272
+ }
273
+ /**
274
+ * Score a decision's importance (for prioritization)
275
+ */
276
+ scoreDecisionImportance(decision) {
277
+ let score = 0;
278
+ // Has rationale
279
+ if (decision.rationale) {
280
+ score += 2;
281
+ }
282
+ // Has alternatives considered
283
+ if (decision.alternatives_considered.length > 0) {
284
+ score += 3;
285
+ }
286
+ // Has rejected reasons
287
+ if (Object.keys(decision.rejected_reasons).length > 0) {
288
+ score += 3;
289
+ }
290
+ // Has related files
291
+ if (decision.related_files.length > 0) {
292
+ score += 2;
293
+ }
294
+ // Has context
295
+ if (decision.context) {
296
+ score += 1;
297
+ }
298
+ // Is a correction (high importance)
299
+ if (decision.rationale?.includes("User correction")) {
300
+ score += 5;
301
+ }
302
+ return score;
303
+ }
304
+ }
305
+ //# sourceMappingURL=DecisionExtractor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DecisionExtractor.js","sourceRoot":"","sources":["../../src/parsers/DecisionExtractor.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAiBhC,MAAM,OAAO,iBAAiB;IAC5B,8BAA8B;IACb,iBAAiB,GAAG;QACnC,wHAAwH;QACxH,kHAAkH;QAClH,uDAAuD;QACvD,6CAA6C;QAC7C,gFAAgF;KACjF,CAAC;IAEF,kDAAkD;IACjC,mBAAmB,GAAG;QACrC,YAAY;QACZ,2CAA2C;QAC3C,iBAAiB;QACjB,2CAA2C;QAC3C,+BAA+B;KAChC,CAAC;IAEF,0DAA0D;IACzC,gBAAgB,GAAG;QAClC,gBAAgB;QAChB,MAAM;QACN,UAAU;QACV,KAAK;QACL,UAAU;QACV,SAAS;QACT,SAAS;QACT,YAAY;QACZ,UAAU;QACV,aAAa;QACb,cAAc;QACd,gBAAgB;QAChB,SAAS;QACT,WAAW;QACX,cAAc;KACf,CAAC;IAEF;;OAEG;IACH,gBAAgB,CACd,QAAmB,EACnB,cAA+B;QAE/B,MAAM,SAAS,GAAe,EAAE,CAAC;QAEjC,uDAAuD;QACvD,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,IAAI,OAAO,CAAC,IAAI,KAAK,WAAW,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;gBACpD,MAAM,QAAQ,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,KAAK,OAAO,CAAC,EAAE,CAAC,CAAC;gBAEzE,kDAAkD;gBAClD,MAAM,iBAAiB,GAAG,IAAI,CAAC,wBAAwB,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;gBAC3E,SAAS,CAAC,IAAI,CAAC,GAAG,iBAAiB,CAAC,CAAC;YACvC,CAAC;YAED,gCAAgC;YAChC,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;gBAC/C,MAAM,WAAW,GAAG,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC;gBACrD,SAAS,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC,CAAC;YACjC,CAAC;QACH,CAAC;QAED,gCAAgC;QAChC,OAAO,IAAI,CAAC,oBAAoB,CAAC,SAAS,CAAC,CAAC;IAC9C,CAAC;IAED;;OAEG;IACK,wBAAwB,CAC9B,OAAgB,EAChB,aAA6B;QAE7B,MAAM,SAAS,GAAe,EAAE,CAAC;QACjC,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC;QACtC,MAAM,eAAe,GAAG,aAAa,EAAE,gBAAgB,IAAI,EAAE,CAAC;QAC9D,MAAM,eAAe,GAAG,GAAG,OAAO,KAAK,eAAe,EAAE,CAAC;QAEzD,6BAA6B;QAC7B,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;YAC7C,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;YAE9D,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;gBAC5B,MAAM,QAAQ,GAAG,IAAI,CAAC,kBAAkB,CAAC,KAAK,EAAE,OAAO,EAAE,aAAa,CAAC,CAAC;gBACxE,IAAI,QAAQ,EAAE,CAAC;oBACb,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBAC3B,CAAC;YACH,CAAC;QACH,CAAC;QAED,8CAA8C;QAC9C,MAAM,mBAAmB,GAAG,IAAI,CAAC,0BAA0B,CACzD,eAAe,EACf,OAAO,EACP,aAAa,CACd,CAAC;QACF,SAAS,CAAC,IAAI,CAAC,GAAG,mBAAmB,CAAC,CAAC;QAEvC,OAAO,SAAS,CAAC;IACnB,CAAC;IAED;;OAEG;IACK,kBAAkB,CACxB,KAAuB,EACvB,OAAgB,EAChB,SAAyB;QAEzB,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;YAAA,OAAO,IAAI,CAAC;QAAA,CAAC;QAE7B,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QAC1B,MAAM,YAAY,GAAG,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC;QACxD,MAAM,SAAS,GAAG,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;QAElD,gDAAgD;QAChD,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;QAE/C,8CAA8C;QAC9C,MAAM,YAAY,GAAG,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC;QAEvD,OAAO;YACL,EAAE,EAAE,MAAM,EAAE;YACZ,eAAe,EAAE,OAAO,CAAC,eAAe;YACxC,UAAU,EAAE,OAAO,CAAC,EAAE;YACtB,aAAa,EAAE,YAAY;YAC3B,SAAS;YACT,uBAAuB,EAAE,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC;YAC3D,gBAAgB,EAAE,IAAI,CAAC,sBAAsB,CAAC,QAAQ,CAAC;YACvD,OAAO;YACP,aAAa,EAAE,YAAY;YAC3B,eAAe,EAAE,EAAE,EAAE,kCAAkC;YACvD,SAAS,EAAE,OAAO,CAAC,SAAS;SAC7B,CAAC;IACJ,CAAC;IAED;;OAEG;IACK,0BAA0B,CAChC,OAAe,EACf,OAAgB,EAChB,SAAyB;QAEzB,MAAM,SAAS,GAAe,EAAE,CAAC;QAEjC,sCAAsC;QACtC,MAAM,oBAAoB,GACxB,8GAA8G,CAAC;QAEjH,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAC,CAAC,CAAC;QAEnE,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,MAAM,YAAY,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;YACtC,IAAI,CAAC,YAAY,EAAE,CAAC;gBAAA,SAAS;YAAA,CAAC;YAE9B,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;YACnC,MAAM,gBAAgB,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;YAE1C,MAAM,YAAY,GAAG,gBAAgB;gBACnC,CAAC,CAAC,gBAAgB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;gBACpD,CAAC,CAAC,EAAE,CAAC;YAEP,SAAS,CAAC,IAAI,CAAC;gBACb,EAAE,EAAE,MAAM,EAAE;gBACZ,eAAe,EAAE,OAAO,CAAC,eAAe;gBACxC,UAAU,EAAE,OAAO,CAAC,EAAE;gBACtB,aAAa,EAAE,YAAY;gBAC3B,SAAS;gBACT,uBAAuB,EAAE,YAAY;gBACrC,gBAAgB,EAAE,EAAE;gBACpB,OAAO,EAAE,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC;gBACtC,aAAa,EAAE,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC;gBAChD,eAAe,EAAE,EAAE;gBACnB,SAAS,EAAE,OAAO,CAAC,SAAS;aAC7B,CAAC,CAAC;QACL,CAAC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC;IAED;;OAEG;IACK,kBAAkB,CAAC,OAAgB;QACzC,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC;QAEtC,gCAAgC;QAChC,MAAM,YAAY,GAAG,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAC7D,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CACtB,CAAC;QAEF,IAAI,CAAC,YAAY,EAAE,CAAC;YAAA,OAAO,EAAE,CAAC;QAAA,CAAC;QAE/B,uCAAuC;QACvC,MAAM,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC,6BAA6B,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QAEjF,OAAO;YACL;gBACE,EAAE,EAAE,MAAM,EAAE;gBACZ,eAAe,EAAE,OAAO,CAAC,eAAe;gBACxC,UAAU,EAAE,OAAO,CAAC,EAAE;gBACtB,aAAa,EAAE,cAAc;gBAC7B,SAAS,EAAE,mDAAmD;gBAC9D,uBAAuB,EAAE,EAAE;gBAC3B,gBAAgB,EAAE,EAAE,mBAAmB,EAAE,eAAe,EAAE;gBAC1D,OAAO,EAAE,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC;gBACtC,aAAa,EAAE,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC;gBAChD,eAAe,EAAE,EAAE;gBACnB,SAAS,EAAE,OAAO,CAAC,SAAS;aAC7B;SACF,CAAC;IACJ,CAAC;IAED;;OAEG;IACK,mBAAmB,CAAC,IAAY;QACtC,yBAAyB;QACzB,IAAI,OAAO,GAAG,IAAI,CAAC,OAAO,CACxB,oFAAoF,EACpF,EAAE,CACH,CAAC;QAEF,8BAA8B;QAC9B,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,wCAAwC,EAAE,EAAE,CAAC,CAAC;QAExE,OAAO,OAAO,CAAC,IAAI,EAAE,CAAC;IACxB,CAAC;IAED;;OAEG;IACK,gBAAgB,CAAC,IAAY;QACnC,MAAM,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,kDAAkD,CAAC,CAAC;QACtF,OAAO,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;IACrC,CAAC;IAED;;OAEG;IACK,mBAAmB,CAAC,IAAY;QACtC,MAAM,YAAY,GAAa,EAAE,CAAC;QAElC,mCAAmC;QACnC,MAAM,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,0DAA0D,CAAC,CAAC;QAC9F,IAAI,cAAc,EAAE,CAAC;YACnB,YAAY,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QAC9C,CAAC;QAED,oCAAoC;QACpC,MAAM,eAAe,GAAG,IAAI,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAC;QACtE,IAAI,eAAe,EAAE,CAAC;YACpB,MAAM,KAAK,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;YACrE,YAAY,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC;QAC9B,CAAC;QAED,OAAO,YAAY,CAAC;IACtB,CAAC;IAED;;OAEG;IACK,sBAAsB,CAAC,IAAY;QACzC,MAAM,OAAO,GAA2B,EAAE,CAAC;QAE3C,2CAA2C;QAC3C,MAAM,eAAe,GACnB,gGAAgG,CAAC;QAEnG,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC,CAAC;QAE3D,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,MAAM,WAAW,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;YACrC,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;YAChC,IAAI,WAAW,IAAI,MAAM,EAAE,CAAC;gBAC1B,OAAO,CAAC,WAAW,CAAC,GAAG,MAAM,CAAC;YAChC,CAAC;QACH,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;OAEG;IACK,eAAe,CAAC,IAAY;QAClC,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QAErC,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC5C,IAAI,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;gBAChC,OAAO,OAAO,CAAC;YACjB,CAAC;QACH,CAAC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC;IAED;;OAEG;IACK,mBAAmB,CAAC,OAAgB;QAC1C,MAAM,KAAK,GAAa,EAAE,CAAC;QAE3B,6CAA6C;QAC7C,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;YACrB,iDAAiD;YACjD,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YACrD,MAAM,eAAe,GAAG,uBAAuB,CAAC;YAChD,MAAM,OAAO,GAAG,WAAW,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;YAEnD,IAAI,OAAO,EAAE,CAAC;gBACZ,KAAK,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,CAAC;YACzB,CAAC;QACH,CAAC;QAED,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,cAAc;IAC5C,CAAC;IAED;;OAEG;IACK,oBAAoB,CAAC,SAAqB;QAChD,MAAM,MAAM,GAAe,EAAE,CAAC;QAC9B,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;QAE/B,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;YACjC,sCAAsC;YACtC,MAAM,SAAS,GAAG,GAAG,QAAQ,CAAC,aAAa,CAAC,WAAW,EAAE,IAAI,QAAQ,CAAC,SAAS,EAAE,CAAC,SAAS,CACzF,CAAC,EACD,GAAG,CACJ,CAAC;YAEF,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;gBACzB,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;gBACpB,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACxB,CAAC;QACH,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;OAEG;IACH,uBAAuB,CAAC,QAAkB;QACxC,IAAI,KAAK,GAAG,CAAC,CAAC;QAEd,gBAAgB;QAChB,IAAI,QAAQ,CAAC,SAAS,EAAE,CAAC;YAAA,KAAK,IAAI,CAAC,CAAC;QAAA,CAAC;QAErC,8BAA8B;QAC9B,IAAI,QAAQ,CAAC,uBAAuB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAAA,KAAK,IAAI,CAAC,CAAC;QAAA,CAAC;QAE9D,uBAAuB;QACvB,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAAA,KAAK,IAAI,CAAC,CAAC;QAAA,CAAC;QAEpE,oBAAoB;QACpB,IAAI,QAAQ,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAAA,KAAK,IAAI,CAAC,CAAC;QAAA,CAAC;QAEpD,cAAc;QACd,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;YAAA,KAAK,IAAI,CAAC,CAAC;QAAA,CAAC;QAEnC,oCAAoC;QACpC,IAAI,QAAQ,CAAC,SAAS,EAAE,QAAQ,CAAC,iBAAiB,CAAC,EAAE,CAAC;YAAA,KAAK,IAAI,CAAC,CAAC;QAAA,CAAC;QAElE,OAAO,KAAK,CAAC;IACf,CAAC;CACF"}
@@ -0,0 +1,71 @@
1
+ /**
2
+ * Git Integrator
3
+ * Links git commits to conversations based on temporal and contextual analysis
4
+ */
5
+ import type { Conversation, FileEdit } from "./ConversationParser.js";
6
+ import type { Decision } from "./DecisionExtractor.js";
7
+ export interface GitCommit {
8
+ hash: string;
9
+ message: string;
10
+ author?: string;
11
+ timestamp: number;
12
+ branch?: string;
13
+ files_changed: string[];
14
+ conversation_id?: string;
15
+ related_message_id?: string;
16
+ metadata: Record<string, unknown>;
17
+ }
18
+ export interface CommitLinkage {
19
+ commit: GitCommit;
20
+ conversation: Conversation;
21
+ confidence: number;
22
+ reasons: string[];
23
+ }
24
+ export declare class GitIntegrator {
25
+ private git;
26
+ constructor(projectPath: string);
27
+ /**
28
+ * Parse git history and link to conversations
29
+ */
30
+ linkCommitsToConversations(conversations: Conversation[], fileEdits: FileEdit[], decisions: Decision[]): Promise<GitCommit[]>;
31
+ /**
32
+ * Parse git history
33
+ */
34
+ private parseGitHistory;
35
+ /**
36
+ * Get files changed in a commit
37
+ */
38
+ private getChangedFiles;
39
+ /**
40
+ * Find best conversation match for a commit
41
+ */
42
+ private findBestConversationMatch;
43
+ /**
44
+ * Score how well a commit matches a conversation
45
+ */
46
+ private scoreCommitConversationMatch;
47
+ /**
48
+ * Score based on timestamp proximity
49
+ * Returns 0-3 points
50
+ */
51
+ private scoreTimestampProximity;
52
+ /**
53
+ * Score based on file overlap
54
+ * Returns 0-4 points
55
+ */
56
+ private scoreFileOverlap;
57
+ /**
58
+ * Score based on commit message keywords
59
+ * Returns 0-2 points
60
+ */
61
+ private scoreCommitMessageKeywords;
62
+ /**
63
+ * Get recent commits (last N days)
64
+ */
65
+ getRecentCommits(days?: number): Promise<GitCommit[]>;
66
+ /**
67
+ * Get commits affecting a specific file
68
+ */
69
+ getCommitsForFile(filePath: string): Promise<GitCommit[]>;
70
+ }
71
+ //# sourceMappingURL=GitIntegrator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GitIntegrator.d.ts","sourceRoot":"","sources":["../../src/parsers/GitIntegrator.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AACtE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAEvD,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,SAAS,CAAC;IAClB,YAAY,EAAE,YAAY,CAAC;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,qBAAa,aAAa;IACxB,OAAO,CAAC,GAAG,CAAY;gBAEX,WAAW,EAAE,MAAM;IAI/B;;OAEG;IACG,0BAA0B,CAC9B,aAAa,EAAE,YAAY,EAAE,EAC7B,SAAS,EAAE,QAAQ,EAAE,EACrB,SAAS,EAAE,QAAQ,EAAE,GACpB,OAAO,CAAC,SAAS,EAAE,CAAC;IAqCvB;;OAEG;YACW,eAAe;IA4C7B;;OAEG;YACW,eAAe;IAgB7B;;OAEG;IACH,OAAO,CAAC,yBAAyB;IA0BjC;;OAEG;IACH,OAAO,CAAC,4BAA4B;IAiDpC;;;OAGG;IACH,OAAO,CAAC,uBAAuB;IAkC/B;;;OAGG;IACH,OAAO,CAAC,gBAAgB;IA0BxB;;;OAGG;IACH,OAAO,CAAC,0BAA0B;IAyClC;;OAEG;IACG,gBAAgB,CAAC,IAAI,GAAE,MAAW,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IAkC/D;;OAEG;IACG,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;CAsBhE"}