cmp-standards 2.0.1 → 2.6.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 (167) hide show
  1. package/README.md +633 -541
  2. package/dist/cli/index.js +239 -7
  3. package/dist/cli/index.js.map +1 -1
  4. package/dist/dashboard/server.d.ts.map +1 -1
  5. package/dist/dashboard/server.js +203 -39
  6. package/dist/dashboard/server.js.map +1 -1
  7. package/dist/db/cloud.d.ts +174 -0
  8. package/dist/db/cloud.d.ts.map +1 -0
  9. package/dist/db/cloud.js +241 -0
  10. package/dist/db/cloud.js.map +1 -0
  11. package/dist/db/drizzle-client.d.ts +3 -3
  12. package/dist/db/drizzle-client.d.ts.map +1 -1
  13. package/dist/db/drizzle-client.js +57 -58
  14. package/dist/db/drizzle-client.js.map +1 -1
  15. package/dist/db/errors.d.ts +76 -0
  16. package/dist/db/errors.d.ts.map +1 -0
  17. package/dist/db/errors.js +135 -0
  18. package/dist/db/errors.js.map +1 -0
  19. package/dist/db/turso-client.d.ts +178 -0
  20. package/dist/db/turso-client.d.ts.map +1 -0
  21. package/dist/db/turso-client.js +455 -0
  22. package/dist/db/turso-client.js.map +1 -0
  23. package/dist/db/upstash-client.d.ts +161 -0
  24. package/dist/db/upstash-client.d.ts.map +1 -0
  25. package/dist/db/upstash-client.js +325 -0
  26. package/dist/db/upstash-client.js.map +1 -0
  27. package/dist/eslint/rules/no-async-useeffect.js +6 -6
  28. package/dist/hooks/cloud-post-tool-use.d.ts +30 -0
  29. package/dist/hooks/cloud-post-tool-use.d.ts.map +1 -0
  30. package/dist/hooks/cloud-post-tool-use.js +116 -0
  31. package/dist/hooks/cloud-post-tool-use.js.map +1 -0
  32. package/dist/hooks/cloud-pre-tool-use.d.ts +19 -0
  33. package/dist/hooks/cloud-pre-tool-use.d.ts.map +1 -0
  34. package/dist/hooks/cloud-pre-tool-use.js +149 -0
  35. package/dist/hooks/cloud-pre-tool-use.js.map +1 -0
  36. package/dist/hooks/cloud-session-start.d.ts +32 -0
  37. package/dist/hooks/cloud-session-start.d.ts.map +1 -0
  38. package/dist/hooks/cloud-session-start.js +257 -0
  39. package/dist/hooks/cloud-session-start.js.map +1 -0
  40. package/dist/hooks/index.d.ts +3 -0
  41. package/dist/hooks/index.d.ts.map +1 -1
  42. package/dist/hooks/index.js +5 -0
  43. package/dist/hooks/index.js.map +1 -1
  44. package/dist/hooks/memory-checkpoint.d.ts.map +1 -1
  45. package/dist/hooks/memory-checkpoint.js +12 -20
  46. package/dist/hooks/memory-checkpoint.js.map +1 -1
  47. package/dist/hooks/pre-tool-use.d.ts +2 -8
  48. package/dist/hooks/pre-tool-use.d.ts.map +1 -1
  49. package/dist/hooks/pre-tool-use.js +7 -106
  50. package/dist/hooks/pre-tool-use.js.map +1 -1
  51. package/dist/hooks/session-start.d.ts +2 -1
  52. package/dist/hooks/session-start.d.ts.map +1 -1
  53. package/dist/hooks/session-start.js +111 -77
  54. package/dist/hooks/session-start.js.map +1 -1
  55. package/dist/index.d.ts +14 -0
  56. package/dist/index.d.ts.map +1 -1
  57. package/dist/index.js +18 -1
  58. package/dist/index.js.map +1 -1
  59. package/dist/mcp/server.d.ts.map +1 -1
  60. package/dist/mcp/server.js +225 -2
  61. package/dist/mcp/server.js.map +1 -1
  62. package/dist/schema/plans.d.ts +194 -0
  63. package/dist/schema/plans.d.ts.map +1 -0
  64. package/dist/schema/plans.js +180 -0
  65. package/dist/schema/plans.js.map +1 -0
  66. package/dist/schema/tracking.d.ts +644 -0
  67. package/dist/schema/tracking.d.ts.map +1 -0
  68. package/dist/schema/tracking.js +204 -0
  69. package/dist/schema/tracking.js.map +1 -0
  70. package/dist/services/ContextGenerator.d.ts +16 -0
  71. package/dist/services/ContextGenerator.d.ts.map +1 -0
  72. package/dist/services/ContextGenerator.js +62 -0
  73. package/dist/services/ContextGenerator.js.map +1 -0
  74. package/dist/services/PlanManager.d.ts +99 -0
  75. package/dist/services/PlanManager.d.ts.map +1 -0
  76. package/dist/services/PlanManager.js +372 -0
  77. package/dist/services/PlanManager.js.map +1 -0
  78. package/dist/services/ProjectScaffold.d.ts.map +1 -1
  79. package/dist/services/ProjectScaffold.js +109 -81
  80. package/dist/services/ProjectScaffold.js.map +1 -1
  81. package/dist/services/TaskTracker.d.ts +1 -1
  82. package/dist/services/TaskTracker.d.ts.map +1 -1
  83. package/dist/services/TaskTracker.js +4 -8
  84. package/dist/services/TaskTracker.js.map +1 -1
  85. package/dist/services/WorkPlanManager.d.ts +1 -1
  86. package/dist/services/WorkPlanManager.d.ts.map +1 -1
  87. package/dist/services/WorkPlanManager.js +8 -14
  88. package/dist/services/WorkPlanManager.js.map +1 -1
  89. package/dist/services/auto-inject.d.ts +1 -0
  90. package/dist/services/auto-inject.d.ts.map +1 -1
  91. package/dist/services/auto-inject.js +12 -17
  92. package/dist/services/auto-inject.js.map +1 -1
  93. package/dist/services/context-injector.d.ts +105 -0
  94. package/dist/services/context-injector.d.ts.map +1 -0
  95. package/dist/services/context-injector.js +357 -0
  96. package/dist/services/context-injector.js.map +1 -0
  97. package/dist/services/cross-project-sync.d.ts +2 -0
  98. package/dist/services/cross-project-sync.d.ts.map +1 -1
  99. package/dist/services/cross-project-sync.js +26 -21
  100. package/dist/services/cross-project-sync.js.map +1 -1
  101. package/dist/services/index.d.ts +15 -15
  102. package/dist/services/index.d.ts.map +1 -1
  103. package/dist/services/index.js +18 -20
  104. package/dist/services/index.js.map +1 -1
  105. package/dist/services/memory-consolidation.d.ts.map +1 -1
  106. package/dist/services/memory-consolidation.js +30 -27
  107. package/dist/services/memory-consolidation.js.map +1 -1
  108. package/dist/services/memory-router.d.ts +98 -0
  109. package/dist/services/memory-router.d.ts.map +1 -0
  110. package/dist/services/memory-router.js +373 -0
  111. package/dist/services/memory-router.js.map +1 -0
  112. package/dist/services/pattern-tracker.d.ts +93 -0
  113. package/dist/services/pattern-tracker.d.ts.map +1 -0
  114. package/dist/services/pattern-tracker.js +347 -0
  115. package/dist/services/pattern-tracker.js.map +1 -0
  116. package/dist/services/semantic-search.d.ts +33 -35
  117. package/dist/services/semantic-search.d.ts.map +1 -1
  118. package/dist/services/semantic-search.js +207 -165
  119. package/dist/services/semantic-search.js.map +1 -1
  120. package/dist/utils/env-loader.d.ts +41 -0
  121. package/dist/utils/env-loader.d.ts.map +1 -0
  122. package/dist/utils/env-loader.js +78 -0
  123. package/dist/utils/env-loader.js.map +1 -0
  124. package/dist/utils/git.d.ts +52 -0
  125. package/dist/utils/git.d.ts.map +1 -0
  126. package/dist/utils/git.js +267 -0
  127. package/dist/utils/git.js.map +1 -0
  128. package/dist/utils/paths.d.ts +39 -5
  129. package/dist/utils/paths.d.ts.map +1 -1
  130. package/dist/utils/paths.js +88 -7
  131. package/dist/utils/paths.js.map +1 -1
  132. package/package.json +100 -94
  133. package/standards/README.md +50 -0
  134. package/standards/experts/expert-routing.md +215 -0
  135. package/standards/general/code-quality.md +86 -0
  136. package/standards/general/memory-usage.md +205 -0
  137. package/standards/general/sync-workflow.md +235 -0
  138. package/standards/general/workflow.md +82 -0
  139. package/standards/hooks/mandatory-tracking.md +446 -0
  140. package/standards/infrastructure/cloud-database.md +287 -0
  141. package/standards/mcp/server-design.md +243 -0
  142. package/standards/mcp/tool-patterns.md +354 -0
  143. package/standards/skills/skill-structure.md +286 -0
  144. package/standards/skills/workflow-design.md +323 -0
  145. package/standards/tools/tool-design.md +297 -0
  146. package/templates/agents/architecture-expert.md +61 -61
  147. package/templates/agents/database-expert.md +62 -62
  148. package/templates/agents/documentation-expert.md +57 -57
  149. package/templates/agents/memory-expert.md +88 -88
  150. package/templates/agents/performance-expert.md +61 -61
  151. package/templates/agents/security-expert.md +59 -59
  152. package/templates/agents/ux-expert.md +63 -63
  153. package/templates/agents/worker.md +75 -75
  154. package/templates/ai-skills/SKILL_TEMPLATE.md +55 -55
  155. package/templates/claude-settings.json +72 -0
  156. package/templates/commands/experts.md +138 -138
  157. package/templates/hooks/README.md +158 -158
  158. package/templates/hooks/project.config.json.template +77 -77
  159. package/templates/hooks/settings.local.json.template +57 -57
  160. package/templates/memory-config.json +56 -82
  161. package/templates/memory-config.schema.json +212 -212
  162. package/templates/settings.json +58 -58
  163. package/templates/skills/continue.md +205 -0
  164. package/templates/workflows/business-improvement.md +264 -264
  165. package/templates/workflows/expert-review.md +153 -153
  166. package/templates/workflows/internal-app.md +245 -245
  167. package/templates/workflows/sync-docs.md +187 -187
@@ -1,91 +1,101 @@
1
1
  /**
2
2
  * Semantic Search Service
3
3
  *
4
- * Provides embedding-based semantic search for memories.
5
- * - Generates embeddings on memory creation
6
- * - Stores embeddings in the content JSON field
7
- * - Performs cosine similarity search
4
+ * Provides hybrid search for memories:
5
+ * 1. Vector Search (Upstash): Semantic understanding
6
+ * 2. Text Search (MySQL): Keyword matching
8
7
  */
9
- import { EmbeddingService } from '../registry/embeddings.js';
8
+ import { EmbeddingService } from "../registry/embeddings.js";
9
+ import { Index } from "@upstash/vector";
10
10
  // =============================================================================
11
11
  // SEMANTIC SEARCH SERVICE
12
12
  // =============================================================================
13
13
  export class SemanticSearchService {
14
14
  embeddingService;
15
15
  client;
16
+ vectorIndex;
16
17
  cache = new Map();
17
18
  constructor(client) {
18
19
  this.client = client;
19
20
  this.embeddingService = new EmbeddingService({
20
- providers: ['openai', 'gemini'],
21
+ providers: ["openai", "gemini"],
21
22
  openaiApiKey: process.env.OPENAI_API_KEY,
22
23
  geminiApiKey: process.env.GEMINI_API_KEY,
23
24
  });
25
+ if (process.env.UPSTASH_VECTOR_REST_URL && process.env.UPSTASH_VECTOR_REST_TOKEN) {
26
+ this.vectorIndex = new Index({
27
+ url: process.env.UPSTASH_VECTOR_REST_URL,
28
+ token: process.env.UPSTASH_VECTOR_REST_TOKEN,
29
+ });
30
+ }
24
31
  }
25
32
  /**
26
- * Search memories by semantic similarity
33
+ * Hybrid Search: Vector + Keyword
27
34
  */
28
35
  async search(query, options) {
29
36
  const limit = options?.limit ?? 10;
30
37
  const threshold = options?.threshold ?? 0.5;
31
- const type = options?.type ?? 'memory';
38
+ const type = options?.type ?? "memory";
39
+ const [vectorResults, textResults] = await Promise.all([
40
+ this.searchVector(query, { limit, threshold }),
41
+ this.fallbackTextSearch(query, options),
42
+ ]);
43
+ // Merge and deduplicate by item ID
44
+ const merged = new Map();
45
+ // Text results first (base)
46
+ textResults.forEach((r) => merged.set(r.item.id, r));
47
+ // Vector results (override/add)
48
+ vectorResults.forEach((r) => {
49
+ const existing = merged.get(r.item.id);
50
+ if (!existing || r.score > existing.score) {
51
+ merged.set(r.item.id, r);
52
+ }
53
+ });
54
+ return Array.from(merged.values())
55
+ .sort((a, b) => b.score - a.score)
56
+ .slice(0, limit);
57
+ }
58
+ /**
59
+ * Search via Upstash Vector
60
+ */
61
+ async searchVector(query, options) {
62
+ if (!this.vectorIndex)
63
+ return [];
32
64
  try {
33
- // Get query embedding
34
- const queryEmbedding = await this.getEmbedding(query);
35
- // Get all memories (we'll filter and score them)
36
- const items = await this.client.list({
37
- type,
38
- limit: 200, // Get more items to filter
65
+ const embedding = await this.getEmbedding(query);
66
+ const results = await this.vectorIndex.query({
67
+ vector: embedding,
68
+ topK: options.limit,
69
+ includeMetadata: true,
39
70
  });
40
- // Score each item by similarity
41
- const scored = [];
42
- for (const item of items) {
43
- const content = item.content;
44
- if (!content)
45
- continue;
46
- // Filter by domain if specified
47
- if (options?.domain && content.domain !== options.domain)
71
+ const matchedResults = [];
72
+ for (const res of results) {
73
+ if (res.score < options.threshold)
48
74
  continue;
49
- // Get or generate embedding
50
- let itemEmbedding = content.embedding;
51
- if (!itemEmbedding) {
52
- // Generate embedding if not present
53
- const text = `${content.title}\n${content.body}`;
54
- try {
55
- itemEmbedding = await this.getEmbedding(text);
56
- // Update the item with embedding (async, don't wait)
57
- this.updateWithEmbedding(item.id, content, itemEmbedding).catch(() => { });
58
- }
59
- catch {
60
- continue; // Skip items we can't embed
61
- }
62
- }
63
- // Calculate cosine similarity
64
- const score = this.cosineSimilarity(queryEmbedding, itemEmbedding);
65
- if (score >= threshold) {
66
- scored.push({
75
+ // Fetch full item from DB to ensure schema consistency
76
+ const item = await this.client.get(res.id);
77
+ if (item) {
78
+ matchedResults.push({
67
79
  item,
68
- score,
69
- content: content,
80
+ score: res.score,
81
+ content: item.content,
82
+ source: "vector",
70
83
  });
71
84
  }
72
85
  }
73
- // Sort by score descending
74
- scored.sort((a, b) => b.score - a.score);
75
- return scored.slice(0, limit);
86
+ return matchedResults;
76
87
  }
77
88
  catch (error) {
78
- console.error('[SemanticSearch] Error:', error);
79
- // Fallback to text search
80
- return this.fallbackTextSearch(query, options);
89
+ console.warn("[SemanticSearch] Vector search failed:", error);
90
+ return [];
81
91
  }
82
92
  }
83
93
  /**
84
- * Create memory with embedding
94
+ * Create memory with embedding and sync to Vector DB
85
95
  */
86
96
  async createMemoryWithEmbedding(title, body, options) {
87
- // Generate embedding
88
- const text = `${title}\n${body}`;
97
+ const text = `${title}
98
+ ${body}`;
89
99
  let embedding;
90
100
  let embeddingModel;
91
101
  try {
@@ -93,23 +103,44 @@ export class SemanticSearchService {
93
103
  embeddingModel = this.embeddingService.getProviderInfo().provider;
94
104
  }
95
105
  catch (error) {
96
- console.warn('[SemanticSearch] Could not generate embedding:', error);
106
+ console.warn("[SemanticSearch] Could not generate embedding:", error);
97
107
  }
98
- // Create content with embedding
99
108
  const content = {
100
109
  title,
101
110
  body,
102
111
  domain: options?.domain,
103
- source: options?.source ?? 'system',
112
+ source: options?.source ?? "system",
104
113
  relatedFiles: options?.relatedFiles,
105
114
  embedding,
106
115
  embeddingModel,
107
116
  embeddedAt: embedding ? new Date().toISOString() : undefined,
108
117
  };
109
118
  const result = await this.client.createMemory(content, options?.tags);
119
+ // Sync to Upstash Vector if available
120
+ let synced = false;
121
+ if (this.vectorIndex && embedding) {
122
+ try {
123
+ await this.vectorIndex.upsert({
124
+ id: result.id,
125
+ vector: embedding,
126
+ metadata: {
127
+ title,
128
+ type: "memory",
129
+ source: content.source,
130
+ domain: content.domain,
131
+ timestamp: new Date().toISOString(),
132
+ },
133
+ });
134
+ synced = true;
135
+ }
136
+ catch (error) {
137
+ console.warn("[SemanticSearch] Vector sync failed:", error);
138
+ }
139
+ }
110
140
  return {
111
141
  id: result.id,
112
142
  embedded: !!embedding,
143
+ synced,
113
144
  };
114
145
  }
115
146
  /**
@@ -122,77 +153,10 @@ export class SemanticSearchService {
122
153
  const content = memory.content;
123
154
  if (!content)
124
155
  return [];
125
- const text = `${content.title}\n${content.body}`;
126
- return this.search(text, { limit: limit + 1 })
127
- .then(results => results.filter(r => r.item.id !== memoryId).slice(0, limit));
128
- }
129
- /**
130
- * Batch embed all memories without embeddings
131
- */
132
- async batchEmbed(options) {
133
- const type = options?.type ?? 'memory';
134
- const limit = options?.limit ?? 100;
135
- const force = options?.force ?? false;
136
- const items = await this.client.list({ type, limit });
137
- let processed = 0;
138
- let embedded = 0;
139
- let failed = 0;
140
- for (const item of items) {
141
- processed++;
142
- const content = item.content;
143
- if (!content) {
144
- failed++;
145
- continue;
146
- }
147
- // Skip if already has embedding (unless force)
148
- if (content.embedding && !force)
149
- continue;
150
- const text = `${content.title || ''}\n${content.body || ''}`;
151
- if (!text.trim()) {
152
- failed++;
153
- continue;
154
- }
155
- try {
156
- const embedding = await this.embeddingService.embed(text);
157
- await this.updateWithEmbedding(item.id, content, embedding);
158
- embedded++;
159
- // Rate limit
160
- await new Promise(r => setTimeout(r, 100));
161
- }
162
- catch {
163
- failed++;
164
- }
165
- }
166
- return { processed, embedded, failed };
156
+ const text = `${content.title}
157
+ ${content.body}`;
158
+ return this.search(text, { limit: limit + 1 }).then((results) => results.filter((r) => r.item.id !== memoryId).slice(0, limit));
167
159
  }
168
- /**
169
- * Get embedding statistics
170
- */
171
- async getEmbeddingStats() {
172
- const items = await this.client.list({ type: 'memory', limit: 1000 });
173
- let withEmbedding = 0;
174
- let withoutEmbedding = 0;
175
- for (const item of items) {
176
- const content = item.content;
177
- if (content?.embedding) {
178
- withEmbedding++;
179
- }
180
- else {
181
- withoutEmbedding++;
182
- }
183
- }
184
- const total = withEmbedding + withoutEmbedding;
185
- const coverage = total > 0 ? (withEmbedding / total) * 100 : 0;
186
- return {
187
- total,
188
- withEmbedding,
189
- withoutEmbedding,
190
- coverage: Math.round(coverage * 10) / 10,
191
- };
192
- }
193
- // ===========================================================================
194
- // PRIVATE METHODS
195
- // ===========================================================================
196
160
  /**
197
161
  * Get embedding with caching
198
162
  */
@@ -202,7 +166,6 @@ export class SemanticSearchService {
202
166
  if (cached)
203
167
  return cached;
204
168
  const embedding = await this.embeddingService.embed(text);
205
- // Cache with LRU eviction
206
169
  if (this.cache.size > 100) {
207
170
  const firstKey = this.cache.keys().next().value;
208
171
  if (firstKey)
@@ -211,39 +174,6 @@ export class SemanticSearchService {
211
174
  this.cache.set(cacheKey, embedding);
212
175
  return embedding;
213
176
  }
214
- /**
215
- * Update memory with embedding
216
- */
217
- async updateWithEmbedding(id, content, embedding) {
218
- const updatedContent = {
219
- ...content,
220
- embedding,
221
- embeddingModel: this.embeddingService.getProviderInfo().provider,
222
- embeddedAt: new Date().toISOString(),
223
- };
224
- await this.client.update(id, {
225
- content: updatedContent,
226
- });
227
- }
228
- /**
229
- * Calculate cosine similarity between two vectors
230
- */
231
- cosineSimilarity(a, b) {
232
- if (a.length !== b.length)
233
- return 0;
234
- let dotProduct = 0;
235
- let normA = 0;
236
- let normB = 0;
237
- for (let i = 0; i < a.length; i++) {
238
- dotProduct += a[i] * b[i];
239
- normA += a[i] * a[i];
240
- normB += b[i] * b[i];
241
- }
242
- const magnitude = Math.sqrt(normA) * Math.sqrt(normB);
243
- if (magnitude === 0)
244
- return 0;
245
- return dotProduct / magnitude;
246
- }
247
177
  /**
248
178
  * Fallback to text search when embedding fails
249
179
  */
@@ -253,24 +183,136 @@ export class SemanticSearchService {
253
183
  limit: options?.limit,
254
184
  });
255
185
  return results
256
- .filter(item => {
186
+ .filter((item) => {
257
187
  if (!options?.domain)
258
188
  return true;
259
189
  const content = item.content;
260
190
  return content?.domain === options.domain;
261
191
  })
262
- .map(item => ({
192
+ .map((item) => ({
263
193
  item,
264
- score: 1.0, // Text match score
194
+ score: 1.0,
265
195
  content: item.content,
196
+ source: "text",
266
197
  }));
267
198
  }
199
+ /**
200
+ * Batch embed memories that don't have embeddings yet
201
+ */
202
+ async batchEmbed(options) {
203
+ const limit = options.limit ?? 50;
204
+ let processed = 0;
205
+ let succeeded = 0;
206
+ let failed = 0;
207
+ let synced = 0;
208
+ try {
209
+ // Get memories without embeddings
210
+ const items = await this.client.list({
211
+ type: 'memory',
212
+ limit,
213
+ });
214
+ for (const item of items) {
215
+ const content = item.content;
216
+ if (content?.embedding)
217
+ continue; // Already has embedding
218
+ processed++;
219
+ try {
220
+ const text = `${content?.title || ''}\n${content?.body || ''}`;
221
+ if (!text.trim())
222
+ continue;
223
+ const embedding = await this.embeddingService.embed(text);
224
+ // Update item with embedding
225
+ await this.client.update(item.id, {
226
+ content: {
227
+ ...content,
228
+ embedding,
229
+ embeddingModel: this.embeddingService.getProviderInfo().provider,
230
+ embeddedAt: new Date().toISOString(),
231
+ },
232
+ });
233
+ succeeded++;
234
+ // Sync to vector DB
235
+ if (this.vectorIndex) {
236
+ try {
237
+ await this.vectorIndex.upsert({
238
+ id: item.id,
239
+ vector: embedding,
240
+ metadata: {
241
+ title: content?.title,
242
+ type: 'memory',
243
+ domain: content?.domain,
244
+ timestamp: new Date().toISOString(),
245
+ },
246
+ });
247
+ synced++;
248
+ }
249
+ catch {
250
+ // Vector sync failed but embedding succeeded
251
+ }
252
+ }
253
+ }
254
+ catch {
255
+ failed++;
256
+ }
257
+ }
258
+ }
259
+ catch (error) {
260
+ console.error('[SemanticSearch] batchEmbed error:', error);
261
+ }
262
+ return { processed, succeeded, failed, synced };
263
+ }
264
+ /**
265
+ * Get embedding statistics
266
+ */
267
+ async getEmbeddingStats() {
268
+ try {
269
+ const items = await this.client.list({
270
+ type: 'memory',
271
+ limit: 1000,
272
+ });
273
+ let withEmbeddings = 0;
274
+ for (const item of items) {
275
+ const content = item.content;
276
+ if (content?.embedding)
277
+ withEmbeddings++;
278
+ }
279
+ let vectorIndexCount = 0;
280
+ if (this.vectorIndex) {
281
+ try {
282
+ const info = await this.vectorIndex.info();
283
+ vectorIndexCount = info.vectorCount ?? 0;
284
+ }
285
+ catch {
286
+ // Vector index info failed
287
+ }
288
+ }
289
+ const totalMemories = items.length;
290
+ const withoutEmbeddings = totalMemories - withEmbeddings;
291
+ const embeddingRate = totalMemories > 0
292
+ ? `${Math.round((withEmbeddings / totalMemories) * 100)}%`
293
+ : '0%';
294
+ return {
295
+ totalMemories,
296
+ withEmbeddings,
297
+ withoutEmbeddings,
298
+ vectorIndexCount,
299
+ embeddingRate,
300
+ };
301
+ }
302
+ catch (error) {
303
+ console.error('[SemanticSearch] getEmbeddingStats error:', error);
304
+ return {
305
+ totalMemories: 0,
306
+ withEmbeddings: 0,
307
+ withoutEmbeddings: 0,
308
+ vectorIndexCount: 0,
309
+ embeddingRate: '0%',
310
+ };
311
+ }
312
+ }
268
313
  }
269
- // =============================================================================
270
- // FACTORY
271
- // =============================================================================
272
314
  /**
273
- * Create a semantic search service
315
+ * Factory
274
316
  */
275
317
  export function createSemanticSearchService(client) {
276
318
  return new SemanticSearchService(client);
@@ -1 +1 @@
1
- {"version":3,"file":"semantic-search.js","sourceRoot":"","sources":["../../src/services/semantic-search.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"semantic-search.js","sourceRoot":"","sources":["../../src/services/semantic-search.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * @file Environment Loader
3
+ * @description Auto-detecta y carga .env desde el directorio actual o padres (monorepo support)
4
+ */
5
+ export interface EnvLoadResult {
6
+ loaded: boolean;
7
+ path: string | null;
8
+ searchedPaths: string[];
9
+ }
10
+ /**
11
+ * Busca y carga .env subiendo por el árbol de directorios
12
+ * Útil para monorepos donde el .env está en la raíz
13
+ */
14
+ export declare function loadEnvFromAncestors(startDir?: string, maxDepth?: number): EnvLoadResult;
15
+ /**
16
+ * Verifica si las credenciales cloud están configuradas
17
+ */
18
+ export declare function hasCloudCredentials(): {
19
+ turso: boolean;
20
+ redis: boolean;
21
+ vector: boolean;
22
+ all: boolean;
23
+ };
24
+ /**
25
+ * Carga .env con fallback a directorios padre y verifica credenciales
26
+ */
27
+ export declare function initEnv(options?: {
28
+ startDir?: string;
29
+ silent?: boolean;
30
+ }): {
31
+ envLoaded: boolean;
32
+ envPath: string | null;
33
+ credentials: ReturnType<typeof hasCloudCredentials>;
34
+ };
35
+ declare const _default: {
36
+ loadEnvFromAncestors: typeof loadEnvFromAncestors;
37
+ hasCloudCredentials: typeof hasCloudCredentials;
38
+ initEnv: typeof initEnv;
39
+ };
40
+ export default _default;
41
+ //# sourceMappingURL=env-loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env-loader.d.ts","sourceRoot":"","sources":["../../src/utils/env-loader.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,OAAO,CAAA;IACf,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;IACnB,aAAa,EAAE,MAAM,EAAE,CAAA;CACxB;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,QAAQ,SAAI,GAAG,aAAa,CAiCnF;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI;IACrC,KAAK,EAAE,OAAO,CAAA;IACd,KAAK,EAAE,OAAO,CAAA;IACd,MAAM,EAAE,OAAO,CAAA;IACf,GAAG,EAAE,OAAO,CAAA;CACb,CAWA;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,OAAO,CAAC,EAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG;IAC1E,SAAS,EAAE,OAAO,CAAA;IAClB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;IACtB,WAAW,EAAE,UAAU,CAAC,OAAO,mBAAmB,CAAC,CAAA;CACpD,CAkBA;;;;;;AAED,wBAAqE"}
@@ -0,0 +1,78 @@
1
+ /**
2
+ * @file Environment Loader
3
+ * @description Auto-detecta y carga .env desde el directorio actual o padres (monorepo support)
4
+ */
5
+ import { config as loadEnv } from 'dotenv';
6
+ import { existsSync } from 'fs';
7
+ import { resolve, dirname } from 'path';
8
+ /**
9
+ * Busca y carga .env subiendo por el árbol de directorios
10
+ * Útil para monorepos donde el .env está en la raíz
11
+ */
12
+ export function loadEnvFromAncestors(startDir, maxDepth = 5) {
13
+ const searchedPaths = [];
14
+ let currentDir = startDir || process.cwd();
15
+ let depth = 0;
16
+ while (depth < maxDepth) {
17
+ const envPath = resolve(currentDir, '.env');
18
+ searchedPaths.push(envPath);
19
+ if (existsSync(envPath)) {
20
+ loadEnv({ path: envPath });
21
+ return {
22
+ loaded: true,
23
+ path: envPath,
24
+ searchedPaths
25
+ };
26
+ }
27
+ // Subir al directorio padre
28
+ const parentDir = dirname(currentDir);
29
+ if (parentDir === currentDir) {
30
+ // Llegamos a la raíz del sistema
31
+ break;
32
+ }
33
+ currentDir = parentDir;
34
+ depth++;
35
+ }
36
+ return {
37
+ loaded: false,
38
+ path: null,
39
+ searchedPaths
40
+ };
41
+ }
42
+ /**
43
+ * Verifica si las credenciales cloud están configuradas
44
+ */
45
+ export function hasCloudCredentials() {
46
+ const turso = !!(process.env.TURSO_DATABASE_URL && process.env.TURSO_AUTH_TOKEN);
47
+ const redis = !!(process.env.UPSTASH_REDIS_REST_URL && process.env.UPSTASH_REDIS_REST_TOKEN);
48
+ const vector = !!(process.env.UPSTASH_VECTOR_REST_URL && process.env.UPSTASH_VECTOR_REST_TOKEN);
49
+ return {
50
+ turso,
51
+ redis,
52
+ vector,
53
+ all: turso && redis
54
+ };
55
+ }
56
+ /**
57
+ * Carga .env con fallback a directorios padre y verifica credenciales
58
+ */
59
+ export function initEnv(options) {
60
+ const result = loadEnvFromAncestors(options?.startDir);
61
+ const credentials = hasCloudCredentials();
62
+ if (!options?.silent) {
63
+ if (result.loaded) {
64
+ console.log(`[cmp-standards] .env loaded from: ${result.path}`);
65
+ }
66
+ else if (!credentials.all) {
67
+ console.warn('[cmp-standards] No .env found in ancestor directories');
68
+ console.warn(` Searched: ${result.searchedPaths.slice(0, 3).join(', ')}...`);
69
+ }
70
+ }
71
+ return {
72
+ envLoaded: result.loaded,
73
+ envPath: result.path,
74
+ credentials
75
+ };
76
+ }
77
+ export default { loadEnvFromAncestors, hasCloudCredentials, initEnv };
78
+ //# sourceMappingURL=env-loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env-loader.js","sourceRoot":"","sources":["../../src/utils/env-loader.ts"],"names":[],"mappings":"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"}