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.
- package/LICENSE +21 -0
- package/README.md +774 -0
- package/README.zh.md +765 -0
- package/bin/context-gatekeeper-cli.js +60 -0
- package/dist/api/gdpr.d.ts +104 -0
- package/dist/api/gdpr.d.ts.map +1 -0
- package/dist/api/gdpr.js +229 -0
- package/dist/api/gdpr.js.map +1 -0
- package/dist/api/health-check.d.ts +13 -0
- package/dist/api/health-check.d.ts.map +1 -0
- package/dist/api/health-check.js +2 -0
- package/dist/api/health-check.js.map +1 -0
- package/dist/api/index.d.ts +7 -0
- package/dist/api/index.d.ts.map +1 -0
- package/dist/api/index.js +8 -0
- package/dist/api/index.js.map +1 -0
- package/dist/api/observability.d.ts +39 -0
- package/dist/api/observability.d.ts.map +1 -0
- package/dist/api/observability.js +132 -0
- package/dist/api/observability.js.map +1 -0
- package/dist/api/session-manager.d.ts +41 -0
- package/dist/api/session-manager.d.ts.map +1 -0
- package/dist/api/session-manager.js +129 -0
- package/dist/api/session-manager.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/server.d.ts +8 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +613 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/tools/configure-llm.d.ts +26 -0
- package/dist/mcp/tools/configure-llm.d.ts.map +1 -0
- package/dist/mcp/tools/configure-llm.js +32 -0
- package/dist/mcp/tools/configure-llm.js.map +1 -0
- package/dist/mcp/tools/context-compress.d.ts +15 -0
- package/dist/mcp/tools/context-compress.d.ts.map +1 -0
- package/dist/mcp/tools/context-compress.js +15 -0
- package/dist/mcp/tools/context-compress.js.map +1 -0
- package/dist/mcp/tools/dual-mode-execute.d.ts +78 -0
- package/dist/mcp/tools/dual-mode-execute.d.ts.map +1 -0
- package/dist/mcp/tools/dual-mode-execute.js +299 -0
- package/dist/mcp/tools/dual-mode-execute.js.map +1 -0
- package/dist/mcp/tools/index.d.ts +19 -0
- package/dist/mcp/tools/index.d.ts.map +1 -0
- package/dist/mcp/tools/index.js +20 -0
- package/dist/mcp/tools/index.js.map +1 -0
- package/dist/mcp/tools/intelligent-recall.d.ts +67 -0
- package/dist/mcp/tools/intelligent-recall.d.ts.map +1 -0
- package/dist/mcp/tools/intelligent-recall.js +208 -0
- package/dist/mcp/tools/intelligent-recall.js.map +1 -0
- package/dist/mcp/tools/memory-anchor.d.ts +13 -0
- package/dist/mcp/tools/memory-anchor.d.ts.map +1 -0
- package/dist/mcp/tools/memory-anchor.js +16 -0
- package/dist/mcp/tools/memory-anchor.js.map +1 -0
- package/dist/mcp/tools/memory-delete-batch.d.ts +16 -0
- package/dist/mcp/tools/memory-delete-batch.d.ts.map +1 -0
- package/dist/mcp/tools/memory-delete-batch.js +26 -0
- package/dist/mcp/tools/memory-delete-batch.js.map +1 -0
- package/dist/mcp/tools/memory-extract.d.ts +68 -0
- package/dist/mcp/tools/memory-extract.d.ts.map +1 -0
- package/dist/mcp/tools/memory-extract.js +280 -0
- package/dist/mcp/tools/memory-extract.js.map +1 -0
- package/dist/mcp/tools/memory-recall.d.ts +42 -0
- package/dist/mcp/tools/memory-recall.d.ts.map +1 -0
- package/dist/mcp/tools/memory-recall.js +37 -0
- package/dist/mcp/tools/memory-recall.js.map +1 -0
- package/dist/mcp/tools/memory-report-usage.d.ts +17 -0
- package/dist/mcp/tools/memory-report-usage.d.ts.map +1 -0
- package/dist/mcp/tools/memory-report-usage.js +15 -0
- package/dist/mcp/tools/memory-report-usage.js.map +1 -0
- package/dist/mcp/tools/memory-search.d.ts +43 -0
- package/dist/mcp/tools/memory-search.d.ts.map +1 -0
- package/dist/mcp/tools/memory-search.js +38 -0
- package/dist/mcp/tools/memory-search.js.map +1 -0
- package/dist/mcp/tools/memory-session.d.ts +118 -0
- package/dist/mcp/tools/memory-session.d.ts.map +1 -0
- package/dist/mcp/tools/memory-session.js +113 -0
- package/dist/mcp/tools/memory-session.js.map +1 -0
- package/dist/mcp/tools/memory-stats.d.ts +10 -0
- package/dist/mcp/tools/memory-stats.d.ts.map +1 -0
- package/dist/mcp/tools/memory-stats.js +35 -0
- package/dist/mcp/tools/memory-stats.js.map +1 -0
- package/dist/mcp/tools/memory-store-batch.d.ts +49 -0
- package/dist/mcp/tools/memory-store-batch.d.ts.map +1 -0
- package/dist/mcp/tools/memory-store-batch.js +48 -0
- package/dist/mcp/tools/memory-store-batch.js.map +1 -0
- package/dist/mcp/tools/memory-store.d.ts +37 -0
- package/dist/mcp/tools/memory-store.d.ts.map +1 -0
- package/dist/mcp/tools/memory-store.js +34 -0
- package/dist/mcp/tools/memory-store.js.map +1 -0
- package/dist/mcp/tools/project-create.d.ts +16 -0
- package/dist/mcp/tools/project-create.d.ts.map +1 -0
- package/dist/mcp/tools/project-create.js +14 -0
- package/dist/mcp/tools/project-create.js.map +1 -0
- package/dist/models/types.d.ts +88 -0
- package/dist/models/types.d.ts.map +1 -0
- package/dist/models/types.js +19 -0
- package/dist/models/types.js.map +1 -0
- package/dist/schema/compression.d.ts +7 -0
- package/dist/schema/compression.d.ts.map +1 -0
- package/dist/schema/compression.js +66 -0
- package/dist/schema/compression.js.map +1 -0
- package/dist/schema/fulltext-search.d.ts +10 -0
- package/dist/schema/fulltext-search.d.ts.map +1 -0
- package/dist/schema/fulltext-search.js +73 -0
- package/dist/schema/fulltext-search.js.map +1 -0
- package/dist/schema/index.d.ts +9 -0
- package/dist/schema/index.d.ts.map +1 -0
- package/dist/schema/index.js +9 -0
- package/dist/schema/index.js.map +1 -0
- package/dist/schema/knowledge-graph.d.ts +108 -0
- package/dist/schema/knowledge-graph.d.ts.map +1 -0
- package/dist/schema/knowledge-graph.js +372 -0
- package/dist/schema/knowledge-graph.js.map +1 -0
- package/dist/schema/memory-session.d.ts +62 -0
- package/dist/schema/memory-session.d.ts.map +1 -0
- package/dist/schema/memory-session.js +258 -0
- package/dist/schema/memory-session.js.map +1 -0
- package/dist/schema/memory.d.ts +84 -0
- package/dist/schema/memory.d.ts.map +1 -0
- package/dist/schema/memory.js +622 -0
- package/dist/schema/memory.js.map +1 -0
- package/dist/schema/project.d.ts +8 -0
- package/dist/schema/project.d.ts.map +1 -0
- package/dist/schema/project.js +68 -0
- package/dist/schema/project.js.map +1 -0
- package/dist/schema/schema-init.d.ts +2 -0
- package/dist/schema/schema-init.d.ts.map +1 -0
- package/dist/schema/schema-init.js +199 -0
- package/dist/schema/schema-init.js.map +1 -0
- package/dist/schema/vector-index.d.ts +28 -0
- package/dist/schema/vector-index.d.ts.map +1 -0
- package/dist/schema/vector-index.js +179 -0
- package/dist/schema/vector-index.js.map +1 -0
- package/dist/scripts/agents/base.d.ts +89 -0
- package/dist/scripts/agents/base.d.ts.map +1 -0
- package/dist/scripts/agents/base.js +148 -0
- package/dist/scripts/agents/base.js.map +1 -0
- package/dist/scripts/agents/base.ts +193 -0
- package/dist/scripts/agents/claude-code.d.ts +21 -0
- package/dist/scripts/agents/claude-code.d.ts.map +1 -0
- package/dist/scripts/agents/claude-code.js +33 -0
- package/dist/scripts/agents/claude-code.js.map +1 -0
- package/dist/scripts/agents/claude-code.ts +36 -0
- package/dist/scripts/agents/claude-desktop.d.ts +25 -0
- package/dist/scripts/agents/claude-desktop.d.ts.map +1 -0
- package/dist/scripts/agents/claude-desktop.js +36 -0
- package/dist/scripts/agents/claude-desktop.js.map +1 -0
- package/dist/scripts/agents/claude-desktop.ts +39 -0
- package/dist/scripts/agents/cline.d.ts +22 -0
- package/dist/scripts/agents/cline.d.ts.map +1 -0
- package/dist/scripts/agents/cline.js +35 -0
- package/dist/scripts/agents/cline.js.map +1 -0
- package/dist/scripts/agents/cline.ts +38 -0
- package/dist/scripts/agents/continue.d.ts +20 -0
- package/dist/scripts/agents/continue.d.ts.map +1 -0
- package/dist/scripts/agents/continue.js +35 -0
- package/dist/scripts/agents/continue.js.map +1 -0
- package/dist/scripts/agents/continue.ts +38 -0
- package/dist/scripts/agents/cursor.d.ts +27 -0
- package/dist/scripts/agents/cursor.d.ts.map +1 -0
- package/dist/scripts/agents/cursor.js +38 -0
- package/dist/scripts/agents/cursor.js.map +1 -0
- package/dist/scripts/agents/cursor.ts +41 -0
- package/dist/scripts/cli/config-gen.d.ts +59 -0
- package/dist/scripts/cli/config-gen.d.ts.map +1 -0
- package/dist/scripts/cli/config-gen.js +156 -0
- package/dist/scripts/cli/config-gen.js.map +1 -0
- package/dist/scripts/cli/config-gen.ts +164 -0
- package/dist/scripts/cli/detect.d.ts +42 -0
- package/dist/scripts/cli/detect.d.ts.map +1 -0
- package/dist/scripts/cli/detect.js +131 -0
- package/dist/scripts/cli/detect.js.map +1 -0
- package/dist/scripts/cli/detect.ts +162 -0
- package/dist/scripts/cli/install.d.ts +31 -0
- package/dist/scripts/cli/install.d.ts.map +1 -0
- package/dist/scripts/cli/install.js +125 -0
- package/dist/scripts/cli/install.js.map +1 -0
- package/dist/scripts/cli/install.ts +157 -0
- package/dist/scripts/cli/status.d.ts +8 -0
- package/dist/scripts/cli/status.d.ts.map +1 -0
- package/dist/scripts/cli/status.js +39 -0
- package/dist/scripts/cli/status.js.map +1 -0
- package/dist/scripts/cli/status.ts +48 -0
- package/dist/scripts/cli/uninstall.d.ts +22 -0
- package/dist/scripts/cli/uninstall.d.ts.map +1 -0
- package/dist/scripts/cli/uninstall.js +141 -0
- package/dist/scripts/cli/uninstall.js.map +1 -0
- package/dist/scripts/cli/uninstall.ts +157 -0
- package/dist/scripts/cli.d.ts +23 -0
- package/dist/scripts/cli.d.ts.map +1 -0
- package/dist/scripts/cli.js +166 -0
- package/dist/scripts/cli.js.map +1 -0
- package/dist/scripts/cli.ts +173 -0
- package/dist/services/classifier/index.d.ts +36 -0
- package/dist/services/classifier/index.d.ts.map +1 -0
- package/dist/services/classifier/index.js +104 -0
- package/dist/services/classifier/index.js.map +1 -0
- package/dist/services/classifier/llm.d.ts +37 -0
- package/dist/services/classifier/llm.d.ts.map +1 -0
- package/dist/services/classifier/llm.js +119 -0
- package/dist/services/classifier/llm.js.map +1 -0
- package/dist/services/classifier/rules.d.ts +22 -0
- package/dist/services/classifier/rules.d.ts.map +1 -0
- package/dist/services/classifier/rules.js +98 -0
- package/dist/services/classifier/rules.js.map +1 -0
- package/dist/services/compressor/index.d.ts +3 -0
- package/dist/services/compressor/index.d.ts.map +1 -0
- package/dist/services/compressor/index.js +3 -0
- package/dist/services/compressor/index.js.map +1 -0
- package/dist/services/compressor/threshold.d.ts +35 -0
- package/dist/services/compressor/threshold.d.ts.map +1 -0
- package/dist/services/compressor/threshold.js +60 -0
- package/dist/services/compressor/threshold.js.map +1 -0
- package/dist/services/compressor/trigger.d.ts +24 -0
- package/dist/services/compressor/trigger.d.ts.map +1 -0
- package/dist/services/compressor/trigger.js +91 -0
- package/dist/services/compressor/trigger.js.map +1 -0
- package/dist/services/constraint-extractor.d.ts +25 -0
- package/dist/services/constraint-extractor.d.ts.map +1 -0
- package/dist/services/constraint-extractor.js +97 -0
- package/dist/services/constraint-extractor.js.map +1 -0
- package/dist/services/database-health.d.ts +22 -0
- package/dist/services/database-health.d.ts.map +1 -0
- package/dist/services/database-health.js +122 -0
- package/dist/services/database-health.js.map +1 -0
- package/dist/services/embedding-fixed.d.ts +9 -0
- package/dist/services/embedding-fixed.d.ts.map +1 -0
- package/dist/services/embedding-fixed.js +70 -0
- package/dist/services/embedding-fixed.js.map +1 -0
- package/dist/services/embedding-provider.d.ts +79 -0
- package/dist/services/embedding-provider.d.ts.map +1 -0
- package/dist/services/embedding-provider.js +229 -0
- package/dist/services/embedding-provider.js.map +1 -0
- package/dist/services/embedding.d.ts +17 -0
- package/dist/services/embedding.d.ts.map +1 -0
- package/dist/services/embedding.js +99 -0
- package/dist/services/embedding.js.map +1 -0
- package/dist/services/hnsw-index.d.ts +76 -0
- package/dist/services/hnsw-index.d.ts.map +1 -0
- package/dist/services/hnsw-index.js +301 -0
- package/dist/services/hnsw-index.js.map +1 -0
- package/dist/services/llm.d.ts +39 -0
- package/dist/services/llm.d.ts.map +1 -0
- package/dist/services/llm.js +207 -0
- package/dist/services/llm.js.map +1 -0
- package/dist/services/memory-tiers.d.ts +75 -0
- package/dist/services/memory-tiers.d.ts.map +1 -0
- package/dist/services/memory-tiers.js +275 -0
- package/dist/services/memory-tiers.js.map +1 -0
- package/dist/services/memory.d.ts +33 -0
- package/dist/services/memory.d.ts.map +1 -0
- package/dist/services/memory.js +209 -0
- package/dist/services/memory.js.map +1 -0
- package/dist/services/multi-agent-sharing.d.ts +83 -0
- package/dist/services/multi-agent-sharing.d.ts.map +1 -0
- package/dist/services/multi-agent-sharing.js +278 -0
- package/dist/services/multi-agent-sharing.js.map +1 -0
- package/dist/services/reranker.d.ts +88 -0
- package/dist/services/reranker.d.ts.map +1 -0
- package/dist/services/reranker.js +234 -0
- package/dist/services/reranker.js.map +1 -0
- package/dist/services/triple-extractor.d.ts +35 -0
- package/dist/services/triple-extractor.d.ts.map +1 -0
- package/dist/services/triple-extractor.js +293 -0
- package/dist/services/triple-extractor.js.map +1 -0
- package/dist/services/vector-provider.d.ts +40 -0
- package/dist/services/vector-provider.d.ts.map +1 -0
- package/dist/services/vector-provider.js +225 -0
- package/dist/services/vector-provider.js.map +1 -0
- package/dist/utils/after-chain-executor.d.ts +26 -0
- package/dist/utils/after-chain-executor.d.ts.map +1 -0
- package/dist/utils/after-chain-executor.js +135 -0
- package/dist/utils/after-chain-executor.js.map +1 -0
- package/dist/utils/after-chain.d.ts +94 -0
- package/dist/utils/after-chain.d.ts.map +1 -0
- package/dist/utils/after-chain.js +155 -0
- package/dist/utils/after-chain.js.map +1 -0
- package/dist/utils/db.d.ts +29 -0
- package/dist/utils/db.d.ts.map +1 -0
- package/dist/utils/db.js +201 -0
- package/dist/utils/db.js.map +1 -0
- package/dist/utils/encryption.d.ts +87 -0
- package/dist/utils/encryption.d.ts.map +1 -0
- package/dist/utils/encryption.js +175 -0
- package/dist/utils/encryption.js.map +1 -0
- package/dist/utils/errors.d.ts +35 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +56 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/logger.d.ts +27 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +177 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/priority.d.ts +26 -0
- package/dist/utils/priority.d.ts.map +1 -0
- package/dist/utils/priority.js +43 -0
- package/dist/utils/priority.js.map +1 -0
- package/dist/utils/watchdog.d.ts +57 -0
- package/dist/utils/watchdog.d.ts.map +1 -0
- package/dist/utils/watchdog.js +164 -0
- package/dist/utils/watchdog.js.map +1 -0
- 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":"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"}
|
|
@@ -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"}
|