@kilnai/core 0.1.16 → 0.9.1

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 (216) hide show
  1. package/dist/agents/agent-rag.d.ts +21 -0
  2. package/dist/agents/agent-rag.d.ts.map +1 -0
  3. package/dist/agents/agent-rag.js +79 -0
  4. package/dist/agents/agent-rag.js.map +1 -0
  5. package/dist/agents/complexity-scorer.d.ts +8 -0
  6. package/dist/agents/complexity-scorer.d.ts.map +1 -0
  7. package/dist/agents/complexity-scorer.js +58 -0
  8. package/dist/agents/complexity-scorer.js.map +1 -0
  9. package/dist/agents/index.d.ts +14 -0
  10. package/dist/agents/index.d.ts.map +1 -1
  11. package/dist/agents/index.js +9 -0
  12. package/dist/agents/index.js.map +1 -1
  13. package/dist/agents/infrastructure/deepgram-stt.d.ts +15 -0
  14. package/dist/agents/infrastructure/deepgram-stt.d.ts.map +1 -0
  15. package/dist/agents/infrastructure/deepgram-stt.js +56 -0
  16. package/dist/agents/infrastructure/deepgram-stt.js.map +1 -0
  17. package/dist/agents/infrastructure/openai-stt.d.ts +15 -0
  18. package/dist/agents/infrastructure/openai-stt.d.ts.map +1 -0
  19. package/dist/agents/infrastructure/openai-stt.js +65 -0
  20. package/dist/agents/infrastructure/openai-stt.js.map +1 -0
  21. package/dist/agents/mcp-client.d.ts +4 -0
  22. package/dist/agents/mcp-client.d.ts.map +1 -1
  23. package/dist/agents/mcp-client.js +15 -2
  24. package/dist/agents/mcp-client.js.map +1 -1
  25. package/dist/agents/model-capability-registry.d.ts +13 -0
  26. package/dist/agents/model-capability-registry.d.ts.map +1 -0
  27. package/dist/agents/model-capability-registry.js +64 -0
  28. package/dist/agents/model-capability-registry.js.map +1 -0
  29. package/dist/agents/rules-router.d.ts +14 -0
  30. package/dist/agents/rules-router.d.ts.map +1 -0
  31. package/dist/agents/rules-router.js +59 -0
  32. package/dist/agents/rules-router.js.map +1 -0
  33. package/dist/agents/sliding-window-rate-limiter.d.ts +11 -0
  34. package/dist/agents/sliding-window-rate-limiter.d.ts.map +1 -0
  35. package/dist/agents/sliding-window-rate-limiter.js +56 -0
  36. package/dist/agents/sliding-window-rate-limiter.js.map +1 -0
  37. package/dist/agents/tool-error-classifier.d.ts +4 -0
  38. package/dist/agents/tool-error-classifier.d.ts.map +1 -0
  39. package/dist/agents/tool-error-classifier.js +32 -0
  40. package/dist/agents/tool-error-classifier.js.map +1 -0
  41. package/dist/agents/tool-execution-engine.d.ts +4 -0
  42. package/dist/agents/tool-execution-engine.d.ts.map +1 -0
  43. package/dist/agents/tool-execution-engine.js +100 -0
  44. package/dist/agents/tool-execution-engine.js.map +1 -0
  45. package/dist/cost/cost-tracker.d.ts +12 -2
  46. package/dist/cost/cost-tracker.d.ts.map +1 -1
  47. package/dist/cost/cost-tracker.js +48 -15
  48. package/dist/cost/cost-tracker.js.map +1 -1
  49. package/dist/cost/index.d.ts +11 -2
  50. package/dist/cost/index.d.ts.map +1 -1
  51. package/dist/cost/index.js +1 -1
  52. package/dist/cost/index.js.map +1 -1
  53. package/dist/domain/domain-package-adapter.d.ts +1 -1
  54. package/dist/domain/domain-package-adapter.js +2 -2
  55. package/dist/domain/domain-package-adapter.js.map +1 -1
  56. package/dist/domains/routing-templates.d.ts +12 -0
  57. package/dist/domains/routing-templates.d.ts.map +1 -0
  58. package/dist/domains/routing-templates.js +109 -0
  59. package/dist/domains/routing-templates.js.map +1 -0
  60. package/dist/engine/domain/capability.d.ts +2 -0
  61. package/dist/engine/domain/capability.d.ts.map +1 -1
  62. package/dist/engine/domain/chunker.d.ts +4 -0
  63. package/dist/engine/domain/chunker.d.ts.map +1 -1
  64. package/dist/engine/domain/contact-memory.d.ts +30 -0
  65. package/dist/engine/domain/contact-memory.d.ts.map +1 -0
  66. package/dist/engine/domain/contact-memory.js +4 -0
  67. package/dist/engine/domain/contact-memory.js.map +1 -0
  68. package/dist/engine/domain/knowledge-config.d.ts +26 -1
  69. package/dist/engine/domain/knowledge-config.d.ts.map +1 -1
  70. package/dist/engine/domain/knowledge-config.js +41 -3
  71. package/dist/engine/domain/knowledge-config.js.map +1 -1
  72. package/dist/engine/domain/knowledge-source.d.ts +31 -0
  73. package/dist/engine/domain/knowledge-source.d.ts.map +1 -0
  74. package/dist/engine/domain/knowledge-source.js +3 -0
  75. package/dist/engine/domain/knowledge-source.js.map +1 -0
  76. package/dist/engine/domain/model-router.d.ts +87 -0
  77. package/dist/engine/domain/model-router.d.ts.map +1 -0
  78. package/dist/engine/domain/model-router.js +4 -0
  79. package/dist/engine/domain/model-router.js.map +1 -0
  80. package/dist/engine/domain/rate-limiter.d.ts +15 -0
  81. package/dist/engine/domain/rate-limiter.d.ts.map +1 -0
  82. package/dist/engine/domain/rate-limiter.js +3 -0
  83. package/dist/engine/domain/rate-limiter.js.map +1 -0
  84. package/dist/engine/domain/tool-execution.d.ts +33 -0
  85. package/dist/engine/domain/tool-execution.d.ts.map +1 -0
  86. package/dist/engine/domain/tool-execution.js +3 -0
  87. package/dist/engine/domain/tool-execution.js.map +1 -0
  88. package/dist/engine/domain/vector-store.d.ts +1 -0
  89. package/dist/engine/domain/vector-store.d.ts.map +1 -1
  90. package/dist/engine/error-catalog.d.ts.map +1 -1
  91. package/dist/engine/error-catalog.js +100 -0
  92. package/dist/engine/error-catalog.js.map +1 -1
  93. package/dist/engine/errors.d.ts +1 -1
  94. package/dist/engine/errors.d.ts.map +1 -1
  95. package/dist/engine/errors.js.map +1 -1
  96. package/dist/engine/gateway/conversation-event.d.ts +57 -1
  97. package/dist/engine/gateway/conversation-event.d.ts.map +1 -1
  98. package/dist/engine/gateway/events-config.d.ts +4 -0
  99. package/dist/engine/gateway/events-config.d.ts.map +1 -1
  100. package/dist/engine/gateway/tenant-config.d.ts +65 -0
  101. package/dist/engine/gateway/tenant-config.d.ts.map +1 -1
  102. package/dist/engine/gateway/tenant-config.js +181 -0
  103. package/dist/engine/gateway/tenant-config.js.map +1 -1
  104. package/dist/engine/index.d.ts +6 -2
  105. package/dist/engine/index.d.ts.map +1 -1
  106. package/dist/engine/index.js.map +1 -1
  107. package/dist/engine/loader/app-loader.d.ts.map +1 -1
  108. package/dist/engine/loader/app-loader.js +41 -0
  109. package/dist/engine/loader/app-loader.js.map +1 -1
  110. package/dist/enrichment/effort-score.d.ts +7 -0
  111. package/dist/enrichment/effort-score.d.ts.map +1 -0
  112. package/dist/enrichment/effort-score.js +15 -0
  113. package/dist/enrichment/effort-score.js.map +1 -0
  114. package/dist/enrichment/enrichment-pipeline.d.ts +13 -0
  115. package/dist/enrichment/enrichment-pipeline.d.ts.map +1 -0
  116. package/dist/enrichment/enrichment-pipeline.js +191 -0
  117. package/dist/enrichment/enrichment-pipeline.js.map +1 -0
  118. package/dist/enrichment/index.d.ts +4 -0
  119. package/dist/enrichment/index.d.ts.map +1 -0
  120. package/dist/enrichment/index.js +3 -0
  121. package/dist/enrichment/index.js.map +1 -0
  122. package/dist/enrichment/types.d.ts +105 -0
  123. package/dist/enrichment/types.d.ts.map +1 -0
  124. package/dist/enrichment/types.js +3 -0
  125. package/dist/enrichment/types.js.map +1 -0
  126. package/dist/events/index.d.ts +72 -2
  127. package/dist/events/index.d.ts.map +1 -1
  128. package/dist/events/index.js +10 -0
  129. package/dist/events/index.js.map +1 -1
  130. package/dist/index.d.ts +18 -1
  131. package/dist/index.d.ts.map +1 -1
  132. package/dist/index.js +6 -0
  133. package/dist/index.js.map +1 -1
  134. package/dist/knowledge/contact-memory.d.ts +26 -0
  135. package/dist/knowledge/contact-memory.d.ts.map +1 -0
  136. package/dist/knowledge/contact-memory.js +235 -0
  137. package/dist/knowledge/contact-memory.js.map +1 -0
  138. package/dist/knowledge/contextual-enricher.d.ts +16 -0
  139. package/dist/knowledge/contextual-enricher.d.ts.map +1 -0
  140. package/dist/knowledge/contextual-enricher.js +82 -0
  141. package/dist/knowledge/contextual-enricher.js.map +1 -0
  142. package/dist/knowledge/index.d.ts +16 -0
  143. package/dist/knowledge/index.d.ts.map +1 -1
  144. package/dist/knowledge/index.js +13 -0
  145. package/dist/knowledge/index.js.map +1 -1
  146. package/dist/knowledge/infrastructure/cohere-reranker.d.ts +13 -0
  147. package/dist/knowledge/infrastructure/cohere-reranker.d.ts.map +1 -0
  148. package/dist/knowledge/infrastructure/cohere-reranker.js +61 -0
  149. package/dist/knowledge/infrastructure/cohere-reranker.js.map +1 -0
  150. package/dist/knowledge/infrastructure/composite-extractor.d.ts +8 -0
  151. package/dist/knowledge/infrastructure/composite-extractor.d.ts.map +1 -0
  152. package/dist/knowledge/infrastructure/composite-extractor.js +26 -0
  153. package/dist/knowledge/infrastructure/composite-extractor.js.map +1 -0
  154. package/dist/knowledge/infrastructure/file-extractor.d.ts +6 -0
  155. package/dist/knowledge/infrastructure/file-extractor.d.ts.map +1 -0
  156. package/dist/knowledge/infrastructure/file-extractor.js +19 -0
  157. package/dist/knowledge/infrastructure/file-extractor.js.map +1 -0
  158. package/dist/knowledge/infrastructure/json-source-store.d.ts +14 -0
  159. package/dist/knowledge/infrastructure/json-source-store.d.ts.map +1 -0
  160. package/dist/knowledge/infrastructure/json-source-store.js +56 -0
  161. package/dist/knowledge/infrastructure/json-source-store.js.map +1 -0
  162. package/dist/knowledge/infrastructure/memory-source-store.d.ts +10 -0
  163. package/dist/knowledge/infrastructure/memory-source-store.d.ts.map +1 -0
  164. package/dist/knowledge/infrastructure/memory-source-store.js +26 -0
  165. package/dist/knowledge/infrastructure/memory-source-store.js.map +1 -0
  166. package/dist/knowledge/infrastructure/memory-vector-store.d.ts +1 -0
  167. package/dist/knowledge/infrastructure/memory-vector-store.d.ts.map +1 -1
  168. package/dist/knowledge/infrastructure/memory-vector-store.js +10 -0
  169. package/dist/knowledge/infrastructure/memory-vector-store.js.map +1 -1
  170. package/dist/knowledge/infrastructure/pdf-extractor.d.ts +6 -0
  171. package/dist/knowledge/infrastructure/pdf-extractor.d.ts.map +1 -0
  172. package/dist/knowledge/infrastructure/pdf-extractor.js +46 -0
  173. package/dist/knowledge/infrastructure/pdf-extractor.js.map +1 -0
  174. package/dist/knowledge/infrastructure/pgvector-store.d.ts +29 -0
  175. package/dist/knowledge/infrastructure/pgvector-store.d.ts.map +1 -0
  176. package/dist/knowledge/infrastructure/pgvector-store.js +141 -0
  177. package/dist/knowledge/infrastructure/pgvector-store.js.map +1 -0
  178. package/dist/knowledge/infrastructure/url-extractor.d.ts +6 -0
  179. package/dist/knowledge/infrastructure/url-extractor.d.ts.map +1 -0
  180. package/dist/knowledge/infrastructure/url-extractor.js +71 -0
  181. package/dist/knowledge/infrastructure/url-extractor.js.map +1 -0
  182. package/dist/knowledge/retrieval-pipeline.d.ts +8 -1
  183. package/dist/knowledge/retrieval-pipeline.d.ts.map +1 -1
  184. package/dist/knowledge/retrieval-pipeline.js +28 -2
  185. package/dist/knowledge/retrieval-pipeline.js.map +1 -1
  186. package/dist/knowledge/source-manager.d.ts +29 -0
  187. package/dist/knowledge/source-manager.d.ts.map +1 -0
  188. package/dist/knowledge/source-manager.js +124 -0
  189. package/dist/knowledge/source-manager.js.map +1 -0
  190. package/dist/observability/span-mapper.d.ts.map +1 -1
  191. package/dist/observability/span-mapper.js +100 -3
  192. package/dist/observability/span-mapper.js.map +1 -1
  193. package/dist/orchestrator/orchestrator.js +2 -2
  194. package/dist/orchestrator/orchestrator.js.map +1 -1
  195. package/dist/safety/index.d.ts +2 -0
  196. package/dist/safety/index.d.ts.map +1 -1
  197. package/dist/safety/index.js +2 -0
  198. package/dist/safety/index.js.map +1 -1
  199. package/dist/safety/pii-scanner.d.ts.map +1 -1
  200. package/dist/safety/pii-scanner.js +18 -0
  201. package/dist/safety/pii-scanner.js.map +1 -1
  202. package/dist/safety/tool-result-sanitizer.d.ts +21 -0
  203. package/dist/safety/tool-result-sanitizer.d.ts.map +1 -0
  204. package/dist/safety/tool-result-sanitizer.js +62 -0
  205. package/dist/safety/tool-result-sanitizer.js.map +1 -0
  206. package/dist/security/annotation-authorizer.d.ts +13 -0
  207. package/dist/security/annotation-authorizer.d.ts.map +1 -0
  208. package/dist/security/annotation-authorizer.js +37 -0
  209. package/dist/security/annotation-authorizer.js.map +1 -0
  210. package/dist/security/index.d.ts +2 -0
  211. package/dist/security/index.d.ts.map +1 -1
  212. package/dist/security/index.js +1 -0
  213. package/dist/security/index.js.map +1 -1
  214. package/dist/security/types.d.ts +2 -2
  215. package/dist/security/types.d.ts.map +1 -1
  216. package/package.json +10 -2
@@ -0,0 +1,235 @@
1
+ // Contact memory: per-user fact storage across conversations
2
+ // Extracts structured facts via LLM (Mem0 ADD/UPDATE/DELETE/NOOP pattern)
3
+ // Stores facts as vector entries with metadata for recall via similarity search
4
+ import { textParts, extractText } from "../engine/domain/content.js";
5
+ import { withRetry } from "../agents/infrastructure/retry.js";
6
+ import { KilnError } from "../engine/errors.js";
7
+ const MAX_RETRIES = 3;
8
+ const BASE_DELAY_MS = 1000;
9
+ const EXTRACTION_MAX_TOKENS = 2048;
10
+ const DEFAULT_RECALL_LIMIT = 20;
11
+ const CONTACT_FACT_TYPE = "contact_fact";
12
+ const EXTRACTION_SYSTEM_PROMPT = `You extract facts about the customer from conversations.
13
+
14
+ For each fact, output a JSON array of objects:
15
+ [{"action": "ADD", "content": "...", "category": "preference"|"entity"|"issue"|"general", "confidence": 0.0-1.0}]
16
+
17
+ Rules:
18
+ - Only extract facts about the CUSTOMER, not the agent
19
+ - ADD: new fact not previously known
20
+ - UPDATE: correction or update to a previously known fact (include "existingFactId" if provided in existing facts)
21
+ - DELETE: fact no longer true (include "existingFactId" if provided in existing facts)
22
+ - NOOP: fact already known and unchanged
23
+ - High confidence (0.7-1.0) for explicit statements, lower (0.3-0.6) for inferences
24
+ - No trivial or obvious facts
25
+ - Output ONLY the JSON array, nothing else`;
26
+ const VALID_ACTIONS = new Set(["ADD", "UPDATE", "DELETE", "NOOP"]);
27
+ const VALID_CATEGORIES = new Set(["preference", "entity", "issue", "general"]);
28
+ function isValidExtractedFact(f) {
29
+ if (typeof f !== "object" || f === null)
30
+ return false;
31
+ const obj = f;
32
+ return (typeof obj.action === "string" &&
33
+ VALID_ACTIONS.has(obj.action) &&
34
+ typeof obj.content === "string" &&
35
+ obj.content.length > 0 &&
36
+ typeof obj.category === "string" &&
37
+ VALID_CATEGORIES.has(obj.category) &&
38
+ typeof obj.confidence === "number" &&
39
+ obj.confidence >= 0 &&
40
+ obj.confidence <= 1);
41
+ }
42
+ function vectorResultToContactFact(result) {
43
+ const m = result.metadata;
44
+ if (m.type !== CONTACT_FACT_TYPE)
45
+ return null;
46
+ return {
47
+ id: result.id,
48
+ externalUserId: String(m.externalUserId ?? ""),
49
+ tenantId: String(m.tenantId ?? ""),
50
+ content: result.content,
51
+ category: m.category ?? "general",
52
+ confidence: typeof m.confidence === "number" ? m.confidence : 0,
53
+ validAt: String(m.validAt ?? ""),
54
+ expiredAt: m.expiredAt ? String(m.expiredAt) : undefined,
55
+ createdAt: String(m.createdAt ?? ""),
56
+ };
57
+ }
58
+ export class ContactMemoryServiceImpl {
59
+ vectorStore;
60
+ embedder;
61
+ provider;
62
+ constructor(config) {
63
+ this.vectorStore = config.vectorStore;
64
+ this.embedder = config.embedder;
65
+ this.provider = config.provider;
66
+ }
67
+ async extractAndStore(conversationHistory, externalUserId, tenantId) {
68
+ if (!conversationHistory.trim())
69
+ return [];
70
+ // Recall existing facts to provide context for UPDATE/DELETE
71
+ const existingFacts = await this.recall(externalUserId, tenantId);
72
+ let userMessage = `Conversation:\n${conversationHistory}`;
73
+ if (existingFacts.length > 0) {
74
+ const existingContext = existingFacts
75
+ .map((f) => `[id:${f.id}] ${f.content} (${f.category})`)
76
+ .join("\n");
77
+ userMessage = `Existing facts about this customer:\n${existingContext}\n\n${userMessage}`;
78
+ }
79
+ // LLM extraction -- fail-open
80
+ let extractedFacts;
81
+ try {
82
+ const response = await withRetry(() => this.provider.createMessage({
83
+ system: EXTRACTION_SYSTEM_PROMPT,
84
+ messages: [{ role: "user", parts: textParts(userMessage) }],
85
+ maxTokens: EXTRACTION_MAX_TOKENS,
86
+ }), {
87
+ maxRetries: MAX_RETRIES,
88
+ baseDelayMs: BASE_DELAY_MS,
89
+ isRetryable: (error) => {
90
+ if (error instanceof KilnError)
91
+ return error.retryable;
92
+ if (error instanceof Error && "status" in error) {
93
+ const status = error.status;
94
+ return status === 429 || status >= 500;
95
+ }
96
+ return false;
97
+ },
98
+ });
99
+ const responseText = extractText(response.parts).trim();
100
+ const parsed = JSON.parse(responseText);
101
+ if (!Array.isArray(parsed))
102
+ return [];
103
+ extractedFacts = parsed.filter(isValidExtractedFact);
104
+ }
105
+ catch {
106
+ // Fail-open: extraction errors are non-fatal
107
+ return [];
108
+ }
109
+ if (extractedFacts.length === 0)
110
+ return [];
111
+ const now = new Date().toISOString();
112
+ const storedFacts = [];
113
+ for (const fact of extractedFacts) {
114
+ switch (fact.action) {
115
+ case "ADD": {
116
+ const contactFact = await this.addFact(fact, externalUserId, tenantId, now);
117
+ storedFacts.push(contactFact);
118
+ break;
119
+ }
120
+ case "UPDATE": {
121
+ // Expire old fact, then add new version
122
+ if (fact.existingFactId) {
123
+ await this.expireFact(fact.existingFactId);
124
+ }
125
+ else {
126
+ await this.expireByContent(fact.content, externalUserId, tenantId);
127
+ }
128
+ const updated = await this.addFact(fact, externalUserId, tenantId, now);
129
+ storedFacts.push(updated);
130
+ break;
131
+ }
132
+ case "DELETE": {
133
+ if (fact.existingFactId) {
134
+ await this.expireFact(fact.existingFactId);
135
+ }
136
+ else {
137
+ await this.expireByContent(fact.content, externalUserId, tenantId);
138
+ }
139
+ break;
140
+ }
141
+ // NOOP: skip
142
+ }
143
+ }
144
+ return storedFacts;
145
+ }
146
+ async recall(externalUserId, tenantId, options) {
147
+ const limit = options?.limit ?? DEFAULT_RECALL_LIMIT;
148
+ // If query is provided, use vector similarity to rank results
149
+ const queryText = options?.query ?? `facts about user ${externalUserId}`;
150
+ const [embedding] = await this.embedder.embed([queryText]);
151
+ if (!embedding)
152
+ return [];
153
+ const results = await this.vectorStore.query(embedding, {
154
+ topK: limit * 2, // Fetch extra to filter expired
155
+ filter: { externalUserId, tenantId, type: CONTACT_FACT_TYPE },
156
+ });
157
+ // Filter out expired facts and convert to ContactFact
158
+ const facts = [];
159
+ for (const result of results) {
160
+ if (result.metadata.expiredAt)
161
+ continue;
162
+ const fact = vectorResultToContactFact(result);
163
+ if (fact)
164
+ facts.push(fact);
165
+ if (facts.length >= limit)
166
+ break;
167
+ }
168
+ return facts;
169
+ }
170
+ // tenantId reserved for future per-tenant isolation at the store level
171
+ async forget(factId, _tenantId) {
172
+ await this.vectorStore.delete([factId]);
173
+ }
174
+ async forgetAll(externalUserId, tenantId) {
175
+ await this.vectorStore.deleteByMetadata({
176
+ externalUserId,
177
+ tenantId,
178
+ type: CONTACT_FACT_TYPE,
179
+ });
180
+ }
181
+ async addFact(fact, externalUserId, tenantId, now) {
182
+ const id = crypto.randomUUID();
183
+ const [embedding] = await this.embedder.embed([fact.content]);
184
+ if (!embedding) {
185
+ throw new KilnError("CONTACT_MEMORY_EXTRACTION_FAILED", "Failed to embed fact content", {
186
+ context: { content: fact.content },
187
+ });
188
+ }
189
+ await this.vectorStore.upsert([
190
+ {
191
+ id,
192
+ content: fact.content,
193
+ embedding,
194
+ metadata: {
195
+ externalUserId,
196
+ tenantId,
197
+ category: fact.category,
198
+ confidence: fact.confidence,
199
+ validAt: now,
200
+ createdAt: now,
201
+ type: CONTACT_FACT_TYPE,
202
+ },
203
+ },
204
+ ]);
205
+ return {
206
+ id,
207
+ externalUserId,
208
+ tenantId,
209
+ content: fact.content,
210
+ category: fact.category,
211
+ confidence: fact.confidence,
212
+ validAt: now,
213
+ createdAt: now,
214
+ };
215
+ }
216
+ async expireFact(factId) {
217
+ // VectorStore doesn't have a get-by-id + update metadata flow,
218
+ // so we delete the entry. The fact is logically expired (removed from active queries).
219
+ await this.vectorStore.delete([factId]);
220
+ }
221
+ async expireByContent(content, externalUserId, tenantId) {
222
+ const [embedding] = await this.embedder.embed([content]);
223
+ if (!embedding)
224
+ return;
225
+ const results = await this.vectorStore.query(embedding, {
226
+ topK: 1,
227
+ minScore: 0.8,
228
+ filter: { externalUserId, tenantId, type: CONTACT_FACT_TYPE },
229
+ });
230
+ if (results.length > 0 && !results[0].metadata.expiredAt) {
231
+ await this.vectorStore.delete([results[0].id]);
232
+ }
233
+ }
234
+ }
235
+ //# sourceMappingURL=contact-memory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contact-memory.js","sourceRoot":"","sources":["../../src/knowledge/contact-memory.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import type { Document, Chunk, ChunkEnricher } from "../engine/domain/chunker.js";
2
+ import type { ProviderAdapter } from "../agents/index.js";
3
+ export interface ContextualEnricherConfig {
4
+ readonly provider: ProviderAdapter;
5
+ readonly concurrency?: number;
6
+ readonly maxDocumentChars?: number;
7
+ }
8
+ export declare class ContextualEnricher implements ChunkEnricher {
9
+ private readonly provider;
10
+ private readonly concurrency;
11
+ private readonly maxDocumentChars;
12
+ constructor(config: ContextualEnricherConfig);
13
+ enrich(document: Document, chunks: Chunk[]): Promise<Chunk[]>;
14
+ private generateContext;
15
+ }
16
+ //# sourceMappingURL=contextual-enricher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contextual-enricher.d.ts","sourceRoot":"","sources":["../../src/knowledge/contextual-enricher.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAClF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAkB1D,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,QAAQ,EAAE,eAAe,CAAC;IACnC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;CACpC;AAED,qBAAa,kBAAmB,YAAW,aAAa;IACtD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAkB;IAC3C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAS;gBAE9B,MAAM,EAAE,wBAAwB;IAMtC,MAAM,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC;YAsCrD,eAAe;CA0B9B"}
@@ -0,0 +1,82 @@
1
+ // Contextual retrieval enrichment -- Anthropic pattern
2
+ // Prepends document-level context to each chunk before embedding via LLM
3
+ import { textParts, extractText } from "../engine/domain/content.js";
4
+ import { withRetry } from "../agents/infrastructure/retry.js";
5
+ import { KilnError } from "../engine/errors.js";
6
+ const DEFAULT_CONCURRENCY = 5;
7
+ const DEFAULT_MAX_DOCUMENT_CHARS = 100_000;
8
+ const MAX_RETRIES = 3;
9
+ const BASE_DELAY_MS = 1000;
10
+ const ENRICHMENT_MAX_TOKENS = 200;
11
+ const ENRICHMENT_PROMPT_TEMPLATE = `Here is a chunk from the document:
12
+ <chunk>
13
+ {chunk}
14
+ </chunk>
15
+
16
+ Give a short succinct context to situate this chunk within the overall document for the purposes of improving search retrieval of the chunk. Answer only with the succinct context and nothing else.`;
17
+ export class ContextualEnricher {
18
+ provider;
19
+ concurrency;
20
+ maxDocumentChars;
21
+ constructor(config) {
22
+ this.provider = config.provider;
23
+ this.concurrency = config.concurrency ?? DEFAULT_CONCURRENCY;
24
+ this.maxDocumentChars = config.maxDocumentChars ?? DEFAULT_MAX_DOCUMENT_CHARS;
25
+ }
26
+ async enrich(document, chunks) {
27
+ if (chunks.length === 0)
28
+ return [];
29
+ const docContent = document.content.length > this.maxDocumentChars
30
+ ? document.content.slice(0, this.maxDocumentChars)
31
+ : document.content;
32
+ const results = new Array(chunks.length);
33
+ let cursor = 0;
34
+ const processChunk = async (index) => {
35
+ const chunk = chunks[index];
36
+ try {
37
+ const context = await this.generateContext(docContent, chunk.content);
38
+ results[index] = {
39
+ ...chunk,
40
+ content: `<context>\n${context}\n</context>\n${chunk.content}`,
41
+ };
42
+ }
43
+ catch {
44
+ // Fail-open: return original chunk unchanged
45
+ results[index] = chunk;
46
+ }
47
+ };
48
+ // Simple semaphore-based concurrency control
49
+ while (cursor < chunks.length) {
50
+ const batch = Math.min(this.concurrency, chunks.length - cursor);
51
+ const batchTasks = [];
52
+ for (let i = 0; i < batch; i++) {
53
+ batchTasks.push(processChunk(cursor + i));
54
+ }
55
+ await Promise.all(batchTasks);
56
+ cursor += batch;
57
+ }
58
+ return results;
59
+ }
60
+ async generateContext(documentContent, chunkContent) {
61
+ const userPrompt = ENRICHMENT_PROMPT_TEMPLATE.replace("{chunk}", chunkContent);
62
+ const response = await withRetry(() => this.provider.createMessage({
63
+ system: documentContent,
64
+ messages: [{ role: "user", parts: textParts(userPrompt) }],
65
+ maxTokens: ENRICHMENT_MAX_TOKENS,
66
+ }), {
67
+ maxRetries: MAX_RETRIES,
68
+ baseDelayMs: BASE_DELAY_MS,
69
+ isRetryable: (error) => {
70
+ if (error instanceof KilnError)
71
+ return error.retryable;
72
+ if (error instanceof Error && "status" in error) {
73
+ const status = error.status;
74
+ return status === 429 || status >= 500;
75
+ }
76
+ return false;
77
+ },
78
+ });
79
+ return extractText(response.parts).trim();
80
+ }
81
+ }
82
+ //# sourceMappingURL=contextual-enricher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contextual-enricher.js","sourceRoot":"","sources":["../../src/knowledge/contextual-enricher.ts"],"names":[],"mappings":"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"}
@@ -3,8 +3,24 @@ export { MarkdownChunker } from "./markdown-chunker.js";
3
3
  export { OpenAIEmbeddingAdapter } from "./infrastructure/openai-embedding.js";
4
4
  export { OllamaEmbeddingAdapter } from "./infrastructure/ollama-embedding.js";
5
5
  export { InMemoryVectorStore, cosineSimilarity } from "./infrastructure/memory-vector-store.js";
6
+ export { PgVectorStore, createPgVectorStore } from "./infrastructure/pgvector-store.js";
7
+ export type { PgVectorStoreConfig } from "./infrastructure/pgvector-store.js";
6
8
  export { RetrievalPipeline } from "./retrieval-pipeline.js";
7
9
  export type { RetrievalPipelineConfig } from "./retrieval-pipeline.js";
8
10
  export { type Reranker } from "./reranker.js";
11
+ export { CohereReranker } from "./infrastructure/cohere-reranker.js";
12
+ export type { CohereRerankerConfig } from "./infrastructure/cohere-reranker.js";
9
13
  export { createKnowledgeCapability, executeKnowledgeSearch } from "./knowledge-capability.js";
14
+ export { ContextualEnricher } from "./contextual-enricher.js";
15
+ export type { ContextualEnricherConfig } from "./contextual-enricher.js";
16
+ export { ContactMemoryServiceImpl } from "./contact-memory.js";
17
+ export type { ContactMemoryServiceConfig } from "./contact-memory.js";
18
+ export { FileExtractor } from "./infrastructure/file-extractor.js";
19
+ export { UrlExtractor } from "./infrastructure/url-extractor.js";
20
+ export { PdfExtractor } from "./infrastructure/pdf-extractor.js";
21
+ export { CompositeExtractor } from "./infrastructure/composite-extractor.js";
22
+ export { InMemorySourceStore } from "./infrastructure/memory-source-store.js";
23
+ export { JsonSourceStore } from "./infrastructure/json-source-store.js";
24
+ export { SourceManager } from "./source-manager.js";
25
+ export type { SourceManagerConfig } from "./source-manager.js";
10
26
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/knowledge/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,sBAAsB,EAAE,MAAM,sCAAsC,CAAC;AAC9E,OAAO,EAAE,sBAAsB,EAAE,MAAM,sCAAsC,CAAC;AAC9E,OAAO,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,yCAAyC,CAAC;AAChG,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,YAAY,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AACvE,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,yBAAyB,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/knowledge/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,sBAAsB,EAAE,MAAM,sCAAsC,CAAC;AAC9E,OAAO,EAAE,sBAAsB,EAAE,MAAM,sCAAsC,CAAC;AAC9E,OAAO,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,yCAAyC,CAAC;AAChG,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AACxF,YAAY,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AAC9E,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,YAAY,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AACvE,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,qCAAqC,CAAC;AACrE,YAAY,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAChF,OAAO,EAAE,yBAAyB,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AAC9F,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC9D,YAAY,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAC;AAGzE,OAAO,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAC;AAC/D,YAAY,EAAE,0BAA0B,EAAE,MAAM,qBAAqB,CAAC;AAGtE,OAAO,EAAE,aAAa,EAAE,MAAM,oCAAoC,CAAC;AACnE,OAAO,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAC;AACjE,OAAO,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAC;AACjE,OAAO,EAAE,kBAAkB,EAAE,MAAM,yCAAyC,CAAC;AAC7E,OAAO,EAAE,mBAAmB,EAAE,MAAM,yCAAyC,CAAC;AAC9E,OAAO,EAAE,eAAe,EAAE,MAAM,uCAAuC,CAAC;AACxE,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,YAAY,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC"}
@@ -4,6 +4,19 @@ export { MarkdownChunker } from "./markdown-chunker.js";
4
4
  export { OpenAIEmbeddingAdapter } from "./infrastructure/openai-embedding.js";
5
5
  export { OllamaEmbeddingAdapter } from "./infrastructure/ollama-embedding.js";
6
6
  export { InMemoryVectorStore, cosineSimilarity } from "./infrastructure/memory-vector-store.js";
7
+ export { PgVectorStore, createPgVectorStore } from "./infrastructure/pgvector-store.js";
7
8
  export { RetrievalPipeline } from "./retrieval-pipeline.js";
9
+ export { CohereReranker } from "./infrastructure/cohere-reranker.js";
8
10
  export { createKnowledgeCapability, executeKnowledgeSearch } from "./knowledge-capability.js";
11
+ export { ContextualEnricher } from "./contextual-enricher.js";
12
+ // Contact memory (Phase 4d)
13
+ export { ContactMemoryServiceImpl } from "./contact-memory.js";
14
+ // Source management (Phase 4c)
15
+ export { FileExtractor } from "./infrastructure/file-extractor.js";
16
+ export { UrlExtractor } from "./infrastructure/url-extractor.js";
17
+ export { PdfExtractor } from "./infrastructure/pdf-extractor.js";
18
+ export { CompositeExtractor } from "./infrastructure/composite-extractor.js";
19
+ export { InMemorySourceStore } from "./infrastructure/memory-source-store.js";
20
+ export { JsonSourceStore } from "./infrastructure/json-source-store.js";
21
+ export { SourceManager } from "./source-manager.js";
9
22
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/knowledge/index.ts"],"names":[],"mappings":"AAAA,8CAA8C;AAE9C,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,sBAAsB,EAAE,MAAM,sCAAsC,CAAC;AAC9E,OAAO,EAAE,sBAAsB,EAAE,MAAM,sCAAsC,CAAC;AAC9E,OAAO,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,yCAAyC,CAAC;AAChG,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAG5D,OAAO,EAAE,yBAAyB,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/knowledge/index.ts"],"names":[],"mappings":"AAAA,8CAA8C;AAE9C,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,sBAAsB,EAAE,MAAM,sCAAsC,CAAC;AAC9E,OAAO,EAAE,sBAAsB,EAAE,MAAM,sCAAsC,CAAC;AAC9E,OAAO,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,yCAAyC,CAAC;AAChG,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AAExF,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAG5D,OAAO,EAAE,cAAc,EAAE,MAAM,qCAAqC,CAAC;AAErE,OAAO,EAAE,yBAAyB,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AAC9F,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAG9D,4BAA4B;AAC5B,OAAO,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAC;AAG/D,+BAA+B;AAC/B,OAAO,EAAE,aAAa,EAAE,MAAM,oCAAoC,CAAC;AACnE,OAAO,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAC;AACjE,OAAO,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAC;AACjE,OAAO,EAAE,kBAAkB,EAAE,MAAM,yCAAyC,CAAC;AAC7E,OAAO,EAAE,mBAAmB,EAAE,MAAM,yCAAyC,CAAC;AAC9E,OAAO,EAAE,eAAe,EAAE,MAAM,uCAAuC,CAAC;AACxE,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,13 @@
1
+ import type { VectorResult } from "../../engine/domain/vector-store.js";
2
+ import type { Reranker } from "../reranker.js";
3
+ export interface CohereRerankerConfig {
4
+ readonly apiKey: string;
5
+ readonly model?: string;
6
+ }
7
+ export declare class CohereReranker implements Reranker {
8
+ private readonly apiKey;
9
+ private readonly model;
10
+ constructor(config: CohereRerankerConfig);
11
+ rerank(query: string, results: VectorResult[]): Promise<VectorResult[]>;
12
+ }
13
+ //# sourceMappingURL=cohere-reranker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cohere-reranker.d.ts","sourceRoot":"","sources":["../../../src/knowledge/infrastructure/cohere-reranker.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qCAAqC,CAAC;AACxE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAI/C,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACzB;AASD,qBAAa,cAAe,YAAW,QAAQ;IAC7C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;gBAEnB,MAAM,EAAE,oBAAoB;IAKlC,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;CAyD9E"}
@@ -0,0 +1,61 @@
1
+ // Cohere reranker adapter -- fetch-based, no external SDK dependency
2
+ import { KilnError } from "../../engine/errors.js";
3
+ import { withRetry } from "../../agents/infrastructure/retry.js";
4
+ export class CohereReranker {
5
+ apiKey;
6
+ model;
7
+ constructor(config) {
8
+ this.apiKey = config.apiKey;
9
+ this.model = config.model ?? "rerank-v3.5";
10
+ }
11
+ async rerank(query, results) {
12
+ if (results.length === 0) {
13
+ return [];
14
+ }
15
+ const data = await withRetry(async () => {
16
+ const response = await fetch("https://api.cohere.com/v2/rerank", {
17
+ method: "POST",
18
+ headers: {
19
+ "Content-Type": "application/json",
20
+ Authorization: `Bearer ${this.apiKey}`,
21
+ },
22
+ body: JSON.stringify({
23
+ model: this.model,
24
+ query,
25
+ documents: results.map((r) => r.content),
26
+ top_n: results.length,
27
+ }),
28
+ });
29
+ if (!response.ok) {
30
+ const status = response.status;
31
+ if (status === 429 || status >= 500) {
32
+ const err = new Error(`Cohere rerank returned ${status}`);
33
+ err.status = status;
34
+ throw err;
35
+ }
36
+ const body = await response.text();
37
+ throw new KilnError("PROVIDER_UNAVAILABLE", `Cohere rerank error ${status}: ${body}`, {
38
+ context: { provider: "cohere", status },
39
+ retryable: false,
40
+ });
41
+ }
42
+ return response.json();
43
+ }, {
44
+ maxRetries: 3,
45
+ baseDelayMs: 1000,
46
+ isRetryable: (error) => !(error instanceof KilnError) &&
47
+ error instanceof Error &&
48
+ "status" in error,
49
+ });
50
+ return data.results.map((r) => {
51
+ const original = results[r.index];
52
+ return {
53
+ id: original.id,
54
+ content: original.content,
55
+ score: r.relevance_score,
56
+ metadata: original.metadata,
57
+ };
58
+ });
59
+ }
60
+ }
61
+ //# sourceMappingURL=cohere-reranker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cohere-reranker.js","sourceRoot":"","sources":["../../../src/knowledge/infrastructure/cohere-reranker.ts"],"names":[],"mappings":"AAAA,qEAAqE;AAIrE,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,MAAM,sCAAsC,CAAC;AAcjE,MAAM,OAAO,cAAc;IACR,MAAM,CAAS;IACf,KAAK,CAAS;IAE/B,YAAY,MAA4B;QACtC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;QAC5B,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,IAAI,aAAa,CAAC;IAC7C,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,KAAa,EAAE,OAAuB;QACjD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,SAAS,CAC1B,KAAK,IAAI,EAAE;YACT,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,kCAAkC,EAAE;gBAC/D,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE;oBACP,cAAc,EAAE,kBAAkB;oBAClC,aAAa,EAAE,UAAU,IAAI,CAAC,MAAM,EAAE;iBACvC;gBACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;oBACnB,KAAK,EAAE,IAAI,CAAC,KAAK;oBACjB,KAAK;oBACL,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;oBACxC,KAAK,EAAE,OAAO,CAAC,MAAM;iBACtB,CAAC;aACH,CAAC,CAAC;YAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC;gBAC/B,IAAI,MAAM,KAAK,GAAG,IAAI,MAAM,IAAI,GAAG,EAAE,CAAC;oBACpC,MAAM,GAAG,GAAG,IAAI,KAAK,CAAC,0BAA0B,MAAM,EAAE,CAAC,CAAC;oBACzD,GAAyC,CAAC,MAAM,GAAG,MAAM,CAAC;oBAC3D,MAAM,GAAG,CAAC;gBACZ,CAAC;gBACD,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;gBACnC,MAAM,IAAI,SAAS,CAAC,sBAAsB,EAAE,uBAAuB,MAAM,KAAK,IAAI,EAAE,EAAE;oBACpF,OAAO,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE;oBACvC,SAAS,EAAE,KAAK;iBACjB,CAAC,CAAC;YACL,CAAC;YAED,OAAO,QAAQ,CAAC,IAAI,EAAmC,CAAC;QAC1D,CAAC,EACD;YACE,UAAU,EAAE,CAAC;YACb,WAAW,EAAE,IAAI;YACjB,WAAW,EAAE,CAAC,KAAc,EAAE,EAAE,CAC9B,CAAC,CAAC,KAAK,YAAY,SAAS,CAAC;gBAC7B,KAAK,YAAY,KAAK;gBACtB,QAAQ,IAAI,KAAK;SACpB,CACF,CAAC;QAEF,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;YAC5B,MAAM,QAAQ,GAAG,OAAO,CAAC,CAAC,CAAC,KAAK,CAAE,CAAC;YACnC,OAAO;gBACL,EAAE,EAAE,QAAQ,CAAC,EAAE;gBACf,OAAO,EAAE,QAAQ,CAAC,OAAO;gBACzB,KAAK,EAAE,CAAC,CAAC,eAAe;gBACxB,QAAQ,EAAE,QAAQ,CAAC,QAAQ;aAC5B,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC;CACF"}
@@ -0,0 +1,8 @@
1
+ import type { ContentExtractor, ExtractedContent, KnowledgeSourceType } from "../../engine/domain/knowledge-source.js";
2
+ export declare class CompositeExtractor implements ContentExtractor {
3
+ readonly supportedTypes: readonly KnowledgeSourceType[];
4
+ private readonly extractors;
5
+ constructor(extractors: readonly ContentExtractor[]);
6
+ extract(uri: string, type: KnowledgeSourceType): Promise<ExtractedContent>;
7
+ }
8
+ //# sourceMappingURL=composite-extractor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"composite-extractor.d.ts","sourceRoot":"","sources":["../../../src/knowledge/infrastructure/composite-extractor.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,yCAAyC,CAAC;AAEvH,qBAAa,kBAAmB,YAAW,gBAAgB;IACzD,QAAQ,CAAC,cAAc,EAAE,SAAS,mBAAmB,EAAE,CAAC;IACxD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAqD;gBAEpE,UAAU,EAAE,SAAS,gBAAgB,EAAE;IAW7C,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,mBAAmB,GAAG,OAAO,CAAC,gBAAgB,CAAC;CASjF"}
@@ -0,0 +1,26 @@
1
+ // CompositeExtractor -- routes extraction to the correct extractor by source type
2
+ import { KilnError } from "../../engine/errors.js";
3
+ export class CompositeExtractor {
4
+ supportedTypes;
5
+ extractors;
6
+ constructor(extractors) {
7
+ const map = new Map();
8
+ for (const extractor of extractors) {
9
+ for (const type of extractor.supportedTypes) {
10
+ map.set(type, extractor);
11
+ }
12
+ }
13
+ this.extractors = map;
14
+ this.supportedTypes = [...map.keys()];
15
+ }
16
+ async extract(uri, type) {
17
+ const extractor = this.extractors.get(type);
18
+ if (!extractor) {
19
+ throw new KilnError("SOURCE_EXTRACTION_FAILED", `No extractor available for source type: ${type}`, {
20
+ context: { uri, type },
21
+ });
22
+ }
23
+ return extractor.extract(uri, type);
24
+ }
25
+ }
26
+ //# sourceMappingURL=composite-extractor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"composite-extractor.js","sourceRoot":"","sources":["../../../src/knowledge/infrastructure/composite-extractor.ts"],"names":[],"mappings":"AAAA,kFAAkF;AAElF,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAGnD,MAAM,OAAO,kBAAkB;IACpB,cAAc,CAAiC;IACvC,UAAU,CAAqD;IAEhF,YAAY,UAAuC;QACjD,MAAM,GAAG,GAAG,IAAI,GAAG,EAAyC,CAAC;QAC7D,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;YACnC,KAAK,MAAM,IAAI,IAAI,SAAS,CAAC,cAAc,EAAE,CAAC;gBAC5C,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;YAC3B,CAAC;QACH,CAAC;QACD,IAAI,CAAC,UAAU,GAAG,GAAG,CAAC;QACtB,IAAI,CAAC,cAAc,GAAG,CAAC,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;IACxC,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,GAAW,EAAE,IAAyB;QAClD,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC5C,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,MAAM,IAAI,SAAS,CAAC,0BAA0B,EAAE,2CAA2C,IAAI,EAAE,EAAE;gBACjG,OAAO,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE;aACvB,CAAC,CAAC;QACL,CAAC;QACD,OAAO,SAAS,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IACtC,CAAC;CACF"}
@@ -0,0 +1,6 @@
1
+ import type { ContentExtractor, ExtractedContent, KnowledgeSourceType } from "../../engine/domain/knowledge-source.js";
2
+ export declare class FileExtractor implements ContentExtractor {
3
+ readonly supportedTypes: readonly KnowledgeSourceType[];
4
+ extract(uri: string): Promise<ExtractedContent>;
5
+ }
6
+ //# sourceMappingURL=file-extractor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-extractor.d.ts","sourceRoot":"","sources":["../../../src/knowledge/infrastructure/file-extractor.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,yCAAyC,CAAC;AAEvH,qBAAa,aAAc,YAAW,gBAAgB;IACpD,QAAQ,CAAC,cAAc,EAAE,SAAS,mBAAmB,EAAE,CAAY;IAE7D,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;CAWtD"}
@@ -0,0 +1,19 @@
1
+ // FileExtractor -- reads local files for knowledge ingestion
2
+ import { readFile } from "node:fs/promises";
3
+ import { KilnError } from "../../engine/errors.js";
4
+ export class FileExtractor {
5
+ supportedTypes = ["file"];
6
+ async extract(uri) {
7
+ try {
8
+ const content = await readFile(uri, "utf-8");
9
+ return { content, metadata: { source: uri } };
10
+ }
11
+ catch (err) {
12
+ throw new KilnError("SOURCE_EXTRACTION_FAILED", `Failed to read file: ${uri}`, {
13
+ context: { uri },
14
+ cause: err,
15
+ });
16
+ }
17
+ }
18
+ }
19
+ //# sourceMappingURL=file-extractor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-extractor.js","sourceRoot":"","sources":["../../../src/knowledge/infrastructure/file-extractor.ts"],"names":[],"mappings":"AAAA,6DAA6D;AAE7D,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAGnD,MAAM,OAAO,aAAa;IACf,cAAc,GAAmC,CAAC,MAAM,CAAC,CAAC;IAEnE,KAAK,CAAC,OAAO,CAAC,GAAW;QACvB,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;YAC7C,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,CAAC;QAChD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,IAAI,SAAS,CAAC,0BAA0B,EAAE,wBAAwB,GAAG,EAAE,EAAE;gBAC7E,OAAO,EAAE,EAAE,GAAG,EAAE;gBAChB,KAAK,EAAE,GAAG;aACX,CAAC,CAAC;QACL,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,14 @@
1
+ import type { KnowledgeSource, SourceStore } from "../../engine/domain/knowledge-source.js";
2
+ export declare class JsonSourceStore implements SourceStore {
3
+ private readonly storageDir;
4
+ private readonly sources;
5
+ constructor(storageDir: string);
6
+ private key;
7
+ private load;
8
+ get(appName: string, sourceId: string): KnowledgeSource | undefined;
9
+ list(appName: string): readonly KnowledgeSource[];
10
+ save(source: KnowledgeSource): void;
11
+ remove(appName: string, sourceId: string): boolean;
12
+ private persist;
13
+ }
14
+ //# sourceMappingURL=json-source-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-source-store.d.ts","sourceRoot":"","sources":["../../../src/knowledge/infrastructure/json-source-store.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,yCAAyC,CAAC;AAE5F,qBAAa,eAAgB,YAAW,WAAW;IACjD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAsC;gBAElD,UAAU,EAAE,MAAM;IAK9B,OAAO,CAAC,GAAG;IAIX,OAAO,CAAC,IAAI;IAUZ,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS;IAInE,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,eAAe,EAAE;IAUjD,IAAI,CAAC,MAAM,EAAE,eAAe,GAAG,IAAI;IAKnC,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO;IASlD,OAAO,CAAC,OAAO;CAKhB"}