@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,399 @@
1
+ /**
2
+ * Knowledge Retriever
3
+ *
4
+ * Provides advanced retrieval capabilities including keyword search,
5
+ * semantic search, and hybrid search with knowledge sufficiency assessment.
6
+ *
7
+ * _Requirements: 3.2, 3.3, 3.4, 5.1, 5.2_
8
+ */
9
+ import { cosineSimilarity } from './embedder.js';
10
+ const DEFAULT_CONFIG = {
11
+ defaultTopK: 10,
12
+ defaultMinScore: 0.3,
13
+ keywordWeight: 0.3,
14
+ semanticWeight: 0.7,
15
+ sufficientThreshold: 0.7,
16
+ ambiguousThreshold: 0.4,
17
+ };
18
+ /**
19
+ * Knowledge Retriever class
20
+ *
21
+ * Provides keyword, semantic, and hybrid search capabilities
22
+ * with knowledge sufficiency assessment.
23
+ */
24
+ export class Retriever {
25
+ store;
26
+ embedder;
27
+ config;
28
+ constructor(store, embedder, config) {
29
+ this.store = store;
30
+ this.embedder = embedder;
31
+ this.config = { ...DEFAULT_CONFIG, ...config };
32
+ }
33
+ /**
34
+ * Search the knowledge base
35
+ *
36
+ * @param query - Search query string
37
+ * @param options - Search options
38
+ * @returns Array of search results sorted by relevance
39
+ */
40
+ async search(query, options) {
41
+ const method = options?.method ?? 'hybrid';
42
+ const topK = options?.topK ?? this.config.defaultTopK;
43
+ const minScore = options?.minScore ?? this.config.defaultMinScore;
44
+ const category = options?.category;
45
+ let results;
46
+ switch (method) {
47
+ case 'keyword':
48
+ results = await this.keywordSearch(query, category);
49
+ break;
50
+ case 'semantic':
51
+ results = await this.semanticSearch(query, category);
52
+ break;
53
+ case 'hybrid':
54
+ default:
55
+ results = await this.hybridSearch(query, category);
56
+ break;
57
+ }
58
+ // Filter by minimum score and limit results
59
+ // Results are already sorted by score descending
60
+ return results.filter((r) => r.score >= minScore).slice(0, topK);
61
+ }
62
+ /**
63
+ * Keyword-based search using text matching
64
+ *
65
+ * Implements simple keyword matching with term frequency scoring.
66
+ * Supports category filtering.
67
+ *
68
+ * _Requirements: 3.4_
69
+ *
70
+ * @param query - Search query
71
+ * @param category - Optional category filter
72
+ * @returns Search results sorted by score descending
73
+ */
74
+ async keywordSearch(query, category) {
75
+ const documents = await this.store.getAllDocuments();
76
+ const matches = this.performKeywordMatch(query, documents, category);
77
+ // Convert to SearchResult and sort by score descending
78
+ return matches
79
+ .map((match) => ({
80
+ document: match.document,
81
+ score: match.score,
82
+ confidence: this.scoreToConfidence(match.score),
83
+ }))
84
+ .sort((a, b) => b.score - a.score);
85
+ }
86
+ /**
87
+ * Perform keyword matching on documents
88
+ */
89
+ performKeywordMatch(query, documents, category) {
90
+ const queryLower = query.toLowerCase();
91
+ const queryTerms = this.tokenize(queryLower);
92
+ if (queryTerms.length === 0) {
93
+ return [];
94
+ }
95
+ const matches = [];
96
+ for (const doc of documents) {
97
+ // Filter by category if specified
98
+ if (category && doc.category !== category) {
99
+ continue;
100
+ }
101
+ const contentLower = doc.content.toLowerCase();
102
+ const titleLower = (doc.title ?? '').toLowerCase();
103
+ const combinedText = `${titleLower} ${contentLower}`;
104
+ // Calculate term frequency score
105
+ const matchedTerms = [];
106
+ let totalScore = 0;
107
+ for (const term of queryTerms) {
108
+ // Check for exact term match
109
+ if (combinedText.includes(term)) {
110
+ matchedTerms.push(term);
111
+ // Count occurrences for TF scoring
112
+ const regex = new RegExp(this.escapeRegex(term), 'gi');
113
+ const occurrences = (combinedText.match(regex) || []).length;
114
+ // TF score with diminishing returns
115
+ totalScore += Math.log(1 + occurrences);
116
+ // Boost for title matches
117
+ if (titleLower.includes(term)) {
118
+ totalScore += 0.5;
119
+ }
120
+ }
121
+ }
122
+ if (matchedTerms.length > 0) {
123
+ // Normalize score by query length and document length
124
+ const coverageScore = matchedTerms.length / queryTerms.length;
125
+ const lengthNorm = 1 / Math.sqrt(combinedText.length / 1000 + 1);
126
+ const finalScore = Math.min(1, (totalScore * coverageScore * lengthNorm) / queryTerms.length);
127
+ matches.push({
128
+ document: doc,
129
+ score: finalScore,
130
+ matchedTerms,
131
+ });
132
+ }
133
+ }
134
+ return matches;
135
+ }
136
+ /**
137
+ * Semantic search using embedding similarity
138
+ *
139
+ * Uses vector similarity to find semantically related documents.
140
+ * Falls back to keyword search if embedder is not available.
141
+ *
142
+ * _Requirements: 3.3_
143
+ *
144
+ * @param query - Search query
145
+ * @param category - Optional category filter
146
+ * @returns Search results sorted by score descending
147
+ */
148
+ async semanticSearch(query, category) {
149
+ // Fall back to keyword search if no embedder
150
+ if (!this.embedder) {
151
+ return this.keywordSearch(query, category);
152
+ }
153
+ // Generate query embedding
154
+ let queryEmbedding;
155
+ try {
156
+ const result = await this.embedder.embed(query);
157
+ queryEmbedding = result.embedding;
158
+ }
159
+ catch (error) {
160
+ console.warn('Failed to generate query embedding, falling back to keyword search:', error);
161
+ return this.keywordSearch(query, category);
162
+ }
163
+ const documents = await this.store.getAllDocuments();
164
+ const matches = await this.performSemanticMatch(queryEmbedding, documents, category);
165
+ // Convert to SearchResult and sort by score descending
166
+ return matches
167
+ .map((match) => ({
168
+ document: match.document,
169
+ score: match.score,
170
+ confidence: this.scoreToConfidence(match.score),
171
+ }))
172
+ .sort((a, b) => b.score - a.score);
173
+ }
174
+ /**
175
+ * Perform semantic matching on documents
176
+ */
177
+ async performSemanticMatch(queryEmbedding, documents, category) {
178
+ const matches = [];
179
+ for (const doc of documents) {
180
+ // Filter by category if specified
181
+ if (category && doc.category !== category) {
182
+ continue;
183
+ }
184
+ // Get document embedding from store
185
+ const docEmbedding = this.store.getEmbedding(doc.id);
186
+ if (!docEmbedding || docEmbedding.length === 0) {
187
+ continue;
188
+ }
189
+ // Calculate cosine similarity
190
+ try {
191
+ const similarity = cosineSimilarity(queryEmbedding, docEmbedding);
192
+ // Normalize to 0-1 range (cosine similarity is -1 to 1)
193
+ const normalizedScore = (similarity + 1) / 2;
194
+ matches.push({
195
+ document: doc,
196
+ score: normalizedScore,
197
+ embedding: docEmbedding,
198
+ });
199
+ }
200
+ catch (error) {
201
+ // Skip documents with incompatible embeddings
202
+ console.warn(`Skipping document ${doc.id} due to embedding error:`, error);
203
+ }
204
+ }
205
+ return matches;
206
+ }
207
+ /**
208
+ * Hybrid search combining keyword and semantic results
209
+ *
210
+ * Merges results from both methods with configurable weights.
211
+ * Deduplicates and re-ranks results.
212
+ *
213
+ * _Requirements: 3.2_
214
+ *
215
+ * @param query - Search query
216
+ * @param category - Optional category filter
217
+ * @returns Search results sorted by combined score descending
218
+ */
219
+ async hybridSearch(query, category) {
220
+ // Get results from both methods
221
+ const keywordResults = await this.keywordSearch(query, category);
222
+ const semanticResults = await this.semanticSearch(query, category);
223
+ // Merge results with weighted scores
224
+ const scoreMap = new Map();
225
+ for (const result of keywordResults) {
226
+ scoreMap.set(result.document.id, {
227
+ keyword: result.score,
228
+ semantic: 0,
229
+ document: result.document,
230
+ });
231
+ }
232
+ for (const result of semanticResults) {
233
+ const existing = scoreMap.get(result.document.id);
234
+ if (existing) {
235
+ existing.semantic = result.score;
236
+ }
237
+ else {
238
+ scoreMap.set(result.document.id, {
239
+ keyword: 0,
240
+ semantic: result.score,
241
+ document: result.document,
242
+ });
243
+ }
244
+ }
245
+ // Calculate combined scores
246
+ const results = [];
247
+ for (const [, scores] of scoreMap.entries()) {
248
+ const combinedScore = scores.keyword * this.config.keywordWeight + scores.semantic * this.config.semanticWeight;
249
+ results.push({
250
+ document: scores.document,
251
+ score: combinedScore,
252
+ confidence: this.scoreToConfidence(combinedScore),
253
+ });
254
+ }
255
+ // Sort by score descending
256
+ return results.sort((a, b) => b.score - a.score);
257
+ }
258
+ /**
259
+ * Assess knowledge sufficiency for a given intent
260
+ *
261
+ * Evaluates whether the retrieved knowledge is sufficient
262
+ * to answer the user's query.
263
+ *
264
+ * _Requirements: 5.1, 5.2_
265
+ *
266
+ * @param results - Search results to assess
267
+ * @param intent - User intent information
268
+ * @returns Knowledge assessment with status and confidence
269
+ */
270
+ assessKnowledge(results, intent) {
271
+ // No results - insufficient knowledge
272
+ if (results.length === 0) {
273
+ return {
274
+ status: 'insufficient',
275
+ confidence: 0,
276
+ missingTopic: intent.requiredTopics?.[0] ?? intent.action,
277
+ };
278
+ }
279
+ // Calculate overall confidence from top results
280
+ const topResults = results.slice(0, 5);
281
+ const avgScore = topResults.reduce((sum, r) => sum + r.score, 0) / topResults.length;
282
+ const maxScore = Math.max(...topResults.map((r) => r.score));
283
+ // Check if required topics are covered
284
+ const coveredTopics = this.findCoveredTopics(results, intent);
285
+ const requiredTopics = intent.requiredTopics ?? [intent.action];
286
+ const missingTopics = requiredTopics.filter((t) => !coveredTopics.has(t.toLowerCase()));
287
+ // Determine status based on scores and coverage
288
+ if (maxScore >= this.config.sufficientThreshold && missingTopics.length === 0) {
289
+ return {
290
+ status: 'sufficient',
291
+ confidence: avgScore,
292
+ };
293
+ }
294
+ if (maxScore >= this.config.ambiguousThreshold) {
295
+ // Check for ambiguity - multiple high-scoring but different results
296
+ const highScoreResults = results.filter((r) => r.score >= this.config.ambiguousThreshold);
297
+ if (highScoreResults.length > 1) {
298
+ const categories = new Set(highScoreResults.map((r) => r.document.category));
299
+ if (categories.size > 1) {
300
+ // Multiple categories with high scores - ambiguous
301
+ return {
302
+ status: 'ambiguous',
303
+ confidence: avgScore,
304
+ alternatives: Array.from(categories).map((cat) => ({
305
+ interpretation: cat,
306
+ confidence: highScoreResults
307
+ .filter((r) => r.document.category === cat)
308
+ .reduce((sum, r) => sum + r.score, 0) / highScoreResults.length,
309
+ })),
310
+ };
311
+ }
312
+ }
313
+ // Partial coverage
314
+ if (missingTopics.length > 0) {
315
+ return {
316
+ status: 'insufficient',
317
+ confidence: avgScore,
318
+ missingTopic: missingTopics[0],
319
+ };
320
+ }
321
+ return {
322
+ status: 'sufficient',
323
+ confidence: avgScore,
324
+ };
325
+ }
326
+ // Low scores - insufficient
327
+ return {
328
+ status: 'insufficient',
329
+ confidence: avgScore,
330
+ missingTopic: missingTopics[0] ?? intent.action,
331
+ };
332
+ }
333
+ /**
334
+ * Find topics covered by search results
335
+ */
336
+ findCoveredTopics(results, intent) {
337
+ const covered = new Set();
338
+ for (const result of results) {
339
+ const content = `${result.document.title ?? ''} ${result.document.content}`.toLowerCase();
340
+ // Check action
341
+ if (content.includes(intent.action.toLowerCase())) {
342
+ covered.add(intent.action.toLowerCase());
343
+ }
344
+ // Check entities
345
+ for (const entity of intent.entities) {
346
+ if (content.includes(entity.toLowerCase())) {
347
+ covered.add(entity.toLowerCase());
348
+ }
349
+ }
350
+ // Check required topics
351
+ for (const topic of intent.requiredTopics ?? []) {
352
+ if (content.includes(topic.toLowerCase())) {
353
+ covered.add(topic.toLowerCase());
354
+ }
355
+ }
356
+ // Add category as covered topic
357
+ covered.add(result.document.category.toLowerCase());
358
+ }
359
+ return covered;
360
+ }
361
+ /**
362
+ * Tokenize text into search terms
363
+ */
364
+ tokenize(text) {
365
+ return text
366
+ .split(/\s+/)
367
+ .map((t) => t.replace(/[^\w\u4e00-\u9fff]/g, '')) // Keep alphanumeric and Chinese chars
368
+ .filter((t) => t.length > 0);
369
+ }
370
+ /**
371
+ * Escape special regex characters
372
+ */
373
+ escapeRegex(str) {
374
+ return str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
375
+ }
376
+ /**
377
+ * Convert score to confidence level
378
+ */
379
+ scoreToConfidence(score) {
380
+ if (score >= 0.7)
381
+ return 'high';
382
+ if (score >= 0.4)
383
+ return 'medium';
384
+ return 'low';
385
+ }
386
+ /**
387
+ * Get retriever configuration
388
+ */
389
+ getConfig() {
390
+ return { ...this.config };
391
+ }
392
+ /**
393
+ * Update retriever configuration
394
+ */
395
+ updateConfig(config) {
396
+ this.config = { ...this.config, ...config };
397
+ }
398
+ }
399
+ //# sourceMappingURL=retriever.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retriever.js","sourceRoot":"","sources":["../../src/knowledge/retriever.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,146 @@
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 type { Document, DocumentInput, KnowledgeBase, SearchOptions, SearchResult } from '../types/knowledge.js';
31
+ import type { Embedder } from './embedder.js';
32
+ import { type ChunkerConfig } from './chunker.js';
33
+ /**
34
+ * Knowledge store configuration
35
+ */
36
+ export interface KnowledgeStoreConfig {
37
+ /** Embedder instance for generating embeddings */
38
+ embedder?: Embedder;
39
+ /** Whether to generate embeddings on document add */
40
+ generateEmbeddings?: boolean;
41
+ /** Default number of results for search */
42
+ defaultTopK?: number;
43
+ /** Default minimum score for search results */
44
+ defaultMinScore?: number;
45
+ /** Chunker configuration */
46
+ chunkerConfig?: ChunkerConfig;
47
+ /** Whether to enable chunking for large documents */
48
+ enableChunking?: boolean;
49
+ }
50
+ /**
51
+ * In-memory Knowledge Store implementation
52
+ *
53
+ * Provides document storage with optional embedding generation
54
+ * and semantic search capabilities.
55
+ */
56
+ export declare class KnowledgeStore implements KnowledgeBase {
57
+ private documents;
58
+ private config;
59
+ private chunker;
60
+ constructor(config?: KnowledgeStoreConfig);
61
+ /**
62
+ * Add a document to the knowledge base
63
+ * Generates embedding if embedder is configured
64
+ * Automatically chunks large documents
65
+ *
66
+ * @returns Document ID (or parent document ID if chunked)
67
+ */
68
+ addDocument(doc: DocumentInput): Promise<string>;
69
+ /**
70
+ * Add a single document (no chunking)
71
+ */
72
+ private addSingleDocument;
73
+ /**
74
+ * Add a large document by chunking it
75
+ */
76
+ private addChunkedDocument;
77
+ /**
78
+ * Get a document by ID
79
+ */
80
+ getDocument(id: string): Promise<Document | null>;
81
+ /**
82
+ * Delete a document by ID
83
+ */
84
+ deleteDocument(id: string): Promise<boolean>;
85
+ /**
86
+ * Update a document
87
+ */
88
+ updateDocument(id: string, updates: Partial<DocumentInput>): Promise<boolean>;
89
+ /**
90
+ * Search the knowledge base
91
+ */
92
+ search(query: string, options?: SearchOptions): Promise<SearchResult[]>;
93
+ /**
94
+ * List all categories
95
+ */
96
+ listCategories(): Promise<string[]>;
97
+ /**
98
+ * Get documents by category
99
+ */
100
+ getDocumentsByCategory(category: string): Promise<Document[]>;
101
+ /**
102
+ * Get all documents
103
+ */
104
+ getAllDocuments(): Promise<Document[]>;
105
+ /**
106
+ * Get document count
107
+ */
108
+ getDocumentCount(): number;
109
+ /**
110
+ * Check if a document has an embedding
111
+ */
112
+ hasEmbedding(id: string): boolean;
113
+ /**
114
+ * Get the embedding for a document
115
+ */
116
+ getEmbedding(id: string): number[] | undefined;
117
+ /**
118
+ * Get the embedding dimension (from first document with embedding)
119
+ */
120
+ getEmbeddingDimension(): number | undefined;
121
+ /**
122
+ * Clear all documents
123
+ */
124
+ clear(): void;
125
+ /**
126
+ * Keyword-based search using simple text matching
127
+ */
128
+ private keywordSearch;
129
+ /**
130
+ * Semantic search using embedding similarity
131
+ */
132
+ private semanticSearch;
133
+ /**
134
+ * Hybrid search combining keyword and semantic results
135
+ */
136
+ private hybridSearch;
137
+ /**
138
+ * Convert score to confidence level
139
+ */
140
+ private scoreToConfidence;
141
+ /**
142
+ * Convert stored document to public document (without embedding)
143
+ */
144
+ private toDocument;
145
+ }
146
+ //# sourceMappingURL=store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/knowledge/store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAGH,OAAO,KAAK,EACV,QAAQ,EACR,aAAa,EACb,aAAa,EACb,aAAa,EACb,YAAY,EACb,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAE9C,OAAO,EAAe,KAAK,aAAa,EAAE,MAAM,cAAc,CAAC;AAgB/D;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,kDAAkD;IAClD,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,qDAAqD;IACrD,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,2CAA2C;IAC3C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,+CAA+C;IAC/C,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,4BAA4B;IAC5B,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,qDAAqD;IACrD,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAcD;;;;;GAKG;AACH,qBAAa,cAAe,YAAW,aAAa;IAClD,OAAO,CAAC,SAAS,CAA0C;IAC3D,OAAO,CAAC,MAAM,CAGZ;IACF,OAAO,CAAC,OAAO,CAAc;gBAEjB,MAAM,CAAC,EAAE,oBAAoB;IAKzC;;;;;;OAMG;IACG,WAAW,CAAC,GAAG,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC;IAStD;;OAEG;YACW,iBAAiB;IA6C/B;;OAEG;YACW,kBAAkB;IAsChC;;OAEG;IACG,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;IAWvD;;OAEG;IACG,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAIlD;;OAEG;IACG,cAAc,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,aAAa,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;IAqCnF;;OAEG;IACG,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAyB7E;;OAEG;IACG,cAAc,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAUzC;;OAEG;IACG,sBAAsB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;IAYnE;;OAEG;IACG,eAAe,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;IAI5C;;OAEG;IACH,gBAAgB,IAAI,MAAM;IAI1B;;OAEG;IACH,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAKjC;;OAEG;IACH,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS;IAI9C;;OAEG;IACH,qBAAqB,IAAI,MAAM,GAAG,SAAS;IAS3C;;OAEG;IACH,KAAK,IAAI,IAAI;IAIb;;OAEG;IACH,OAAO,CAAC,aAAa;IAoCrB;;OAEG;YACW,cAAc;IAmD5B;;OAEG;YACW,YAAY;IA2C1B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAMzB;;OAEG;IACH,OAAO,CAAC,UAAU;CAWnB"}