context-gatekeeper 0.3.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 (305) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +774 -0
  3. package/README.zh.md +765 -0
  4. package/bin/context-gatekeeper-cli.js +60 -0
  5. package/dist/api/gdpr.d.ts +104 -0
  6. package/dist/api/gdpr.d.ts.map +1 -0
  7. package/dist/api/gdpr.js +229 -0
  8. package/dist/api/gdpr.js.map +1 -0
  9. package/dist/api/health-check.d.ts +13 -0
  10. package/dist/api/health-check.d.ts.map +1 -0
  11. package/dist/api/health-check.js +2 -0
  12. package/dist/api/health-check.js.map +1 -0
  13. package/dist/api/index.d.ts +7 -0
  14. package/dist/api/index.d.ts.map +1 -0
  15. package/dist/api/index.js +8 -0
  16. package/dist/api/index.js.map +1 -0
  17. package/dist/api/observability.d.ts +39 -0
  18. package/dist/api/observability.d.ts.map +1 -0
  19. package/dist/api/observability.js +132 -0
  20. package/dist/api/observability.js.map +1 -0
  21. package/dist/api/session-manager.d.ts +41 -0
  22. package/dist/api/session-manager.d.ts.map +1 -0
  23. package/dist/api/session-manager.js +129 -0
  24. package/dist/api/session-manager.js.map +1 -0
  25. package/dist/index.d.ts +2 -0
  26. package/dist/index.d.ts.map +1 -0
  27. package/dist/index.js +7 -0
  28. package/dist/index.js.map +1 -0
  29. package/dist/mcp/server.d.ts +8 -0
  30. package/dist/mcp/server.d.ts.map +1 -0
  31. package/dist/mcp/server.js +613 -0
  32. package/dist/mcp/server.js.map +1 -0
  33. package/dist/mcp/tools/configure-llm.d.ts +26 -0
  34. package/dist/mcp/tools/configure-llm.d.ts.map +1 -0
  35. package/dist/mcp/tools/configure-llm.js +32 -0
  36. package/dist/mcp/tools/configure-llm.js.map +1 -0
  37. package/dist/mcp/tools/context-compress.d.ts +15 -0
  38. package/dist/mcp/tools/context-compress.d.ts.map +1 -0
  39. package/dist/mcp/tools/context-compress.js +15 -0
  40. package/dist/mcp/tools/context-compress.js.map +1 -0
  41. package/dist/mcp/tools/dual-mode-execute.d.ts +78 -0
  42. package/dist/mcp/tools/dual-mode-execute.d.ts.map +1 -0
  43. package/dist/mcp/tools/dual-mode-execute.js +299 -0
  44. package/dist/mcp/tools/dual-mode-execute.js.map +1 -0
  45. package/dist/mcp/tools/index.d.ts +19 -0
  46. package/dist/mcp/tools/index.d.ts.map +1 -0
  47. package/dist/mcp/tools/index.js +20 -0
  48. package/dist/mcp/tools/index.js.map +1 -0
  49. package/dist/mcp/tools/intelligent-recall.d.ts +67 -0
  50. package/dist/mcp/tools/intelligent-recall.d.ts.map +1 -0
  51. package/dist/mcp/tools/intelligent-recall.js +208 -0
  52. package/dist/mcp/tools/intelligent-recall.js.map +1 -0
  53. package/dist/mcp/tools/memory-anchor.d.ts +13 -0
  54. package/dist/mcp/tools/memory-anchor.d.ts.map +1 -0
  55. package/dist/mcp/tools/memory-anchor.js +16 -0
  56. package/dist/mcp/tools/memory-anchor.js.map +1 -0
  57. package/dist/mcp/tools/memory-delete-batch.d.ts +16 -0
  58. package/dist/mcp/tools/memory-delete-batch.d.ts.map +1 -0
  59. package/dist/mcp/tools/memory-delete-batch.js +26 -0
  60. package/dist/mcp/tools/memory-delete-batch.js.map +1 -0
  61. package/dist/mcp/tools/memory-extract.d.ts +68 -0
  62. package/dist/mcp/tools/memory-extract.d.ts.map +1 -0
  63. package/dist/mcp/tools/memory-extract.js +280 -0
  64. package/dist/mcp/tools/memory-extract.js.map +1 -0
  65. package/dist/mcp/tools/memory-recall.d.ts +42 -0
  66. package/dist/mcp/tools/memory-recall.d.ts.map +1 -0
  67. package/dist/mcp/tools/memory-recall.js +37 -0
  68. package/dist/mcp/tools/memory-recall.js.map +1 -0
  69. package/dist/mcp/tools/memory-report-usage.d.ts +17 -0
  70. package/dist/mcp/tools/memory-report-usage.d.ts.map +1 -0
  71. package/dist/mcp/tools/memory-report-usage.js +15 -0
  72. package/dist/mcp/tools/memory-report-usage.js.map +1 -0
  73. package/dist/mcp/tools/memory-search.d.ts +43 -0
  74. package/dist/mcp/tools/memory-search.d.ts.map +1 -0
  75. package/dist/mcp/tools/memory-search.js +38 -0
  76. package/dist/mcp/tools/memory-search.js.map +1 -0
  77. package/dist/mcp/tools/memory-session.d.ts +118 -0
  78. package/dist/mcp/tools/memory-session.d.ts.map +1 -0
  79. package/dist/mcp/tools/memory-session.js +113 -0
  80. package/dist/mcp/tools/memory-session.js.map +1 -0
  81. package/dist/mcp/tools/memory-stats.d.ts +10 -0
  82. package/dist/mcp/tools/memory-stats.d.ts.map +1 -0
  83. package/dist/mcp/tools/memory-stats.js +35 -0
  84. package/dist/mcp/tools/memory-stats.js.map +1 -0
  85. package/dist/mcp/tools/memory-store-batch.d.ts +49 -0
  86. package/dist/mcp/tools/memory-store-batch.d.ts.map +1 -0
  87. package/dist/mcp/tools/memory-store-batch.js +48 -0
  88. package/dist/mcp/tools/memory-store-batch.js.map +1 -0
  89. package/dist/mcp/tools/memory-store.d.ts +37 -0
  90. package/dist/mcp/tools/memory-store.d.ts.map +1 -0
  91. package/dist/mcp/tools/memory-store.js +34 -0
  92. package/dist/mcp/tools/memory-store.js.map +1 -0
  93. package/dist/mcp/tools/project-create.d.ts +16 -0
  94. package/dist/mcp/tools/project-create.d.ts.map +1 -0
  95. package/dist/mcp/tools/project-create.js +14 -0
  96. package/dist/mcp/tools/project-create.js.map +1 -0
  97. package/dist/models/types.d.ts +88 -0
  98. package/dist/models/types.d.ts.map +1 -0
  99. package/dist/models/types.js +19 -0
  100. package/dist/models/types.js.map +1 -0
  101. package/dist/schema/compression.d.ts +7 -0
  102. package/dist/schema/compression.d.ts.map +1 -0
  103. package/dist/schema/compression.js +66 -0
  104. package/dist/schema/compression.js.map +1 -0
  105. package/dist/schema/fulltext-search.d.ts +10 -0
  106. package/dist/schema/fulltext-search.d.ts.map +1 -0
  107. package/dist/schema/fulltext-search.js +73 -0
  108. package/dist/schema/fulltext-search.js.map +1 -0
  109. package/dist/schema/index.d.ts +9 -0
  110. package/dist/schema/index.d.ts.map +1 -0
  111. package/dist/schema/index.js +9 -0
  112. package/dist/schema/index.js.map +1 -0
  113. package/dist/schema/knowledge-graph.d.ts +108 -0
  114. package/dist/schema/knowledge-graph.d.ts.map +1 -0
  115. package/dist/schema/knowledge-graph.js +372 -0
  116. package/dist/schema/knowledge-graph.js.map +1 -0
  117. package/dist/schema/memory-session.d.ts +62 -0
  118. package/dist/schema/memory-session.d.ts.map +1 -0
  119. package/dist/schema/memory-session.js +258 -0
  120. package/dist/schema/memory-session.js.map +1 -0
  121. package/dist/schema/memory.d.ts +84 -0
  122. package/dist/schema/memory.d.ts.map +1 -0
  123. package/dist/schema/memory.js +622 -0
  124. package/dist/schema/memory.js.map +1 -0
  125. package/dist/schema/project.d.ts +8 -0
  126. package/dist/schema/project.d.ts.map +1 -0
  127. package/dist/schema/project.js +68 -0
  128. package/dist/schema/project.js.map +1 -0
  129. package/dist/schema/schema-init.d.ts +2 -0
  130. package/dist/schema/schema-init.d.ts.map +1 -0
  131. package/dist/schema/schema-init.js +199 -0
  132. package/dist/schema/schema-init.js.map +1 -0
  133. package/dist/schema/vector-index.d.ts +28 -0
  134. package/dist/schema/vector-index.d.ts.map +1 -0
  135. package/dist/schema/vector-index.js +179 -0
  136. package/dist/schema/vector-index.js.map +1 -0
  137. package/dist/scripts/agents/base.d.ts +89 -0
  138. package/dist/scripts/agents/base.d.ts.map +1 -0
  139. package/dist/scripts/agents/base.js +148 -0
  140. package/dist/scripts/agents/base.js.map +1 -0
  141. package/dist/scripts/agents/base.ts +193 -0
  142. package/dist/scripts/agents/claude-code.d.ts +21 -0
  143. package/dist/scripts/agents/claude-code.d.ts.map +1 -0
  144. package/dist/scripts/agents/claude-code.js +33 -0
  145. package/dist/scripts/agents/claude-code.js.map +1 -0
  146. package/dist/scripts/agents/claude-code.ts +36 -0
  147. package/dist/scripts/agents/claude-desktop.d.ts +25 -0
  148. package/dist/scripts/agents/claude-desktop.d.ts.map +1 -0
  149. package/dist/scripts/agents/claude-desktop.js +36 -0
  150. package/dist/scripts/agents/claude-desktop.js.map +1 -0
  151. package/dist/scripts/agents/claude-desktop.ts +39 -0
  152. package/dist/scripts/agents/cline.d.ts +22 -0
  153. package/dist/scripts/agents/cline.d.ts.map +1 -0
  154. package/dist/scripts/agents/cline.js +35 -0
  155. package/dist/scripts/agents/cline.js.map +1 -0
  156. package/dist/scripts/agents/cline.ts +38 -0
  157. package/dist/scripts/agents/continue.d.ts +20 -0
  158. package/dist/scripts/agents/continue.d.ts.map +1 -0
  159. package/dist/scripts/agents/continue.js +35 -0
  160. package/dist/scripts/agents/continue.js.map +1 -0
  161. package/dist/scripts/agents/continue.ts +38 -0
  162. package/dist/scripts/agents/cursor.d.ts +27 -0
  163. package/dist/scripts/agents/cursor.d.ts.map +1 -0
  164. package/dist/scripts/agents/cursor.js +38 -0
  165. package/dist/scripts/agents/cursor.js.map +1 -0
  166. package/dist/scripts/agents/cursor.ts +41 -0
  167. package/dist/scripts/cli/config-gen.d.ts +59 -0
  168. package/dist/scripts/cli/config-gen.d.ts.map +1 -0
  169. package/dist/scripts/cli/config-gen.js +156 -0
  170. package/dist/scripts/cli/config-gen.js.map +1 -0
  171. package/dist/scripts/cli/config-gen.ts +164 -0
  172. package/dist/scripts/cli/detect.d.ts +42 -0
  173. package/dist/scripts/cli/detect.d.ts.map +1 -0
  174. package/dist/scripts/cli/detect.js +131 -0
  175. package/dist/scripts/cli/detect.js.map +1 -0
  176. package/dist/scripts/cli/detect.ts +162 -0
  177. package/dist/scripts/cli/install.d.ts +31 -0
  178. package/dist/scripts/cli/install.d.ts.map +1 -0
  179. package/dist/scripts/cli/install.js +125 -0
  180. package/dist/scripts/cli/install.js.map +1 -0
  181. package/dist/scripts/cli/install.ts +157 -0
  182. package/dist/scripts/cli/status.d.ts +8 -0
  183. package/dist/scripts/cli/status.d.ts.map +1 -0
  184. package/dist/scripts/cli/status.js +39 -0
  185. package/dist/scripts/cli/status.js.map +1 -0
  186. package/dist/scripts/cli/status.ts +48 -0
  187. package/dist/scripts/cli/uninstall.d.ts +22 -0
  188. package/dist/scripts/cli/uninstall.d.ts.map +1 -0
  189. package/dist/scripts/cli/uninstall.js +141 -0
  190. package/dist/scripts/cli/uninstall.js.map +1 -0
  191. package/dist/scripts/cli/uninstall.ts +157 -0
  192. package/dist/scripts/cli.d.ts +23 -0
  193. package/dist/scripts/cli.d.ts.map +1 -0
  194. package/dist/scripts/cli.js +166 -0
  195. package/dist/scripts/cli.js.map +1 -0
  196. package/dist/scripts/cli.ts +173 -0
  197. package/dist/services/classifier/index.d.ts +36 -0
  198. package/dist/services/classifier/index.d.ts.map +1 -0
  199. package/dist/services/classifier/index.js +104 -0
  200. package/dist/services/classifier/index.js.map +1 -0
  201. package/dist/services/classifier/llm.d.ts +37 -0
  202. package/dist/services/classifier/llm.d.ts.map +1 -0
  203. package/dist/services/classifier/llm.js +119 -0
  204. package/dist/services/classifier/llm.js.map +1 -0
  205. package/dist/services/classifier/rules.d.ts +22 -0
  206. package/dist/services/classifier/rules.d.ts.map +1 -0
  207. package/dist/services/classifier/rules.js +98 -0
  208. package/dist/services/classifier/rules.js.map +1 -0
  209. package/dist/services/compressor/index.d.ts +3 -0
  210. package/dist/services/compressor/index.d.ts.map +1 -0
  211. package/dist/services/compressor/index.js +3 -0
  212. package/dist/services/compressor/index.js.map +1 -0
  213. package/dist/services/compressor/threshold.d.ts +35 -0
  214. package/dist/services/compressor/threshold.d.ts.map +1 -0
  215. package/dist/services/compressor/threshold.js +60 -0
  216. package/dist/services/compressor/threshold.js.map +1 -0
  217. package/dist/services/compressor/trigger.d.ts +24 -0
  218. package/dist/services/compressor/trigger.d.ts.map +1 -0
  219. package/dist/services/compressor/trigger.js +91 -0
  220. package/dist/services/compressor/trigger.js.map +1 -0
  221. package/dist/services/constraint-extractor.d.ts +25 -0
  222. package/dist/services/constraint-extractor.d.ts.map +1 -0
  223. package/dist/services/constraint-extractor.js +97 -0
  224. package/dist/services/constraint-extractor.js.map +1 -0
  225. package/dist/services/database-health.d.ts +22 -0
  226. package/dist/services/database-health.d.ts.map +1 -0
  227. package/dist/services/database-health.js +122 -0
  228. package/dist/services/database-health.js.map +1 -0
  229. package/dist/services/embedding-fixed.d.ts +9 -0
  230. package/dist/services/embedding-fixed.d.ts.map +1 -0
  231. package/dist/services/embedding-fixed.js +70 -0
  232. package/dist/services/embedding-fixed.js.map +1 -0
  233. package/dist/services/embedding-provider.d.ts +79 -0
  234. package/dist/services/embedding-provider.d.ts.map +1 -0
  235. package/dist/services/embedding-provider.js +229 -0
  236. package/dist/services/embedding-provider.js.map +1 -0
  237. package/dist/services/embedding.d.ts +17 -0
  238. package/dist/services/embedding.d.ts.map +1 -0
  239. package/dist/services/embedding.js +99 -0
  240. package/dist/services/embedding.js.map +1 -0
  241. package/dist/services/hnsw-index.d.ts +76 -0
  242. package/dist/services/hnsw-index.d.ts.map +1 -0
  243. package/dist/services/hnsw-index.js +301 -0
  244. package/dist/services/hnsw-index.js.map +1 -0
  245. package/dist/services/llm.d.ts +39 -0
  246. package/dist/services/llm.d.ts.map +1 -0
  247. package/dist/services/llm.js +207 -0
  248. package/dist/services/llm.js.map +1 -0
  249. package/dist/services/memory-tiers.d.ts +75 -0
  250. package/dist/services/memory-tiers.d.ts.map +1 -0
  251. package/dist/services/memory-tiers.js +275 -0
  252. package/dist/services/memory-tiers.js.map +1 -0
  253. package/dist/services/memory.d.ts +33 -0
  254. package/dist/services/memory.d.ts.map +1 -0
  255. package/dist/services/memory.js +209 -0
  256. package/dist/services/memory.js.map +1 -0
  257. package/dist/services/multi-agent-sharing.d.ts +83 -0
  258. package/dist/services/multi-agent-sharing.d.ts.map +1 -0
  259. package/dist/services/multi-agent-sharing.js +278 -0
  260. package/dist/services/multi-agent-sharing.js.map +1 -0
  261. package/dist/services/reranker.d.ts +88 -0
  262. package/dist/services/reranker.d.ts.map +1 -0
  263. package/dist/services/reranker.js +234 -0
  264. package/dist/services/reranker.js.map +1 -0
  265. package/dist/services/triple-extractor.d.ts +35 -0
  266. package/dist/services/triple-extractor.d.ts.map +1 -0
  267. package/dist/services/triple-extractor.js +293 -0
  268. package/dist/services/triple-extractor.js.map +1 -0
  269. package/dist/services/vector-provider.d.ts +40 -0
  270. package/dist/services/vector-provider.d.ts.map +1 -0
  271. package/dist/services/vector-provider.js +225 -0
  272. package/dist/services/vector-provider.js.map +1 -0
  273. package/dist/utils/after-chain-executor.d.ts +26 -0
  274. package/dist/utils/after-chain-executor.d.ts.map +1 -0
  275. package/dist/utils/after-chain-executor.js +135 -0
  276. package/dist/utils/after-chain-executor.js.map +1 -0
  277. package/dist/utils/after-chain.d.ts +94 -0
  278. package/dist/utils/after-chain.d.ts.map +1 -0
  279. package/dist/utils/after-chain.js +155 -0
  280. package/dist/utils/after-chain.js.map +1 -0
  281. package/dist/utils/db.d.ts +29 -0
  282. package/dist/utils/db.d.ts.map +1 -0
  283. package/dist/utils/db.js +201 -0
  284. package/dist/utils/db.js.map +1 -0
  285. package/dist/utils/encryption.d.ts +87 -0
  286. package/dist/utils/encryption.d.ts.map +1 -0
  287. package/dist/utils/encryption.js +175 -0
  288. package/dist/utils/encryption.js.map +1 -0
  289. package/dist/utils/errors.d.ts +35 -0
  290. package/dist/utils/errors.d.ts.map +1 -0
  291. package/dist/utils/errors.js +56 -0
  292. package/dist/utils/errors.js.map +1 -0
  293. package/dist/utils/logger.d.ts +27 -0
  294. package/dist/utils/logger.d.ts.map +1 -0
  295. package/dist/utils/logger.js +177 -0
  296. package/dist/utils/logger.js.map +1 -0
  297. package/dist/utils/priority.d.ts +26 -0
  298. package/dist/utils/priority.d.ts.map +1 -0
  299. package/dist/utils/priority.js +43 -0
  300. package/dist/utils/priority.js.map +1 -0
  301. package/dist/utils/watchdog.d.ts +57 -0
  302. package/dist/utils/watchdog.d.ts.map +1 -0
  303. package/dist/utils/watchdog.js +164 -0
  304. package/dist/utils/watchdog.js.map +1 -0
  305. package/package.json +78 -0
@@ -0,0 +1,301 @@
1
+ /**
2
+ * HNSW (Hierarchical Navigable Small World) Index Simulation Layer
3
+ * Provides approximate nearest neighbor (ANN) search using a layered graph structure
4
+ *
5
+ * HNSW Parameters:
6
+ * - M: number of connections per layer (default 16)
7
+ * - efConstruction: search width during construction (default 200)
8
+ * - efSearch: search width during search (default 100)
9
+ * - levelMult: probability multiplier for level generation (default 1/log(2) ≈ 1.44)
10
+ */
11
+ import { v4 as uuidv4 } from 'uuid';
12
+ import { query, getDatabase } from '../utils/db.js';
13
+ const DEFAULT_CONFIG = {
14
+ M: 16,
15
+ efConstruction: 200,
16
+ efSearch: 100,
17
+ levelMult: 1 / Math.log(2),
18
+ dimension: 4096,
19
+ metric: 'cosine'
20
+ };
21
+ // In-memory HNSW structures (for active indexes)
22
+ const hnswIndexes = new Map();
23
+ /**
24
+ * Initialize HNSW index in database
25
+ */
26
+ export function initHNSWIndex(_indexName, config = {}) {
27
+ const db = getDatabase();
28
+ const fullConfig = { ...DEFAULT_CONFIG, ...config };
29
+ db.run(`
30
+ CREATE TABLE IF NOT EXISTS hnsw_nodes (
31
+ id TEXT PRIMARY KEY,
32
+ index_name TEXT NOT NULL,
33
+ memory_id TEXT NOT NULL,
34
+ vector TEXT NOT NULL,
35
+ level INTEGER NOT NULL,
36
+ labels TEXT NOT NULL DEFAULT '[]',
37
+ created_at TEXT NOT NULL DEFAULT (datetime('now'))
38
+ )
39
+ `);
40
+ db.run(`CREATE INDEX IF NOT EXISTS idx_hnsw_nodes_index ON hnsw_nodes(index_name)`);
41
+ db.run(`CREATE INDEX IF NOT EXISTS idx_hnsw_nodes_memory ON hnsw_nodes(index_name, memory_id)`);
42
+ db.run(`CREATE INDEX IF NOT EXISTS idx_hnsw_nodes_level ON hnsw_nodes(index_name, level)`);
43
+ return fullConfig;
44
+ }
45
+ /**
46
+ * Create a new HNSW index in memory
47
+ */
48
+ export function createHNSWIndex(indexName, config = {}) {
49
+ const fullConfig = { ...DEFAULT_CONFIG, ...config };
50
+ if (!hnswIndexes.has(indexName)) {
51
+ hnswIndexes.set(indexName, {
52
+ config: fullConfig,
53
+ nodes: new Map(),
54
+ entryPoints: new Map(),
55
+ memoryIndex: new Map()
56
+ });
57
+ }
58
+ return fullConfig;
59
+ }
60
+ /**
61
+ * Get or create an HNSW index
62
+ */
63
+ export function getHNSWIndex(indexName) {
64
+ if (hnswIndexes.has(indexName)) {
65
+ return hnswIndexes.get(indexName).config;
66
+ }
67
+ // Try to load from database
68
+ const rows = query(`SELECT COUNT(*) as count FROM hnsw_nodes WHERE index_name = ? LIMIT 1`, [indexName]);
69
+ if (rows.length > 0 && rows[0].count > 0) {
70
+ // Index exists in DB but not in memory - needs rebuild
71
+ return null;
72
+ }
73
+ return null;
74
+ }
75
+ /**
76
+ * Calculate random level based on levelMult
77
+ */
78
+ function calculateLevel(config) {
79
+ let level = 0;
80
+ while (Math.random() < Math.exp(-level * config.levelMult) && level < Math.ceil(Math.log(config.dimension))) {
81
+ level++;
82
+ }
83
+ return Math.max(0, level - 1);
84
+ }
85
+ /**
86
+ * Calculate distance between two vectors
87
+ */
88
+ function calculateDistance(a, b, metric) {
89
+ if (metric === 'cosine') {
90
+ let dot = 0, normA = 0, normB = 0;
91
+ for (let i = 0; i < a.length; i++) {
92
+ dot += a[i] * b[i];
93
+ normA += a[i] * a[i];
94
+ normB += b[i] * b[i];
95
+ }
96
+ const denom = Math.sqrt(normA) * Math.sqrt(normB);
97
+ return denom === 0 ? 0 : 1 - dot / denom;
98
+ }
99
+ else if (metric === 'l2') {
100
+ let sum = 0;
101
+ for (let i = 0; i < a.length; i++) {
102
+ const diff = a[i] - b[i];
103
+ sum += diff * diff;
104
+ }
105
+ return Math.sqrt(sum);
106
+ }
107
+ else {
108
+ // inner product (higher is more similar)
109
+ let dot = 0;
110
+ for (let i = 0; i < a.length; i++) {
111
+ dot += a[i] * b[i];
112
+ }
113
+ return -dot; // negate so lower is better (like other metrics)
114
+ }
115
+ }
116
+ /**
117
+ * Search for nearest neighbors in a layer
118
+ */
119
+ function searchLayerLayer(nodes, queryVector, ef, level, metric) {
120
+ const visited = new Set();
121
+ const candidates = [];
122
+ const result = [];
123
+ // Initialize with entry point
124
+ const entryId = Array.from(nodes.values()).find(n => n.level >= level)?.id;
125
+ if (!entryId)
126
+ return result;
127
+ candidates.push({ id: entryId, score: calculateDistance(queryVector, nodes.get(entryId).vector, metric) });
128
+ visited.add(entryId);
129
+ while (candidates.length > 0) {
130
+ // Sort by score (lowest first for distance)
131
+ candidates.sort((a, b) => a.score - b.score);
132
+ const current = candidates.shift();
133
+ if (result.length === 0 || current.score < result[result.length - 1].score || result.length < ef) {
134
+ result.push(current);
135
+ // Search neighbors (simplified - in real HNSW this would use the graph structure)
136
+ for (const [neighborId, neighbor] of nodes) {
137
+ if (visited.has(neighborId) || neighbor.level < level)
138
+ continue;
139
+ visited.add(neighborId);
140
+ const dist = calculateDistance(queryVector, neighbor.vector, metric);
141
+ if (result.length < ef || dist < result[result.length - 1].score) {
142
+ candidates.push({ id: neighborId, score: dist });
143
+ }
144
+ }
145
+ }
146
+ }
147
+ return result.slice(0, ef);
148
+ }
149
+ /**
150
+ * Insert a node into the HNSW index
151
+ */
152
+ export function insertHNSWNode(indexName, memoryId, vector, labels = []) {
153
+ const index = hnswIndexes.get(indexName);
154
+ if (!index)
155
+ return null;
156
+ // Check if already exists
157
+ if (index.memoryIndex.has(memoryId)) {
158
+ return index.nodes.get(index.memoryIndex.get(memoryId)) || null;
159
+ }
160
+ const nodeId = uuidv4();
161
+ const level = calculateLevel(index.config);
162
+ const node = {
163
+ id: nodeId,
164
+ memoryId,
165
+ vector,
166
+ level,
167
+ labels,
168
+ createdAt: new Date().toISOString()
169
+ };
170
+ index.nodes.set(nodeId, node);
171
+ index.memoryIndex.set(memoryId, nodeId);
172
+ // Update entry points
173
+ for (let l = level; l >= 0; l--) {
174
+ if (!index.entryPoints.has(l) || level > (index.nodes.get(index.entryPoints.get(l))?.level || -1)) {
175
+ index.entryPoints.set(l, nodeId);
176
+ }
177
+ }
178
+ return node;
179
+ }
180
+ /**
181
+ * Search for nearest neighbors
182
+ */
183
+ export function searchHNSW(indexName, queryVector, k = 10, efSearch) {
184
+ const index = hnswIndexes.get(indexName);
185
+ if (!index)
186
+ return [];
187
+ const ef = efSearch || index.config.efSearch;
188
+ // Start from top level entry point
189
+ for (let level = Math.max(...Array.from(index.entryPoints.keys())); level >= 0; level--) {
190
+ const entryId = index.entryPoints.get(level);
191
+ if (!entryId)
192
+ continue;
193
+ searchLayerLayer(index.nodes, queryVector, ef, level, index.config.metric);
194
+ }
195
+ // Final search at level 0
196
+ const finalResults = searchLayerLayer(index.nodes, queryVector, ef, 0, index.config.metric);
197
+ return finalResults.slice(0, k).map(r => ({
198
+ memoryId: index.nodes.get(r.id).memoryId,
199
+ score: 1 - r.score // Convert distance to similarity for cosine
200
+ }));
201
+ }
202
+ /**
203
+ * Remove a node from HNSW index
204
+ */
205
+ export function removeHNSWNode(indexName, memoryId) {
206
+ const index = hnswIndexes.get(indexName);
207
+ if (!index)
208
+ return false;
209
+ const nodeId = index.memoryIndex.get(memoryId);
210
+ if (!nodeId)
211
+ return false;
212
+ index.nodes.delete(nodeId);
213
+ index.memoryIndex.delete(memoryId);
214
+ // Update entry points
215
+ for (const [level, epId] of index.entryPoints) {
216
+ if (epId === nodeId) {
217
+ // Find new entry point at this level
218
+ const newEp = Array.from(index.nodes.values()).find(n => n.level >= level);
219
+ if (newEp) {
220
+ index.entryPoints.set(level, newEp.id);
221
+ }
222
+ else {
223
+ index.entryPoints.delete(level);
224
+ }
225
+ }
226
+ }
227
+ return true;
228
+ }
229
+ /**
230
+ * Get statistics for an HNSW index
231
+ */
232
+ export function getHNSWStats(indexName) {
233
+ const index = hnswIndexes.get(indexName);
234
+ if (!index)
235
+ return null;
236
+ let maxLevel = 0;
237
+ let totalSize = 0;
238
+ for (const node of index.nodes.values()) {
239
+ if (node.level > maxLevel)
240
+ maxLevel = node.level;
241
+ totalSize += node.vector.length * 8; // 8 bytes per float64
242
+ }
243
+ return {
244
+ nodeCount: index.nodes.size,
245
+ maxLevel,
246
+ memorySize: totalSize,
247
+ config: index.config
248
+ };
249
+ }
250
+ /**
251
+ * Clear an HNSW index from memory
252
+ */
253
+ export function clearHNSWIndex(indexName) {
254
+ hnswIndexes.delete(indexName);
255
+ }
256
+ /**
257
+ * Sync HNSW index with database (load persisted nodes)
258
+ */
259
+ export function syncHNSWFromDB(indexName, config = {}) {
260
+ const fullConfig = { ...DEFAULT_CONFIG, ...config };
261
+ // Create index if not exists
262
+ createHNSWIndex(indexName, fullConfig);
263
+ const index = hnswIndexes.get(indexName);
264
+ const rows = query(`SELECT * FROM hnsw_nodes WHERE index_name = ?`, [indexName]);
265
+ for (const row of rows) {
266
+ const node = {
267
+ id: row.id,
268
+ memoryId: row.memory_id,
269
+ vector: JSON.parse(row.vector),
270
+ level: row.level,
271
+ labels: JSON.parse(row.labels),
272
+ createdAt: row.created_at
273
+ };
274
+ index.nodes.set(node.id, node);
275
+ index.memoryIndex.set(node.memoryId, node.id);
276
+ // Update entry points
277
+ for (let l = node.level; l >= 0; l--) {
278
+ if (!index.entryPoints.has(l) || node.level > (index.nodes.get(index.entryPoints.get(l))?.level || -1)) {
279
+ index.entryPoints.set(l, node.id);
280
+ }
281
+ }
282
+ }
283
+ return rows.length;
284
+ }
285
+ /**
286
+ * Persist HNSW nodes to database
287
+ */
288
+ export function persistHNSWToDB(indexName) {
289
+ const index = hnswIndexes.get(indexName);
290
+ if (!index)
291
+ return 0;
292
+ let count = 0;
293
+ const db = getDatabase();
294
+ for (const node of index.nodes.values()) {
295
+ db.run(`INSERT OR REPLACE INTO hnsw_nodes (id, index_name, memory_id, vector, level, labels, created_at)
296
+ VALUES (?, ?, ?, ?, ?, ?, ?)`, [node.id, indexName, node.memoryId, JSON.stringify(node.vector), node.level, JSON.stringify(node.labels), node.createdAt]);
297
+ count++;
298
+ }
299
+ return count;
300
+ }
301
+ //# sourceMappingURL=hnsw-index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hnsw-index.js","sourceRoot":"","sources":["../../src/services/hnsw-index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * LLM Summarization Service
3
+ * Provides automatic summarization using configurable LLM providers
4
+ */
5
+ import { z } from 'zod';
6
+ export declare const LLMConfigSchema: z.ZodObject<{
7
+ provider: z.ZodDefault<z.ZodEnum<["openai", "ollama", "anthropic", "none"]>>;
8
+ apiKey: z.ZodOptional<z.ZodString>;
9
+ baseUrl: z.ZodOptional<z.ZodString>;
10
+ model: z.ZodDefault<z.ZodString>;
11
+ }, "strip", z.ZodTypeAny, {
12
+ provider: "openai" | "ollama" | "anthropic" | "none";
13
+ model: string;
14
+ apiKey?: string | undefined;
15
+ baseUrl?: string | undefined;
16
+ }, {
17
+ provider?: "openai" | "ollama" | "anthropic" | "none" | undefined;
18
+ apiKey?: string | undefined;
19
+ baseUrl?: string | undefined;
20
+ model?: string | undefined;
21
+ }>;
22
+ export type LLMConfig = z.infer<typeof LLMConfigSchema>;
23
+ /**
24
+ * Configure the LLM provider
25
+ */
26
+ export declare function configureLLM(newConfig: Partial<LLMConfig>): void;
27
+ /**
28
+ * Get current LLM config
29
+ */
30
+ export declare function getLLMConfig(): LLMConfig;
31
+ /**
32
+ * Summarize content using configured LLM
33
+ */
34
+ export declare function summarizeContent(content: string, maxLength?: number): Promise<string>;
35
+ /**
36
+ * Check if LLM is available (for health check)
37
+ */
38
+ export declare function isLLMAvailable(): Promise<boolean>;
39
+ //# sourceMappingURL=llm.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llm.d.ts","sourceRoot":"","sources":["../../src/services/llm.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;EAK1B,CAAC;AAEH,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AAQxD;;GAEG;AACH,wBAAgB,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,SAAS,CAAC,GAAG,IAAI,CAEhE;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,SAAS,CAExC;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,GAAE,MAAY,GAAG,OAAO,CAAC,MAAM,CAAC,CAqBhG;AAwID;;GAEG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,OAAO,CAAC,CA+BvD"}
@@ -0,0 +1,207 @@
1
+ /**
2
+ * LLM Summarization Service
3
+ * Provides automatic summarization using configurable LLM providers
4
+ */
5
+ import { z } from 'zod';
6
+ import { logger } from '../utils/logger.js';
7
+ export const LLMConfigSchema = z.object({
8
+ provider: z.enum(['openai', 'ollama', 'anthropic', 'none']).default('none'),
9
+ apiKey: z.string().optional(),
10
+ baseUrl: z.string().optional(),
11
+ model: z.string().default('gpt-3.5-turbo')
12
+ });
13
+ // Global config
14
+ let config = {
15
+ provider: 'none',
16
+ model: 'gpt-3.5-turbo'
17
+ };
18
+ /**
19
+ * Configure the LLM provider
20
+ */
21
+ export function configureLLM(newConfig) {
22
+ config = { ...config, ...newConfig };
23
+ }
24
+ /**
25
+ * Get current LLM config
26
+ */
27
+ export function getLLMConfig() {
28
+ return { ...config };
29
+ }
30
+ /**
31
+ * Summarize content using configured LLM
32
+ */
33
+ export async function summarizeContent(content, maxLength = 200) {
34
+ // If no LLM configured, use simple truncation
35
+ if (config.provider === 'none') {
36
+ return simpleSummarize(content, maxLength);
37
+ }
38
+ try {
39
+ switch (config.provider) {
40
+ case 'openai':
41
+ return await summarizeWithOpenAI(content, maxLength);
42
+ case 'ollama':
43
+ return await summarizeWithOllama(content, maxLength);
44
+ case 'anthropic':
45
+ return await summarizeWithAnthropic(content, maxLength);
46
+ default:
47
+ return simpleSummarize(content, maxLength);
48
+ }
49
+ }
50
+ catch (error) {
51
+ logger.error('LLM summarization failed, falling back to simple', { error: error instanceof Error ? error.message : String(error) });
52
+ return simpleSummarize(content, maxLength);
53
+ }
54
+ }
55
+ /**
56
+ * Simple extractive summarization (no LLM required)
57
+ */
58
+ function simpleSummarize(content, maxLength = 200) {
59
+ if (content.length <= maxLength) {
60
+ return content;
61
+ }
62
+ // Try to find sentence boundaries
63
+ const sentences = content.match(/[^.!?]+[.!?]+/g) || [content];
64
+ let result = '';
65
+ for (const sentence of sentences) {
66
+ if (result.length + sentence.length > maxLength) {
67
+ break;
68
+ }
69
+ result += sentence;
70
+ }
71
+ // If no sentences fit, truncate with word boundary
72
+ if (!result) {
73
+ const words = content.split(/\s+/);
74
+ result = words.slice(0, Math.floor(maxLength / 5)).join(' ') + '...';
75
+ }
76
+ return result.trim() || content.substring(0, maxLength - 3) + '...';
77
+ }
78
+ /**
79
+ * Summarize using OpenAI API
80
+ */
81
+ async function summarizeWithOpenAI(content, maxLength) {
82
+ const baseUrl = config.baseUrl || 'https://api.openai.com/v1';
83
+ const apiKey = config.apiKey || process.env.OPENAI_API_KEY;
84
+ if (!apiKey) {
85
+ return simpleSummarize(content, maxLength);
86
+ }
87
+ const response = await fetch(`${baseUrl}/chat/completions`, {
88
+ method: 'POST',
89
+ headers: {
90
+ 'Content-Type': 'application/json',
91
+ 'Authorization': `Bearer ${apiKey}`
92
+ },
93
+ body: JSON.stringify({
94
+ model: config.model,
95
+ messages: [
96
+ {
97
+ role: 'system',
98
+ content: `You are a text summarizer. Summarize the following content in no more than ${maxLength} characters. Keep the key information and essential meaning.`
99
+ },
100
+ {
101
+ role: 'user',
102
+ content
103
+ }
104
+ ],
105
+ max_tokens: Math.ceil(maxLength / 2),
106
+ temperature: 0.3
107
+ })
108
+ });
109
+ if (!response.ok) {
110
+ throw new Error(`OpenAI API error: ${response.status}`);
111
+ }
112
+ const data = await response.json();
113
+ return data.choices?.[0]?.message?.content?.trim() || simpleSummarize(content, maxLength);
114
+ }
115
+ /**
116
+ * Summarize using Ollama (local LLM)
117
+ */
118
+ async function summarizeWithOllama(content, maxLength) {
119
+ const baseUrl = config.baseUrl || 'http://localhost:11434/api/generate';
120
+ const response = await fetch(baseUrl, {
121
+ method: 'POST',
122
+ headers: {
123
+ 'Content-Type': 'application/json'
124
+ },
125
+ body: JSON.stringify({
126
+ model: config.model || 'llama3.2',
127
+ prompt: `Summarize this in ${maxLength} characters or less:\n\n${content}`,
128
+ stream: false
129
+ })
130
+ });
131
+ if (!response.ok) {
132
+ throw new Error(`Ollama API error: ${response.status}`);
133
+ }
134
+ const data = await response.json();
135
+ return data.response?.trim() || simpleSummarize(content, maxLength);
136
+ }
137
+ /**
138
+ * Summarize using Anthropic API
139
+ */
140
+ async function summarizeWithAnthropic(content, maxLength) {
141
+ const baseUrl = config.baseUrl || 'https://api.anthropic.com/v1';
142
+ const apiKey = config.apiKey || process.env.ANTHROPIC_API_KEY;
143
+ if (!apiKey) {
144
+ return simpleSummarize(content, maxLength);
145
+ }
146
+ const response = await fetch(`${baseUrl}/messages`, {
147
+ method: 'POST',
148
+ headers: {
149
+ 'Content-Type': 'application/json',
150
+ 'x-api-key': apiKey,
151
+ 'anthropic-version': '2023-06-01'
152
+ },
153
+ body: JSON.stringify({
154
+ model: config.model || 'claude-3-haiku',
155
+ max_tokens: Math.ceil(maxLength / 2),
156
+ messages: [
157
+ {
158
+ role: 'user',
159
+ content: `Summarize this in ${maxLength} characters or less: ${content}`
160
+ }
161
+ ]
162
+ })
163
+ });
164
+ if (!response.ok) {
165
+ throw new Error(`Anthropic API error: ${response.status}`);
166
+ }
167
+ const data = await response.json();
168
+ return data.content?.[0]?.text?.trim() || simpleSummarize(content, maxLength);
169
+ }
170
+ /**
171
+ * Check if LLM is available (for health check)
172
+ */
173
+ export async function isLLMAvailable() {
174
+ if (config.provider === 'none') {
175
+ return false;
176
+ }
177
+ try {
178
+ switch (config.provider) {
179
+ case 'openai': {
180
+ const apiKey = config.apiKey || process.env.OPENAI_API_KEY;
181
+ if (!apiKey)
182
+ return false;
183
+ const response = await fetch('https://api.openai.com/v1/models', {
184
+ headers: { 'Authorization': `Bearer ${apiKey}` }
185
+ });
186
+ return response.ok;
187
+ }
188
+ case 'ollama': {
189
+ const baseUrl = config.baseUrl || 'http://localhost:11434';
190
+ const response = await fetch(`${baseUrl}/api/tags`);
191
+ return response.ok;
192
+ }
193
+ case 'anthropic': {
194
+ const apiKey = config.apiKey || process.env.ANTHROPIC_API_KEY;
195
+ if (!apiKey)
196
+ return false;
197
+ return true; // Assume available if key is set
198
+ }
199
+ default:
200
+ return false;
201
+ }
202
+ }
203
+ catch {
204
+ return false;
205
+ }
206
+ }
207
+ //# sourceMappingURL=llm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llm.js","sourceRoot":"","sources":["../../src/services/llm.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,75 @@
1
+ /**
2
+ * Memory Tiers Service
3
+ * Implements 3-tier memory architecture: session, short-term, long-term
4
+ * with forgetting mechanism and semantic compression
5
+ */
6
+ import { Memory, IsolationContext } from '../models/types.js';
7
+ export type MemoryTier = 'session' | 'short' | 'long';
8
+ export interface MemoryTierRecord {
9
+ memoryId: string;
10
+ tier: MemoryTier;
11
+ accessCount: number;
12
+ lastAccessedAt: Date;
13
+ tierChangedAt: Date;
14
+ importanceScore: number;
15
+ }
16
+ export interface TierConfig {
17
+ sessionRetentionHours: number;
18
+ shortRetentionDays: number;
19
+ longPromotionThreshold: number;
20
+ forgettingThreshold: number;
21
+ maxTierSize: Record<MemoryTier, number>;
22
+ }
23
+ export interface TieredMemoryStats {
24
+ sessionCount: number;
25
+ shortCount: number;
26
+ longCount: number;
27
+ promotedCount: number;
28
+ demotedCount: number;
29
+ forgottenCount: number;
30
+ }
31
+ export declare function initMemoryTiers(): void;
32
+ declare class MemoryTiersService {
33
+ private config;
34
+ constructor(config?: Partial<TierConfig>);
35
+ /**
36
+ * Assign a memory to a tier
37
+ */
38
+ assignToTier(memoryId: string, tier: MemoryTier, importanceScore?: number): Promise<MemoryTierRecord>;
39
+ /**
40
+ * Get tier record for a memory
41
+ */
42
+ getTierRecord(memoryId: string): MemoryTierRecord | null;
43
+ /**
44
+ * Get memories by tier
45
+ */
46
+ getMemoriesByTier(tier: MemoryTier, isolation?: IsolationContext): Memory[];
47
+ /**
48
+ * Update tier assignment based on access patterns
49
+ */
50
+ refreshTierAssignment(memoryId: string): Promise<MemoryTierRecord | null>;
51
+ /**
52
+ * Run tier maintenance - promote, demote, and forget memories
53
+ */
54
+ runTierMaintenance(): Promise<TieredMemoryStats>;
55
+ /**
56
+ * Forget a memory (soft delete with semantic compression)
57
+ */
58
+ private forgetMemory;
59
+ /**
60
+ * Create a new memory in session tier
61
+ */
62
+ createTieredMemory(content: string, priority: Memory['priority'], importanceScore?: number, isolation?: IsolationContext): Promise<Memory>;
63
+ /**
64
+ * Get tier statistics
65
+ */
66
+ getTierStats(): {
67
+ tier: MemoryTier;
68
+ count: number;
69
+ avgImportance: number;
70
+ }[];
71
+ }
72
+ export declare function getMemoryTiersService(config?: Partial<TierConfig>): MemoryTiersService;
73
+ export declare function resetMemoryTiersService(): void;
74
+ export {};
75
+ //# sourceMappingURL=memory-tiers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-tiers.d.ts","sourceRoot":"","sources":["../../src/services/memory-tiers.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAI9D,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,OAAO,GAAG,MAAM,CAAC;AAEtD,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,UAAU,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,IAAI,CAAC;IACrB,aAAa,EAAE,IAAI,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,UAAU;IACzB,qBAAqB,EAAE,MAAM,CAAC;IAC9B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,sBAAsB,EAAE,MAAM,CAAC;IAC/B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,WAAW,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;CACzC;AAcD,MAAM,WAAW,iBAAiB;IAChC,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;CACxB;AAID,wBAAgB,eAAe,IAAI,IAAI,CAsBtC;AAID,cAAM,kBAAkB;IACtB,OAAO,CAAC,MAAM,CAAa;gBAEf,MAAM,GAAE,OAAO,CAAC,UAAU,CAAM;IAI5C;;OAEG;IACG,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,eAAe,GAAE,MAAY,GAAG,OAAO,CAAC,gBAAgB,CAAC;IA2BhH;;OAEG;IACH,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,gBAAgB,GAAG,IAAI;IAUxD;;OAEG;IACH,iBAAiB,CAAC,IAAI,EAAE,UAAU,EAAE,SAAS,CAAC,EAAE,gBAAgB,GAAG,MAAM,EAAE;IA+B3E;;OAEG;IACG,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC;IAwB/E;;OAEG;IACG,kBAAkB,IAAI,OAAO,CAAC,iBAAiB,CAAC;IAmEtD;;OAEG;YACW,YAAY;IAY1B;;OAEG;IACG,kBAAkB,CACtB,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,CAAC,UAAU,CAAC,EAC5B,eAAe,GAAE,MAAY,EAC7B,SAAS,CAAC,EAAE,gBAAgB,GAC3B,OAAO,CAAC,MAAM,CAAC;IAgBlB;;OAEG;IACH,YAAY,IAAI;QAAE,IAAI,EAAE,UAAU,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAA;KAAE,EAAE;CAe7E;AAsED,wBAAgB,qBAAqB,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,UAAU,CAAC,GAAG,kBAAkB,CAKtF;AAED,wBAAgB,uBAAuB,IAAI,IAAI,CAE9C"}