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