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,275 @@
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 { getDatabase, query, run } from '../utils/db.js';
7
+ import { DatabaseError } from '../utils/errors.js';
8
+ import { getMemoriesByIds, createMemory, deleteMemory } from '../schema/memory.js';
9
+ import { getContextCompressor } from './compressor/index.js';
10
+ const DEFAULT_TIER_CONFIG = {
11
+ sessionRetentionHours: 1,
12
+ shortRetentionDays: 7,
13
+ longPromotionThreshold: 0.8,
14
+ forgettingThreshold: 0.2,
15
+ maxTierSize: {
16
+ session: 50,
17
+ short: 500,
18
+ long: 10000
19
+ }
20
+ };
21
+ // ============ Schema ============
22
+ export function initMemoryTiers() {
23
+ const db = getDatabase();
24
+ try {
25
+ db.run(`
26
+ CREATE TABLE IF NOT EXISTS memory_tiers (
27
+ memory_id TEXT PRIMARY KEY,
28
+ tier TEXT NOT NULL CHECK (tier IN ('session', 'short', 'long')),
29
+ access_count INTEGER NOT NULL DEFAULT 1,
30
+ last_accessed_at TEXT NOT NULL DEFAULT (datetime('now')),
31
+ tier_changed_at TEXT NOT NULL DEFAULT (datetime('now')),
32
+ importance_score REAL NOT NULL DEFAULT 0.5,
33
+ FOREIGN KEY (memory_id) REFERENCES memories(id)
34
+ )
35
+ `);
36
+ db.run(`CREATE INDEX IF NOT EXISTS idx_memory_tiers_tier ON memory_tiers(tier)`);
37
+ db.run(`CREATE INDEX IF NOT EXISTS idx_memory_tiers_accessed ON memory_tiers(last_accessed_at)`);
38
+ db.run(`CREATE INDEX IF NOT EXISTS idx_memory_tiers_importance ON memory_tiers(importance_score)`);
39
+ }
40
+ catch (error) {
41
+ throw new DatabaseError('Failed to initialize memory tiers', error);
42
+ }
43
+ }
44
+ // ============ Memory Tier Management ============
45
+ class MemoryTiersService {
46
+ config;
47
+ constructor(config = {}) {
48
+ this.config = { ...DEFAULT_TIER_CONFIG, ...config };
49
+ }
50
+ /**
51
+ * Assign a memory to a tier
52
+ */
53
+ async assignToTier(memoryId, tier, importanceScore = 0.5) {
54
+ const now = new Date().toISOString();
55
+ try {
56
+ // Check if already assigned
57
+ const existing = query(`SELECT * FROM memory_tiers WHERE memory_id = ?`, [memoryId]);
58
+ if (existing.length > 0) {
59
+ // Update existing tier
60
+ run(`UPDATE memory_tiers SET tier = ?, importance_score = ?, tier_changed_at = ?, last_accessed_at = ? WHERE memory_id = ?`, [tier, importanceScore, now, now, memoryId]);
61
+ }
62
+ else {
63
+ // Create new tier record
64
+ run(`INSERT INTO memory_tiers (memory_id, tier, importance_score, last_accessed_at, tier_changed_at) VALUES (?, ?, ?, ?, ?)`, [memoryId, tier, importanceScore, now, now]);
65
+ }
66
+ return this.getTierRecord(memoryId);
67
+ }
68
+ catch (error) {
69
+ throw new DatabaseError('Failed to assign memory to tier', error);
70
+ }
71
+ }
72
+ /**
73
+ * Get tier record for a memory
74
+ */
75
+ getTierRecord(memoryId) {
76
+ try {
77
+ const rows = query(`SELECT * FROM memory_tiers WHERE memory_id = ?`, [memoryId]);
78
+ if (rows.length === 0)
79
+ return null;
80
+ return mapTierRow(rows[0]);
81
+ }
82
+ catch {
83
+ return null;
84
+ }
85
+ }
86
+ /**
87
+ * Get memories by tier
88
+ */
89
+ getMemoriesByTier(tier, isolation) {
90
+ try {
91
+ let sql = `
92
+ SELECT m.* FROM memories m
93
+ JOIN memory_tiers t ON m.id = t.memory_id
94
+ WHERE t.tier = ? AND m.deleted = 0
95
+ `;
96
+ const params = [tier];
97
+ if (isolation?.userId) {
98
+ sql += ' AND m.user_id = ?';
99
+ params.push(isolation.userId);
100
+ }
101
+ if (isolation?.agentId) {
102
+ sql += ' AND m.agent_id = ?';
103
+ params.push(isolation.agentId);
104
+ }
105
+ if (isolation?.projectId) {
106
+ sql += ' AND m.project_id = ?';
107
+ params.push(isolation.projectId);
108
+ }
109
+ sql += ' ORDER BY t.importance_score DESC, t.last_accessed_at DESC';
110
+ const rows = query(sql, params);
111
+ return rows.map(mapMemoryRow);
112
+ }
113
+ catch (error) {
114
+ throw new DatabaseError('Failed to get memories by tier', error);
115
+ }
116
+ }
117
+ /**
118
+ * Update tier assignment based on access patterns
119
+ */
120
+ async refreshTierAssignment(memoryId) {
121
+ const record = this.getTierRecord(memoryId);
122
+ if (!record)
123
+ return null;
124
+ // Increment access count
125
+ run(`UPDATE memory_tiers SET access_count = access_count + 1, last_accessed_at = ? WHERE memory_id = ?`, [new Date().toISOString(), memoryId]);
126
+ // Check for tier promotion/demotion
127
+ const updatedRecord = this.getTierRecord(memoryId);
128
+ if (!updatedRecord)
129
+ return null;
130
+ // Promote to long-term if high importance and many accesses
131
+ if (updatedRecord.importanceScore >= this.config.longPromotionThreshold &&
132
+ updatedRecord.accessCount >= 10 &&
133
+ updatedRecord.tier !== 'long') {
134
+ return this.assignToTier(memoryId, 'long', updatedRecord.importanceScore + 0.1);
135
+ }
136
+ return updatedRecord;
137
+ }
138
+ /**
139
+ * Run tier maintenance - promote, demote, and forget memories
140
+ */
141
+ async runTierMaintenance() {
142
+ const stats = {
143
+ sessionCount: 0,
144
+ shortCount: 0,
145
+ longCount: 0,
146
+ promotedCount: 0,
147
+ demotedCount: 0,
148
+ forgottenCount: 0
149
+ };
150
+ const now = new Date();
151
+ // Session tier: promote session memories to short-term after retention period
152
+ const sessionRetentionMs = this.config.sessionRetentionHours * 60 * 60 * 1000;
153
+ const sessionThreshold = new Date(now.getTime() - sessionRetentionMs);
154
+ const sessionMemories = query(`SELECT memory_id, importance_score FROM memory_tiers WHERE tier = 'session' AND datetime(last_accessed_at) < datetime(?)`, [sessionThreshold.toISOString()]);
155
+ for (const row of sessionMemories) {
156
+ if (row.importance_score >= this.config.forgettingThreshold) {
157
+ await this.assignToTier(row.memory_id, 'short', row.importance_score);
158
+ stats.promotedCount++;
159
+ }
160
+ else {
161
+ // Forget this memory
162
+ await this.forgetMemory(row.memory_id);
163
+ stats.forgottenCount++;
164
+ }
165
+ }
166
+ // Short tier: promote important memories to long-term
167
+ const shortMemories = query(`SELECT memory_id, importance_score FROM memory_tiers WHERE tier = 'short'`);
168
+ for (const row of shortMemories) {
169
+ if (row.importance_score >= this.config.longPromotionThreshold) {
170
+ await this.assignToTier(row.memory_id, 'long', row.importance_score + 0.1);
171
+ stats.promotedCount++;
172
+ }
173
+ }
174
+ // Long tier: enforce max size (evict lowest importance)
175
+ const longCount = query(`SELECT COUNT(*) as count FROM memory_tiers WHERE tier = 'long'`)[0]?.count ?? 0;
176
+ if (longCount > this.config.maxTierSize.long) {
177
+ const toDemote = query(`SELECT memory_id FROM memory_tiers WHERE tier = 'long' ORDER BY importance_score ASC LIMIT ?`, [longCount - this.config.maxTierSize.long]);
178
+ for (const row of toDemote) {
179
+ await this.assignToTier(row.memory_id, 'short', 0.3);
180
+ stats.demotedCount++;
181
+ }
182
+ }
183
+ // Count tiers
184
+ stats.sessionCount = query(`SELECT COUNT(*) as count FROM memory_tiers WHERE tier = 'session'`)[0]?.count ?? 0;
185
+ stats.shortCount = query(`SELECT COUNT(*) as count FROM memory_tiers WHERE tier = 'short'`)[0]?.count ?? 0;
186
+ stats.longCount = query(`SELECT COUNT(*) as count FROM memory_tiers WHERE tier = 'long'`)[0]?.count ?? 0;
187
+ return stats;
188
+ }
189
+ /**
190
+ * Forget a memory (soft delete with semantic compression)
191
+ */
192
+ async forgetMemory(memoryId) {
193
+ const memory = getMemoriesByIds([memoryId])[0];
194
+ if (!memory)
195
+ return;
196
+ // Create a semantic compression before forgetting
197
+ const compressor = getContextCompressor();
198
+ await compressor.compress(0.9); // Compress to 90% reduction
199
+ // Soft delete
200
+ deleteMemory(memoryId);
201
+ }
202
+ /**
203
+ * Create a new memory in session tier
204
+ */
205
+ async createTieredMemory(content, priority, importanceScore = 0.5, isolation) {
206
+ const memory = createMemory({
207
+ content,
208
+ priority,
209
+ userId: isolation?.userId,
210
+ agentId: isolation?.agentId,
211
+ projectId: isolation?.projectId
212
+ });
213
+ await this.assignToTier(memory.id, 'session', importanceScore);
214
+ return memory;
215
+ }
216
+ /**
217
+ * Get tier statistics
218
+ */
219
+ getTierStats() {
220
+ try {
221
+ const rows = query(`SELECT tier, COUNT(*) as count, AVG(importance_score) as avg_importance FROM memory_tiers GROUP BY tier`);
222
+ return rows.map(row => ({
223
+ tier: row.tier,
224
+ count: row.count,
225
+ avgImportance: row.avg_importance
226
+ }));
227
+ }
228
+ catch {
229
+ return [];
230
+ }
231
+ }
232
+ }
233
+ function mapTierRow(row) {
234
+ return {
235
+ memoryId: row.memory_id,
236
+ tier: row.tier,
237
+ accessCount: row.access_count,
238
+ lastAccessedAt: new Date(row.last_accessed_at),
239
+ tierChangedAt: new Date(row.tier_changed_at),
240
+ importanceScore: row.importance_score
241
+ };
242
+ }
243
+ function mapMemoryRow(row) {
244
+ return {
245
+ id: row.id,
246
+ userId: row.user_id,
247
+ agentId: row.agent_id,
248
+ projectId: row.project_id,
249
+ content: row.content,
250
+ priority: row.priority,
251
+ projectTags: JSON.parse(row.project_tags || '[]'),
252
+ anchored: row.anchored === 1,
253
+ accessCount: row.access_count,
254
+ version: row.version,
255
+ updatedBy: row.updated_by,
256
+ parentId: row.parent_id,
257
+ lineage: JSON.parse(row.lineage || '[]'),
258
+ createdAt: new Date(row.created_at),
259
+ updatedAt: new Date(row.updated_at),
260
+ expiresAt: row.expires_at ? new Date(row.expires_at) : null,
261
+ deleted: row.deleted === 1
262
+ };
263
+ }
264
+ // ============ Singleton ============
265
+ let memoryTiersInstance = null;
266
+ export function getMemoryTiersService(config) {
267
+ if (!memoryTiersInstance) {
268
+ memoryTiersInstance = new MemoryTiersService(config);
269
+ }
270
+ return memoryTiersInstance;
271
+ }
272
+ export function resetMemoryTiersService() {
273
+ memoryTiersInstance = null;
274
+ }
275
+ //# sourceMappingURL=memory-tiers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-tiers.js","sourceRoot":"","sources":["../../src/services/memory-tiers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ import { CreateMemoryInput, RecallMemoryInput, Memory, IsolationContext, DEFAULT_ISOLATION } from '../models/types.js';
2
+ export type SearchMode = 'keyword' | 'semantic' | 'hybrid' | 'auto' | 'fulltext';
3
+ export interface MemoryStoreOptions {
4
+ useTransaction?: boolean;
5
+ isolation?: IsolationContext;
6
+ }
7
+ export declare class MemoryService {
8
+ private isolationContext;
9
+ constructor(isolationContext?: IsolationContext);
10
+ setIsolationContext(context: Partial<IsolationContext>): void;
11
+ getIsolationContext(): IsolationContext;
12
+ storeMemory(input: CreateMemoryInput, updatedBy?: string, options?: MemoryStoreOptions): Memory;
13
+ storeMemoryWithTransaction(input: CreateMemoryInput, updatedBy?: string, isolation?: IsolationContext): Memory;
14
+ recallMemories(input: RecallMemoryInput, searchMode?: SearchMode): Memory[];
15
+ private searchWithFullText;
16
+ private detectSearchMode;
17
+ getMemory(id: string): Memory | null;
18
+ anchorMemory(id: string): Memory;
19
+ updateMemoryContent(id: string, content: string, updatedBy?: string, options?: MemoryStoreOptions): Memory;
20
+ updateMemoryContentWithTransaction(id: string, content: string, updatedBy?: string, isolation?: IsolationContext): Memory;
21
+ removeMemory(id: string, updatedBy?: string): void;
22
+ listAllMemories(projectTags?: string[]): Memory[];
23
+ getHighPriorityMemories(projectTags?: string[]): Memory[];
24
+ isMemoryHighPriority(memory: Memory | null): boolean;
25
+ cleanupExpired(): number;
26
+ rebuildSearchIndex(): number;
27
+ isSearchIndexAvailable(): boolean;
28
+ }
29
+ export declare function getMemoryService(isolation?: IsolationContext): MemoryService;
30
+ export declare function resetMemoryService(): void;
31
+ export { DEFAULT_ISOLATION };
32
+ export type { IsolationContext };
33
+ //# sourceMappingURL=memory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../../src/services/memory.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EACjB,iBAAiB,EACjB,MAAM,EACN,gBAAgB,EAChB,iBAAiB,EAClB,MAAM,oBAAoB,CAAC;AAwB5B,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,UAAU,GAAG,QAAQ,GAAG,MAAM,GAAG,UAAU,CAAC;AAEjF,MAAM,WAAW,kBAAkB;IACjC,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,SAAS,CAAC,EAAE,gBAAgB,CAAC;CAC9B;AAED,qBAAa,aAAa;IACxB,OAAO,CAAC,gBAAgB,CAAmB;gBAE/B,gBAAgB,GAAE,gBAAoC;IAIlE,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,gBAAgB,CAAC,GAAG,IAAI;IAI7D,mBAAmB,IAAI,gBAAgB;IAIvC,WAAW,CAAC,KAAK,EAAE,iBAAiB,EAAE,SAAS,CAAC,EAAE,MAAM,EAAE,OAAO,GAAE,kBAAuB;IAiC1F,0BAA0B,CAAC,KAAK,EAAE,iBAAiB,EAAE,SAAS,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,gBAAgB;IA4BrG,cAAc,CAAC,KAAK,EAAE,iBAAiB,EAAE,UAAU,GAAE,UAAmB;IAyDxE,OAAO,CAAC,kBAAkB;IAY1B,OAAO,CAAC,gBAAgB;IAkBxB,SAAS,CAAC,EAAE,EAAE,MAAM;IAIpB,YAAY,CAAC,EAAE,EAAE,MAAM;IAIvB,mBAAmB,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,EAAE,OAAO,GAAE,kBAAuB;IAcrG,kCAAkC,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,gBAAgB;IAUhH,YAAY,CAAC,EAAE,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI;IAIlD,eAAe,CAAC,WAAW,CAAC,EAAE,MAAM,EAAE;IAItC,uBAAuB,CAAC,WAAW,CAAC,EAAE,MAAM,EAAE;IAK9C,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO;IAKpD,cAAc,IAAI,MAAM;IAIxB,kBAAkB,IAAI,MAAM;IAI5B,sBAAsB,IAAI,OAAO;CAQlC;AAID,wBAAgB,gBAAgB,CAAC,SAAS,CAAC,EAAE,gBAAgB,GAAG,aAAa,CAK5E;AAED,wBAAgB,kBAAkB,IAAI,IAAI,CAEzC;AAED,OAAO,EAAE,iBAAiB,EAAE,CAAC;AAC7B,YAAY,EAAE,gBAAgB,EAAE,CAAC"}
@@ -0,0 +1,209 @@
1
+ import { DEFAULT_ISOLATION } from '../models/types.js';
2
+ import { createMemory, getMemory, getMemoriesByIds, updateMemory, deleteMemory, listMemories, searchMemoriesBM25, searchMemoriesVector, searchMemoriesHybrid, incrementAccessCount, storeEmbedding, computeContentHash, findDuplicateByHash, cleanupExpiredMemories } from '../schema/memory.js';
3
+ import { insertHNSWNode, getHNSWIndex } from './hnsw-index.js';
4
+ import { searchFullText, rebuildFullTextIndex } from '../schema/fulltext-search.js';
5
+ import { calculatePriorityScore, isHighPriority } from '../utils/priority.js';
6
+ import { generateFixedEmbedding, generateFixedQueryEmbedding } from '../services/embedding-fixed.js';
7
+ import { transaction } from '../utils/db.js';
8
+ export class MemoryService {
9
+ isolationContext;
10
+ constructor(isolationContext = DEFAULT_ISOLATION) {
11
+ this.isolationContext = isolationContext;
12
+ }
13
+ setIsolationContext(context) {
14
+ this.isolationContext = { ...this.isolationContext, ...context };
15
+ }
16
+ getIsolationContext() {
17
+ return { ...this.isolationContext };
18
+ }
19
+ storeMemory(input, updatedBy, options = {}) {
20
+ const isolation = options.isolation || this.isolationContext;
21
+ if (options.useTransaction) {
22
+ return this.storeMemoryWithTransaction(input, updatedBy, isolation);
23
+ }
24
+ const contentHash = computeContentHash(input.content);
25
+ const existing = findDuplicateByHash(contentHash, isolation);
26
+ if (existing) {
27
+ incrementAccessCount(existing.id);
28
+ return existing;
29
+ }
30
+ const memoryInput = { ...input, ...isolation };
31
+ const memory = createMemory(memoryInput, updatedBy);
32
+ const embedding = generateFixedEmbedding(input.content);
33
+ storeEmbedding(memory.id, input.content, embedding, 'fixed-tfidf', 'v1', 4096);
34
+ // 增量索引:新记忆同步写入 HNSW(懒构建,无需全量重建)
35
+ try {
36
+ const idx = getHNSWIndex('default');
37
+ if (idx) {
38
+ insertHNSWNode('default', memory.id, embedding, input.projectTags || []);
39
+ }
40
+ }
41
+ catch {
42
+ // HNSW 索引未初始化,静默跳过
43
+ }
44
+ return memory;
45
+ }
46
+ storeMemoryWithTransaction(input, updatedBy, isolation) {
47
+ const effectiveIsolation = isolation || this.isolationContext;
48
+ const contentHash = computeContentHash(input.content);
49
+ const existing = findDuplicateByHash(contentHash, effectiveIsolation);
50
+ if (existing) {
51
+ incrementAccessCount(existing.id);
52
+ return existing;
53
+ }
54
+ return transaction(() => {
55
+ const memoryInput = { ...input, ...effectiveIsolation };
56
+ const memory = createMemory(memoryInput, updatedBy);
57
+ const embedding = generateFixedEmbedding(input.content);
58
+ storeEmbedding(memory.id, input.content, embedding, 'fixed-tfidf', 'v1', 4096);
59
+ // 增量索引
60
+ try {
61
+ const idx = getHNSWIndex('default');
62
+ if (idx) {
63
+ insertHNSWNode('default', memory.id, embedding, input.projectTags || []);
64
+ }
65
+ }
66
+ catch {
67
+ // 静默跳过
68
+ }
69
+ return memory;
70
+ });
71
+ }
72
+ recallMemories(input, searchMode = 'auto') {
73
+ const { query, projectTags, limit = 10, userId, agentId, projectId } = input;
74
+ const isolation = { userId, agentId, projectId };
75
+ let memories;
76
+ const actualMode = searchMode === 'auto' ? this.detectSearchMode(query) : searchMode;
77
+ switch (actualMode) {
78
+ case 'keyword':
79
+ memories = searchMemoriesBM25(query, projectTags, limit, isolation);
80
+ break;
81
+ case 'fulltext':
82
+ memories = this.searchWithFullText(query, projectTags, limit, isolation);
83
+ break;
84
+ case 'semantic':
85
+ try {
86
+ const queryEmbedding = generateFixedQueryEmbedding(query);
87
+ const results = searchMemoriesVector(queryEmbedding, projectTags, limit, 0.1, isolation);
88
+ memories = results.map(r => ({ ...r, similarity: r.similarity }));
89
+ }
90
+ catch {
91
+ memories = searchMemoriesBM25(query, projectTags, limit, isolation);
92
+ }
93
+ break;
94
+ case 'hybrid':
95
+ try {
96
+ const queryEmbedding = generateFixedQueryEmbedding(query);
97
+ const results = searchMemoriesHybrid(query, queryEmbedding, projectTags, limit, 0.5, 0.5, isolation);
98
+ memories = results;
99
+ }
100
+ catch {
101
+ memories = searchMemoriesBM25(query, projectTags, limit, isolation);
102
+ }
103
+ break;
104
+ default:
105
+ memories = searchMemoriesBM25(query, projectTags, limit, isolation);
106
+ }
107
+ if (!query) {
108
+ memories = listMemories(projectTags, isolation);
109
+ }
110
+ const scoredMemories = [];
111
+ for (const memory of memories) {
112
+ incrementAccessCount(memory.id);
113
+ const score = calculatePriorityScore(memory.priority, memory.accessCount + 1, memory.createdAt, memory.anchored);
114
+ scoredMemories.push({ memory, score });
115
+ }
116
+ scoredMemories.sort((a, b) => b.score - a.score);
117
+ return scoredMemories.slice(0, limit).map(item => item.memory);
118
+ }
119
+ searchWithFullText(queryText, projectTags, limit = 10, isolation) {
120
+ const results = searchFullText(queryText, limit);
121
+ const memoryIds = results.map(result => result.memoryId);
122
+ const memories = getMemoriesByIds(memoryIds, isolation);
123
+ if (!projectTags || projectTags.length === 0) {
124
+ return memories;
125
+ }
126
+ return memories.filter(memory => projectTags.every(tag => memory.projectTags.includes(tag)));
127
+ }
128
+ detectSearchMode(query) {
129
+ if (query.length < 20) {
130
+ return 'keyword';
131
+ }
132
+ const hasTechnicalTerms = /\b(api|function|class|error|bug|fix|implement|test|config)\b/i.test(query);
133
+ if (hasTechnicalTerms) {
134
+ return 'hybrid';
135
+ }
136
+ const hasNaturalLanguage = /\b(how|what|why|explain|describe|tell me about)\b/i.test(query);
137
+ if (hasNaturalLanguage) {
138
+ return 'semantic';
139
+ }
140
+ return 'hybrid';
141
+ }
142
+ getMemory(id) {
143
+ return getMemory(id, this.isolationContext);
144
+ }
145
+ anchorMemory(id) {
146
+ return updateMemory(id, { anchored: true }, undefined, this.isolationContext);
147
+ }
148
+ updateMemoryContent(id, content, updatedBy, options = {}) {
149
+ const isolation = options.isolation || this.isolationContext;
150
+ if (options.useTransaction) {
151
+ return this.updateMemoryContentWithTransaction(id, content, updatedBy, isolation);
152
+ }
153
+ const memory = updateMemory(id, { content }, updatedBy, isolation);
154
+ const embedding = generateFixedEmbedding(content);
155
+ storeEmbedding(id, content, embedding, 'fixed-tfidf', 'v1', 4096);
156
+ return memory;
157
+ }
158
+ updateMemoryContentWithTransaction(id, content, updatedBy, isolation) {
159
+ const effectiveIsolation = isolation || this.isolationContext;
160
+ return transaction(() => {
161
+ const memory = updateMemory(id, { content }, updatedBy, effectiveIsolation);
162
+ const embedding = generateFixedEmbedding(content);
163
+ storeEmbedding(id, content, embedding, 'fixed-tfidf', 'v1', 4096);
164
+ return memory;
165
+ });
166
+ }
167
+ removeMemory(id, updatedBy) {
168
+ deleteMemory(id, updatedBy, this.isolationContext);
169
+ }
170
+ listAllMemories(projectTags) {
171
+ return listMemories(projectTags, this.isolationContext);
172
+ }
173
+ getHighPriorityMemories(projectTags) {
174
+ const memories = listMemories(projectTags, this.isolationContext);
175
+ return memories.filter(memory => isHighPriority(memory.priority));
176
+ }
177
+ isMemoryHighPriority(memory) {
178
+ if (!memory)
179
+ return false;
180
+ return isHighPriority(memory.priority);
181
+ }
182
+ cleanupExpired() {
183
+ return cleanupExpiredMemories();
184
+ }
185
+ rebuildSearchIndex() {
186
+ return rebuildFullTextIndex();
187
+ }
188
+ isSearchIndexAvailable() {
189
+ try {
190
+ searchFullText('health-check', 1);
191
+ return true;
192
+ }
193
+ catch {
194
+ return false;
195
+ }
196
+ }
197
+ }
198
+ let memoryServiceInstance = null;
199
+ export function getMemoryService(isolation) {
200
+ if (!memoryServiceInstance) {
201
+ memoryServiceInstance = new MemoryService(isolation);
202
+ }
203
+ return memoryServiceInstance;
204
+ }
205
+ export function resetMemoryService() {
206
+ memoryServiceInstance = null;
207
+ }
208
+ export { DEFAULT_ISOLATION };
209
+ //# sourceMappingURL=memory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory.js","sourceRoot":"","sources":["../../src/services/memory.ts"],"names":[],"mappings":"AAAA,OAAO,EAKL,iBAAiB,EAClB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,YAAY,EACZ,SAAS,EACT,gBAAgB,EAChB,YAAY,EACZ,YAAY,EACZ,YAAY,EAEZ,kBAAkB,EAClB,oBAAoB,EACpB,oBAAoB,EACpB,oBAAoB,EACpB,cAAc,EACd,kBAAkB,EAClB,mBAAmB,EACnB,sBAAsB,EACvB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/D,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AACpF,OAAO,EAAE,sBAAsB,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC9E,OAAO,EAAE,sBAAsB,EAAE,2BAA2B,EAAE,MAAM,gCAAgC,CAAC;AACrG,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAS7C,MAAM,OAAO,aAAa;IAChB,gBAAgB,CAAmB;IAE3C,YAAY,mBAAqC,iBAAiB;QAChE,IAAI,CAAC,gBAAgB,GAAG,gBAAgB,CAAC;IAC3C,CAAC;IAED,mBAAmB,CAAC,OAAkC;QACpD,IAAI,CAAC,gBAAgB,GAAG,EAAE,GAAG,IAAI,CAAC,gBAAgB,EAAE,GAAG,OAAO,EAAE,CAAC;IACnE,CAAC;IAED,mBAAmB;QACjB,OAAO,EAAE,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;IACtC,CAAC;IAED,WAAW,CAAC,KAAwB,EAAE,SAAkB,EAAE,UAA8B,EAAE;QACxF,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,IAAI,CAAC,gBAAgB,CAAC;QAE7D,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;YAC3B,OAAO,IAAI,CAAC,0BAA0B,CAAC,KAAK,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;QACtE,CAAC;QAED,MAAM,WAAW,GAAG,kBAAkB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACtD,MAAM,QAAQ,GAAG,mBAAmB,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;QAE7D,IAAI,QAAQ,EAAE,CAAC;YACb,oBAAoB,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;YAClC,OAAO,QAAQ,CAAC;QAClB,CAAC;QAED,MAAM,WAAW,GAAG,EAAE,GAAG,KAAK,EAAE,GAAG,SAAS,EAAE,CAAC;QAC/C,MAAM,MAAM,GAAG,YAAY,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;QACpD,MAAM,SAAS,GAAG,sBAAsB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACxD,cAAc,CAAC,MAAM,CAAC,EAAE,EAAE,KAAK,CAAC,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QAE/E,gCAAgC;QAChC,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC;YACpC,IAAI,GAAG,EAAE,CAAC;gBACR,cAAc,CAAC,SAAS,EAAE,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,KAAK,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC;YAC3E,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,mBAAmB;QACrB,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,0BAA0B,CAAC,KAAwB,EAAE,SAAkB,EAAE,SAA4B;QACnG,MAAM,kBAAkB,GAAG,SAAS,IAAI,IAAI,CAAC,gBAAgB,CAAC;QAC9D,MAAM,WAAW,GAAG,kBAAkB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACtD,MAAM,QAAQ,GAAG,mBAAmB,CAAC,WAAW,EAAE,kBAAkB,CAAC,CAAC;QAEtE,IAAI,QAAQ,EAAE,CAAC;YACb,oBAAoB,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;YAClC,OAAO,QAAQ,CAAC;QAClB,CAAC;QAED,OAAO,WAAW,CAAC,GAAG,EAAE;YACtB,MAAM,WAAW,GAAG,EAAE,GAAG,KAAK,EAAE,GAAG,kBAAkB,EAAE,CAAC;YACxD,MAAM,MAAM,GAAG,YAAY,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;YACpD,MAAM,SAAS,GAAG,sBAAsB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YACxD,cAAc,CAAC,MAAM,CAAC,EAAE,EAAE,KAAK,CAAC,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;YAC/E,OAAO;YACP,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC;gBACpC,IAAI,GAAG,EAAE,CAAC;oBACR,cAAc,CAAC,SAAS,EAAE,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,KAAK,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC;gBAC3E,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO;YACT,CAAC;YACD,OAAO,MAAM,CAAC;QAChB,CAAC,CAAC,CAAC;IACL,CAAC;IAED,cAAc,CAAC,KAAwB,EAAE,aAAyB,MAAM;QACtE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,GAAG,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,KAAK,CAAC;QAC7E,MAAM,SAAS,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC;QAEjD,IAAI,QAAQ,CAAC;QAEb,MAAM,UAAU,GAAG,UAAU,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC;QAErF,QAAQ,UAAU,EAAE,CAAC;YACnB,KAAK,SAAS;gBACZ,QAAQ,GAAG,kBAAkB,CAAC,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;gBACpE,MAAM;YACR,KAAK,UAAU;gBACb,QAAQ,GAAG,IAAI,CAAC,kBAAkB,CAAC,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;gBACzE,MAAM;YACR,KAAK,UAAU;gBACb,IAAI,CAAC;oBACH,MAAM,cAAc,GAAG,2BAA2B,CAAC,KAAK,CAAC,CAAC;oBAC1D,MAAM,OAAO,GAAG,oBAAoB,CAAC,cAAc,EAAE,WAAW,EAAE,KAAK,EAAE,GAAG,EAAE,SAAS,CAAC,CAAC;oBACzF,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,UAAU,EAAE,CAAC,CAA8C,CAAC;gBACjH,CAAC;gBAAC,MAAM,CAAC;oBACP,QAAQ,GAAG,kBAAkB,CAAC,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;gBACtE,CAAC;gBACD,MAAM;YACR,KAAK,QAAQ;gBACX,IAAI,CAAC;oBACH,MAAM,cAAc,GAAG,2BAA2B,CAAC,KAAK,CAAC,CAAC;oBAC1D,MAAM,OAAO,GAAG,oBAAoB,CAAC,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,SAAS,CAAC,CAAC;oBACrG,QAAQ,GAAG,OAA+D,CAAC;gBAC7E,CAAC;gBAAC,MAAM,CAAC;oBACP,QAAQ,GAAG,kBAAkB,CAAC,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;gBACtE,CAAC;gBACD,MAAM;YACR;gBACE,QAAQ,GAAG,kBAAkB,CAAC,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;QACxE,CAAC;QAED,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,QAAQ,GAAG,YAAY,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;QAClD,CAAC;QAED,MAAM,cAAc,GAA6C,EAAE,CAAC;QACpE,KAAK,MAAM,MAAM,IAAI,QAAQ,EAAE,CAAC;YAC9B,oBAAoB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YAChC,MAAM,KAAK,GAAG,sBAAsB,CAClC,MAAM,CAAC,QAAQ,EACf,MAAM,CAAC,WAAW,GAAG,CAAC,EACtB,MAAM,CAAC,SAAS,EAChB,MAAM,CAAC,QAAQ,CAChB,CAAC;YACF,cAAc,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;QACzC,CAAC;QAED,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;QACjD,OAAO,cAAc,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACjE,CAAC;IAEO,kBAAkB,CAAC,SAAiB,EAAE,WAAsB,EAAE,QAAgB,EAAE,EAAE,SAA4B;QACpH,MAAM,OAAO,GAAG,cAAc,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QACjD,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QACzD,MAAM,QAAQ,GAAG,gBAAgB,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;QAExD,IAAI,CAAC,WAAW,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC7C,OAAO,QAAQ,CAAC;QAClB,CAAC;QAED,OAAO,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAC/F,CAAC;IAEO,gBAAgB,CAAC,KAAa;QACpC,IAAI,KAAK,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;YACtB,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,MAAM,iBAAiB,GAAG,+DAA+D,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACtG,IAAI,iBAAiB,EAAE,CAAC;YACtB,OAAO,QAAQ,CAAC;QAClB,CAAC;QAED,MAAM,kBAAkB,GAAG,oDAAoD,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC5F,IAAI,kBAAkB,EAAE,CAAC;YACvB,OAAO,UAAU,CAAC;QACpB,CAAC;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,SAAS,CAAC,EAAU;QAClB,OAAO,SAAS,CAAC,EAAE,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC;IAC9C,CAAC;IAED,YAAY,CAAC,EAAU;QACrB,OAAO,YAAY,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC;IAChF,CAAC;IAED,mBAAmB,CAAC,EAAU,EAAE,OAAe,EAAE,SAAkB,EAAE,UAA8B,EAAE;QACnG,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,IAAI,CAAC,gBAAgB,CAAC;QAE7D,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;YAC3B,OAAO,IAAI,CAAC,kCAAkC,CAAC,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;QACpF,CAAC;QAED,MAAM,MAAM,GAAG,YAAY,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;QACnE,MAAM,SAAS,GAAG,sBAAsB,CAAC,OAAO,CAAC,CAAC;QAClD,cAAc,CAAC,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QAElE,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,kCAAkC,CAAC,EAAU,EAAE,OAAe,EAAE,SAAkB,EAAE,SAA4B;QAC9G,MAAM,kBAAkB,GAAG,SAAS,IAAI,IAAI,CAAC,gBAAgB,CAAC;QAC9D,OAAO,WAAW,CAAC,GAAG,EAAE;YACtB,MAAM,MAAM,GAAG,YAAY,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,SAAS,EAAE,kBAAkB,CAAC,CAAC;YAC5E,MAAM,SAAS,GAAG,sBAAsB,CAAC,OAAO,CAAC,CAAC;YAClD,cAAc,CAAC,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;YAClE,OAAO,MAAM,CAAC;QAChB,CAAC,CAAC,CAAC;IACL,CAAC;IAED,YAAY,CAAC,EAAU,EAAE,SAAkB;QACzC,YAAY,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC;IACrD,CAAC;IAED,eAAe,CAAC,WAAsB;QACpC,OAAO,YAAY,CAAC,WAAW,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC;IAC1D,CAAC;IAED,uBAAuB,CAAC,WAAsB;QAC5C,MAAM,QAAQ,GAAG,YAAY,CAAC,WAAW,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC;QAClE,OAAO,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,cAAc,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;IACpE,CAAC;IAED,oBAAoB,CAAC,MAAqB;QACxC,IAAI,CAAC,MAAM;YAAE,OAAO,KAAK,CAAC;QAC1B,OAAO,cAAc,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IACzC,CAAC;IAED,cAAc;QACZ,OAAO,sBAAsB,EAAE,CAAC;IAClC,CAAC;IAED,kBAAkB;QAChB,OAAO,oBAAoB,EAAE,CAAC;IAChC,CAAC;IAED,sBAAsB;QACpB,IAAI,CAAC;YACH,cAAc,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC;YAClC,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;CACF;AAED,IAAI,qBAAqB,GAAyB,IAAI,CAAC;AAEvD,MAAM,UAAU,gBAAgB,CAAC,SAA4B;IAC3D,IAAI,CAAC,qBAAqB,EAAE,CAAC;QAC3B,qBAAqB,GAAG,IAAI,aAAa,CAAC,SAAS,CAAC,CAAC;IACvD,CAAC;IACD,OAAO,qBAAqB,CAAC;AAC/B,CAAC;AAED,MAAM,UAAU,kBAAkB;IAChC,qBAAqB,GAAG,IAAI,CAAC;AAC/B,CAAC;AAED,OAAO,EAAE,iBAAiB,EAAE,CAAC"}
@@ -0,0 +1,83 @@
1
+ /**
2
+ * Multi-Agent Sharing Service
3
+ * Enables sharing memories and sessions across agents
4
+ */
5
+ import { Memory } from '../models/types.js';
6
+ export interface ShareConfig {
7
+ shareToAgents: string[];
8
+ shareToProjects: string[];
9
+ permission: 'read' | 'read_write' | 'admin';
10
+ expiresAt?: Date;
11
+ }
12
+ export interface SharedMemoryRecord {
13
+ id: string;
14
+ memoryId: string;
15
+ sharedByAgentId: string;
16
+ sharedToAgentId: string;
17
+ sharedToProjectId: string;
18
+ permission: string;
19
+ sharedAt: Date;
20
+ expiresAt: Date | null;
21
+ }
22
+ export interface ShareToken {
23
+ token: string;
24
+ memoryId: string;
25
+ sharedByAgentId: string;
26
+ permission: string;
27
+ createdAt: Date;
28
+ expiresAt: Date | null;
29
+ useCount: number;
30
+ maxUses: number | null;
31
+ }
32
+ export declare function initMultiAgentSharing(): void;
33
+ /**
34
+ * Share a memory with specific agents
35
+ */
36
+ export declare function shareMemoryToAgents(memoryId: string, sharedByAgentId: string, targetAgentIds: string[], targetProjectId: string, permission?: ShareConfig['permission'], expiresAt?: Date): SharedMemoryRecord[];
37
+ /**
38
+ * Share a memory to a project (all agents in project)
39
+ */
40
+ export declare function shareMemoryToProject(memoryId: string, sharedByAgentId: string, targetProjectId: string, permission?: ShareConfig['permission'], expiresAt?: Date): SharedMemoryRecord;
41
+ /**
42
+ * Get shared memories for an agent
43
+ */
44
+ export declare function getSharedMemoriesForAgent(agentId: string, projectId?: string, includeExpired?: boolean): Array<SharedMemoryRecord & {
45
+ memory: Memory;
46
+ }>;
47
+ /**
48
+ * Revoke a shared memory
49
+ */
50
+ export declare function revokeSharedMemory(shareId: string): void;
51
+ /**
52
+ * Revoke all shares of a memory
53
+ */
54
+ export declare function revokeAllSharesForMemory(memoryId: string): number;
55
+ /**
56
+ * Create a share token for a memory
57
+ */
58
+ export declare function createShareToken(memoryId: string, sharedByAgentId: string, permission?: 'read' | 'read_write', options?: {
59
+ expiresAt?: Date;
60
+ maxUses?: number;
61
+ }): ShareToken;
62
+ /**
63
+ * Redeem a share token
64
+ */
65
+ export declare function redeemShareToken(token: string): {
66
+ memory: Memory;
67
+ permission: string;
68
+ } | null;
69
+ /**
70
+ * Delete expired tokens
71
+ */
72
+ export declare function cleanupExpiredTokens(): number;
73
+ export declare function getMultiAgentSharingService(): {
74
+ shareMemoryToAgents: typeof shareMemoryToAgents;
75
+ shareMemoryToProject: typeof shareMemoryToProject;
76
+ getSharedMemoriesForAgent: typeof getSharedMemoriesForAgent;
77
+ revokeSharedMemory: typeof revokeSharedMemory;
78
+ revokeAllSharesForMemory: typeof revokeAllSharesForMemory;
79
+ createShareToken: typeof createShareToken;
80
+ redeemShareToken: typeof redeemShareToken;
81
+ cleanupExpiredTokens: typeof cleanupExpiredTokens;
82
+ };
83
+ //# sourceMappingURL=multi-agent-sharing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"multi-agent-sharing.d.ts","sourceRoot":"","sources":["../../src/services/multi-agent-sharing.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAG5C,MAAM,WAAW,WAAW;IAC1B,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,UAAU,EAAE,MAAM,GAAG,YAAY,GAAG,OAAO,CAAC;IAC5C,SAAS,CAAC,EAAE,IAAI,CAAC;CAClB;AAED,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,MAAM,CAAC;IACxB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,IAAI,CAAC;IACf,SAAS,EAAE,IAAI,GAAG,IAAI,CAAC;CACxB;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,IAAI,CAAC;IAChB,SAAS,EAAE,IAAI,GAAG,IAAI,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB;AAED,wBAAgB,qBAAqB,IAAI,IAAI,CAyC5C;AAID;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,MAAM,EAChB,eAAe,EAAE,MAAM,EACvB,cAAc,EAAE,MAAM,EAAE,EACxB,eAAe,EAAE,MAAM,EACvB,UAAU,GAAE,WAAW,CAAC,YAAY,CAAU,EAC9C,SAAS,CAAC,EAAE,IAAI,GACf,kBAAkB,EAAE,CAStB;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,MAAM,EAChB,eAAe,EAAE,MAAM,EACvB,eAAe,EAAE,MAAM,EACvB,UAAU,GAAE,WAAW,CAAC,YAAY,CAAU,EAC9C,SAAS,CAAC,EAAE,IAAI,GACf,kBAAkB,CAGpB;AA+CD;;GAEG;AACH,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,MAAM,EACf,SAAS,CAAC,EAAE,MAAM,EAClB,cAAc,GAAE,OAAe,GAC9B,KAAK,CAAC,kBAAkB,GAAG;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAuChD;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAMxD;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAOjE;AAID;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,MAAM,EAChB,eAAe,EAAE,MAAM,EACvB,UAAU,GAAE,MAAM,GAAG,YAAqB,EAC1C,OAAO,GAAE;IACP,SAAS,CAAC,EAAE,IAAI,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;CACb,GACL,UAAU,CAgCZ;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CA4C7F;AAED;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,MAAM,CAU7C;AAsED,wBAAgB,2BAA2B;;;;;;;;;EAW1C"}