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,135 @@
1
+ /**
2
+ * After-Chain 执行器
3
+ *
4
+ * 负责执行 After-Chain 编排逻辑:
5
+ * - 在工具返回后触发后续工具
6
+ * - 管理会话上下文(传递 conversation_turns 给 memory_extract)
7
+ */
8
+ import { getAfterChainRegistry } from './after-chain.js';
9
+ import { memoryExtractTool } from '../mcp/tools/memory-extract.js';
10
+ const sessionContext = {
11
+ recentTurns: [],
12
+ maxTurns: 50,
13
+ };
14
+ /** 记录对话轮次(供 after-chain 使用) */
15
+ export function recordConversationTurn(role, content) {
16
+ sessionContext.recentTurns.push({
17
+ role,
18
+ content,
19
+ timestamp: Date.now(),
20
+ });
21
+ // 保留最近 N 轮
22
+ if (sessionContext.recentTurns.length > sessionContext.maxTurns) {
23
+ sessionContext.recentTurns = sessionContext.recentTurns.slice(-sessionContext.maxTurns);
24
+ }
25
+ }
26
+ /** 清空会话上下文 */
27
+ export function clearSessionContext() {
28
+ sessionContext.recentTurns = [];
29
+ }
30
+ /** 工具处理器注册表 */
31
+ const toolHandlers = {};
32
+ /** 注册工具处理器 */
33
+ export function registerToolHandler(toolName, handler) {
34
+ toolHandlers[toolName] = handler;
35
+ }
36
+ /**
37
+ * 执行通用 followupTool
38
+ */
39
+ async function executeGenericFollowup(followupTool, input, output) {
40
+ // memory_extract 需要 conversation_turns
41
+ if (followupTool === 'memory_extract') {
42
+ const conversation_turns = sessionContext.recentTurns
43
+ .slice(-20)
44
+ .map(t => ({ role: t.role, content: t.content }));
45
+ if (conversation_turns.length === 0) {
46
+ return { success: false, error: 'No conversation turns available for extraction' };
47
+ }
48
+ await memoryExtractTool({
49
+ conversation_turns,
50
+ extract_mode: 'all',
51
+ min_confidence: 0.5,
52
+ use_llm: true,
53
+ });
54
+ return { success: true };
55
+ }
56
+ // 检查注册表中的处理器
57
+ const handler = toolHandlers[followupTool];
58
+ if (handler) {
59
+ // 从 input/output 派生参数
60
+ const params = deriveToolParams(followupTool, input, output);
61
+ await handler(params);
62
+ return { success: true };
63
+ }
64
+ return { success: false, error: `No handler for followupTool: ${followupTool}` };
65
+ }
66
+ /**
67
+ * 从 input/output 派生工具参数
68
+ */
69
+ function deriveToolParams(followupTool, input, output) {
70
+ const inputObj = input;
71
+ const outputObj = output;
72
+ switch (followupTool) {
73
+ case 'memory_recall':
74
+ return {
75
+ query: inputObj.content || inputObj.key || outputObj.value || '',
76
+ limit: 10,
77
+ search_mode: 'auto',
78
+ };
79
+ case 'memory_stats':
80
+ return {};
81
+ case 'intelligent_recall':
82
+ return {
83
+ query: inputObj.content || inputObj.key || '',
84
+ limit: 10,
85
+ relevance_threshold: 0.07,
86
+ };
87
+ case 'dual_mode_execute':
88
+ return {
89
+ action: inputObj.content || inputObj.value || '',
90
+ context: JSON.stringify(inputObj),
91
+ mode: 'soft_only',
92
+ };
93
+ default:
94
+ return { ...inputObj };
95
+ }
96
+ }
97
+ /** 执行 After-Chain 钩子 */
98
+ export async function executeAfterChain(triggerTool, input, output) {
99
+ const registry = getAfterChainRegistry();
100
+ if (!registry.getGlobalConfig().enabled)
101
+ return;
102
+ const hooks = registry.getFollowups(triggerTool);
103
+ if (hooks.length === 0)
104
+ return;
105
+ for (const hook of hooks) {
106
+ // 检查条件
107
+ if (hook.condition && !hook.condition(input, output))
108
+ continue;
109
+ const event = {
110
+ chain: '',
111
+ triggerTool: hook.triggerTool,
112
+ followupTool: hook.followupTool,
113
+ timestamp: new Date().toISOString(),
114
+ input,
115
+ output,
116
+ success: false,
117
+ };
118
+ try {
119
+ const result = await executeGenericFollowup(hook.followupTool, input, output);
120
+ event.success = result.success;
121
+ event.error = result.error;
122
+ }
123
+ catch (error) {
124
+ event.success = false;
125
+ event.error = error instanceof Error ? error.message : String(error);
126
+ }
127
+ registry.emit(event);
128
+ }
129
+ }
130
+ /** 从会话上下文获取最近的对话轮次 */
131
+ export function getRecentConversationTurns(limit) {
132
+ const turns = limit ? sessionContext.recentTurns.slice(-limit) : sessionContext.recentTurns;
133
+ return turns.map(t => ({ role: t.role, content: t.content }));
134
+ }
135
+ //# sourceMappingURL=after-chain-executor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"after-chain-executor.js","sourceRoot":"","sources":["../../src/utils/after-chain-executor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,94 @@
1
+ /**
2
+ * After-Chain 工具链编排
3
+ *
4
+ * 核心理念:工具执行后可自动触发后续工具,形成链式调用。
5
+ * 例如:memory_store → memory_extract(存储记忆后自动提取约束)
6
+ */
7
+ /** 工具名称 */
8
+ export type ToolName = 'memory_store' | 'memory_recall' | 'memory_anchor' | 'memory_report_usage' | 'context_compress' | 'project_create' | 'memory_store_batch' | 'memory_delete_batch' | 'memory_search' | 'configure_llm' | 'memory_stats' | 'memory_extract' | 'intelligent_recall' | 'dual_mode_execute' | 'gdpr_export' | 'gdpr_delete' | 'data_summary' | 'session_store' | 'session_store_batch' | 'session_delete';
9
+ /** After-Chain 触发器配置 */
10
+ export interface AfterChainHook {
11
+ /** 触发工具名称 */
12
+ triggerTool: ToolName;
13
+ /** 后续工具名称 */
14
+ followupTool: ToolName;
15
+ /** 触发条件(可选),默认总是触发 */
16
+ condition?: (input: unknown, output: unknown) => boolean;
17
+ /** 是否异步执行(不阻塞主工具返回) */
18
+ async?: boolean;
19
+ /** 是否启用(可通过配置开关) */
20
+ enabled?: boolean;
21
+ }
22
+ /** After-Chain 链配置 */
23
+ export interface ChainConfig {
24
+ /** 链名称 */
25
+ name: string;
26
+ /** 描述 */
27
+ description?: string;
28
+ /** 钩子列表 */
29
+ hooks: AfterChainHook[];
30
+ }
31
+ /** After-Chain 全局配置 */
32
+ export interface AfterChainGlobalConfig {
33
+ /** 默认异步执行 */
34
+ defaultAsync: boolean;
35
+ /** 默认启用 */
36
+ defaultEnabled: boolean;
37
+ /** 全局开关 */
38
+ enabled: boolean;
39
+ }
40
+ /** 默认 After-Chain 全局配置 */
41
+ export declare const DEFAULT_GLOBAL_CONFIG: AfterChainGlobalConfig;
42
+ /** 预定义的工具链 */
43
+ export declare const PREDEFINED_CHAINS: ChainConfig[];
44
+ /** After-Chain 事件 */
45
+ export interface AfterChainEvent {
46
+ chain: string;
47
+ triggerTool: ToolName;
48
+ followupTool: ToolName;
49
+ timestamp: string;
50
+ input: unknown;
51
+ output: unknown;
52
+ success: boolean;
53
+ error?: string;
54
+ }
55
+ /** After-Chain 回调函数类型 */
56
+ export type AfterChainCallback = (event: AfterChainEvent) => void;
57
+ /**
58
+ * After-Chain 注册中心
59
+ * 负责注册工具链、执行后钩子、管理全局配置
60
+ */
61
+ export declare class AfterChainRegistry {
62
+ private chains;
63
+ private globalConfig;
64
+ private callbacks;
65
+ constructor();
66
+ /** 注册一条工具链 */
67
+ registerChain(config: ChainConfig): void;
68
+ /** 注销一条工具链 */
69
+ unregisterChain(name: string): void;
70
+ /** 更新全局配置 */
71
+ updateGlobalConfig(updates: Partial<AfterChainGlobalConfig>): void;
72
+ /** 获取全局配置 */
73
+ getGlobalConfig(): AfterChainGlobalConfig;
74
+ /** 添加事件回调 */
75
+ onEvent(callback: AfterChainCallback): () => void;
76
+ /** 获取所有已注册的链名称 */
77
+ getChainNames(): string[];
78
+ /** 获取链配置 */
79
+ getChain(name: string): ChainConfig | undefined;
80
+ /** 获取所有链配置 */
81
+ getAllChains(): ChainConfig[];
82
+ /** 切换链的启用状态 */
83
+ toggleChain(name: string, enabled: boolean): boolean;
84
+ /** 获取某工具触发的所有后续工具 */
85
+ getFollowups(triggerTool: ToolName): AfterChainHook[];
86
+ /** 触发 After-Chain 回调 */
87
+ emit(event: AfterChainEvent): void;
88
+ /** 获取所有钩子的数量 */
89
+ getHookCount(): number;
90
+ }
91
+ export declare function getAfterChainRegistry(): AfterChainRegistry;
92
+ /** 重置注册中心(测试用) */
93
+ export declare function resetAfterChainRegistry(): void;
94
+ //# sourceMappingURL=after-chain.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"after-chain.d.ts","sourceRoot":"","sources":["../../src/utils/after-chain.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,155 @@
1
+ /**
2
+ * After-Chain 工具链编排
3
+ *
4
+ * 核心理念:工具执行后可自动触发后续工具,形成链式调用。
5
+ * 例如:memory_store → memory_extract(存储记忆后自动提取约束)
6
+ */
7
+ /** 默认 After-Chain 全局配置 */
8
+ export const DEFAULT_GLOBAL_CONFIG = {
9
+ defaultAsync: true,
10
+ defaultEnabled: true,
11
+ enabled: true,
12
+ };
13
+ /** 预定义的工具链 */
14
+ export const PREDEFINED_CHAINS = [
15
+ {
16
+ name: 'store-then-extract',
17
+ description: '存储记忆后自动提取约束(AutoSkill 风格)',
18
+ hooks: [
19
+ {
20
+ triggerTool: 'memory_store',
21
+ followupTool: 'memory_extract',
22
+ async: true,
23
+ enabled: true,
24
+ },
25
+ ],
26
+ },
27
+ {
28
+ name: 'batch-store-then-extract',
29
+ description: '批量存储后自动提取约束',
30
+ hooks: [
31
+ {
32
+ triggerTool: 'memory_store_batch',
33
+ followupTool: 'memory_extract',
34
+ async: true,
35
+ enabled: true,
36
+ },
37
+ ],
38
+ },
39
+ {
40
+ name: 'session-store-then-extract',
41
+ description: '会话存储后自动提取约束',
42
+ hooks: [
43
+ {
44
+ triggerTool: 'session_store',
45
+ followupTool: 'memory_extract',
46
+ async: true,
47
+ enabled: true,
48
+ },
49
+ ],
50
+ },
51
+ ];
52
+ /**
53
+ * After-Chain 注册中心
54
+ * 负责注册工具链、执行后钩子、管理全局配置
55
+ */
56
+ export class AfterChainRegistry {
57
+ chains = new Map();
58
+ globalConfig = { ...DEFAULT_GLOBAL_CONFIG };
59
+ callbacks = [];
60
+ constructor() {
61
+ // 注册预定义链
62
+ for (const chain of PREDEFINED_CHAINS) {
63
+ this.registerChain(chain);
64
+ }
65
+ }
66
+ /** 注册一条工具链 */
67
+ registerChain(config) {
68
+ this.chains.set(config.name, config);
69
+ }
70
+ /** 注销一条工具链 */
71
+ unregisterChain(name) {
72
+ this.chains.delete(name);
73
+ }
74
+ /** 更新全局配置 */
75
+ updateGlobalConfig(updates) {
76
+ this.globalConfig = { ...this.globalConfig, ...updates };
77
+ }
78
+ /** 获取全局配置 */
79
+ getGlobalConfig() {
80
+ return { ...this.globalConfig };
81
+ }
82
+ /** 添加事件回调 */
83
+ onEvent(callback) {
84
+ this.callbacks.push(callback);
85
+ return () => {
86
+ const index = this.callbacks.indexOf(callback);
87
+ if (index >= 0)
88
+ this.callbacks.splice(index, 1);
89
+ };
90
+ }
91
+ /** 获取所有已注册的链名称 */
92
+ getChainNames() {
93
+ return [...this.chains.keys()];
94
+ }
95
+ /** 获取链配置 */
96
+ getChain(name) {
97
+ return this.chains.get(name);
98
+ }
99
+ /** 获取所有链配置 */
100
+ getAllChains() {
101
+ return [...this.chains.values()];
102
+ }
103
+ /** 切换链的启用状态 */
104
+ toggleChain(name, enabled) {
105
+ const chain = this.chains.get(name);
106
+ if (!chain)
107
+ return false;
108
+ chain.hooks = chain.hooks.map(hook => ({ ...hook, enabled }));
109
+ return true;
110
+ }
111
+ /** 获取某工具触发的所有后续工具 */
112
+ getFollowups(triggerTool) {
113
+ const hooks = [];
114
+ for (const chain of this.chains.values()) {
115
+ for (const hook of chain.hooks) {
116
+ if (hook.triggerTool === triggerTool && hook.enabled !== false) {
117
+ hooks.push(hook);
118
+ }
119
+ }
120
+ }
121
+ return hooks;
122
+ }
123
+ /** 触发 After-Chain 回调 */
124
+ emit(event) {
125
+ for (const callback of this.callbacks) {
126
+ try {
127
+ callback(event);
128
+ }
129
+ catch {
130
+ // 回调错误不影响主流程
131
+ }
132
+ }
133
+ }
134
+ /** 获取所有钩子的数量 */
135
+ getHookCount() {
136
+ let count = 0;
137
+ for (const chain of this.chains.values()) {
138
+ count += chain.hooks.filter(h => h.enabled !== false).length;
139
+ }
140
+ return count;
141
+ }
142
+ }
143
+ // 全局单例
144
+ let registry = null;
145
+ export function getAfterChainRegistry() {
146
+ if (!registry) {
147
+ registry = new AfterChainRegistry();
148
+ }
149
+ return registry;
150
+ }
151
+ /** 重置注册中心(测试用) */
152
+ export function resetAfterChainRegistry() {
153
+ registry = null;
154
+ }
155
+ //# sourceMappingURL=after-chain.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"after-chain.js","sourceRoot":"","sources":["../../src/utils/after-chain.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * SQLite database wrapper - compatible API with better-sqlite3
3
+ * Uses sql.js (pure JavaScript, no native compilation required)
4
+ */
5
+ import { Database as SqlJsDatabase, SqlValue } from 'sql.js';
6
+ export type { SqlValue };
7
+ export declare function castParams(params: unknown[]): SqlValue[];
8
+ export declare function initDatabase(path?: string): Promise<SqlJsDatabase>;
9
+ export declare function initDatabaseSync(_path?: string): SqlJsDatabase;
10
+ /** 手动刷新数据库到磁盘(适用于优雅关闭) */
11
+ export declare function flushDatabase(): void;
12
+ /** 获取当前数据库路径 */
13
+ export declare function getDbPath(): string;
14
+ export declare function getDatabase(): SqlJsDatabase;
15
+ export declare function closeDatabase(): void;
16
+ export declare function query<T = Record<string, unknown>>(sql: string, params?: unknown[]): T[];
17
+ export declare function run(sql: string, params?: unknown[]): {
18
+ changes: number;
19
+ lastInsertRowid: number;
20
+ };
21
+ export declare function transaction<T>(fn: () => T): T;
22
+ export declare function resetDatabase(): void;
23
+ declare const _default: {
24
+ query: typeof query;
25
+ run: typeof run;
26
+ transaction: typeof transaction;
27
+ };
28
+ export default _default;
29
+ //# sourceMappingURL=db.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../../src/utils/db.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAkB,EAAE,QAAQ,IAAI,aAAa,EAAE,QAAQ,EAAa,MAAM,QAAQ,CAAC;AACnF,YAAY,EAAE,QAAQ,EAAE,CAAC;AAEzB,wBAAgB,UAAU,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,QAAQ,EAAE,CAExD;AAyCD,wBAAsB,YAAY,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAiDxE;AAED,wBAAgB,gBAAgB,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,aAAa,CAK9D;AAqBD,0BAA0B;AAC1B,wBAAgB,aAAa,IAAI,IAAI,CAEpC;AAED,gBAAgB;AAChB,wBAAgB,SAAS,IAAI,MAAM,CAElC;AAED,wBAAgB,WAAW,IAAI,aAAa,CAK3C;AAED,wBAAgB,aAAa,IAAI,IAAI,CAYpC;AAMD,wBAAgB,KAAK,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/C,GAAG,EAAE,MAAM,EACX,MAAM,CAAC,EAAE,OAAO,EAAE,GACjB,CAAC,EAAE,CAeL;AAED,wBAAgB,GAAG,CACjB,GAAG,EAAE,MAAM,EACX,MAAM,CAAC,EAAE,OAAO,EAAE,GACjB;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,eAAe,EAAE,MAAM,CAAA;CAAE,CAc9C;AAED,wBAAgB,WAAW,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,CAc7C;AAED,wBAAgB,aAAa,IAAI,IAAI,CAEpC;;;;;;AAED,wBAA2C"}
@@ -0,0 +1,201 @@
1
+ /**
2
+ * SQLite database wrapper - compatible API with better-sqlite3
3
+ * Uses sql.js (pure JavaScript, no native compilation required)
4
+ */
5
+ import initSqlJs from 'sql.js';
6
+ export function castParams(params) {
7
+ return params;
8
+ }
9
+ import { DatabaseError } from './errors.js';
10
+ import { logger } from './logger.js';
11
+ import { dirname, join } from 'path';
12
+ import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'fs';
13
+ let db = null;
14
+ let dbPath = ':memory:';
15
+ let saveTimer = null;
16
+ let initPromise = null;
17
+ // 刷新间隔(毫秒),可通过环境变量配置
18
+ const DEFAULT_FLUSH_INTERVAL_MS = 30_000;
19
+ const FLUSH_INTERVAL_ENV = 'CG_DB_FLUSH_INTERVAL_MS';
20
+ function getFlushInterval() {
21
+ const envVal = process.env[FLUSH_INTERVAL_ENV];
22
+ if (envVal) {
23
+ const parsed = parseInt(envVal, 10);
24
+ if (!isNaN(parsed) && parsed >= 1000)
25
+ return parsed;
26
+ }
27
+ return DEFAULT_FLUSH_INTERVAL_MS;
28
+ }
29
+ function getDataDir() {
30
+ const envDataDir = process.env.DATA_DIR;
31
+ if (envDataDir)
32
+ return envDataDir;
33
+ if (process.platform === 'win32') {
34
+ return join(process.env.APPDATA || '', 'context-gatekeeper');
35
+ }
36
+ else if (process.platform === 'darwin') {
37
+ return join(process.env.HOME || '', 'Library', 'Application Support', 'context-gatekeeper');
38
+ }
39
+ else {
40
+ return join(process.env.HOME || '', '.context-gatekeeper');
41
+ }
42
+ }
43
+ function _getDbPath() {
44
+ return join(getDataDir(), 'memory.db');
45
+ }
46
+ export async function initDatabase(path) {
47
+ // If already initialized, return immediately
48
+ if (db)
49
+ return db;
50
+ if (initPromise)
51
+ return initPromise;
52
+ const targetPath = path || _getDbPath();
53
+ // For synchronous usage (testing), check if we can return immediately
54
+ if (db) {
55
+ return db;
56
+ }
57
+ initPromise = (async () => {
58
+ const SQL = await initSqlJs();
59
+ dbPath = targetPath;
60
+ if (dbPath !== ':memory:') {
61
+ const dir = dirname(dbPath);
62
+ if (!existsSync(dir)) {
63
+ mkdirSync(dir, { recursive: true });
64
+ }
65
+ if (existsSync(dbPath)) {
66
+ try {
67
+ const buffer = readFileSync(dbPath);
68
+ db = new SQL.Database(buffer);
69
+ }
70
+ catch {
71
+ db = new SQL.Database();
72
+ }
73
+ }
74
+ else {
75
+ db = new SQL.Database();
76
+ }
77
+ }
78
+ else {
79
+ db = new SQL.Database();
80
+ }
81
+ db.run('PRAGMA journal_mode=WAL');
82
+ db.run('PRAGMA synchronous=NORMAL');
83
+ db.run('PRAGMA busy_timeout=5000');
84
+ db.run('PRAGMA cache_size=-64000');
85
+ if (dbPath !== ':memory:') {
86
+ scheduleSave();
87
+ }
88
+ return db;
89
+ })();
90
+ return initPromise;
91
+ }
92
+ export function initDatabaseSync(_path) {
93
+ if (db)
94
+ return db;
95
+ // This will throw - caller must use await initDatabase()
96
+ throw new DatabaseError('Database not initialized. Use await initDatabase() first.');
97
+ }
98
+ function scheduleSave() {
99
+ if (saveTimer)
100
+ clearInterval(saveTimer);
101
+ saveTimer = setInterval(saveDatabase, getFlushInterval());
102
+ }
103
+ function saveDatabase() {
104
+ if (!db || dbPath === ':memory:')
105
+ return;
106
+ try {
107
+ if (!existsSync(dirname(dbPath))) {
108
+ mkdirSync(dirname(dbPath), { recursive: true });
109
+ }
110
+ const data = db.export();
111
+ writeFileSync(dbPath, Buffer.from(data));
112
+ }
113
+ catch (error) {
114
+ logger.error('Failed to save database', { error });
115
+ }
116
+ }
117
+ /** 手动刷新数据库到磁盘(适用于优雅关闭) */
118
+ export function flushDatabase() {
119
+ saveDatabase();
120
+ }
121
+ /** 获取当前数据库路径 */
122
+ export function getDbPath() {
123
+ return dbPath;
124
+ }
125
+ export function getDatabase() {
126
+ if (!db) {
127
+ throw new DatabaseError('Database not initialized. Call initDatabase() first.');
128
+ }
129
+ return db;
130
+ }
131
+ export function closeDatabase() {
132
+ if (saveTimer) {
133
+ clearInterval(saveTimer);
134
+ saveTimer = null;
135
+ }
136
+ if (db) {
137
+ flushDatabase();
138
+ db.close();
139
+ db = null;
140
+ }
141
+ initPromise = null;
142
+ }
143
+ function prepare(sql) {
144
+ return getDatabase().prepare(sql);
145
+ }
146
+ export function query(sql, params) {
147
+ try {
148
+ const stmt = prepare(sql);
149
+ if (params && params.length > 0) {
150
+ stmt.bind(params);
151
+ }
152
+ const results = [];
153
+ while (stmt.step()) {
154
+ results.push(stmt.getAsObject());
155
+ }
156
+ stmt.free();
157
+ return results;
158
+ }
159
+ catch (error) {
160
+ throw new DatabaseError(`Query failed: ${sql}`, error);
161
+ }
162
+ }
163
+ export function run(sql, params) {
164
+ try {
165
+ if (params && params.length > 0) {
166
+ getDatabase().run(sql, params);
167
+ }
168
+ else {
169
+ getDatabase().run(sql);
170
+ }
171
+ const changes = getDatabase().getRowsModified();
172
+ const result = getDatabase().exec('SELECT last_insert_rowid()');
173
+ const lastInsertRowid = result.length > 0 ? Number(result[0].values[0][0]) : 0;
174
+ return { changes, lastInsertRowid };
175
+ }
176
+ catch (error) {
177
+ throw new DatabaseError(`Execution failed: ${sql}`, error);
178
+ }
179
+ }
180
+ export function transaction(fn) {
181
+ try {
182
+ getDatabase().run('BEGIN TRANSACTION');
183
+ try {
184
+ const result = fn();
185
+ getDatabase().run('COMMIT');
186
+ return result;
187
+ }
188
+ catch (error) {
189
+ getDatabase().run('ROLLBACK');
190
+ throw error;
191
+ }
192
+ }
193
+ catch (error) {
194
+ throw new DatabaseError('Transaction failed', error);
195
+ }
196
+ }
197
+ export function resetDatabase() {
198
+ closeDatabase();
199
+ }
200
+ export default { query, run, transaction };
201
+ //# sourceMappingURL=db.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"db.js","sourceRoot":"","sources":["../../src/utils/db.ts"],"names":[],"mappings":"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"}