@benchcubed/today-cli 1.0.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 (210) hide show
  1. package/README.md +296 -0
  2. package/dist/ai/bedrock-client.d.ts +1 -0
  3. package/dist/ai/bedrock-client.d.ts.map +1 -0
  4. package/dist/ai/bedrock-client.js +2 -0
  5. package/dist/ai/bedrock-client.js.map +1 -0
  6. package/dist/ai/knowledge-processor.d.ts +1 -0
  7. package/dist/ai/knowledge-processor.d.ts.map +1 -0
  8. package/dist/ai/knowledge-processor.js +2 -0
  9. package/dist/ai/knowledge-processor.js.map +1 -0
  10. package/dist/cli.d.ts +3 -0
  11. package/dist/cli.d.ts.map +1 -0
  12. package/dist/cli.js +70 -0
  13. package/dist/cli.js.map +1 -0
  14. package/dist/commands/ask.d.ts +3 -0
  15. package/dist/commands/ask.d.ts.map +1 -0
  16. package/dist/commands/ask.js +217 -0
  17. package/dist/commands/ask.js.map +1 -0
  18. package/dist/commands/audit.d.ts +3 -0
  19. package/dist/commands/audit.d.ts.map +1 -0
  20. package/dist/commands/audit.js +153 -0
  21. package/dist/commands/audit.js.map +1 -0
  22. package/dist/commands/auth.d.ts +3 -0
  23. package/dist/commands/auth.d.ts.map +1 -0
  24. package/dist/commands/auth.js +114 -0
  25. package/dist/commands/auth.js.map +1 -0
  26. package/dist/commands/config.d.ts +3 -0
  27. package/dist/commands/config.d.ts.map +1 -0
  28. package/dist/commands/config.js +72 -0
  29. package/dist/commands/config.js.map +1 -0
  30. package/dist/commands/embeddings.d.ts +3 -0
  31. package/dist/commands/embeddings.d.ts.map +1 -0
  32. package/dist/commands/embeddings.js +118 -0
  33. package/dist/commands/embeddings.js.map +1 -0
  34. package/dist/commands/experts.d.ts +3 -0
  35. package/dist/commands/experts.d.ts.map +1 -0
  36. package/dist/commands/experts.js +129 -0
  37. package/dist/commands/experts.js.map +1 -0
  38. package/dist/commands/export-import.d.ts +4 -0
  39. package/dist/commands/export-import.d.ts.map +1 -0
  40. package/dist/commands/export-import.js +285 -0
  41. package/dist/commands/export-import.js.map +1 -0
  42. package/dist/commands/git.d.ts +4 -0
  43. package/dist/commands/git.d.ts.map +1 -0
  44. package/dist/commands/git.js +274 -0
  45. package/dist/commands/git.js.map +1 -0
  46. package/dist/commands/impact.d.ts +3 -0
  47. package/dist/commands/impact.d.ts.map +1 -0
  48. package/dist/commands/impact.js +121 -0
  49. package/dist/commands/impact.js.map +1 -0
  50. package/dist/commands/insights.d.ts +3 -0
  51. package/dist/commands/insights.d.ts.map +1 -0
  52. package/dist/commands/insights.js +113 -0
  53. package/dist/commands/insights.js.map +1 -0
  54. package/dist/commands/learned.d.ts +3 -0
  55. package/dist/commands/learned.d.ts.map +1 -0
  56. package/dist/commands/learned.js +355 -0
  57. package/dist/commands/learned.js.map +1 -0
  58. package/dist/commands/onboard.d.ts +3 -0
  59. package/dist/commands/onboard.d.ts.map +1 -0
  60. package/dist/commands/onboard.js +141 -0
  61. package/dist/commands/onboard.js.map +1 -0
  62. package/dist/commands/recent.d.ts +3 -0
  63. package/dist/commands/recent.d.ts.map +1 -0
  64. package/dist/commands/recent.js +83 -0
  65. package/dist/commands/recent.js.map +1 -0
  66. package/dist/commands/secrets.d.ts +3 -0
  67. package/dist/commands/secrets.d.ts.map +1 -0
  68. package/dist/commands/secrets.js +203 -0
  69. package/dist/commands/secrets.js.map +1 -0
  70. package/dist/commands/stats.d.ts +3 -0
  71. package/dist/commands/stats.d.ts.map +1 -0
  72. package/dist/commands/stats.js +120 -0
  73. package/dist/commands/stats.js.map +1 -0
  74. package/dist/config/index.d.ts +12 -0
  75. package/dist/config/index.d.ts.map +1 -0
  76. package/dist/config/index.js +46 -0
  77. package/dist/config/index.js.map +1 -0
  78. package/dist/database/migrations.d.ts +13 -0
  79. package/dist/database/migrations.d.ts.map +1 -0
  80. package/dist/database/migrations.js +190 -0
  81. package/dist/database/migrations.js.map +1 -0
  82. package/dist/database/postgresql.d.ts +92 -0
  83. package/dist/database/postgresql.d.ts.map +1 -0
  84. package/dist/database/postgresql.js +382 -0
  85. package/dist/database/postgresql.js.map +1 -0
  86. package/dist/database/sqlite.d.ts +54 -0
  87. package/dist/database/sqlite.d.ts.map +1 -0
  88. package/dist/database/sqlite.js +337 -0
  89. package/dist/database/sqlite.js.map +1 -0
  90. package/dist/lambda/admin.d.ts +3 -0
  91. package/dist/lambda/admin.d.ts.map +1 -0
  92. package/dist/lambda/admin.js +818 -0
  93. package/dist/lambda/admin.js.map +1 -0
  94. package/dist/lambda/ai-services.d.ts +6 -0
  95. package/dist/lambda/ai-services.d.ts.map +1 -0
  96. package/dist/lambda/ai-services.js +472 -0
  97. package/dist/lambda/ai-services.js.map +1 -0
  98. package/dist/lambda/analytics.d.ts +3 -0
  99. package/dist/lambda/analytics.d.ts.map +1 -0
  100. package/dist/lambda/analytics.js +481 -0
  101. package/dist/lambda/analytics.js.map +1 -0
  102. package/dist/lambda/api-router.d.ts +3 -0
  103. package/dist/lambda/api-router.d.ts.map +1 -0
  104. package/dist/lambda/api-router.js +162 -0
  105. package/dist/lambda/api-router.js.map +1 -0
  106. package/dist/lambda/custom-topics.d.ts +3 -0
  107. package/dist/lambda/custom-topics.d.ts.map +1 -0
  108. package/dist/lambda/custom-topics.js +425 -0
  109. package/dist/lambda/custom-topics.js.map +1 -0
  110. package/dist/lambda/graph-builder.d.ts +3 -0
  111. package/dist/lambda/graph-builder.d.ts.map +1 -0
  112. package/dist/lambda/graph-builder.js +442 -0
  113. package/dist/lambda/graph-builder.js.map +1 -0
  114. package/dist/lambda/knowledge-ai.d.ts +3 -0
  115. package/dist/lambda/knowledge-ai.d.ts.map +1 -0
  116. package/dist/lambda/knowledge-ai.js +849 -0
  117. package/dist/lambda/knowledge-ai.js.map +1 -0
  118. package/dist/lambda/post-confirmation.d.ts +8 -0
  119. package/dist/lambda/post-confirmation.d.ts.map +1 -0
  120. package/dist/lambda/post-confirmation.js +92 -0
  121. package/dist/lambda/post-confirmation.js.map +1 -0
  122. package/dist/lambda/teams.d.ts +3 -0
  123. package/dist/lambda/teams.d.ts.map +1 -0
  124. package/dist/lambda/teams.js +568 -0
  125. package/dist/lambda/teams.js.map +1 -0
  126. package/dist/lib/export-helpers.d.ts +5 -0
  127. package/dist/lib/export-helpers.d.ts.map +1 -0
  128. package/dist/lib/export-helpers.js +137 -0
  129. package/dist/lib/export-helpers.js.map +1 -0
  130. package/dist/lib/import-helpers.d.ts +5 -0
  131. package/dist/lib/import-helpers.d.ts.map +1 -0
  132. package/dist/lib/import-helpers.js +185 -0
  133. package/dist/lib/import-helpers.js.map +1 -0
  134. package/dist/lib/insights-helpers.d.ts +123 -0
  135. package/dist/lib/insights-helpers.d.ts.map +1 -0
  136. package/dist/lib/insights-helpers.js +374 -0
  137. package/dist/lib/insights-helpers.js.map +1 -0
  138. package/dist/lib/search-helpers.d.ts +4 -0
  139. package/dist/lib/search-helpers.d.ts.map +1 -0
  140. package/dist/lib/search-helpers.js +124 -0
  141. package/dist/lib/search-helpers.js.map +1 -0
  142. package/dist/lib/secret-helpers.d.ts +2 -0
  143. package/dist/lib/secret-helpers.d.ts.map +1 -0
  144. package/dist/lib/secret-helpers.js +85 -0
  145. package/dist/lib/secret-helpers.js.map +1 -0
  146. package/dist/lib/stats-helpers.d.ts +41 -0
  147. package/dist/lib/stats-helpers.d.ts.map +1 -0
  148. package/dist/lib/stats-helpers.js +263 -0
  149. package/dist/lib/stats-helpers.js.map +1 -0
  150. package/dist/services/aws-api.d.ts +81 -0
  151. package/dist/services/aws-api.d.ts.map +1 -0
  152. package/dist/services/aws-api.js +388 -0
  153. package/dist/services/aws-api.js.map +1 -0
  154. package/dist/services/bedrock.d.ts +83 -0
  155. package/dist/services/bedrock.d.ts.map +1 -0
  156. package/dist/services/bedrock.js +434 -0
  157. package/dist/services/bedrock.js.map +1 -0
  158. package/dist/services/commit-learnings.d.ts +25 -0
  159. package/dist/services/commit-learnings.d.ts.map +1 -0
  160. package/dist/services/commit-learnings.js +180 -0
  161. package/dist/services/commit-learnings.js.map +1 -0
  162. package/dist/services/embedding-storage.d.ts +42 -0
  163. package/dist/services/embedding-storage.d.ts.map +1 -0
  164. package/dist/services/embedding-storage.js +124 -0
  165. package/dist/services/embedding-storage.js.map +1 -0
  166. package/dist/services/expert-engine.d.ts +21 -0
  167. package/dist/services/expert-engine.d.ts.map +1 -0
  168. package/dist/services/expert-engine.js +58 -0
  169. package/dist/services/expert-engine.js.map +1 -0
  170. package/dist/services/onboarding-accelerator.d.ts +118 -0
  171. package/dist/services/onboarding-accelerator.d.ts.map +1 -0
  172. package/dist/services/onboarding-accelerator.js +403 -0
  173. package/dist/services/onboarding-accelerator.js.map +1 -0
  174. package/dist/services/secret-detection.d.ts +46 -0
  175. package/dist/services/secret-detection.d.ts.map +1 -0
  176. package/dist/services/secret-detection.js +75 -0
  177. package/dist/services/secret-detection.js.map +1 -0
  178. package/dist/services/secret-manager-simple.d.ts +51 -0
  179. package/dist/services/secret-manager-simple.d.ts.map +1 -0
  180. package/dist/services/secret-manager-simple.js +119 -0
  181. package/dist/services/secret-manager-simple.js.map +1 -0
  182. package/dist/services/secret-manager.d.ts +150 -0
  183. package/dist/services/secret-manager.d.ts.map +1 -0
  184. package/dist/services/secret-manager.js +287 -0
  185. package/dist/services/secret-manager.js.map +1 -0
  186. package/dist/services/vector-embeddings.d.ts +70 -0
  187. package/dist/services/vector-embeddings.d.ts.map +1 -0
  188. package/dist/services/vector-embeddings.js +167 -0
  189. package/dist/services/vector-embeddings.js.map +1 -0
  190. package/dist/services/vector-search.d.ts +28 -0
  191. package/dist/services/vector-search.d.ts.map +1 -0
  192. package/dist/services/vector-search.js +192 -0
  193. package/dist/services/vector-search.js.map +1 -0
  194. package/dist/types/index.d.ts +86 -0
  195. package/dist/types/index.d.ts.map +1 -0
  196. package/dist/types/index.js +4 -0
  197. package/dist/types/index.js.map +1 -0
  198. package/dist/utils/formatting.d.ts +10 -0
  199. package/dist/utils/formatting.d.ts.map +1 -0
  200. package/dist/utils/formatting.js +82 -0
  201. package/dist/utils/formatting.js.map +1 -0
  202. package/dist/utils/git.d.ts +52 -0
  203. package/dist/utils/git.d.ts.map +1 -0
  204. package/dist/utils/git.js +182 -0
  205. package/dist/utils/git.js.map +1 -0
  206. package/dist/utils/validation.d.ts +17 -0
  207. package/dist/utils/validation.d.ts.map +1 -0
  208. package/dist/utils/validation.js +187 -0
  209. package/dist/utils/validation.js.map +1 -0
  210. package/package.json +81 -0
@@ -0,0 +1,434 @@
1
+ "use strict";
2
+ // Amazon Bedrock integration for AI-enhanced knowledge processing
3
+ // Routes through authenticated backend API
4
+ Object.defineProperty(exports, "__esModule", { value: true });
5
+ exports.bedrockService = exports.BedrockService = void 0;
6
+ const vector_embeddings_1 = require("./vector-embeddings");
7
+ const aws_api_1 = require("./aws-api");
8
+ class BedrockService {
9
+ constructor() {
10
+ // API endpoint managed by awsApiService
11
+ }
12
+ /**
13
+ * Enhance learning entry with AI-generated metadata
14
+ * Routes through authenticated backend API
15
+ */
16
+ async enhanceKnowledgeEntry(content, authorId) {
17
+ try {
18
+ if (!aws_api_1.awsApiService.isAuthenticated()) {
19
+ console.warn('Not authenticated, using fallback');
20
+ return this.getFallbackResponse(content);
21
+ }
22
+ const response = await aws_api_1.awsApiService.callAPI('/ai/enhance', 'POST', {
23
+ content,
24
+ authorId
25
+ });
26
+ if (response.success && response.data) {
27
+ return {
28
+ topics: response.data.topics || [],
29
+ tags: response.data.tags || [],
30
+ impactScore: response.data.impactScore || 5,
31
+ expertiseLevel: response.data.expertiseLevel || 'intermediate',
32
+ relatedExperts: response.data.relatedExperts || [],
33
+ summary: response.data.summary
34
+ };
35
+ }
36
+ throw new Error(response.error || 'Failed to enhance knowledge');
37
+ }
38
+ catch (error) {
39
+ console.warn('Bedrock enhancement failed, using fallback:', error);
40
+ return this.getFallbackResponse(content);
41
+ }
42
+ }
43
+ /**
44
+ * Enhanced natural language querying with efficient semantic search
45
+ * Uses two-stage filtering: hybrid search pre-filtering + AI ranking for top candidates
46
+ */
47
+ async processNaturalLanguageQuery(question, searchFunction) {
48
+ try {
49
+ // First analyze the question to extract key terms
50
+ const analysis = await this.analyzeQuestion(question);
51
+ // Stage 1: Efficient hybrid search pre-filtering using database + vector search
52
+ // This reduces the candidate set from thousands to ~20-50 entries
53
+ const keywordCandidates = await this.getHybridCandidates(question, analysis, searchFunction);
54
+ // Stage 2: AI-powered semantic ranking on the small candidate set
55
+ // Only send top candidates to Bedrock to control costs
56
+ const rankedResults = await this.rankTopCandidates(question, analysis, keywordCandidates);
57
+ // Suggest experts based on topics
58
+ const suggestedExperts = await this.suggestExpertsForTopics(analysis.topics);
59
+ return {
60
+ analysis,
61
+ rankedResults,
62
+ suggestedExperts
63
+ };
64
+ }
65
+ catch (error) {
66
+ console.warn('Enhanced query processing failed, using fallback:', error);
67
+ return this.getFallbackQueryResult(question, []);
68
+ }
69
+ }
70
+ /**
71
+ * Public method for question analysis
72
+ */
73
+ async analyzeQuestion(question) {
74
+ try {
75
+ // Call through API for question analysis
76
+ const response = await aws_api_1.awsApiService.callAPI('/ai/analyze-question', 'POST', {
77
+ question
78
+ });
79
+ return response.analysis || this.getFallbackQuestionAnalysis(question);
80
+ }
81
+ catch (error) {
82
+ console.warn('Question analysis failed, using fallback:', error);
83
+ return this.getFallbackQuestionAnalysis(question);
84
+ }
85
+ }
86
+ /**
87
+ * Stage 1: Efficient hybrid candidate filtering
88
+ * Uses database search + vector similarity to get best candidates
89
+ */
90
+ async getHybridCandidates(question, analysis, searchFunction) {
91
+ try {
92
+ // Generate embedding for semantic search
93
+ const questionEmbedding = await this.generateQuestionEmbedding(question);
94
+ // Use hybrid search if embedding generation succeeded
95
+ if (questionEmbedding.length > 0) {
96
+ return await searchFunction(question, questionEmbedding, 30);
97
+ }
98
+ }
99
+ catch (error) {
100
+ console.warn('Hybrid search failed, falling back to keyword search:', error);
101
+ }
102
+ // Fallback to multi-term keyword search
103
+ const searchTerms = [
104
+ question,
105
+ ...analysis.topics,
106
+ ...analysis.suggestedSearchTerms
107
+ ];
108
+ const candidateSet = new Map();
109
+ const maxCandidatesPerTerm = 10;
110
+ const maxTotalCandidates = 30;
111
+ // Search with multiple terms to get diverse candidates
112
+ for (const term of searchTerms.slice(0, 5)) { // Limit search terms to control cost
113
+ try {
114
+ const results = await searchFunction(term, undefined, maxCandidatesPerTerm);
115
+ results.forEach(entry => {
116
+ if (candidateSet.size < maxTotalCandidates) {
117
+ candidateSet.set(entry.id || entry.content, entry);
118
+ }
119
+ });
120
+ }
121
+ catch (error) {
122
+ console.warn(`Search failed for term: ${term}`, error);
123
+ }
124
+ }
125
+ return Array.from(candidateSet.values());
126
+ }
127
+ /**
128
+ * Generate embedding for question using real Titan embeddings
129
+ */
130
+ async generateQuestionEmbedding(question) {
131
+ try {
132
+ // Use the real vector embedding service
133
+ return await vector_embeddings_1.vectorEmbeddingService.generateEmbedding(question);
134
+ }
135
+ catch (error) {
136
+ console.warn('Failed to generate question embedding:', error);
137
+ return []; // Fallback to keyword search
138
+ }
139
+ }
140
+ /**
141
+ * Stage 2: AI-powered semantic ranking on small candidate set
142
+ * Only processes top candidates to control Bedrock costs
143
+ */
144
+ async rankTopCandidates(question, _analysis, candidates) {
145
+ if (candidates.length === 0)
146
+ return [];
147
+ // Limit candidates sent to Bedrock to control costs
148
+ const maxBedrockCandidates = 15;
149
+ const topCandidates = candidates.slice(0, maxBedrockCandidates);
150
+ try {
151
+ // TODO: Route through API for ranking
152
+ // const prompt = this.buildEfficientRankingPrompt(question, analysis, topCandidates);
153
+ // const response = await awsApiService.callAPI('/ai/rank', 'POST', { question, analysis, candidates: topCandidates });
154
+ return this.getBasicRelevanceRanking(question, topCandidates);
155
+ }
156
+ catch (error) {
157
+ console.warn('AI ranking failed, using basic scoring:', error);
158
+ return this.getBasicRelevanceRanking(question, topCandidates);
159
+ }
160
+ }
161
+ /**
162
+ * Optimized ranking prompt that processes fewer entries more efficiently
163
+ */
164
+ _buildEfficientRankingPrompt(question, analysis, candidates) {
165
+ // Create concise summaries to fit more entries in the prompt
166
+ const candidateSummaries = candidates.map((entry, index) => ({
167
+ index,
168
+ content: entry.content.substring(0, 150), // Shorter content to save tokens
169
+ topics: (entry.aiTopics || []).slice(0, 3), // Limit topics
170
+ impact: entry.impactScore || 0
171
+ }));
172
+ return `Rank knowledge entries by relevance to this developer question.
173
+
174
+ Question: "${question}"
175
+ Intent: ${analysis.intent}
176
+ Key Topics: ${analysis.topics.slice(0, 3).join(', ')}
177
+
178
+ Candidates (${candidates.length} entries):
179
+ ${candidateSummaries.map(c => `${c.index}: "${c.content}" [Topics: ${c.topics.join(', ')}] [Impact: ${c.impact}]`).join('\n')}
180
+
181
+ Return JSON array with objects containing:
182
+ - entryIndex: number
183
+ - relevanceScore: 0-10 (only include if >= 6)
184
+ - matchReason: brief explanation
185
+
186
+ Focus on semantic relevance, not just keyword matching. Prioritize high-impact entries.
187
+ Respond with JSON only.`;
188
+ }
189
+ /**
190
+ * Suggest experts based on identified topics
191
+ */
192
+ async suggestExpertsForTopics(topics) {
193
+ const expertMapping = {
194
+ 'react': ['Frontend Lead', 'React Specialist', 'UI/UX Developer'],
195
+ 'typescript': ['TypeScript Expert', 'Frontend Architect', 'Full-stack Developer'],
196
+ 'docker': ['DevOps Engineer', 'Infrastructure Specialist', 'Platform Engineer'],
197
+ 'aws': ['Cloud Architect', 'AWS Specialist', 'DevOps Engineer'],
198
+ 'database': ['Database Administrator', 'Backend Developer', 'Data Engineer'],
199
+ 'api': ['Backend Developer', 'API Architect', 'Full-stack Developer'],
200
+ 'security': ['Security Engineer', 'DevSecOps Specialist', 'Infrastructure Lead'],
201
+ 'performance': ['Performance Engineer', 'Senior Developer', 'System Architect']
202
+ };
203
+ const suggestedExperts = new Set();
204
+ topics.forEach(topic => {
205
+ const topicLower = topic.toLowerCase();
206
+ Object.keys(expertMapping).forEach(key => {
207
+ if (topicLower.includes(key)) {
208
+ expertMapping[key].forEach(expert => suggestedExperts.add(expert));
209
+ }
210
+ });
211
+ });
212
+ return Array.from(suggestedExperts).slice(0, 3);
213
+ }
214
+ /**
215
+ * Generate insights from learning patterns
216
+ */
217
+ async generateInsights(entries, _teamId) {
218
+ try {
219
+ // TODO: Route through API for insights generation
220
+ // const response = await awsApiService.callAPI('/ai/insights', 'POST', { entries, teamId });
221
+ return this.getFallbackInsights(entries);
222
+ }
223
+ catch (error) {
224
+ console.warn('Insights generation failed, using fallback:', error);
225
+ return this.getFallbackInsights(entries);
226
+ }
227
+ }
228
+ _buildKnowledgeEnhancementPrompt(content, authorId) {
229
+ return `You are an AI assistant helping developers organize and enhance their knowledge entries.
230
+
231
+ Analyze this learning entry and provide structured metadata:
232
+
233
+ Content: "${content}"
234
+ Author: ${authorId}
235
+
236
+ Please respond with a JSON object containing:
237
+ - topics: Array of 3-5 relevant technical topics/keywords
238
+ - tags: Array of 2-4 concise tags for categorization
239
+ - impactScore: Number from 1-10 indicating potential impact/usefulness
240
+ - expertiseLevel: "beginner", "intermediate", or "expert" based on content complexity
241
+ - relatedExperts: Array of potential expert roles who might know about this topic
242
+ - summary: Brief 1-sentence summary if content is long
243
+
244
+ Focus on:
245
+ - Technical accuracy and relevance
246
+ - Practical usefulness for developers
247
+ - Clear categorization for searchability
248
+
249
+ Respond only with valid JSON, no additional text.`;
250
+ }
251
+ _buildQuestionAnalysisPrompt(question) {
252
+ return `You are an AI assistant helping developers find relevant knowledge by analyzing their questions.
253
+
254
+ Analyze this developer question:
255
+ "${question}"
256
+
257
+ Please respond with a JSON object containing:
258
+ - intent: Brief description of what the developer is trying to accomplish
259
+ - topics: Array of 3-5 technical topics related to this question
260
+ - confidence: Number from 0-1 indicating how well you understand the question
261
+ - suggestedSearchTerms: Array of 3-5 alternative search terms that might find relevant knowledge
262
+
263
+ Focus on:
264
+ - Understanding the developer's actual need
265
+ - Identifying key technical concepts
266
+ - Providing good search alternatives
267
+
268
+ Respond only with valid JSON, no additional text.`;
269
+ }
270
+ _buildInsightsPrompt(entries, teamId) {
271
+ const recentTopics = entries.slice(0, 10).map(e => e.aiTopics || []).flat();
272
+ const topicCounts = recentTopics.reduce((acc, topic) => {
273
+ acc[topic] = (acc[topic] || 0) + 1;
274
+ return acc;
275
+ }, {});
276
+ return `You are an AI assistant analyzing team learning patterns to provide insights.
277
+
278
+ Team: ${teamId}
279
+ Recent learning topics: ${Object.keys(topicCounts).slice(0, 10).join(', ')}
280
+ Total entries analyzed: ${entries.length}
281
+
282
+ Generate 3-5 actionable insights about this team's learning patterns. Focus on:
283
+ - Learning trends and focus areas
284
+ - Knowledge gaps that might exist
285
+ - Recommendations for skill development
286
+ - Opportunities for knowledge sharing
287
+
288
+ Respond with a JSON array of insight strings, each being a complete, actionable sentence.
289
+ Example: ["Your team is actively learning React optimization patterns", "Consider exploring database performance tuning"]
290
+
291
+ Respond only with valid JSON array, no additional text.`;
292
+ }
293
+ _parseKnowledgeResponse(response) {
294
+ try {
295
+ const parsed = JSON.parse(response);
296
+ return {
297
+ topics: parsed.topics || [],
298
+ tags: parsed.tags || [],
299
+ impactScore: Math.max(1, Math.min(10, parsed.impactScore || 5)),
300
+ expertiseLevel: ['beginner', 'intermediate', 'expert'].includes(parsed.expertiseLevel)
301
+ ? parsed.expertiseLevel
302
+ : 'beginner',
303
+ relatedExperts: parsed.relatedExperts || [],
304
+ summary: parsed.summary
305
+ };
306
+ }
307
+ catch (error) {
308
+ console.warn('Failed to parse Bedrock response:', error);
309
+ return this.getFallbackResponse('');
310
+ }
311
+ }
312
+ _parseQuestionResponse(response) {
313
+ try {
314
+ const parsed = JSON.parse(response);
315
+ return {
316
+ intent: parsed.intent || 'General question',
317
+ topics: parsed.topics || [],
318
+ confidence: Math.max(0, Math.min(1, parsed.confidence || 0.5)),
319
+ suggestedSearchTerms: parsed.suggestedSearchTerms || []
320
+ };
321
+ }
322
+ catch (error) {
323
+ console.warn('Failed to parse question analysis:', error);
324
+ return this.getFallbackQuestionAnalysis('');
325
+ }
326
+ }
327
+ _parseRelevanceResponse(response, entries) {
328
+ try {
329
+ const parsed = JSON.parse(response);
330
+ if (!Array.isArray(parsed))
331
+ return [];
332
+ return parsed
333
+ .filter(item => item.entryIndex < entries.length && item.relevanceScore >= 6)
334
+ .map(item => ({
335
+ entry: entries[item.entryIndex],
336
+ relevanceScore: item.relevanceScore,
337
+ matchReason: item.matchReason || 'Relevant match found'
338
+ }))
339
+ .sort((a, b) => b.relevanceScore - a.relevanceScore);
340
+ }
341
+ catch (error) {
342
+ console.warn('Failed to parse relevance response:', error);
343
+ return [];
344
+ }
345
+ }
346
+ _parseInsightsResponse(response) {
347
+ try {
348
+ const parsed = JSON.parse(response);
349
+ return Array.isArray(parsed) ? parsed : [];
350
+ }
351
+ catch (error) {
352
+ console.warn('Failed to parse insights response:', error);
353
+ return this.getFallbackInsights([]);
354
+ }
355
+ }
356
+ getFallbackResponse(content) {
357
+ // Simple keyword extraction as fallback
358
+ const words = content.toLowerCase().split(/\s+/);
359
+ const techKeywords = ['react', 'typescript', 'javascript', 'python', 'aws', 'docker', 'api', 'database', 'css', 'html'];
360
+ const foundTopics = techKeywords.filter(keyword => words.some(word => word.includes(keyword)));
361
+ return {
362
+ topics: foundTopics.slice(0, 3),
363
+ tags: foundTopics.slice(0, 2),
364
+ impactScore: Math.floor(Math.random() * 5) + 3, // 3-7 range
365
+ expertiseLevel: content.length > 200 ? 'intermediate' : 'beginner',
366
+ relatedExperts: ['senior-developer', 'tech-lead'],
367
+ };
368
+ }
369
+ getFallbackQuestionAnalysis(question) {
370
+ const words = question.toLowerCase().split(/\s+/);
371
+ const techKeywords = ['react', 'typescript', 'javascript', 'python', 'aws', 'docker', 'api', 'database'];
372
+ const foundTopics = techKeywords.filter(keyword => words.some(word => word.includes(keyword)));
373
+ return {
374
+ intent: 'Developer seeking technical guidance',
375
+ topics: foundTopics.slice(0, 3),
376
+ confidence: 0.6,
377
+ suggestedSearchTerms: foundTopics.concat(words.filter(w => w.length > 3).slice(0, 2))
378
+ };
379
+ }
380
+ getBasicRelevanceRanking(question, entries) {
381
+ const questionWords = question.toLowerCase().split(/\s+/);
382
+ return entries
383
+ .map(entry => {
384
+ const contentWords = entry.content.toLowerCase().split(/\s+/);
385
+ const topicWords = (entry.aiTopics || []).join(' ').toLowerCase().split(/\s+/);
386
+ let score = 0;
387
+ questionWords.forEach(qWord => {
388
+ if (qWord.length > 3) {
389
+ if (contentWords.some((cWord) => cWord.includes(qWord)))
390
+ score += 2;
391
+ if (topicWords.some((tWord) => tWord.includes(qWord)))
392
+ score += 3;
393
+ }
394
+ });
395
+ return {
396
+ entry,
397
+ relevanceScore: Math.min(10, score),
398
+ matchReason: score > 0 ? 'Keyword match found' : 'No direct match'
399
+ };
400
+ })
401
+ .filter(item => item.relevanceScore >= 3)
402
+ .sort((a, b) => b.relevanceScore - a.relevanceScore);
403
+ }
404
+ getFallbackQueryResult(question, entries) {
405
+ const analysis = this.getFallbackQuestionAnalysis(question);
406
+ const rankedResults = this.getBasicRelevanceRanking(question, entries);
407
+ const suggestedExperts = ['Senior Developer', 'Tech Lead', 'Subject Matter Expert'];
408
+ return { analysis, rankedResults, suggestedExperts };
409
+ }
410
+ getFallbackInsights(_entries) {
411
+ const fallbackInsights = [
412
+ 'Your team is actively sharing knowledge and learning new technologies',
413
+ 'Consider documenting more architectural decisions and design patterns',
414
+ 'Knowledge sharing frequency has increased - great for team collaboration',
415
+ 'Look for opportunities to cross-train team members on different technologies'
416
+ ];
417
+ return fallbackInsights.slice(0, 3);
418
+ }
419
+ /**
420
+ * Check if Bedrock is available and configured
421
+ */
422
+ async isAvailable() {
423
+ try {
424
+ // Check if API is available
425
+ return aws_api_1.awsApiService.isAuthenticated();
426
+ }
427
+ catch (error) {
428
+ return false;
429
+ }
430
+ }
431
+ }
432
+ exports.BedrockService = BedrockService;
433
+ exports.bedrockService = new BedrockService();
434
+ //# sourceMappingURL=bedrock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bedrock.js","sourceRoot":"","sources":["../../src/services/bedrock.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Service for generating learning entries from git commits
3
+ */
4
+ import { GitCommit } from '../utils/git';
5
+ export interface CommitLearning {
6
+ content: string;
7
+ context: string;
8
+ topics: string[];
9
+ commitHash: string;
10
+ commitMessage: string;
11
+ isFromGitPush: boolean;
12
+ }
13
+ /**
14
+ * Generate a learning entry from a well-structured commit
15
+ * @param commit - The git commit to analyze
16
+ * @returns A learning entry object or null if not suitable
17
+ */
18
+ export declare function generateLearningFromCommit(commit: GitCommit): Promise<CommitLearning | null>;
19
+ /**
20
+ * Process multiple commits and generate learning entries
21
+ * @param commits - Array of commits to process
22
+ * @returns Array of learning entries generated from well-structured commits
23
+ */
24
+ export declare function generateLearningsFromCommits(commits: GitCommit[]): Promise<CommitLearning[]>;
25
+ //# sourceMappingURL=commit-learnings.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commit-learnings.d.ts","sourceRoot":"","sources":["../../src/services/commit-learnings.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,SAAS,EAAgE,MAAM,cAAc,CAAC;AAEvG,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,OAAO,CAAC;CACxB;AAED;;;;GAIG;AACH,wBAAsB,0BAA0B,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CA+DlG;AAkHD;;;;GAIG;AACH,wBAAsB,4BAA4B,CAAC,OAAO,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CAWlG"}
@@ -0,0 +1,180 @@
1
+ "use strict";
2
+ /**
3
+ * Service for generating learning entries from git commits
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.generateLearningFromCommit = generateLearningFromCommit;
7
+ exports.generateLearningsFromCommits = generateLearningsFromCommits;
8
+ const bedrock_1 = require("./bedrock");
9
+ const git_1 = require("../utils/git");
10
+ /**
11
+ * Generate a learning entry from a well-structured commit
12
+ * @param commit - The git commit to analyze
13
+ * @returns A learning entry object or null if not suitable
14
+ */
15
+ async function generateLearningFromCommit(commit) {
16
+ // First, check if the commit is well-structured
17
+ const analysis = (0, git_1.analyzeCommitStructure)(commit);
18
+ if (!analysis.isWellStructured) {
19
+ return null;
20
+ }
21
+ // Extract context from the commit
22
+ const context = (0, git_1.extractCommitContext)(commit);
23
+ // Use Bedrock AI to generate a comprehensive learning entry
24
+ const bedrockAvailable = await bedrock_1.bedrockService.isAvailable();
25
+ let learningContent;
26
+ let topics = [];
27
+ if (bedrockAvailable) {
28
+ try {
29
+ // Create a prompt for Bedrock to generate learning content
30
+ const prompt = `Analyze this git commit and create a comprehensive learning entry that captures the key knowledge and insights:
31
+
32
+ ${context}
33
+
34
+ Please provide:
35
+ 1. A detailed explanation of what was learned or implemented
36
+ 2. Why this change was made (the reasoning behind it)
37
+ 3. Any technical patterns, best practices, or important considerations
38
+ 4. Potential gotchas or things to watch out for
39
+ 5. How this knowledge could be applied in the future
40
+
41
+ Write this as a learning entry that would be valuable for team members and future reference. Focus on the knowledge gained, not just the change made.`;
42
+ // Use Bedrock to generate enhanced learning content
43
+ const enhancedResult = await bedrock_1.bedrockService.enhanceKnowledgeEntry(prompt, 'git-system');
44
+ if (enhancedResult && enhancedResult.summary) {
45
+ learningContent = enhancedResult.summary;
46
+ topics = enhancedResult.topics || [];
47
+ }
48
+ else {
49
+ // Fallback to basic learning content
50
+ learningContent = generateBasicLearningContent(commit, analysis, context);
51
+ topics = extractTopicsFromCommit(commit, analysis);
52
+ }
53
+ }
54
+ catch (error) {
55
+ console.warn('Bedrock enhancement failed, using basic learning generation:', error);
56
+ learningContent = generateBasicLearningContent(commit, analysis, context);
57
+ topics = extractTopicsFromCommit(commit, analysis);
58
+ }
59
+ }
60
+ else {
61
+ // Generate basic learning content without Bedrock
62
+ learningContent = generateBasicLearningContent(commit, analysis, context);
63
+ topics = extractTopicsFromCommit(commit, analysis);
64
+ }
65
+ return {
66
+ content: learningContent,
67
+ context,
68
+ topics,
69
+ commitHash: commit.hash,
70
+ commitMessage: commit.message,
71
+ isFromGitPush: true
72
+ };
73
+ }
74
+ /**
75
+ * Generate basic learning content when Bedrock is not available
76
+ */
77
+ function generateBasicLearningContent(commit, analysis, context) {
78
+ let content = `**Learning from commit: ${commit.message}**\n\n`;
79
+ if (analysis.conventionalType) {
80
+ content += `**Type:** ${analysis.conventionalType}\n`;
81
+ if (analysis.scope) {
82
+ content += `**Scope:** ${analysis.scope}\n`;
83
+ }
84
+ content += `**Description:** ${analysis.description}\n\n`;
85
+ }
86
+ content += `**What was done:**\n`;
87
+ content += `${commit.message}\n\n`;
88
+ content += `**Files affected:**\n`;
89
+ commit.files.forEach(file => {
90
+ content += `- ${file}\n`;
91
+ });
92
+ content += '\n';
93
+ content += `**Key takeaways:**\n`;
94
+ content += `- This change demonstrates ${analysis.conventionalType || 'a development'} in the codebase\n`;
95
+ content += `- Modified ${commit.files.length} file(s)\n`;
96
+ if (analysis.reasons.length > 0) {
97
+ content += `\n**Quality indicators:**\n`;
98
+ analysis.reasons.forEach((reason) => {
99
+ content += `- ${reason}\n`;
100
+ });
101
+ }
102
+ content += `\n**Context:**\n`;
103
+ content += `Author: ${commit.author}\n`;
104
+ content += `Date: ${commit.date.toLocaleDateString()}\n`;
105
+ return content;
106
+ }
107
+ /**
108
+ * Extract topics from commit information
109
+ */
110
+ function extractTopicsFromCommit(commit, analysis) {
111
+ const topics = [];
112
+ // Add conventional commit type as a topic
113
+ if (analysis.conventionalType) {
114
+ topics.push(analysis.conventionalType);
115
+ }
116
+ // Add scope as a topic if present
117
+ if (analysis.scope) {
118
+ topics.push(analysis.scope);
119
+ }
120
+ // Extract topics from file extensions
121
+ const extensions = new Set();
122
+ commit.files.forEach(file => {
123
+ const ext = file.split('.').pop();
124
+ if (ext && ext.length < 10) {
125
+ extensions.add(ext);
126
+ }
127
+ });
128
+ extensions.forEach(ext => {
129
+ const topicMap = {
130
+ 'ts': 'TypeScript',
131
+ 'js': 'JavaScript',
132
+ 'py': 'Python',
133
+ 'go': 'Go',
134
+ 'java': 'Java',
135
+ 'rb': 'Ruby',
136
+ 'sh': 'Shell',
137
+ 'yml': 'YAML',
138
+ 'yaml': 'YAML',
139
+ 'json': 'JSON',
140
+ 'md': 'Documentation',
141
+ 'sql': 'SQL',
142
+ 'tf': 'Terraform',
143
+ };
144
+ if (topicMap[ext]) {
145
+ topics.push(topicMap[ext]);
146
+ }
147
+ });
148
+ // Extract topics from file paths (directories)
149
+ const directories = new Set();
150
+ commit.files.forEach(file => {
151
+ const parts = file.split('/');
152
+ if (parts.length > 1) {
153
+ directories.add(parts[0]);
154
+ }
155
+ });
156
+ // Add relevant directory names as topics
157
+ const relevantDirs = ['src', 'lib', 'tests', 'docs', 'api', 'ui', 'services', 'utils', 'components'];
158
+ directories.forEach(dir => {
159
+ if (relevantDirs.includes(dir.toLowerCase())) {
160
+ topics.push(dir);
161
+ }
162
+ });
163
+ return [...new Set(topics)]; // Remove duplicates
164
+ }
165
+ /**
166
+ * Process multiple commits and generate learning entries
167
+ * @param commits - Array of commits to process
168
+ * @returns Array of learning entries generated from well-structured commits
169
+ */
170
+ async function generateLearningsFromCommits(commits) {
171
+ const learnings = [];
172
+ for (const commit of commits) {
173
+ const learning = await generateLearningFromCommit(commit);
174
+ if (learning) {
175
+ learnings.push(learning);
176
+ }
177
+ }
178
+ return learnings;
179
+ }
180
+ //# sourceMappingURL=commit-learnings.js.map