@agenticc/core 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 (196) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +370 -0
  3. package/README.zh-CN.md +372 -0
  4. package/dist/audit/index.d.ts +9 -0
  5. package/dist/audit/index.d.ts.map +1 -0
  6. package/dist/audit/index.js +9 -0
  7. package/dist/audit/index.js.map +1 -0
  8. package/dist/audit/logger.d.ts +211 -0
  9. package/dist/audit/logger.d.ts.map +1 -0
  10. package/dist/audit/logger.js +268 -0
  11. package/dist/audit/logger.js.map +1 -0
  12. package/dist/audit/query.d.ts +164 -0
  13. package/dist/audit/query.d.ts.map +1 -0
  14. package/dist/audit/query.js +250 -0
  15. package/dist/audit/query.js.map +1 -0
  16. package/dist/conversation/context-builder.d.ts +119 -0
  17. package/dist/conversation/context-builder.d.ts.map +1 -0
  18. package/dist/conversation/context-builder.js +252 -0
  19. package/dist/conversation/context-builder.js.map +1 -0
  20. package/dist/conversation/index.d.ts +10 -0
  21. package/dist/conversation/index.d.ts.map +1 -0
  22. package/dist/conversation/index.js +10 -0
  23. package/dist/conversation/index.js.map +1 -0
  24. package/dist/conversation/message-store.d.ts +231 -0
  25. package/dist/conversation/message-store.d.ts.map +1 -0
  26. package/dist/conversation/message-store.js +404 -0
  27. package/dist/conversation/message-store.js.map +1 -0
  28. package/dist/conversation/session.d.ts +201 -0
  29. package/dist/conversation/session.d.ts.map +1 -0
  30. package/dist/conversation/session.js +285 -0
  31. package/dist/conversation/session.js.map +1 -0
  32. package/dist/core/agent.d.ts +277 -0
  33. package/dist/core/agent.d.ts.map +1 -0
  34. package/dist/core/agent.js +674 -0
  35. package/dist/core/agent.js.map +1 -0
  36. package/dist/core/agentic-loop.d.ts +98 -0
  37. package/dist/core/agentic-loop.d.ts.map +1 -0
  38. package/dist/core/agentic-loop.js +496 -0
  39. package/dist/core/agentic-loop.js.map +1 -0
  40. package/dist/core/index.d.ts +14 -0
  41. package/dist/core/index.d.ts.map +1 -0
  42. package/dist/core/index.js +14 -0
  43. package/dist/core/index.js.map +1 -0
  44. package/dist/core/intent-parser.d.ts +101 -0
  45. package/dist/core/intent-parser.d.ts.map +1 -0
  46. package/dist/core/intent-parser.js +221 -0
  47. package/dist/core/intent-parser.js.map +1 -0
  48. package/dist/core/plan-generator.d.ts +133 -0
  49. package/dist/core/plan-generator.d.ts.map +1 -0
  50. package/dist/core/plan-generator.js +294 -0
  51. package/dist/core/plan-generator.js.map +1 -0
  52. package/dist/core/plugin-manager.d.ts +120 -0
  53. package/dist/core/plugin-manager.d.ts.map +1 -0
  54. package/dist/core/plugin-manager.js +369 -0
  55. package/dist/core/plugin-manager.js.map +1 -0
  56. package/dist/core/response-handler.d.ts +141 -0
  57. package/dist/core/response-handler.d.ts.map +1 -0
  58. package/dist/core/response-handler.js +384 -0
  59. package/dist/core/response-handler.js.map +1 -0
  60. package/dist/core/tool-executor.d.ts +143 -0
  61. package/dist/core/tool-executor.d.ts.map +1 -0
  62. package/dist/core/tool-executor.js +354 -0
  63. package/dist/core/tool-executor.js.map +1 -0
  64. package/dist/core/tool-registry.d.ts +133 -0
  65. package/dist/core/tool-registry.d.ts.map +1 -0
  66. package/dist/core/tool-registry.js +252 -0
  67. package/dist/core/tool-registry.js.map +1 -0
  68. package/dist/index.d.ts +44 -0
  69. package/dist/index.d.ts.map +1 -0
  70. package/dist/index.js +47 -0
  71. package/dist/index.js.map +1 -0
  72. package/dist/knowledge/chunker.d.ts +78 -0
  73. package/dist/knowledge/chunker.d.ts.map +1 -0
  74. package/dist/knowledge/chunker.js +233 -0
  75. package/dist/knowledge/chunker.js.map +1 -0
  76. package/dist/knowledge/embedder.d.ts +93 -0
  77. package/dist/knowledge/embedder.d.ts.map +1 -0
  78. package/dist/knowledge/embedder.js +205 -0
  79. package/dist/knowledge/embedder.js.map +1 -0
  80. package/dist/knowledge/index.d.ts +10 -0
  81. package/dist/knowledge/index.d.ts.map +1 -0
  82. package/dist/knowledge/index.js +11 -0
  83. package/dist/knowledge/index.js.map +1 -0
  84. package/dist/knowledge/loaders/index.d.ts +10 -0
  85. package/dist/knowledge/loaders/index.d.ts.map +1 -0
  86. package/dist/knowledge/loaders/index.js +10 -0
  87. package/dist/knowledge/loaders/index.js.map +1 -0
  88. package/dist/knowledge/loaders/markdown.d.ts +88 -0
  89. package/dist/knowledge/loaders/markdown.d.ts.map +1 -0
  90. package/dist/knowledge/loaders/markdown.js +205 -0
  91. package/dist/knowledge/loaders/markdown.js.map +1 -0
  92. package/dist/knowledge/loaders/yaml.d.ts +112 -0
  93. package/dist/knowledge/loaders/yaml.d.ts.map +1 -0
  94. package/dist/knowledge/loaders/yaml.js +368 -0
  95. package/dist/knowledge/loaders/yaml.js.map +1 -0
  96. package/dist/knowledge/retriever.d.ts +144 -0
  97. package/dist/knowledge/retriever.d.ts.map +1 -0
  98. package/dist/knowledge/retriever.js +399 -0
  99. package/dist/knowledge/retriever.js.map +1 -0
  100. package/dist/knowledge/store.d.ts +146 -0
  101. package/dist/knowledge/store.d.ts.map +1 -0
  102. package/dist/knowledge/store.js +420 -0
  103. package/dist/knowledge/store.js.map +1 -0
  104. package/dist/llm/adapter.d.ts +194 -0
  105. package/dist/llm/adapter.d.ts.map +1 -0
  106. package/dist/llm/adapter.js +42 -0
  107. package/dist/llm/adapter.js.map +1 -0
  108. package/dist/llm/adapters/anyrouter.d.ts +84 -0
  109. package/dist/llm/adapters/anyrouter.d.ts.map +1 -0
  110. package/dist/llm/adapters/anyrouter.js +372 -0
  111. package/dist/llm/adapters/anyrouter.js.map +1 -0
  112. package/dist/llm/adapters/claude.d.ts +66 -0
  113. package/dist/llm/adapters/claude.d.ts.map +1 -0
  114. package/dist/llm/adapters/claude.js +323 -0
  115. package/dist/llm/adapters/claude.js.map +1 -0
  116. package/dist/llm/adapters/index.d.ts +12 -0
  117. package/dist/llm/adapters/index.d.ts.map +1 -0
  118. package/dist/llm/adapters/index.js +12 -0
  119. package/dist/llm/adapters/index.js.map +1 -0
  120. package/dist/llm/adapters/mimo.d.ts +85 -0
  121. package/dist/llm/adapters/mimo.d.ts.map +1 -0
  122. package/dist/llm/adapters/mimo.js +316 -0
  123. package/dist/llm/adapters/mimo.js.map +1 -0
  124. package/dist/llm/adapters/openai.d.ts +53 -0
  125. package/dist/llm/adapters/openai.d.ts.map +1 -0
  126. package/dist/llm/adapters/openai.js +293 -0
  127. package/dist/llm/adapters/openai.js.map +1 -0
  128. package/dist/llm/adapters/qwen.d.ts +53 -0
  129. package/dist/llm/adapters/qwen.d.ts.map +1 -0
  130. package/dist/llm/adapters/qwen.js +299 -0
  131. package/dist/llm/adapters/qwen.js.map +1 -0
  132. package/dist/llm/adapters/siliconflow.d.ts +69 -0
  133. package/dist/llm/adapters/siliconflow.d.ts.map +1 -0
  134. package/dist/llm/adapters/siliconflow.js +331 -0
  135. package/dist/llm/adapters/siliconflow.js.map +1 -0
  136. package/dist/llm/index.d.ts +9 -0
  137. package/dist/llm/index.d.ts.map +1 -0
  138. package/dist/llm/index.js +12 -0
  139. package/dist/llm/index.js.map +1 -0
  140. package/dist/llm/manager.d.ts +97 -0
  141. package/dist/llm/manager.d.ts.map +1 -0
  142. package/dist/llm/manager.js +337 -0
  143. package/dist/llm/manager.js.map +1 -0
  144. package/dist/test-utils/arbitraries.d.ts +230 -0
  145. package/dist/test-utils/arbitraries.d.ts.map +1 -0
  146. package/dist/test-utils/arbitraries.js +280 -0
  147. package/dist/test-utils/arbitraries.js.map +1 -0
  148. package/dist/test-utils/cleanup.d.ts +184 -0
  149. package/dist/test-utils/cleanup.d.ts.map +1 -0
  150. package/dist/test-utils/cleanup.js +282 -0
  151. package/dist/test-utils/cleanup.js.map +1 -0
  152. package/dist/test-utils/config.d.ts +80 -0
  153. package/dist/test-utils/config.d.ts.map +1 -0
  154. package/dist/test-utils/config.js +94 -0
  155. package/dist/test-utils/config.js.map +1 -0
  156. package/dist/test-utils/index.d.ts +10 -0
  157. package/dist/test-utils/index.d.ts.map +1 -0
  158. package/dist/test-utils/index.js +36 -0
  159. package/dist/test-utils/index.js.map +1 -0
  160. package/dist/test-utils/mocks.d.ts +170 -0
  161. package/dist/test-utils/mocks.d.ts.map +1 -0
  162. package/dist/test-utils/mocks.js +281 -0
  163. package/dist/test-utils/mocks.js.map +1 -0
  164. package/dist/types/config.d.ts +170 -0
  165. package/dist/types/config.d.ts.map +1 -0
  166. package/dist/types/config.js +120 -0
  167. package/dist/types/config.js.map +1 -0
  168. package/dist/types/knowledge.d.ts +95 -0
  169. package/dist/types/knowledge.d.ts.map +1 -0
  170. package/dist/types/knowledge.js +7 -0
  171. package/dist/types/knowledge.js.map +1 -0
  172. package/dist/types/loop.d.ts +148 -0
  173. package/dist/types/loop.d.ts.map +1 -0
  174. package/dist/types/loop.js +16 -0
  175. package/dist/types/loop.js.map +1 -0
  176. package/dist/types/plugin.d.ts +137 -0
  177. package/dist/types/plugin.d.ts.map +1 -0
  178. package/dist/types/plugin.js +15 -0
  179. package/dist/types/plugin.js.map +1 -0
  180. package/dist/types/response.d.ts +186 -0
  181. package/dist/types/response.d.ts.map +1 -0
  182. package/dist/types/response.js +99 -0
  183. package/dist/types/response.js.map +1 -0
  184. package/dist/types/streaming.d.ts +478 -0
  185. package/dist/types/streaming.d.ts.map +1 -0
  186. package/dist/types/streaming.js +483 -0
  187. package/dist/types/streaming.js.map +1 -0
  188. package/dist/types/tool.d.ts +118 -0
  189. package/dist/types/tool.d.ts.map +1 -0
  190. package/dist/types/tool.js +42 -0
  191. package/dist/types/tool.js.map +1 -0
  192. package/dist/utils/error.d.ts +22 -0
  193. package/dist/utils/error.d.ts.map +1 -0
  194. package/dist/utils/error.js +36 -0
  195. package/dist/utils/error.js.map +1 -0
  196. package/package.json +102 -0
@@ -0,0 +1,420 @@
1
+ /**
2
+ * Knowledge Store
3
+ *
4
+ * In-memory document storage with semantic search for RAG (Retrieval-Augmented Generation).
5
+ *
6
+ * **Why In-Memory?**
7
+ * - RAG requires fast semantic search during conversation processing
8
+ * - Documents are typically loaded at application startup
9
+ * - Embeddings are expensive to generate (cached in memory for performance)
10
+ * - Conversation history is stored externally (database), but knowledge is cached
11
+ *
12
+ * **Design Philosophy:**
13
+ * - Knowledge documents are relatively static (updated infrequently)
14
+ * - Fast retrieval is critical for responsive agent interactions
15
+ * - In-memory storage provides sub-millisecond search performance
16
+ * - For large knowledge bases, consider implementing pagination or lazy loading
17
+ *
18
+ * **For Production:**
19
+ * - Load documents at startup from files or database
20
+ * - Use document versioning to detect changes
21
+ * - Implement periodic refresh if documents change
22
+ * - Consider distributed caching (Redis) for multi-instance deployments
23
+ *
24
+ * Handles storage and retrieval of knowledge documents.
25
+ * Supports document CRUD operations with embedding generation.
26
+ * Includes automatic text chunking for large documents.
27
+ *
28
+ * _Requirements: 3.1, 3.5, 3.6_
29
+ */
30
+ import { v4 as uuidv4 } from 'uuid';
31
+ import { cosineSimilarity } from './embedder.js';
32
+ import { TextChunker } from './chunker.js';
33
+ const DEFAULT_CONFIG = {
34
+ embedder: undefined,
35
+ generateEmbeddings: true,
36
+ defaultTopK: 10,
37
+ defaultMinScore: 0.5,
38
+ chunkerConfig: undefined,
39
+ enableChunking: true,
40
+ };
41
+ /**
42
+ * In-memory Knowledge Store implementation
43
+ *
44
+ * Provides document storage with optional embedding generation
45
+ * and semantic search capabilities.
46
+ */
47
+ export class KnowledgeStore {
48
+ documents = new Map();
49
+ config;
50
+ chunker;
51
+ constructor(config) {
52
+ this.config = { ...DEFAULT_CONFIG, ...config };
53
+ this.chunker = new TextChunker(config?.chunkerConfig);
54
+ }
55
+ /**
56
+ * Add a document to the knowledge base
57
+ * Generates embedding if embedder is configured
58
+ * Automatically chunks large documents
59
+ *
60
+ * @returns Document ID (or parent document ID if chunked)
61
+ */
62
+ async addDocument(doc) {
63
+ // Check if document needs chunking
64
+ if (this.config.enableChunking && this.chunker.needsChunking(doc.content)) {
65
+ return this.addChunkedDocument(doc);
66
+ }
67
+ return this.addSingleDocument(doc);
68
+ }
69
+ /**
70
+ * Add a single document (no chunking)
71
+ */
72
+ async addSingleDocument(doc, chunkInfo) {
73
+ const id = uuidv4();
74
+ const now = new Date();
75
+ let embedding;
76
+ // Generate embedding if configured
77
+ if (this.config.generateEmbeddings && this.config.embedder) {
78
+ try {
79
+ const result = await this.config.embedder.embed(doc.content);
80
+ embedding = result.embedding;
81
+ }
82
+ catch (error) {
83
+ console.warn('Failed to generate embedding:', error);
84
+ // Continue without embedding
85
+ }
86
+ }
87
+ const storedDoc = {
88
+ id,
89
+ category: doc.category,
90
+ title: doc.title,
91
+ content: doc.content,
92
+ metadata: doc.metadata ?? {},
93
+ embedding,
94
+ createdAt: now,
95
+ updatedAt: now,
96
+ ...(chunkInfo && {
97
+ parentId: chunkInfo.parentId,
98
+ chunkIndex: chunkInfo.chunkIndex,
99
+ totalChunks: chunkInfo.totalChunks,
100
+ }),
101
+ };
102
+ this.documents.set(id, storedDoc);
103
+ return id;
104
+ }
105
+ /**
106
+ * Add a large document by chunking it
107
+ */
108
+ async addChunkedDocument(doc) {
109
+ const parentId = uuidv4();
110
+ const chunks = this.chunker.chunk(doc.content);
111
+ const totalChunks = chunks.length;
112
+ console.log(`Chunking document "${doc.title}" into ${totalChunks} chunks`);
113
+ // Add each chunk as a separate document
114
+ for (const chunk of chunks) {
115
+ const chunkTitle = doc.title
116
+ ? `${doc.title} [${chunk.index + 1}/${totalChunks}]`
117
+ : `Chunk ${chunk.index + 1}/${totalChunks}`;
118
+ await this.addSingleDocument({
119
+ category: doc.category,
120
+ title: chunkTitle,
121
+ content: chunk.content,
122
+ metadata: {
123
+ ...doc.metadata,
124
+ _isChunk: true,
125
+ _chunkIndex: chunk.index,
126
+ _totalChunks: totalChunks,
127
+ _startPos: chunk.startPos,
128
+ _endPos: chunk.endPos,
129
+ },
130
+ }, {
131
+ parentId,
132
+ chunkIndex: chunk.index,
133
+ totalChunks,
134
+ });
135
+ }
136
+ return parentId;
137
+ }
138
+ /**
139
+ * Get a document by ID
140
+ */
141
+ async getDocument(id) {
142
+ const doc = this.documents.get(id);
143
+ if (!doc) {
144
+ return null;
145
+ }
146
+ // Return without embedding (internal detail)
147
+ return this.toDocument(doc);
148
+ }
149
+ /**
150
+ * Delete a document by ID
151
+ */
152
+ async deleteDocument(id) {
153
+ return this.documents.delete(id);
154
+ }
155
+ /**
156
+ * Update a document
157
+ */
158
+ async updateDocument(id, updates) {
159
+ const doc = this.documents.get(id);
160
+ if (!doc) {
161
+ return false;
162
+ }
163
+ // Update fields
164
+ if (updates.category !== undefined) {
165
+ doc.category = updates.category;
166
+ }
167
+ if (updates.title !== undefined) {
168
+ doc.title = updates.title;
169
+ }
170
+ if (updates.metadata !== undefined) {
171
+ doc.metadata = updates.metadata;
172
+ }
173
+ // If content changed, regenerate embedding
174
+ if (updates.content !== undefined) {
175
+ doc.content = updates.content;
176
+ if (this.config.generateEmbeddings && this.config.embedder) {
177
+ try {
178
+ const result = await this.config.embedder.embed(updates.content);
179
+ doc.embedding = result.embedding;
180
+ }
181
+ catch (error) {
182
+ console.warn('Failed to regenerate embedding:', error);
183
+ }
184
+ }
185
+ }
186
+ doc.updatedAt = new Date();
187
+ return true;
188
+ }
189
+ /**
190
+ * Search the knowledge base
191
+ */
192
+ async search(query, options) {
193
+ const method = options?.method ?? 'hybrid';
194
+ const topK = options?.topK ?? this.config.defaultTopK;
195
+ const minScore = options?.minScore ?? this.config.defaultMinScore;
196
+ const category = options?.category;
197
+ let results;
198
+ switch (method) {
199
+ case 'keyword':
200
+ results = this.keywordSearch(query, category);
201
+ break;
202
+ case 'semantic':
203
+ results = await this.semanticSearch(query, category);
204
+ break;
205
+ case 'hybrid':
206
+ default:
207
+ results = await this.hybridSearch(query, category);
208
+ break;
209
+ }
210
+ // Filter by minimum score and limit results
211
+ return results.filter((r) => r.score >= minScore).slice(0, topK);
212
+ }
213
+ /**
214
+ * List all categories
215
+ */
216
+ async listCategories() {
217
+ const categories = new Set();
218
+ for (const doc of this.documents.values()) {
219
+ categories.add(doc.category);
220
+ }
221
+ return Array.from(categories).sort();
222
+ }
223
+ /**
224
+ * Get documents by category
225
+ */
226
+ async getDocumentsByCategory(category) {
227
+ const results = [];
228
+ for (const doc of this.documents.values()) {
229
+ if (doc.category === category) {
230
+ results.push(this.toDocument(doc));
231
+ }
232
+ }
233
+ return results;
234
+ }
235
+ /**
236
+ * Get all documents
237
+ */
238
+ async getAllDocuments() {
239
+ return Array.from(this.documents.values()).map((doc) => this.toDocument(doc));
240
+ }
241
+ /**
242
+ * Get document count
243
+ */
244
+ getDocumentCount() {
245
+ return this.documents.size;
246
+ }
247
+ /**
248
+ * Check if a document has an embedding
249
+ */
250
+ hasEmbedding(id) {
251
+ const doc = this.documents.get(id);
252
+ return doc?.embedding !== undefined && doc.embedding.length > 0;
253
+ }
254
+ /**
255
+ * Get the embedding for a document
256
+ */
257
+ getEmbedding(id) {
258
+ return this.documents.get(id)?.embedding;
259
+ }
260
+ /**
261
+ * Get the embedding dimension (from first document with embedding)
262
+ */
263
+ getEmbeddingDimension() {
264
+ for (const doc of this.documents.values()) {
265
+ if (doc.embedding && doc.embedding.length > 0) {
266
+ return doc.embedding.length;
267
+ }
268
+ }
269
+ return undefined;
270
+ }
271
+ /**
272
+ * Clear all documents
273
+ */
274
+ clear() {
275
+ this.documents.clear();
276
+ }
277
+ /**
278
+ * Keyword-based search using simple text matching
279
+ */
280
+ keywordSearch(query, category) {
281
+ const queryLower = query.toLowerCase();
282
+ const queryTerms = queryLower.split(/\s+/).filter((t) => t.length > 0);
283
+ const results = [];
284
+ for (const doc of this.documents.values()) {
285
+ // Filter by category if specified
286
+ if (category && doc.category !== category) {
287
+ continue;
288
+ }
289
+ const contentLower = doc.content.toLowerCase();
290
+ const titleLower = (doc.title ?? '').toLowerCase();
291
+ // Calculate keyword match score
292
+ let matchCount = 0;
293
+ for (const term of queryTerms) {
294
+ if (contentLower.includes(term) || titleLower.includes(term)) {
295
+ matchCount++;
296
+ }
297
+ }
298
+ if (matchCount > 0) {
299
+ const score = matchCount / queryTerms.length;
300
+ results.push({
301
+ document: this.toDocument(doc),
302
+ score,
303
+ confidence: this.scoreToConfidence(score),
304
+ });
305
+ }
306
+ }
307
+ // Sort by score descending
308
+ return results.sort((a, b) => b.score - a.score);
309
+ }
310
+ /**
311
+ * Semantic search using embedding similarity
312
+ */
313
+ async semanticSearch(query, category) {
314
+ if (!this.config.embedder) {
315
+ // Fall back to keyword search if no embedder
316
+ return this.keywordSearch(query, category);
317
+ }
318
+ // Generate query embedding
319
+ let queryEmbedding;
320
+ try {
321
+ const result = await this.config.embedder.embed(query);
322
+ queryEmbedding = result.embedding;
323
+ }
324
+ catch (error) {
325
+ console.warn('Failed to generate query embedding:', error);
326
+ return this.keywordSearch(query, category);
327
+ }
328
+ const results = [];
329
+ for (const doc of this.documents.values()) {
330
+ // Filter by category if specified
331
+ if (category && doc.category !== category) {
332
+ continue;
333
+ }
334
+ // Skip documents without embeddings
335
+ if (!doc.embedding || doc.embedding.length === 0) {
336
+ continue;
337
+ }
338
+ // Calculate cosine similarity
339
+ try {
340
+ const score = cosineSimilarity(queryEmbedding, doc.embedding);
341
+ // Normalize score to 0-1 range (cosine similarity is -1 to 1)
342
+ const normalizedScore = (score + 1) / 2;
343
+ results.push({
344
+ document: this.toDocument(doc),
345
+ score: normalizedScore,
346
+ confidence: this.scoreToConfidence(normalizedScore),
347
+ });
348
+ }
349
+ catch (error) {
350
+ // Skip documents with incompatible embeddings
351
+ console.warn(`Skipping document ${doc.id} due to embedding error:`, error);
352
+ }
353
+ }
354
+ // Sort by score descending
355
+ return results.sort((a, b) => b.score - a.score);
356
+ }
357
+ /**
358
+ * Hybrid search combining keyword and semantic results
359
+ */
360
+ async hybridSearch(query, category) {
361
+ const keywordResults = this.keywordSearch(query, category);
362
+ const semanticResults = await this.semanticSearch(query, category);
363
+ // Merge results with weighted scores
364
+ const scoreMap = new Map();
365
+ for (const result of keywordResults) {
366
+ scoreMap.set(result.document.id, { keyword: result.score, semantic: 0 });
367
+ }
368
+ for (const result of semanticResults) {
369
+ const existing = scoreMap.get(result.document.id);
370
+ if (existing) {
371
+ existing.semantic = result.score;
372
+ }
373
+ else {
374
+ scoreMap.set(result.document.id, { keyword: 0, semantic: result.score });
375
+ }
376
+ }
377
+ // Calculate combined scores (weighted average)
378
+ const keywordWeight = 0.3;
379
+ const semanticWeight = 0.7;
380
+ const results = [];
381
+ for (const [id, scores] of scoreMap.entries()) {
382
+ const doc = this.documents.get(id);
383
+ if (!doc)
384
+ continue;
385
+ const combinedScore = scores.keyword * keywordWeight + scores.semantic * semanticWeight;
386
+ results.push({
387
+ document: this.toDocument(doc),
388
+ score: combinedScore,
389
+ confidence: this.scoreToConfidence(combinedScore),
390
+ });
391
+ }
392
+ // Sort by score descending
393
+ return results.sort((a, b) => b.score - a.score);
394
+ }
395
+ /**
396
+ * Convert score to confidence level
397
+ */
398
+ scoreToConfidence(score) {
399
+ if (score >= 0.8)
400
+ return 'high';
401
+ if (score >= 0.5)
402
+ return 'medium';
403
+ return 'low';
404
+ }
405
+ /**
406
+ * Convert stored document to public document (without embedding)
407
+ */
408
+ toDocument(doc) {
409
+ return {
410
+ id: doc.id,
411
+ category: doc.category,
412
+ title: doc.title,
413
+ content: doc.content,
414
+ metadata: doc.metadata,
415
+ createdAt: doc.createdAt,
416
+ updatedAt: doc.updatedAt,
417
+ };
418
+ }
419
+ }
420
+ //# sourceMappingURL=store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/knowledge/store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,OAAO,EAAE,EAAE,IAAI,MAAM,EAAE,MAAM,MAAM,CAAC;AASpC,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,WAAW,EAAsB,MAAM,cAAc,CAAC;AAkC/D,MAAM,cAAc,GAGhB;IACF,QAAQ,EAAE,SAAS;IACnB,kBAAkB,EAAE,IAAI;IACxB,WAAW,EAAE,EAAE;IACf,eAAe,EAAE,GAAG;IACpB,aAAa,EAAE,SAAS;IACxB,cAAc,EAAE,IAAI;CACrB,CAAC;AAEF;;;;;GAKG;AACH,MAAM,OAAO,cAAc;IACjB,SAAS,GAAgC,IAAI,GAAG,EAAE,CAAC;IACnD,MAAM,CAGZ;IACM,OAAO,CAAc;IAE7B,YAAY,MAA6B;QACvC,IAAI,CAAC,MAAM,GAAG,EAAE,GAAG,cAAc,EAAE,GAAG,MAAM,EAAE,CAAC;QAC/C,IAAI,CAAC,OAAO,GAAG,IAAI,WAAW,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IACxD,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,WAAW,CAAC,GAAkB;QAClC,mCAAmC;QACnC,IAAI,IAAI,CAAC,MAAM,CAAC,cAAc,IAAI,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;YAC1E,OAAO,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC;QACtC,CAAC;QAED,OAAO,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC;IACrC,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,iBAAiB,CAC7B,GAAkB,EAClB,SAIC;QAED,MAAM,EAAE,GAAG,MAAM,EAAE,CAAC;QACpB,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;QAEvB,IAAI,SAA+B,CAAC;QAEpC,mCAAmC;QACnC,IAAI,IAAI,CAAC,MAAM,CAAC,kBAAkB,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;YAC3D,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;gBAC7D,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;YAC/B,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,IAAI,CAAC,+BAA+B,EAAE,KAAK,CAAC,CAAC;gBACrD,6BAA6B;YAC/B,CAAC;QACH,CAAC;QAED,MAAM,SAAS,GAAmB;YAChC,EAAE;YACF,QAAQ,EAAE,GAAG,CAAC,QAAQ;YACtB,KAAK,EAAE,GAAG,CAAC,KAAK;YAChB,OAAO,EAAE,GAAG,CAAC,OAAO;YACpB,QAAQ,EAAE,GAAG,CAAC,QAAQ,IAAI,EAAE;YAC5B,SAAS;YACT,SAAS,EAAE,GAAG;YACd,SAAS,EAAE,GAAG;YACd,GAAG,CAAC,SAAS,IAAI;gBACf,QAAQ,EAAE,SAAS,CAAC,QAAQ;gBAC5B,UAAU,EAAE,SAAS,CAAC,UAAU;gBAChC,WAAW,EAAE,SAAS,CAAC,WAAW;aACnC,CAAC;SACH,CAAC;QAEF,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC;QAElC,OAAO,EAAE,CAAC;IACZ,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,kBAAkB,CAAC,GAAkB;QACjD,MAAM,QAAQ,GAAG,MAAM,EAAE,CAAC;QAC1B,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC/C,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC;QAElC,OAAO,CAAC,GAAG,CAAC,sBAAsB,GAAG,CAAC,KAAK,UAAU,WAAW,SAAS,CAAC,CAAC;QAE3E,wCAAwC;QACxC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,MAAM,UAAU,GAAG,GAAG,CAAC,KAAK;gBAC1B,CAAC,CAAC,GAAG,GAAG,CAAC,KAAK,KAAK,KAAK,CAAC,KAAK,GAAG,CAAC,IAAI,WAAW,GAAG;gBACpD,CAAC,CAAC,SAAS,KAAK,CAAC,KAAK,GAAG,CAAC,IAAI,WAAW,EAAE,CAAC;YAE9C,MAAM,IAAI,CAAC,iBAAiB,CAC1B;gBACE,QAAQ,EAAE,GAAG,CAAC,QAAQ;gBACtB,KAAK,EAAE,UAAU;gBACjB,OAAO,EAAE,KAAK,CAAC,OAAO;gBACtB,QAAQ,EAAE;oBACR,GAAG,GAAG,CAAC,QAAQ;oBACf,QAAQ,EAAE,IAAI;oBACd,WAAW,EAAE,KAAK,CAAC,KAAK;oBACxB,YAAY,EAAE,WAAW;oBACzB,SAAS,EAAE,KAAK,CAAC,QAAQ;oBACzB,OAAO,EAAE,KAAK,CAAC,MAAM;iBACtB;aACF,EACD;gBACE,QAAQ;gBACR,UAAU,EAAE,KAAK,CAAC,KAAK;gBACvB,WAAW;aACZ,CACF,CAAC;QACJ,CAAC;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,WAAW,CAAC,EAAU;QAC1B,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAEnC,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,OAAO,IAAI,CAAC;QACd,CAAC;QAED,6CAA6C;QAC7C,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;IAC9B,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,cAAc,CAAC,EAAU;QAC7B,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACnC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,cAAc,CAAC,EAAU,EAAE,OAA+B;QAC9D,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAEnC,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,OAAO,KAAK,CAAC;QACf,CAAC;QAED,gBAAgB;QAChB,IAAI,OAAO,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;YACnC,GAAG,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;QAClC,CAAC;QACD,IAAI,OAAO,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;YAChC,GAAG,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;QAC5B,CAAC;QACD,IAAI,OAAO,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;YACnC,GAAG,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;QAClC,CAAC;QAED,2CAA2C;QAC3C,IAAI,OAAO,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;YAClC,GAAG,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;YAE9B,IAAI,IAAI,CAAC,MAAM,CAAC,kBAAkB,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;gBAC3D,IAAI,CAAC;oBACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;oBACjE,GAAG,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;gBACnC,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,OAAO,CAAC,IAAI,CAAC,iCAAiC,EAAE,KAAK,CAAC,CAAC;gBACzD,CAAC;YACH,CAAC;QACH,CAAC;QAED,GAAG,CAAC,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC;QAE3B,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,MAAM,CAAC,KAAa,EAAE,OAAuB;QACjD,MAAM,MAAM,GAAG,OAAO,EAAE,MAAM,IAAI,QAAQ,CAAC;QAC3C,MAAM,IAAI,GAAG,OAAO,EAAE,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC;QACtD,MAAM,QAAQ,GAAG,OAAO,EAAE,QAAQ,IAAI,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC;QAClE,MAAM,QAAQ,GAAG,OAAO,EAAE,QAAQ,CAAC;QAEnC,IAAI,OAAuB,CAAC;QAE5B,QAAQ,MAAM,EAAE,CAAC;YACf,KAAK,SAAS;gBACZ,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;gBAC9C,MAAM;YACR,KAAK,UAAU;gBACb,OAAO,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;gBACrD,MAAM;YACR,KAAK,QAAQ,CAAC;YACd;gBACE,OAAO,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;gBACnD,MAAM;QACV,CAAC;QAED,4CAA4C;QAC5C,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,QAAQ,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IACnE,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,cAAc;QAClB,MAAM,UAAU,GAAG,IAAI,GAAG,EAAU,CAAC;QAErC,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,CAAC;YAC1C,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC/B,CAAC;QAED,OAAO,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,IAAI,EAAE,CAAC;IACvC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,sBAAsB,CAAC,QAAgB;QAC3C,MAAM,OAAO,GAAe,EAAE,CAAC;QAE/B,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,CAAC;YAC1C,IAAI,GAAG,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;gBAC9B,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;YACrC,CAAC;QACH,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,eAAe;QACnB,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;IAChF,CAAC;IAED;;OAEG;IACH,gBAAgB;QACd,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;IAC7B,CAAC;IAED;;OAEG;IACH,YAAY,CAAC,EAAU;QACrB,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACnC,OAAO,GAAG,EAAE,SAAS,KAAK,SAAS,IAAI,GAAG,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC;IAClE,CAAC;IAED;;OAEG;IACH,YAAY,CAAC,EAAU;QACrB,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,SAAS,CAAC;IAC3C,CAAC;IAED;;OAEG;IACH,qBAAqB;QACnB,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,CAAC;YAC1C,IAAI,GAAG,CAAC,SAAS,IAAI,GAAG,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC9C,OAAO,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC;YAC9B,CAAC;QACH,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED;;OAEG;IACH,KAAK;QACH,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;IACzB,CAAC;IAED;;OAEG;IACK,aAAa,CAAC,KAAa,EAAE,QAAiB;QACpD,MAAM,UAAU,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;QACvC,MAAM,UAAU,GAAG,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACvE,MAAM,OAAO,GAAmB,EAAE,CAAC;QAEnC,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,CAAC;YAC1C,kCAAkC;YAClC,IAAI,QAAQ,IAAI,GAAG,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;gBAC1C,SAAS;YACX,CAAC;YAED,MAAM,YAAY,GAAG,GAAG,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;YAC/C,MAAM,UAAU,GAAG,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;YAEnD,gCAAgC;YAChC,IAAI,UAAU,GAAG,CAAC,CAAC;YACnB,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;gBAC9B,IAAI,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;oBAC7D,UAAU,EAAE,CAAC;gBACf,CAAC;YACH,CAAC;YAED,IAAI,UAAU,GAAG,CAAC,EAAE,CAAC;gBACnB,MAAM,KAAK,GAAG,UAAU,GAAG,UAAU,CAAC,MAAM,CAAC;gBAC7C,OAAO,CAAC,IAAI,CAAC;oBACX,QAAQ,EAAE,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;oBAC9B,KAAK;oBACL,UAAU,EAAE,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC;iBAC1C,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,2BAA2B;QAC3B,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;IACnD,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,cAAc,CAAC,KAAa,EAAE,QAAiB;QAC3D,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;YAC1B,6CAA6C;YAC7C,OAAO,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QAC7C,CAAC;QAED,2BAA2B;QAC3B,IAAI,cAAwB,CAAC;QAC7B,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YACvD,cAAc,GAAG,MAAM,CAAC,SAAS,CAAC;QACpC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,IAAI,CAAC,qCAAqC,EAAE,KAAK,CAAC,CAAC;YAC3D,OAAO,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QAC7C,CAAC;QAED,MAAM,OAAO,GAAmB,EAAE,CAAC;QAEnC,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,CAAC;YAC1C,kCAAkC;YAClC,IAAI,QAAQ,IAAI,GAAG,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;gBAC1C,SAAS;YACX,CAAC;YAED,oCAAoC;YACpC,IAAI,CAAC,GAAG,CAAC,SAAS,IAAI,GAAG,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACjD,SAAS;YACX,CAAC;YAED,8BAA8B;YAC9B,IAAI,CAAC;gBACH,MAAM,KAAK,GAAG,gBAAgB,CAAC,cAAc,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC;gBAE9D,8DAA8D;gBAC9D,MAAM,eAAe,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;gBAExC,OAAO,CAAC,IAAI,CAAC;oBACX,QAAQ,EAAE,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;oBAC9B,KAAK,EAAE,eAAe;oBACtB,UAAU,EAAE,IAAI,CAAC,iBAAiB,CAAC,eAAe,CAAC;iBACpD,CAAC,CAAC;YACL,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,8CAA8C;gBAC9C,OAAO,CAAC,IAAI,CAAC,qBAAqB,GAAG,CAAC,EAAE,0BAA0B,EAAE,KAAK,CAAC,CAAC;YAC7E,CAAC;QACH,CAAC;QAED,2BAA2B;QAC3B,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;IACnD,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,YAAY,CAAC,KAAa,EAAE,QAAiB;QACzD,MAAM,cAAc,GAAG,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QAC3D,MAAM,eAAe,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QAEnE,qCAAqC;QACrC,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAiD,CAAC;QAE1E,KAAK,MAAM,MAAM,IAAI,cAAc,EAAE,CAAC;YACpC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,CAAC,KAAK,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC;QAC3E,CAAC;QAED,KAAK,MAAM,MAAM,IAAI,eAAe,EAAE,CAAC;YACrC,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;YAClD,IAAI,QAAQ,EAAE,CAAC;gBACb,QAAQ,CAAC,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC;YACnC,CAAC;iBAAM,CAAC;gBACN,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;YAC3E,CAAC;QACH,CAAC;QAED,+CAA+C;QAC/C,MAAM,aAAa,GAAG,GAAG,CAAC;QAC1B,MAAM,cAAc,GAAG,GAAG,CAAC;QAE3B,MAAM,OAAO,GAAmB,EAAE,CAAC;QAEnC,KAAK,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,IAAI,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC;YAC9C,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACnC,IAAI,CAAC,GAAG;gBAAE,SAAS;YAEnB,MAAM,aAAa,GAAG,MAAM,CAAC,OAAO,GAAG,aAAa,GAAG,MAAM,CAAC,QAAQ,GAAG,cAAc,CAAC;YAExF,OAAO,CAAC,IAAI,CAAC;gBACX,QAAQ,EAAE,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;gBAC9B,KAAK,EAAE,aAAa;gBACpB,UAAU,EAAE,IAAI,CAAC,iBAAiB,CAAC,aAAa,CAAC;aAClD,CAAC,CAAC;QACL,CAAC;QAED,2BAA2B;QAC3B,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;IACnD,CAAC;IAED;;OAEG;IACK,iBAAiB,CAAC,KAAa;QACrC,IAAI,KAAK,IAAI,GAAG;YAAE,OAAO,MAAM,CAAC;QAChC,IAAI,KAAK,IAAI,GAAG;YAAE,OAAO,QAAQ,CAAC;QAClC,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;OAEG;IACK,UAAU,CAAC,GAAmB;QACpC,OAAO;YACL,EAAE,EAAE,GAAG,CAAC,EAAE;YACV,QAAQ,EAAE,GAAG,CAAC,QAAQ;YACtB,KAAK,EAAE,GAAG,CAAC,KAAK;YAChB,OAAO,EAAE,GAAG,CAAC,OAAO;YACpB,QAAQ,EAAE,GAAG,CAAC,QAAQ;YACtB,SAAS,EAAE,GAAG,CAAC,SAAS;YACxB,SAAS,EAAE,GAAG,CAAC,SAAS;SACzB,CAAC;IACJ,CAAC;CACF"}
@@ -0,0 +1,194 @@
1
+ /**
2
+ * LLM Adapter Interface
3
+ *
4
+ * Defines the common interface for all LLM providers.
5
+ * Each provider (OpenAI, Claude, Qwen, etc.) implements this interface.
6
+ */
7
+ import type { ToolDefinition } from '../types/tool.js';
8
+ /**
9
+ * Options for text generation
10
+ */
11
+ export interface GenerateOptions {
12
+ /** Temperature for response generation (0-2) */
13
+ temperature?: number;
14
+ /** Maximum tokens in response */
15
+ maxTokens?: number;
16
+ /** Stop sequences */
17
+ stopSequences?: string[];
18
+ /** System prompt */
19
+ systemPrompt?: string;
20
+ /** Additional provider-specific options */
21
+ options?: Record<string, unknown>;
22
+ /** Abort signal for cancellation */
23
+ abortSignal?: AbortSignal;
24
+ }
25
+ /**
26
+ * Message in a conversation
27
+ */
28
+ export interface ChatMessage {
29
+ /** Role of the message sender */
30
+ role: 'system' | 'user' | 'assistant' | 'tool';
31
+ /** Message content */
32
+ content: string;
33
+ /** Tool call ID (for tool responses) */
34
+ toolCallId?: string;
35
+ /** Tool name (for tool responses) */
36
+ toolName?: string;
37
+ /** Tool calls requested by assistant (for assistant messages) */
38
+ toolCalls?: ToolCall[];
39
+ }
40
+ /**
41
+ * Tool call requested by the LLM
42
+ */
43
+ export interface ToolCall {
44
+ /** Unique ID for this tool call */
45
+ id: string;
46
+ /** Name of the tool to call */
47
+ name: string;
48
+ /** Arguments for the tool */
49
+ arguments: Record<string, unknown>;
50
+ }
51
+ /**
52
+ * Response from LLM generation with tools
53
+ */
54
+ export interface LLMResponse {
55
+ /** Text content of the response */
56
+ content: string;
57
+ /** Tool calls requested by the LLM */
58
+ toolCalls?: ToolCall[];
59
+ /** Whether the response is complete or needs tool results */
60
+ finishReason: 'stop' | 'tool_calls' | 'length' | 'content_filter';
61
+ /** Token usage information */
62
+ usage?: {
63
+ promptTokens: number;
64
+ completionTokens: number;
65
+ totalTokens: number;
66
+ };
67
+ }
68
+ /**
69
+ * Stream chunk from LLM
70
+ */
71
+ export interface StreamChunk {
72
+ /** Type of the chunk */
73
+ type: 'content' | 'tool_call' | 'done';
74
+ /** Content delta (for content chunks) */
75
+ content?: string;
76
+ /** Tool call delta (for tool_call chunks) */
77
+ toolCall?: {
78
+ index: number;
79
+ id?: string;
80
+ name?: string;
81
+ arguments?: string;
82
+ };
83
+ /** Final response (for done chunks) */
84
+ response?: LLMResponse;
85
+ }
86
+ /**
87
+ * Callback for streaming chunks
88
+ */
89
+ export type StreamCallback = (chunk: StreamChunk) => void;
90
+ /**
91
+ * Embedding result
92
+ */
93
+ export interface EmbeddingResult {
94
+ /** The embedding vector */
95
+ embedding: number[];
96
+ /** Token count of the input */
97
+ tokenCount?: number;
98
+ }
99
+ /**
100
+ * LLM Adapter Interface
101
+ *
102
+ * All LLM providers must implement this interface to be used with the Agent.
103
+ */
104
+ export interface LLMAdapter {
105
+ /** Provider name for identification */
106
+ readonly provider: string;
107
+ /** Model name being used */
108
+ readonly model: string;
109
+ /**
110
+ * Generate text from a prompt
111
+ *
112
+ * @param prompt - The input prompt or conversation messages
113
+ * @param options - Generation options
114
+ * @returns Generated text
115
+ */
116
+ generate(prompt: string | ChatMessage[], options?: GenerateOptions): Promise<string>;
117
+ /**
118
+ * Generate text with tool calling support
119
+ *
120
+ * @param prompt - The input prompt or conversation messages
121
+ * @param tools - Available tools for the LLM to call
122
+ * @param options - Generation options
123
+ * @returns LLM response with potential tool calls
124
+ */
125
+ generateWithTools(prompt: string | ChatMessage[], tools: ToolDefinition[], options?: GenerateOptions): Promise<LLMResponse>;
126
+ /**
127
+ * Generate text with tool calling support (streaming)
128
+ *
129
+ * @param prompt - The input prompt or conversation messages
130
+ * @param tools - Available tools for the LLM to call
131
+ * @param onChunk - Callback for each streaming chunk
132
+ * @param options - Generation options
133
+ * @returns Final LLM response with potential tool calls
134
+ */
135
+ generateWithToolsStream(prompt: string | ChatMessage[], tools: ToolDefinition[], onChunk: StreamCallback, options?: GenerateOptions): Promise<LLMResponse>;
136
+ /**
137
+ * Check if the adapter supports streaming
138
+ */
139
+ supportsStreaming(): boolean;
140
+ /**
141
+ * Generate embedding for text
142
+ *
143
+ * @param text - Text to embed
144
+ * @returns Embedding vector
145
+ */
146
+ embed(text: string): Promise<EmbeddingResult>;
147
+ /**
148
+ * Check if the adapter supports embeddings
149
+ */
150
+ supportsEmbeddings(): boolean;
151
+ /**
152
+ * Check if the adapter supports tool calling
153
+ */
154
+ supportsToolCalling(): boolean;
155
+ }
156
+ /**
157
+ * Base configuration for creating an LLM adapter
158
+ */
159
+ export interface LLMAdapterConfig {
160
+ /** API key for authentication */
161
+ apiKey: string;
162
+ /** Model identifier */
163
+ model: string;
164
+ /** Custom API endpoint */
165
+ baseUrl?: string;
166
+ /** Default temperature */
167
+ temperature?: number;
168
+ /** Default max tokens */
169
+ maxTokens?: number;
170
+ /** Request timeout in milliseconds */
171
+ timeoutMs?: number;
172
+ }
173
+ /**
174
+ * Error thrown by LLM adapters
175
+ */
176
+ export declare class LLMError extends Error {
177
+ readonly code: LLMErrorCode;
178
+ readonly provider: string;
179
+ readonly cause?: Error;
180
+ constructor(message: string, code: LLMErrorCode, provider: string, cause?: Error);
181
+ }
182
+ /**
183
+ * LLM error codes
184
+ */
185
+ export type LLMErrorCode = 'AUTHENTICATION_ERROR' | 'RATE_LIMIT_ERROR' | 'INVALID_REQUEST' | 'MODEL_NOT_FOUND' | 'CONTEXT_LENGTH_EXCEEDED' | 'CONTENT_FILTER' | 'TIMEOUT' | 'NETWORK_ERROR' | 'CANCELLED' | 'UNKNOWN_ERROR';
186
+ /**
187
+ * Helper to convert string prompt to chat messages
188
+ */
189
+ export declare function promptToMessages(prompt: string, systemPrompt?: string): ChatMessage[];
190
+ /**
191
+ * Helper to extract text content from messages
192
+ */
193
+ export declare function messagesToPrompt(messages: ChatMessage[]): string;
194
+ //# sourceMappingURL=adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../src/llm/adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * LLM Adapter Interface
3
+ *
4
+ * Defines the common interface for all LLM providers.
5
+ * Each provider (OpenAI, Claude, Qwen, etc.) implements this interface.
6
+ */
7
+ /**
8
+ * Error thrown by LLM adapters
9
+ */
10
+ export class LLMError extends Error {
11
+ code;
12
+ provider;
13
+ cause;
14
+ constructor(message, code, provider, cause) {
15
+ super(message);
16
+ this.code = code;
17
+ this.provider = provider;
18
+ this.cause = cause;
19
+ this.name = 'LLMError';
20
+ }
21
+ }
22
+ /**
23
+ * Helper to convert string prompt to chat messages
24
+ */
25
+ export function promptToMessages(prompt, systemPrompt) {
26
+ const messages = [];
27
+ if (systemPrompt) {
28
+ messages.push({ role: 'system', content: systemPrompt });
29
+ }
30
+ messages.push({ role: 'user', content: prompt });
31
+ return messages;
32
+ }
33
+ /**
34
+ * Helper to extract text content from messages
35
+ */
36
+ export function messagesToPrompt(messages) {
37
+ return messages
38
+ .filter((m) => m.role !== 'system')
39
+ .map((m) => `${m.role}: ${m.content}`)
40
+ .join('\n');
41
+ }
42
+ //# sourceMappingURL=adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../src/llm/adapter.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAmMH;;GAEG;AACH,MAAM,OAAO,QAAS,SAAQ,KAAK;IAGf;IACA;IACA;IAJlB,YACE,OAAe,EACC,IAAkB,EAClB,QAAgB,EAChB,KAAa;QAE7B,KAAK,CAAC,OAAO,CAAC,CAAC;QAJC,SAAI,GAAJ,IAAI,CAAc;QAClB,aAAQ,GAAR,QAAQ,CAAQ;QAChB,UAAK,GAAL,KAAK,CAAQ;QAG7B,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC;IACzB,CAAC;CACF;AAiBD;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,MAAc,EAAE,YAAqB;IACpE,MAAM,QAAQ,GAAkB,EAAE,CAAC;IAEnC,IAAI,YAAY,EAAE,CAAC;QACjB,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC,CAAC;IAC3D,CAAC;IAED,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;IAEjD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,QAAuB;IACtD,OAAO,QAAQ;SACZ,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC;SAClC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC;SACrC,IAAI,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC"}