@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.
- package/README.md +296 -0
- package/dist/ai/bedrock-client.d.ts +1 -0
- package/dist/ai/bedrock-client.d.ts.map +1 -0
- package/dist/ai/bedrock-client.js +2 -0
- package/dist/ai/bedrock-client.js.map +1 -0
- package/dist/ai/knowledge-processor.d.ts +1 -0
- package/dist/ai/knowledge-processor.d.ts.map +1 -0
- package/dist/ai/knowledge-processor.js +2 -0
- package/dist/ai/knowledge-processor.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +70 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/ask.d.ts +3 -0
- package/dist/commands/ask.d.ts.map +1 -0
- package/dist/commands/ask.js +217 -0
- package/dist/commands/ask.js.map +1 -0
- package/dist/commands/audit.d.ts +3 -0
- package/dist/commands/audit.d.ts.map +1 -0
- package/dist/commands/audit.js +153 -0
- package/dist/commands/audit.js.map +1 -0
- package/dist/commands/auth.d.ts +3 -0
- package/dist/commands/auth.d.ts.map +1 -0
- package/dist/commands/auth.js +114 -0
- package/dist/commands/auth.js.map +1 -0
- package/dist/commands/config.d.ts +3 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +72 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/embeddings.d.ts +3 -0
- package/dist/commands/embeddings.d.ts.map +1 -0
- package/dist/commands/embeddings.js +118 -0
- package/dist/commands/embeddings.js.map +1 -0
- package/dist/commands/experts.d.ts +3 -0
- package/dist/commands/experts.d.ts.map +1 -0
- package/dist/commands/experts.js +129 -0
- package/dist/commands/experts.js.map +1 -0
- package/dist/commands/export-import.d.ts +4 -0
- package/dist/commands/export-import.d.ts.map +1 -0
- package/dist/commands/export-import.js +285 -0
- package/dist/commands/export-import.js.map +1 -0
- package/dist/commands/git.d.ts +4 -0
- package/dist/commands/git.d.ts.map +1 -0
- package/dist/commands/git.js +274 -0
- package/dist/commands/git.js.map +1 -0
- package/dist/commands/impact.d.ts +3 -0
- package/dist/commands/impact.d.ts.map +1 -0
- package/dist/commands/impact.js +121 -0
- package/dist/commands/impact.js.map +1 -0
- package/dist/commands/insights.d.ts +3 -0
- package/dist/commands/insights.d.ts.map +1 -0
- package/dist/commands/insights.js +113 -0
- package/dist/commands/insights.js.map +1 -0
- package/dist/commands/learned.d.ts +3 -0
- package/dist/commands/learned.d.ts.map +1 -0
- package/dist/commands/learned.js +355 -0
- package/dist/commands/learned.js.map +1 -0
- package/dist/commands/onboard.d.ts +3 -0
- package/dist/commands/onboard.d.ts.map +1 -0
- package/dist/commands/onboard.js +141 -0
- package/dist/commands/onboard.js.map +1 -0
- package/dist/commands/recent.d.ts +3 -0
- package/dist/commands/recent.d.ts.map +1 -0
- package/dist/commands/recent.js +83 -0
- package/dist/commands/recent.js.map +1 -0
- package/dist/commands/secrets.d.ts +3 -0
- package/dist/commands/secrets.d.ts.map +1 -0
- package/dist/commands/secrets.js +203 -0
- package/dist/commands/secrets.js.map +1 -0
- package/dist/commands/stats.d.ts +3 -0
- package/dist/commands/stats.d.ts.map +1 -0
- package/dist/commands/stats.js +120 -0
- package/dist/commands/stats.js.map +1 -0
- package/dist/config/index.d.ts +12 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +46 -0
- package/dist/config/index.js.map +1 -0
- package/dist/database/migrations.d.ts +13 -0
- package/dist/database/migrations.d.ts.map +1 -0
- package/dist/database/migrations.js +190 -0
- package/dist/database/migrations.js.map +1 -0
- package/dist/database/postgresql.d.ts +92 -0
- package/dist/database/postgresql.d.ts.map +1 -0
- package/dist/database/postgresql.js +382 -0
- package/dist/database/postgresql.js.map +1 -0
- package/dist/database/sqlite.d.ts +54 -0
- package/dist/database/sqlite.d.ts.map +1 -0
- package/dist/database/sqlite.js +337 -0
- package/dist/database/sqlite.js.map +1 -0
- package/dist/lambda/admin.d.ts +3 -0
- package/dist/lambda/admin.d.ts.map +1 -0
- package/dist/lambda/admin.js +818 -0
- package/dist/lambda/admin.js.map +1 -0
- package/dist/lambda/ai-services.d.ts +6 -0
- package/dist/lambda/ai-services.d.ts.map +1 -0
- package/dist/lambda/ai-services.js +472 -0
- package/dist/lambda/ai-services.js.map +1 -0
- package/dist/lambda/analytics.d.ts +3 -0
- package/dist/lambda/analytics.d.ts.map +1 -0
- package/dist/lambda/analytics.js +481 -0
- package/dist/lambda/analytics.js.map +1 -0
- package/dist/lambda/api-router.d.ts +3 -0
- package/dist/lambda/api-router.d.ts.map +1 -0
- package/dist/lambda/api-router.js +162 -0
- package/dist/lambda/api-router.js.map +1 -0
- package/dist/lambda/custom-topics.d.ts +3 -0
- package/dist/lambda/custom-topics.d.ts.map +1 -0
- package/dist/lambda/custom-topics.js +425 -0
- package/dist/lambda/custom-topics.js.map +1 -0
- package/dist/lambda/graph-builder.d.ts +3 -0
- package/dist/lambda/graph-builder.d.ts.map +1 -0
- package/dist/lambda/graph-builder.js +442 -0
- package/dist/lambda/graph-builder.js.map +1 -0
- package/dist/lambda/knowledge-ai.d.ts +3 -0
- package/dist/lambda/knowledge-ai.d.ts.map +1 -0
- package/dist/lambda/knowledge-ai.js +849 -0
- package/dist/lambda/knowledge-ai.js.map +1 -0
- package/dist/lambda/post-confirmation.d.ts +8 -0
- package/dist/lambda/post-confirmation.d.ts.map +1 -0
- package/dist/lambda/post-confirmation.js +92 -0
- package/dist/lambda/post-confirmation.js.map +1 -0
- package/dist/lambda/teams.d.ts +3 -0
- package/dist/lambda/teams.d.ts.map +1 -0
- package/dist/lambda/teams.js +568 -0
- package/dist/lambda/teams.js.map +1 -0
- package/dist/lib/export-helpers.d.ts +5 -0
- package/dist/lib/export-helpers.d.ts.map +1 -0
- package/dist/lib/export-helpers.js +137 -0
- package/dist/lib/export-helpers.js.map +1 -0
- package/dist/lib/import-helpers.d.ts +5 -0
- package/dist/lib/import-helpers.d.ts.map +1 -0
- package/dist/lib/import-helpers.js +185 -0
- package/dist/lib/import-helpers.js.map +1 -0
- package/dist/lib/insights-helpers.d.ts +123 -0
- package/dist/lib/insights-helpers.d.ts.map +1 -0
- package/dist/lib/insights-helpers.js +374 -0
- package/dist/lib/insights-helpers.js.map +1 -0
- package/dist/lib/search-helpers.d.ts +4 -0
- package/dist/lib/search-helpers.d.ts.map +1 -0
- package/dist/lib/search-helpers.js +124 -0
- package/dist/lib/search-helpers.js.map +1 -0
- package/dist/lib/secret-helpers.d.ts +2 -0
- package/dist/lib/secret-helpers.d.ts.map +1 -0
- package/dist/lib/secret-helpers.js +85 -0
- package/dist/lib/secret-helpers.js.map +1 -0
- package/dist/lib/stats-helpers.d.ts +41 -0
- package/dist/lib/stats-helpers.d.ts.map +1 -0
- package/dist/lib/stats-helpers.js +263 -0
- package/dist/lib/stats-helpers.js.map +1 -0
- package/dist/services/aws-api.d.ts +81 -0
- package/dist/services/aws-api.d.ts.map +1 -0
- package/dist/services/aws-api.js +388 -0
- package/dist/services/aws-api.js.map +1 -0
- package/dist/services/bedrock.d.ts +83 -0
- package/dist/services/bedrock.d.ts.map +1 -0
- package/dist/services/bedrock.js +434 -0
- package/dist/services/bedrock.js.map +1 -0
- package/dist/services/commit-learnings.d.ts +25 -0
- package/dist/services/commit-learnings.d.ts.map +1 -0
- package/dist/services/commit-learnings.js +180 -0
- package/dist/services/commit-learnings.js.map +1 -0
- package/dist/services/embedding-storage.d.ts +42 -0
- package/dist/services/embedding-storage.d.ts.map +1 -0
- package/dist/services/embedding-storage.js +124 -0
- package/dist/services/embedding-storage.js.map +1 -0
- package/dist/services/expert-engine.d.ts +21 -0
- package/dist/services/expert-engine.d.ts.map +1 -0
- package/dist/services/expert-engine.js +58 -0
- package/dist/services/expert-engine.js.map +1 -0
- package/dist/services/onboarding-accelerator.d.ts +118 -0
- package/dist/services/onboarding-accelerator.d.ts.map +1 -0
- package/dist/services/onboarding-accelerator.js +403 -0
- package/dist/services/onboarding-accelerator.js.map +1 -0
- package/dist/services/secret-detection.d.ts +46 -0
- package/dist/services/secret-detection.d.ts.map +1 -0
- package/dist/services/secret-detection.js +75 -0
- package/dist/services/secret-detection.js.map +1 -0
- package/dist/services/secret-manager-simple.d.ts +51 -0
- package/dist/services/secret-manager-simple.d.ts.map +1 -0
- package/dist/services/secret-manager-simple.js +119 -0
- package/dist/services/secret-manager-simple.js.map +1 -0
- package/dist/services/secret-manager.d.ts +150 -0
- package/dist/services/secret-manager.d.ts.map +1 -0
- package/dist/services/secret-manager.js +287 -0
- package/dist/services/secret-manager.js.map +1 -0
- package/dist/services/vector-embeddings.d.ts +70 -0
- package/dist/services/vector-embeddings.d.ts.map +1 -0
- package/dist/services/vector-embeddings.js +167 -0
- package/dist/services/vector-embeddings.js.map +1 -0
- package/dist/services/vector-search.d.ts +28 -0
- package/dist/services/vector-search.d.ts.map +1 -0
- package/dist/services/vector-search.js +192 -0
- package/dist/services/vector-search.js.map +1 -0
- package/dist/types/index.d.ts +86 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +4 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/formatting.d.ts +10 -0
- package/dist/utils/formatting.d.ts.map +1 -0
- package/dist/utils/formatting.js +82 -0
- package/dist/utils/formatting.js.map +1 -0
- package/dist/utils/git.d.ts +52 -0
- package/dist/utils/git.d.ts.map +1 -0
- package/dist/utils/git.js +182 -0
- package/dist/utils/git.js.map +1 -0
- package/dist/utils/validation.d.ts +17 -0
- package/dist/utils/validation.d.ts.map +1 -0
- package/dist/utils/validation.js +187 -0
- package/dist/utils/validation.js.map +1 -0
- 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":";AAAA,iEAAiE;AACjE,2CAA2C;;;;;;AAE3C,uCAA0C;AAC1C,oDAA4B;AAQ5B,MAAa,sBAAsB;IAIjC;QAHQ,mBAAc,GAAG,IAAI,GAAG,EAAoB,CAAC;QACpC,mBAAc,GAAG,8BAA8B,CAAC;QAG/D,wCAAwC;IAC1C,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,iBAAiB,CAAC,IAAY;QAClC,IAAI,CAAC;YACH,oBAAoB;YACpB,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;YACxC,IAAI,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACtC,OAAO,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAE,CAAC;YAC5C,CAAC;YAED,IAAI,CAAC,uBAAa,CAAC,eAAe,EAAE,EAAE,CAAC;gBACrC,OAAO,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAC;gBAC3D,OAAO,EAAE,CAAC;YACZ,CAAC;YAED,MAAM,QAAQ,GAAG,MAAM,uBAAa,CAAC,OAAO,CAAC,gBAAgB,EAAE,MAAM,EAAE;gBACrE,KAAK,EAAE,CAAC,IAAI,CAAC,EAAE,qCAAqC;gBACpD,SAAS,EAAE,KAAK;aACjB,CAAC,CAAC;YAEH,IAAI,QAAQ,CAAC,OAAO,IAAI,QAAQ,CAAC,IAAI,IAAI,QAAQ,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;gBAClE,6DAA6D;gBAC7D,8CAA8C;gBAC9C,MAAM,SAAS,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;oBAC1D,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;oBAC7B,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC;gBAE7B,mBAAmB;gBACnB,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;gBAE7C,OAAO,SAAS,CAAC;YACnB,CAAC;YAED,MAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,IAAI,8BAA8B,CAAC,CAAC;QACpE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,+BAA+B,EAAE,KAAK,CAAC,CAAC;YACtD,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,uBAAuB,CAAC,KAAe;QAC3C,IAAI,CAAC;YACH,IAAI,CAAC,uBAAa,CAAC,eAAe,EAAE,EAAE,CAAC;gBACrC,OAAO,CAAC,IAAI,CAAC,kDAAkD,CAAC,CAAC;gBACjE,OAAO,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;YAC7B,CAAC;YAED,MAAM,QAAQ,GAAG,MAAM,uBAAa,CAAC,OAAO,CAAC,gBAAgB,EAAE,MAAM,EAAE;gBACrE,KAAK;gBACL,SAAS,EAAE,IAAI;aAChB,CAAC,CAAC;YAEH,IAAI,QAAQ,CAAC,OAAO,IAAI,QAAQ,CAAC,IAAI,IAAI,QAAQ,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;gBAClE,OAAO,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC;YAClC,CAAC;YAED,MAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,IAAI,qCAAqC,CAAC,CAAC;QAC3E,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,oCAAoC,EAAE,KAAK,CAAC,CAAC;YAC3D,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED;;OAEG;IACH,gBAAgB,CAAC,CAAW,EAAE,CAAW;QACvC,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC5C,OAAO,CAAC,CAAC;QACX,CAAC;QAED,MAAM,UAAU,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAClE,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;QACzE,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;QAEzE,IAAI,UAAU,KAAK,CAAC,IAAI,UAAU,KAAK,CAAC,EAAE,CAAC;YACzC,OAAO,CAAC,CAAC;QACX,CAAC;QAED,OAAO,UAAU,GAAG,CAAC,UAAU,GAAG,UAAU,CAAC,CAAC;IAChD,CAAC;IAED;;OAEG;IACH,eAAe,CACb,cAAwB,EACxB,mBAA6D,EAC7D,OAAe,EAAE,EACjB,YAAoB,GAAG;QAEvB,MAAM,YAAY,GAAG,mBAAmB;aACrC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;YACjB,EAAE,EAAE,SAAS,CAAC,EAAE;YAChB,UAAU,EAAE,IAAI,CAAC,gBAAgB,CAAC,cAAc,EAAE,SAAS,CAAC,SAAS,CAAC;SACvE,CAAC,CAAC;aACF,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,UAAU,IAAI,SAAS,CAAC;aAChD,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,UAAU,CAAC;aAC3C,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;QAElB,OAAO,YAAY,CAAC;IACtB,CAAC;IAED;;OAEG;IACK,eAAe,CAAC,IAAY;QAClC,iDAAiD;QACjD,OAAO,IAAI;aACR,IAAI,EAAE;aACN,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,uBAAuB;aAC5C,SAAS,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,0DAA0D;IACpF,CAAC;IAED;;OAEG;IACK,WAAW,CAAC,IAAY;QAC9B,OAAO,gBAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAChE,CAAC;IAED;;OAEG;IACK,MAAM,CAAC,EAAU;QACvB,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;IACzD,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,WAAW;QACf,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;YACrC,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,IAAI,CAAC,yCAAyC,EAAE,KAAK,CAAC,CAAC;YAC/D,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED;;OAEG;IACH,YAAY;QACV,OAAO;YACL,KAAK,EAAE,IAAI,CAAC,cAAc;YAC1B,UAAU,EAAE,IAAI,CAAC,gCAAgC;SAClD,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,UAAU;QACR,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,CAAC;IAC9B,CAAC;IAED;;OAEG;IACH,aAAa;QACX,OAAO;YACL,IAAI,EAAE,IAAI,CAAC,cAAc,CAAC,IAAI;SAC/B,CAAC;IACJ,CAAC;CACF;AApLD,wDAoLC;AAEY,QAAA,sBAAsB,GAAG,IAAI,sBAAsB,EAAE,CAAC"}
|
|
@@ -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 @@
|
|
|
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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"}
|