@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,167 @@
1
+ "use strict";
2
+ // Vector embedding service using Amazon Bedrock Titan Embeddings
3
+ // Routes through authenticated backend API
4
+ var __importDefault = (this && this.__importDefault) || function (mod) {
5
+ return (mod && mod.__esModule) ? mod : { "default": mod };
6
+ };
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.vectorEmbeddingService = exports.VectorEmbeddingService = void 0;
9
+ const aws_api_1 = require("./aws-api");
10
+ const crypto_1 = __importDefault(require("crypto"));
11
+ class VectorEmbeddingService {
12
+ constructor() {
13
+ this.embeddingCache = new Map();
14
+ this.embeddingModel = 'amazon.titan-embed-text-v2:0';
15
+ // API endpoint managed by awsApiService
16
+ }
17
+ /**
18
+ * Generate embedding for a single text
19
+ * Routes through authenticated backend API
20
+ */
21
+ async generateEmbedding(text) {
22
+ try {
23
+ // Check cache first
24
+ const cacheKey = this.getCacheKey(text);
25
+ if (this.embeddingCache.has(cacheKey)) {
26
+ return this.embeddingCache.get(cacheKey);
27
+ }
28
+ if (!aws_api_1.awsApiService.isAuthenticated()) {
29
+ console.warn('Not authenticated for embedding generation');
30
+ return [];
31
+ }
32
+ const response = await aws_api_1.awsApiService.callAPI('/ai/embeddings', 'POST', {
33
+ texts: [text], // Send as array even for single text
34
+ batchMode: false
35
+ });
36
+ if (response.success && response.data && response.data.embeddings) {
37
+ // Backend returns array of embeddings when texts is an array
38
+ // Extract the first embedding for single text
39
+ const embedding = Array.isArray(response.data.embeddings[0])
40
+ ? response.data.embeddings[0]
41
+ : response.data.embeddings;
42
+ // Cache the result
43
+ this.embeddingCache.set(cacheKey, embedding);
44
+ return embedding;
45
+ }
46
+ throw new Error(response.error || 'Failed to generate embedding');
47
+ }
48
+ catch (error) {
49
+ console.error('Failed to generate embedding:', error);
50
+ throw error;
51
+ }
52
+ }
53
+ /**
54
+ * Generate embeddings for multiple texts in batches
55
+ * Routes through authenticated backend API
56
+ */
57
+ async batchGenerateEmbeddings(texts) {
58
+ try {
59
+ if (!aws_api_1.awsApiService.isAuthenticated()) {
60
+ console.warn('Not authenticated for batch embedding generation');
61
+ return texts.map(() => []);
62
+ }
63
+ const response = await aws_api_1.awsApiService.callAPI('/ai/embeddings', 'POST', {
64
+ texts,
65
+ batchMode: true
66
+ });
67
+ if (response.success && response.data && response.data.embeddings) {
68
+ return response.data.embeddings;
69
+ }
70
+ throw new Error(response.error || 'Failed to generate batch embeddings');
71
+ }
72
+ catch (error) {
73
+ console.error('Batch embedding generation failed:', error);
74
+ throw error;
75
+ }
76
+ }
77
+ /**
78
+ * Calculate cosine similarity between two vectors
79
+ */
80
+ cosineSimilarity(a, b) {
81
+ if (a.length !== b.length || a.length === 0) {
82
+ return 0;
83
+ }
84
+ const dotProduct = a.reduce((sum, val, i) => sum + val * b[i], 0);
85
+ const magnitudeA = Math.sqrt(a.reduce((sum, val) => sum + val * val, 0));
86
+ const magnitudeB = Math.sqrt(b.reduce((sum, val) => sum + val * val, 0));
87
+ if (magnitudeA === 0 || magnitudeB === 0) {
88
+ return 0;
89
+ }
90
+ return dotProduct / (magnitudeA * magnitudeB);
91
+ }
92
+ /**
93
+ * Find most similar embeddings from a collection
94
+ */
95
+ findMostSimilar(queryEmbedding, candidateEmbeddings, topK = 10, threshold = 0.7) {
96
+ const similarities = candidateEmbeddings
97
+ .map(candidate => ({
98
+ id: candidate.id,
99
+ similarity: this.cosineSimilarity(queryEmbedding, candidate.embedding)
100
+ }))
101
+ .filter(result => result.similarity >= threshold)
102
+ .sort((a, b) => b.similarity - a.similarity)
103
+ .slice(0, topK);
104
+ return similarities;
105
+ }
106
+ /**
107
+ * Preprocess text for better embedding quality
108
+ */
109
+ _preprocessText(text) {
110
+ // Clean and normalize text for better embeddings
111
+ return text
112
+ .trim()
113
+ .replace(/\s+/g, ' ') // Normalize whitespace
114
+ .substring(0, 50000); // Titan embedding v2 max input length (50,000 characters)
115
+ }
116
+ /**
117
+ * Generate cache key for text
118
+ */
119
+ getCacheKey(text) {
120
+ return crypto_1.default.createHash('sha256').update(text).digest('hex');
121
+ }
122
+ /**
123
+ * Utility delay function
124
+ */
125
+ _delay(ms) {
126
+ return new Promise(resolve => setTimeout(resolve, ms));
127
+ }
128
+ /**
129
+ * Check if embedding service is available
130
+ */
131
+ async isAvailable() {
132
+ try {
133
+ await this.generateEmbedding('test');
134
+ return true;
135
+ }
136
+ catch (error) {
137
+ console.warn('Vector embedding service not available:', error);
138
+ return false;
139
+ }
140
+ }
141
+ /**
142
+ * Get embedding model information
143
+ */
144
+ getModelInfo() {
145
+ return {
146
+ model: this.embeddingModel,
147
+ dimensions: 1024 // Titan embedding v2 dimensions
148
+ };
149
+ }
150
+ /**
151
+ * Clear embedding cache
152
+ */
153
+ clearCache() {
154
+ this.embeddingCache.clear();
155
+ }
156
+ /**
157
+ * Get cache statistics
158
+ */
159
+ getCacheStats() {
160
+ return {
161
+ size: this.embeddingCache.size
162
+ };
163
+ }
164
+ }
165
+ exports.VectorEmbeddingService = VectorEmbeddingService;
166
+ exports.vectorEmbeddingService = new VectorEmbeddingService();
167
+ //# sourceMappingURL=vector-embeddings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vector-embeddings.js","sourceRoot":"","sources":["../../src/services/vector-embeddings.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ export interface VectorSearchResult {
2
+ id: string;
3
+ content: string;
4
+ similarity: number;
5
+ aiTopics: string[];
6
+ customTopics?: string[];
7
+ impactScore: number;
8
+ authorId: string;
9
+ createdAt?: string;
10
+ }
11
+ /**
12
+ * Generate embedding for a query using backend API.
13
+ *
14
+ * Note: The `_region` parameter is intentionally unused. The region is
15
+ * determined by the backend Lambda, and this parameter is retained only
16
+ * for backward compatibility with existing callers.
17
+ */
18
+ export declare function generateQueryEmbedding(query: string, _region?: string): Promise<number[]>;
19
+ /**
20
+ * Perform vector similarity search on entries
21
+ * Now with S3 lazy-loading support for embeddings
22
+ */
23
+ export declare function vectorSearch(queryEmbedding: number[], entries: any[], topK?: number, minSimilarity?: number): Promise<VectorSearchResult[]>;
24
+ /**
25
+ * Hybrid search combining keyword and vector search with recency boost
26
+ */
27
+ export declare function hybridSearch(queryEmbedding: number[], queryText: string, entries: any[], topK?: number): Promise<VectorSearchResult[]>;
28
+ //# sourceMappingURL=vector-search.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vector-search.d.ts","sourceRoot":"","sources":["../../src/services/vector-search.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AA2BD;;;;;;GAMG;AACH,wBAAsB,sBAAsB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,GAAE,MAAoB,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAE5G;AAwBD;;;GAGG;AACH,wBAAsB,YAAY,CAChC,cAAc,EAAE,MAAM,EAAE,EACxB,OAAO,EAAE,GAAG,EAAE,EACd,IAAI,GAAE,MAAW,EACjB,aAAa,GAAE,MAAY,GAC1B,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAiF/B;AAED;;GAEG;AACH,wBAAsB,YAAY,CAChC,cAAc,EAAE,MAAM,EAAE,EACxB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,GAAG,EAAE,EACd,IAAI,GAAE,MAAW,GAChB,OAAO,CAAC,kBAAkB,EAAE,CAAC,CA8C/B"}
@@ -0,0 +1,192 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.generateQueryEmbedding = generateQueryEmbedding;
4
+ exports.vectorSearch = vectorSearch;
5
+ exports.hybridSearch = hybridSearch;
6
+ const vector_embeddings_1 = require("./vector-embeddings");
7
+ const embedding_storage_1 = require("./embedding-storage");
8
+ /**
9
+ * Calculate cosine similarity between two vectors
10
+ */
11
+ function cosineSimilarity(vecA, vecB) {
12
+ if (vecA.length !== vecB.length) {
13
+ console.warn(`Vector dimension mismatch: ${vecA.length} vs ${vecB.length}`);
14
+ throw new Error(`Vectors must have the same length (${vecA.length} vs ${vecB.length})`);
15
+ }
16
+ let dotProduct = 0;
17
+ let normA = 0;
18
+ let normB = 0;
19
+ for (let i = 0; i < vecA.length; i++) {
20
+ dotProduct += vecA[i] * vecB[i];
21
+ normA += vecA[i] * vecA[i];
22
+ normB += vecB[i] * vecB[i];
23
+ }
24
+ const denominator = Math.sqrt(normA) * Math.sqrt(normB);
25
+ if (denominator === 0)
26
+ return 0;
27
+ return dotProduct / denominator;
28
+ }
29
+ /**
30
+ * Generate embedding for a query using backend API.
31
+ *
32
+ * Note: The `_region` parameter is intentionally unused. The region is
33
+ * determined by the backend Lambda, and this parameter is retained only
34
+ * for backward compatibility with existing callers.
35
+ */
36
+ async function generateQueryEmbedding(query, _region = 'us-east-1') {
37
+ return vector_embeddings_1.vectorEmbeddingService.generateEmbedding(query);
38
+ }
39
+ /**
40
+ * Load embedding from S3 if needed via backend API
41
+ */
42
+ async function loadEmbeddingFromS3(s3Key, teamId) {
43
+ try {
44
+ // Extract entryId from S3 key (format: embeddings/{teamId}/{entryId}.json or embeddings/{entryId}.json)
45
+ const keyParts = s3Key.split('/');
46
+ const entryId = keyParts[keyParts.length - 1].replace('.json', '');
47
+ return await embedding_storage_1.embeddingStorageService.getEmbedding(entryId, teamId);
48
+ }
49
+ catch (error) {
50
+ const errorName = error && (error.name || error.code);
51
+ if (errorName === 'NoSuchKey') {
52
+ // Expected case: embedding not found in storage
53
+ console.info(`Embedding not found in S3 for key "${s3Key}" (teamId=${teamId})`);
54
+ }
55
+ else {
56
+ // Unexpected failure: permission, network, or other error
57
+ console.warn(`Failed to load embedding from S3 for key "${s3Key}" (teamId=${teamId}):`, error);
58
+ }
59
+ return null;
60
+ }
61
+ }
62
+ /**
63
+ * Perform vector similarity search on entries
64
+ * Now with S3 lazy-loading support for embeddings
65
+ */
66
+ async function vectorSearch(queryEmbedding, entries, topK = 10, minSimilarity = 0.5) {
67
+ const results = [];
68
+ for (const entry of entries) {
69
+ // Handle different entry formats
70
+ // If entry already has id/content directly (from API), use it
71
+ // Otherwise parse entry_data
72
+ let entryData;
73
+ let entryEmbedding;
74
+ if (entry.id && entry.content) {
75
+ // Entry is already parsed (from API)
76
+ entryData = entry;
77
+ // Try to load from S3 first (new method)
78
+ if (entry.embedding_s3_key) {
79
+ const s3Embedding = await loadEmbeddingFromS3(entry.embedding_s3_key, entry.teamId || 'default');
80
+ if (s3Embedding)
81
+ entryEmbedding = s3Embedding;
82
+ }
83
+ // Fallback to old DynamoDB storage
84
+ if (!entryEmbedding && entry.embedding_vector?.L) {
85
+ entryEmbedding = entry.embedding_vector.L.map((item) => parseFloat(item.N));
86
+ }
87
+ else if (!entryEmbedding && entry.embedding) {
88
+ entryEmbedding = entry.embedding;
89
+ }
90
+ }
91
+ else if (entry.entry_data) {
92
+ // Entry needs parsing (raw DynamoDB format)
93
+ entryData = typeof entry.entry_data === 'string'
94
+ ? JSON.parse(entry.entry_data)
95
+ : entry.entry_data;
96
+ // Try to load from S3 first (new method)
97
+ if (entry.embedding_s3_key?.S) {
98
+ const s3Embedding = await loadEmbeddingFromS3(entry.embedding_s3_key.S, entryData.teamId || 'default');
99
+ if (s3Embedding)
100
+ entryEmbedding = s3Embedding;
101
+ }
102
+ // Fallback to old DynamoDB storage
103
+ if (!entryEmbedding && entry.embedding_vector?.L) {
104
+ entryEmbedding = entry.embedding_vector.L.map((item) => parseFloat(item.N));
105
+ }
106
+ else if (!entryEmbedding && entryData.embedding) {
107
+ entryEmbedding = entryData.embedding;
108
+ }
109
+ }
110
+ else {
111
+ // Unknown format, skip
112
+ continue;
113
+ }
114
+ if (!entryEmbedding || entryEmbedding.length === 0) {
115
+ continue; // Skip entries without embeddings
116
+ }
117
+ // Validate vector dimensions match
118
+ if (entryEmbedding.length !== queryEmbedding.length) {
119
+ console.warn(`Skipping entry ${entryData.id}: dimension mismatch (${entryEmbedding.length} vs ${queryEmbedding.length})`);
120
+ continue;
121
+ }
122
+ try {
123
+ const similarity = cosineSimilarity(queryEmbedding, entryEmbedding);
124
+ if (similarity >= minSimilarity) {
125
+ results.push({
126
+ id: entryData.id,
127
+ content: entryData.content,
128
+ similarity,
129
+ aiTopics: entryData.aiTopics || [],
130
+ impactScore: entryData.impactScore || 0,
131
+ authorId: entryData.authorId,
132
+ createdAt: entryData.createdAt,
133
+ });
134
+ }
135
+ }
136
+ catch (error) {
137
+ console.error(`Error calculating similarity for entry ${entryData.id}:`, error);
138
+ }
139
+ }
140
+ // Sort by similarity (highest first) and return top K
141
+ results.sort((a, b) => b.similarity - a.similarity);
142
+ return results.slice(0, topK);
143
+ }
144
+ /**
145
+ * Hybrid search combining keyword and vector search with recency boost
146
+ */
147
+ async function hybridSearch(queryEmbedding, queryText, entries, topK = 10) {
148
+ // Get vector search results with lower threshold since we pre-filtered
149
+ const vectorResults = await vectorSearch(queryEmbedding, entries, topK * 3, 0.2);
150
+ // Boost scores for keyword matches and recency
151
+ const queryWords = queryText.toLowerCase().split(/\s+/).filter(w => w.length > 3);
152
+ const now = Date.now();
153
+ for (const result of vectorResults) {
154
+ const contentLower = result.content.toLowerCase();
155
+ const aiTopicsLower = result.aiTopics?.join(' ').toLowerCase() || '';
156
+ const customTopicsLower = result.customTopics?.join(' ').toLowerCase() || '';
157
+ // Count keyword matches (already filtered, so boost is smaller)
158
+ let keywordMatches = 0;
159
+ for (const word of queryWords) {
160
+ if (contentLower.includes(word))
161
+ keywordMatches += 2;
162
+ if (aiTopicsLower.includes(word))
163
+ keywordMatches += 1;
164
+ if (customTopicsLower.includes(word))
165
+ keywordMatches += 1; // Custom topics have same weight as AI topics
166
+ }
167
+ // Boost similarity score based on keyword matches
168
+ if (keywordMatches > 0) {
169
+ result.similarity = Math.min(1.0, result.similarity + (keywordMatches * 0.03));
170
+ }
171
+ // Recency boost - newer entries get small boost (max 0.05)
172
+ try {
173
+ // Try to parse createdAt from result or find it in entry
174
+ const createdAt = new Date(result.createdAt || 0).getTime();
175
+ if (createdAt > 0) {
176
+ const ageInDays = (now - createdAt) / (1000 * 60 * 60 * 24);
177
+ if (ageInDays < 30) {
178
+ // Boost entries from last 30 days
179
+ const recencyBoost = Math.max(0, 0.05 * (1 - ageInDays / 30));
180
+ result.similarity = Math.min(1.0, result.similarity + recencyBoost);
181
+ }
182
+ }
183
+ }
184
+ catch (error) {
185
+ // Ignore date parsing errors
186
+ }
187
+ }
188
+ // Re-sort and return top K
189
+ vectorResults.sort((a, b) => b.similarity - a.similarity);
190
+ return vectorResults.slice(0, topK);
191
+ }
192
+ //# sourceMappingURL=vector-search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vector-search.js","sourceRoot":"","sources":["../../src/services/vector-search.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,86 @@
1
+ export interface CompetitionLearningEntry {
2
+ id: string;
3
+ content: string;
4
+ authorId: string;
5
+ teamId: string;
6
+ createdAt: Date;
7
+ aiTopics: string[];
8
+ customTopics?: string[];
9
+ expertiseLevel: 'beginner' | 'intermediate' | 'expert';
10
+ impactScore: number;
11
+ helpfulnessRating: number;
12
+ timeSavedMinutes: number;
13
+ viewCount: number;
14
+ shareCount: number;
15
+ questionsAnswered: number;
16
+ onboardingRelevance: boolean;
17
+ }
18
+ export interface CompetitionTeam {
19
+ id: string;
20
+ name: string;
21
+ domain: string;
22
+ totalKnowledgeEntries: number;
23
+ avgOnboardingTime: number;
24
+ knowledgeReuseRate: number;
25
+ expertConnections: number;
26
+ productivityGain: number;
27
+ syntheticDataEnabled: boolean;
28
+ }
29
+ export interface ProductivityImpact {
30
+ userId: string;
31
+ teamId: string;
32
+ date: Date;
33
+ timesSavedMinutes: number;
34
+ duplicateQuestionsAvoided: number;
35
+ knowledgeReused: number;
36
+ expertConnectionsMade: number;
37
+ onboardingTasksCompleted: number;
38
+ estimatedCostSavings: number;
39
+ productivityIncrease: number;
40
+ }
41
+ export interface ExpertSuggestion {
42
+ userId: string;
43
+ name: string;
44
+ relevantEntries: CompetitionLearningEntry[];
45
+ expertiseScore: number;
46
+ lastActive: Date;
47
+ }
48
+ export interface ProductivityMetrics {
49
+ timesSaved: number;
50
+ questionsAnswered: number;
51
+ knowledgeShared: number;
52
+ onboardingAcceleration: number;
53
+ }
54
+ export interface ROIMetrics {
55
+ timesSavedMinutes: number;
56
+ duplicateQuestionsAvoided: number;
57
+ onboardingTimeReduction: number;
58
+ knowledgeReuseRate: number;
59
+ }
60
+ export interface TodayConfig {
61
+ apiKey?: string;
62
+ teamId?: string;
63
+ userId?: string;
64
+ awsRegion: string;
65
+ apiEndpoint?: string;
66
+ userPoolId?: string;
67
+ clientId?: string;
68
+ }
69
+ export interface CLICommand {
70
+ name: string;
71
+ description: string;
72
+ action: (...args: any[]) => Promise<void>;
73
+ }
74
+ export interface CustomTopic {
75
+ id: string;
76
+ teamId: string;
77
+ name: string;
78
+ description?: string;
79
+ isDefault: boolean;
80
+ color?: string;
81
+ createdAt: Date;
82
+ updatedAt: Date;
83
+ createdBy: string;
84
+ entryCount?: number;
85
+ }
86
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ "use strict";
2
+ // Core competition types for Today CLI
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":";AAAA,uCAAuC"}
@@ -0,0 +1,10 @@
1
+ import { CompetitionLearningEntry } from '../types';
2
+ export declare function formatLearningEntry(entry: CompetitionLearningEntry, index?: number): string;
3
+ export declare function formatSearchResults(results: CompetitionLearningEntry[], query: string): string;
4
+ export declare function formatSuccessMessage(message: string, details?: string): string;
5
+ export declare function formatErrorMessage(error: Error): string;
6
+ export declare function formatWarningMessage(message: string): string;
7
+ export declare function formatInfoMessage(message: string): string;
8
+ export declare function formatProgressMessage(message: string): string;
9
+ export declare function formatStatsDisplay(stats: any): string;
10
+ //# sourceMappingURL=formatting.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formatting.d.ts","sourceRoot":"","sources":["../../src/utils/formatting.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,wBAAwB,EAAE,MAAM,UAAU,CAAC;AAEpD,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,wBAAwB,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAyB3F;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,wBAAwB,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAS9F;AAED,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAM9E;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,CAEvD;AAED,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAE5D;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEzD;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAE7D;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,GAAG,GAAG,MAAM,CAmBrD"}
@@ -0,0 +1,82 @@
1
+ "use strict";
2
+ // Output formatting utilities for Today CLI
3
+ var __importDefault = (this && this.__importDefault) || function (mod) {
4
+ return (mod && mod.__esModule) ? mod : { "default": mod };
5
+ };
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.formatLearningEntry = formatLearningEntry;
8
+ exports.formatSearchResults = formatSearchResults;
9
+ exports.formatSuccessMessage = formatSuccessMessage;
10
+ exports.formatErrorMessage = formatErrorMessage;
11
+ exports.formatWarningMessage = formatWarningMessage;
12
+ exports.formatInfoMessage = formatInfoMessage;
13
+ exports.formatProgressMessage = formatProgressMessage;
14
+ exports.formatStatsDisplay = formatStatsDisplay;
15
+ const chalk_1 = __importDefault(require("chalk"));
16
+ function formatLearningEntry(entry, index) {
17
+ const prefix = index !== undefined ? `${index + 1}. ` : '';
18
+ const content = entry.content.length > 100
19
+ ? `${entry.content.substring(0, 100)}...`
20
+ : entry.content;
21
+ const lines = [
22
+ chalk_1.default.cyan(`${prefix}${content}`),
23
+ chalk_1.default.gray(` Created: ${new Date(entry.createdAt).toLocaleDateString()}`),
24
+ chalk_1.default.gray(` Author: ${entry.authorId}`),
25
+ ];
26
+ if (entry.aiTopics.length > 0) {
27
+ lines.push(chalk_1.default.gray(` Topics: ${entry.aiTopics.join(', ')}`));
28
+ }
29
+ if (entry.impactScore > 0) {
30
+ lines.push(chalk_1.default.green(` Impact Score: ${entry.impactScore.toFixed(1)}/10`));
31
+ }
32
+ if (entry.timeSavedMinutes > 0) {
33
+ lines.push(chalk_1.default.blue(` Time Saved: ${entry.timeSavedMinutes} minutes`));
34
+ }
35
+ return lines.join('\n');
36
+ }
37
+ function formatSearchResults(results, query) {
38
+ if (results.length === 0) {
39
+ return chalk_1.default.yellow(`No results found for "${query}". Try different keywords or check your spelling.`);
40
+ }
41
+ const header = chalk_1.default.green(`\nšŸ“š Found ${results.length} result${results.length === 1 ? '' : 's'} for "${query}":\n`);
42
+ const entries = results.map((entry, index) => formatLearningEntry(entry, index)).join('\n\n');
43
+ return header + entries;
44
+ }
45
+ function formatSuccessMessage(message, details) {
46
+ const lines = [chalk_1.default.green(`āœ… ${message}`)];
47
+ if (details) {
48
+ lines.push(chalk_1.default.gray(` ${details}`));
49
+ }
50
+ return lines.join('\n');
51
+ }
52
+ function formatErrorMessage(error) {
53
+ return chalk_1.default.red(`āŒ ${error.message}`);
54
+ }
55
+ function formatWarningMessage(message) {
56
+ return chalk_1.default.yellow(`āš ļø ${message}`);
57
+ }
58
+ function formatInfoMessage(message) {
59
+ return chalk_1.default.blue(`ā„¹ļø ${message}`);
60
+ }
61
+ function formatProgressMessage(message) {
62
+ return chalk_1.default.blue(`šŸ“š ${message}`);
63
+ }
64
+ function formatStatsDisplay(stats) {
65
+ const lines = [
66
+ chalk_1.default.blue('šŸ“Š Your Productivity Statistics'),
67
+ '',
68
+ chalk_1.default.green(`ā±ļø Time saved today: ${stats.timeSavedToday || 0} minutes`),
69
+ chalk_1.default.green(`šŸ“ Knowledge entries: ${stats.totalEntries || 0}`),
70
+ chalk_1.default.green(`ā“ Questions answered: ${stats.questionsAnswered || 0}`),
71
+ chalk_1.default.green(`šŸŽÆ Impact score: ${stats.averageImpact || 0}/10`),
72
+ ];
73
+ if (stats.topTopics && stats.topTopics.length > 0) {
74
+ lines.push('');
75
+ lines.push(chalk_1.default.cyan('šŸ·ļø Top topics you\'re learning:'));
76
+ stats.topTopics.forEach((topic, index) => {
77
+ lines.push(chalk_1.default.gray(` ${index + 1}. ${topic}`));
78
+ });
79
+ }
80
+ return lines.join('\n');
81
+ }
82
+ //# sourceMappingURL=formatting.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formatting.js","sourceRoot":"","sources":["../../src/utils/formatting.ts"],"names":[],"mappings":"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"}