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,79 @@
1
+ /**
2
+ * Embedding Provider 抽象接口
3
+ *
4
+ * 支持多种 embedding 后端:
5
+ * - tfidf: 零依赖 TF-IDF(默认降级)
6
+ * - openai: OpenAI text-embedding-3-small/ada-002
7
+ * - cohere: Cohere Embed v3/v4
8
+ * - ollama: 本地 Ollama embedding 模型
9
+ */
10
+ export interface EmbeddingResult {
11
+ vector: number[];
12
+ dimension: number;
13
+ model: string;
14
+ provider: string;
15
+ }
16
+ export interface EmbeddingProvider {
17
+ /** Provider 名称 */
18
+ readonly name: string;
19
+ /** 生成文本的 embedding 向量 */
20
+ embed(content: string): Promise<EmbeddingResult>;
21
+ /** 批量生成 embedding */
22
+ embedBatch(contents: string[]): Promise<EmbeddingResult[]>;
23
+ /** 向量维度 */
24
+ readonly dimension: number;
25
+ /** 是否可用(已配置) */
26
+ isAvailable(): boolean;
27
+ }
28
+ export declare class TfidfEmbeddingProvider implements EmbeddingProvider {
29
+ readonly name = "tfidf";
30
+ readonly dimension = 4096;
31
+ private corpus;
32
+ embed(content: string): Promise<EmbeddingResult>;
33
+ embedBatch(contents: string[]): Promise<EmbeddingResult[]>;
34
+ isAvailable(): boolean;
35
+ /** 更新语料库(用于增量索引) */
36
+ addToCorpus(content: string): void;
37
+ /** 清空语料库 */
38
+ clearCorpus(): void;
39
+ }
40
+ export declare class OpenAIEmbeddingProvider implements EmbeddingProvider {
41
+ readonly name = "openai";
42
+ readonly dimension: number;
43
+ readonly model: string;
44
+ private apiKey;
45
+ private baseUrl;
46
+ constructor(model?: string, dimension?: number);
47
+ isAvailable(): boolean;
48
+ setApiKey(key: string): void;
49
+ setBaseUrl(url: string): void;
50
+ embed(content: string): Promise<EmbeddingResult>;
51
+ embedBatch(contents: string[]): Promise<EmbeddingResult[]>;
52
+ }
53
+ export declare class CohereEmbeddingProvider implements EmbeddingProvider {
54
+ readonly name = "cohere";
55
+ readonly dimension = 1024;
56
+ readonly model = "embed-english-v3.0";
57
+ private apiKey;
58
+ constructor();
59
+ isAvailable(): boolean;
60
+ setApiKey(key: string): void;
61
+ embed(content: string): Promise<EmbeddingResult>;
62
+ embedBatch(contents: string[]): Promise<EmbeddingResult[]>;
63
+ }
64
+ export type EmbeddingProviderName = 'tfidf' | 'openai' | 'cohere' | 'ollama';
65
+ export interface EmbeddingConfig {
66
+ provider: EmbeddingProviderName;
67
+ openaiApiKey?: string;
68
+ cohereApiKey?: string;
69
+ openaiModel?: string;
70
+ openaiBaseUrl?: string;
71
+ }
72
+ export declare function configureEmbeddingProvider(config: EmbeddingConfig): void;
73
+ export declare function getCurrentProvider(): EmbeddingProvider;
74
+ export declare function getEmbeddingConfig(): EmbeddingConfig;
75
+ /** 获取当前 provider 的便捷函数 */
76
+ export declare function generateEmbedding(content: string): Promise<EmbeddingResult>;
77
+ /** 批量生成 embedding */
78
+ export declare function generateEmbeddingBatch(contents: string[]): Promise<EmbeddingResult[]>;
79
+ //# sourceMappingURL=embedding-provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embedding-provider.d.ts","sourceRoot":"","sources":["../../src/services/embedding-provider.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,229 @@
1
+ /**
2
+ * Embedding Provider 抽象接口
3
+ *
4
+ * 支持多种 embedding 后端:
5
+ * - tfidf: 零依赖 TF-IDF(默认降级)
6
+ * - openai: OpenAI text-embedding-3-small/ada-002
7
+ * - cohere: Cohere Embed v3/v4
8
+ * - ollama: 本地 Ollama embedding 模型
9
+ */
10
+ // ============================================================
11
+ // TF-IDF Provider(零依赖降级)
12
+ // ============================================================
13
+ import { generateFixedEmbedding, FIXED_EMBEDDING_DIMENSION } from './embedding-fixed.js';
14
+ export class TfidfEmbeddingProvider {
15
+ name = 'tfidf';
16
+ dimension = FIXED_EMBEDDING_DIMENSION;
17
+ corpus = [];
18
+ embed(content) {
19
+ const vector = generateFixedEmbedding(content, this.corpus);
20
+ this.corpus.push(content);
21
+ return Promise.resolve({ vector, dimension: this.dimension, model: 'fixed-tfidf', provider: 'tfidf' });
22
+ }
23
+ embedBatch(contents) {
24
+ const results = contents.map(content => {
25
+ const vector = generateFixedEmbedding(content, this.corpus);
26
+ this.corpus.push(content);
27
+ return { vector, dimension: this.dimension, model: 'fixed-tfidf', provider: 'tfidf' };
28
+ });
29
+ return Promise.resolve(results);
30
+ }
31
+ isAvailable() {
32
+ return true; // 始终可用
33
+ }
34
+ /** 更新语料库(用于增量索引) */
35
+ addToCorpus(content) {
36
+ this.corpus.push(content);
37
+ }
38
+ /** 清空语料库 */
39
+ clearCorpus() {
40
+ this.corpus = [];
41
+ }
42
+ }
43
+ // ============================================================
44
+ // OpenAI Provider
45
+ // ============================================================
46
+ export class OpenAIEmbeddingProvider {
47
+ name = 'openai';
48
+ dimension;
49
+ model;
50
+ apiKey;
51
+ baseUrl;
52
+ constructor(model = 'text-embedding-3-small', dimension = 1536) {
53
+ this.model = model;
54
+ this.dimension = dimension;
55
+ this.apiKey = process.env.OPENAI_API_KEY || '';
56
+ this.baseUrl = process.env.OPENAI_EMBEDDING_BASE_URL || 'https://api.openai.com/v1';
57
+ }
58
+ isAvailable() {
59
+ return !!this.apiKey;
60
+ }
61
+ setApiKey(key) {
62
+ this.apiKey = key;
63
+ }
64
+ setBaseUrl(url) {
65
+ this.baseUrl = url;
66
+ }
67
+ async embed(content) {
68
+ if (!this.isAvailable()) {
69
+ throw new Error('OpenAI API key not configured');
70
+ }
71
+ const response = await fetch(`${this.baseUrl}/embeddings`, {
72
+ method: 'POST',
73
+ headers: {
74
+ 'Content-Type': 'application/json',
75
+ 'Authorization': `Bearer ${this.apiKey}`,
76
+ },
77
+ body: JSON.stringify({
78
+ model: this.model,
79
+ input: content,
80
+ }),
81
+ });
82
+ if (!response.ok) {
83
+ throw new Error(`OpenAI embedding error: ${response.status}`);
84
+ }
85
+ const data = await response.json();
86
+ const vector = data.data[0]?.embedding ?? new Array(this.dimension).fill(0);
87
+ return { vector, dimension: vector.length, model: this.model, provider: 'openai' };
88
+ }
89
+ async embedBatch(contents) {
90
+ if (!this.isAvailable()) {
91
+ throw new Error('OpenAI API key not configured');
92
+ }
93
+ const response = await fetch(`${this.baseUrl}/embeddings`, {
94
+ method: 'POST',
95
+ headers: {
96
+ 'Content-Type': 'application/json',
97
+ 'Authorization': `Bearer ${this.apiKey}`,
98
+ },
99
+ body: JSON.stringify({
100
+ model: this.model,
101
+ input: contents,
102
+ }),
103
+ });
104
+ if (!response.ok) {
105
+ throw new Error(`OpenAI embedding error: ${response.status}`);
106
+ }
107
+ const data = await response.json();
108
+ return data.data.map(item => ({
109
+ vector: item.embedding,
110
+ dimension: item.embedding.length,
111
+ model: this.model,
112
+ provider: 'openai',
113
+ }));
114
+ }
115
+ }
116
+ // ============================================================
117
+ // Cohere Provider
118
+ // ============================================================
119
+ export class CohereEmbeddingProvider {
120
+ name = 'cohere';
121
+ dimension = 1024;
122
+ model = 'embed-english-v3.0';
123
+ apiKey;
124
+ constructor() {
125
+ this.apiKey = process.env.COHERE_API_KEY || '';
126
+ }
127
+ isAvailable() {
128
+ return !!this.apiKey;
129
+ }
130
+ setApiKey(key) {
131
+ this.apiKey = key;
132
+ }
133
+ async embed(content) {
134
+ if (!this.isAvailable()) {
135
+ throw new Error('Cohere API key not configured');
136
+ }
137
+ const response = await fetch('https://api.cohere.ai/v1/embed', {
138
+ method: 'POST',
139
+ headers: {
140
+ 'Content-Type': 'application/json',
141
+ 'Authorization': `Bearer ${this.apiKey}`,
142
+ },
143
+ body: JSON.stringify({
144
+ texts: [content],
145
+ model: this.model,
146
+ input_type: 'search_document',
147
+ }),
148
+ });
149
+ if (!response.ok) {
150
+ throw new Error(`Cohere embedding error: ${response.status}`);
151
+ }
152
+ const data = await response.json();
153
+ return {
154
+ vector: data.embeddings[0] ?? new Array(this.dimension).fill(0),
155
+ dimension: this.dimension,
156
+ model: this.model,
157
+ provider: 'cohere',
158
+ };
159
+ }
160
+ async embedBatch(contents) {
161
+ if (!this.isAvailable()) {
162
+ throw new Error('Cohere API key not configured');
163
+ }
164
+ const response = await fetch('https://api.cohere.ai/v1/embed', {
165
+ method: 'POST',
166
+ headers: {
167
+ 'Content-Type': 'application/json',
168
+ 'Authorization': `Bearer ${this.apiKey}`,
169
+ },
170
+ body: JSON.stringify({
171
+ texts: contents,
172
+ model: this.model,
173
+ input_type: 'search_document',
174
+ }),
175
+ });
176
+ if (!response.ok) {
177
+ throw new Error(`Cohere embedding error: ${response.status}`);
178
+ }
179
+ const data = await response.json();
180
+ return data.embeddings.map(vector => ({
181
+ vector,
182
+ dimension: vector.length,
183
+ model: this.model,
184
+ provider: 'cohere',
185
+ }));
186
+ }
187
+ }
188
+ let currentProvider = new TfidfEmbeddingProvider();
189
+ let currentConfig = { provider: 'tfidf' };
190
+ export function configureEmbeddingProvider(config) {
191
+ currentConfig = config;
192
+ switch (config.provider) {
193
+ case 'openai': {
194
+ const provider = new OpenAIEmbeddingProvider(config.openaiModel || 'text-embedding-3-small', config.openaiModel === 'text-embedding-3-large' ? 3072 : 1536);
195
+ if (config.openaiApiKey)
196
+ provider.setApiKey(config.openaiApiKey);
197
+ if (config.openaiBaseUrl)
198
+ provider.setBaseUrl(config.openaiBaseUrl);
199
+ currentProvider = provider;
200
+ break;
201
+ }
202
+ case 'cohere': {
203
+ const provider = new CohereEmbeddingProvider();
204
+ if (config.cohereApiKey)
205
+ provider.setApiKey(config.cohereApiKey);
206
+ currentProvider = provider;
207
+ break;
208
+ }
209
+ case 'tfidf':
210
+ default:
211
+ currentProvider = new TfidfEmbeddingProvider();
212
+ break;
213
+ }
214
+ }
215
+ export function getCurrentProvider() {
216
+ return currentProvider;
217
+ }
218
+ export function getEmbeddingConfig() {
219
+ return { ...currentConfig };
220
+ }
221
+ /** 获取当前 provider 的便捷函数 */
222
+ export async function generateEmbedding(content) {
223
+ return currentProvider.embed(content);
224
+ }
225
+ /** 批量生成 embedding */
226
+ export async function generateEmbeddingBatch(contents) {
227
+ return currentProvider.embedBatch(contents);
228
+ }
229
+ //# sourceMappingURL=embedding-provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embedding-provider.js","sourceRoot":"","sources":["../../src/services/embedding-provider.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Simple TF-IDF based embedding service
3
+ * Provides semantic embeddings without external API dependencies
4
+ */
5
+ /**
6
+ * Generate TF-IDF vector for a document
7
+ */
8
+ export declare function generateEmbedding(content: string, existingContents?: string[]): number[];
9
+ /**
10
+ * Generate embedding for a query (same process)
11
+ */
12
+ export declare function generateQueryEmbedding(query: string): number[];
13
+ /**
14
+ * Vector dimension for embeddings
15
+ */
16
+ export declare const VECTOR_DIM = 128;
17
+ //# sourceMappingURL=embedding.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embedding.d.ts","sourceRoot":"","sources":["../../src/services/embedding.ts"],"names":[],"mappings":"AAAA;;;GAGG;AA8BH;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,MAAM,EACf,gBAAgB,GAAE,MAAM,EAAO,GAC9B,MAAM,EAAE,CAuCV;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAE9D;AAED;;GAEG;AACH,eAAO,MAAM,UAAU,MAAM,CAAC"}
@@ -0,0 +1,99 @@
1
+ /**
2
+ * Simple TF-IDF based embedding service
3
+ * Provides semantic embeddings without external API dependencies
4
+ */
5
+ /**
6
+ * Tokenize text into words
7
+ */
8
+ function tokenize(text) {
9
+ return text
10
+ .toLowerCase()
11
+ .replace(/[^\w\s]/g, ' ')
12
+ .split(/\s+/)
13
+ .filter(word => word.length > 1)
14
+ .filter(word => !STOP_WORDS.has(word));
15
+ }
16
+ /**
17
+ * Calculate term frequency
18
+ */
19
+ function termFrequency(term, tokens) {
20
+ const count = tokens.filter(t => t === term).length;
21
+ return count / Math.max(tokens.length, 1);
22
+ }
23
+ /**
24
+ * Calculate inverse document frequency
25
+ */
26
+ function inverseDocumentFrequency(term, allTokens) {
27
+ const docsWithTerm = allTokens.filter(tokens => tokens.includes(term)).length;
28
+ return Math.log((allTokens.length + 1) / (docsWithTerm + 1)) + 1;
29
+ }
30
+ /**
31
+ * Generate TF-IDF vector for a document
32
+ */
33
+ export function generateEmbedding(content, existingContents = []) {
34
+ const tokens = tokenize(content);
35
+ if (tokens.length === 0) {
36
+ return new Array(VECTOR_DIM).fill(0);
37
+ }
38
+ // Build vocabulary from all documents
39
+ const allDocs = existingContents.concat([content]);
40
+ const allTokens = allDocs.map(tokenize);
41
+ const vocabulary = new Map();
42
+ let vocabIndex = 0;
43
+ for (const docTokens of allTokens) {
44
+ for (const token of docTokens) {
45
+ if (!vocabulary.has(token) && vocabIndex < VECTOR_DIM) {
46
+ vocabulary.set(token, vocabIndex++);
47
+ }
48
+ }
49
+ }
50
+ // Create TF-IDF vector
51
+ const vector = new Array(VECTOR_DIM).fill(0);
52
+ for (const [token, index] of vocabulary.entries()) {
53
+ const tf = termFrequency(token, tokens);
54
+ const idf = inverseDocumentFrequency(token, allTokens);
55
+ vector[index] = tf * idf;
56
+ }
57
+ // Normalize vector
58
+ const magnitude = Math.sqrt(vector.reduce((sum, val) => sum + val * val, 0));
59
+ if (magnitude > 0) {
60
+ for (let i = 0; i < vector.length; i++) {
61
+ vector[i] /= magnitude;
62
+ }
63
+ }
64
+ return vector;
65
+ }
66
+ /**
67
+ * Generate embedding for a query (same process)
68
+ */
69
+ export function generateQueryEmbedding(query) {
70
+ return generateEmbedding(query, []);
71
+ }
72
+ /**
73
+ * Vector dimension for embeddings
74
+ */
75
+ export const VECTOR_DIM = 128;
76
+ /**
77
+ * English stop words
78
+ */
79
+ const STOP_WORDS = new Set([
80
+ 'a', 'an', 'and', 'are', 'as', 'at', 'be', 'by', 'for', 'from',
81
+ 'has', 'he', 'in', 'is', 'it', 'its', 'of', 'on', 'that', 'the',
82
+ 'to', 'was', 'will', 'with', 'i', 'me', 'my', 'myself', 'we', 'our',
83
+ 'ours', 'ourselves', 'you', 'your', 'yours', 'yourself', 'yourselves',
84
+ 'he', 'him', 'his', 'himself', 'she', 'her', 'hers', 'herself', 'it',
85
+ 'its', 'itself', 'they', 'them', 'their', 'theirs', 'themselves',
86
+ 'what', 'which', 'who', 'whom', 'this', 'that', 'these', 'those',
87
+ 'am', 'is', 'are', 'was', 'were', 'be', 'been', 'being', 'have', 'has',
88
+ 'had', 'having', 'do', 'does', 'did', 'doing', 'would', 'should', 'could',
89
+ 'ought', 'can', 'cannot', 'could', 'may', 'might', 'must', 'need',
90
+ 'shall', 'should', 'will', 'would', 'but', 'if', 'or', 'because', 'as',
91
+ 'until', 'while', 'of', 'at', 'by', 'for', 'with', 'about', 'against',
92
+ 'between', 'into', 'through', 'during', 'before', 'after', 'above',
93
+ 'below', 'to', 'from', 'up', 'down', 'in', 'out', 'on', 'off', 'over',
94
+ 'under', 'again', 'further', 'then', 'once', 'here', 'there', 'when',
95
+ 'where', 'why', 'how', 'all', 'each', 'few', 'more', 'most', 'other',
96
+ 'some', 'such', 'no', 'nor', 'not', 'only', 'own', 'same', 'so',
97
+ 'than', 'too', 'very', 'just', 'now', 'also', 'get', 'got', 'getting'
98
+ ]);
99
+ //# sourceMappingURL=embedding.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embedding.js","sourceRoot":"","sources":["../../src/services/embedding.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,76 @@
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
+ export interface HNSWConfig {
12
+ M: number;
13
+ efConstruction: number;
14
+ efSearch: number;
15
+ levelMult: number;
16
+ dimension: number;
17
+ metric: 'cosine' | 'l2' | 'ip';
18
+ }
19
+ export interface HNSWNode {
20
+ id: string;
21
+ memoryId: string;
22
+ vector: number[];
23
+ level: number;
24
+ labels: string[];
25
+ createdAt: string;
26
+ }
27
+ export interface HNSWSearchResult {
28
+ memoryId: string;
29
+ score: number;
30
+ }
31
+ /**
32
+ * Initialize HNSW index in database
33
+ */
34
+ export declare function initHNSWIndex(_indexName: string, config?: Partial<HNSWConfig>): HNSWConfig;
35
+ /**
36
+ * Create a new HNSW index in memory
37
+ */
38
+ export declare function createHNSWIndex(indexName: string, config?: Partial<HNSWConfig>): HNSWConfig;
39
+ /**
40
+ * Get or create an HNSW index
41
+ */
42
+ export declare function getHNSWIndex(indexName: string): HNSWConfig | null;
43
+ /**
44
+ * Insert a node into the HNSW index
45
+ */
46
+ export declare function insertHNSWNode(indexName: string, memoryId: string, vector: number[], labels?: string[]): HNSWNode | null;
47
+ /**
48
+ * Search for nearest neighbors
49
+ */
50
+ export declare function searchHNSW(indexName: string, queryVector: number[], k?: number, efSearch?: number): HNSWSearchResult[];
51
+ /**
52
+ * Remove a node from HNSW index
53
+ */
54
+ export declare function removeHNSWNode(indexName: string, memoryId: string): boolean;
55
+ /**
56
+ * Get statistics for an HNSW index
57
+ */
58
+ export declare function getHNSWStats(indexName: string): {
59
+ nodeCount: number;
60
+ maxLevel: number;
61
+ memorySize: number;
62
+ config: HNSWConfig;
63
+ } | null;
64
+ /**
65
+ * Clear an HNSW index from memory
66
+ */
67
+ export declare function clearHNSWIndex(indexName: string): void;
68
+ /**
69
+ * Sync HNSW index with database (load persisted nodes)
70
+ */
71
+ export declare function syncHNSWFromDB(indexName: string, config?: Partial<HNSWConfig>): number;
72
+ /**
73
+ * Persist HNSW nodes to database
74
+ */
75
+ export declare function persistHNSWToDB(indexName: string): number;
76
+ //# sourceMappingURL=hnsw-index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hnsw-index.d.ts","sourceRoot":"","sources":["../../src/services/hnsw-index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAKH,MAAM,WAAW,UAAU;IACzB,CAAC,EAAE,MAAM,CAAC;IACV,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,QAAQ,GAAG,IAAI,GAAG,IAAI,CAAC;CAChC;AAED,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;CACf;AAmBD;;GAEG;AACH,wBAAgB,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,GAAE,OAAO,CAAC,UAAU,CAAM,GAAG,UAAU,CAqB9F;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,GAAE,OAAO,CAAC,UAAU,CAAM,GAAG,UAAU,CAa/F;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CAiBjE;AAwFD;;GAEG;AACH,wBAAgB,cAAc,CAC5B,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EAAE,EAChB,MAAM,GAAE,MAAM,EAAO,GACpB,QAAQ,GAAG,IAAI,CAgCjB;AAED;;GAEG;AACH,wBAAgB,UAAU,CACxB,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,EAAE,EACrB,CAAC,GAAE,MAAW,EACd,QAAQ,CAAC,EAAE,MAAM,GAChB,gBAAgB,EAAE,CAiCpB;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAwB3E;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG;IAC/C,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,UAAU,CAAC;CACpB,GAAG,IAAI,CAkBP;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAEtD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,GAAE,OAAO,CAAC,UAAU,CAAM,GAAG,MAAM,CAsC1F;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAiBzD"}