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,278 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Multi-Agent Sharing Service
|
|
3
|
+
* Enables sharing memories and sessions across agents
|
|
4
|
+
*/
|
|
5
|
+
import { v4 as uuidv4 } from 'uuid';
|
|
6
|
+
import { getDatabase, query, run } from '../utils/db.js';
|
|
7
|
+
import { DatabaseError } from '../utils/errors.js';
|
|
8
|
+
import { getMemory } from '../schema/memory.js';
|
|
9
|
+
export function initMultiAgentSharing() {
|
|
10
|
+
const db = getDatabase();
|
|
11
|
+
try {
|
|
12
|
+
// Shared memories table
|
|
13
|
+
db.run(`
|
|
14
|
+
CREATE TABLE IF NOT EXISTS shared_memories (
|
|
15
|
+
id TEXT PRIMARY KEY,
|
|
16
|
+
memory_id TEXT NOT NULL,
|
|
17
|
+
shared_by_agent_id TEXT NOT NULL,
|
|
18
|
+
shared_to_agent_id TEXT NOT NULL,
|
|
19
|
+
shared_to_project_id TEXT NOT NULL,
|
|
20
|
+
permission TEXT NOT NULL CHECK (permission IN ('read', 'read_write', 'admin')),
|
|
21
|
+
shared_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
22
|
+
expires_at TEXT,
|
|
23
|
+
FOREIGN KEY (memory_id) REFERENCES memories(id)
|
|
24
|
+
)
|
|
25
|
+
`);
|
|
26
|
+
db.run(`CREATE INDEX IF NOT EXISTS idx_shared_memories_to_agent ON shared_memories(shared_to_agent_id)`);
|
|
27
|
+
db.run(`CREATE INDEX IF NOT EXISTS idx_shared_memories_to_project ON shared_memories(shared_to_project_id)`);
|
|
28
|
+
db.run(`CREATE INDEX IF NOT EXISTS idx_shared_memories_memory ON shared_memories(memory_id)`);
|
|
29
|
+
// Share tokens table (for one-time or limited-use shares)
|
|
30
|
+
db.run(`
|
|
31
|
+
CREATE TABLE IF NOT EXISTS share_tokens (
|
|
32
|
+
token TEXT PRIMARY KEY,
|
|
33
|
+
memory_id TEXT NOT NULL,
|
|
34
|
+
shared_by_agent_id TEXT NOT NULL,
|
|
35
|
+
permission TEXT NOT NULL CHECK (permission IN ('read', 'read_write')),
|
|
36
|
+
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
37
|
+
expires_at TEXT,
|
|
38
|
+
use_count INTEGER NOT NULL DEFAULT 0,
|
|
39
|
+
max_uses INTEGER,
|
|
40
|
+
FOREIGN KEY (memory_id) REFERENCES memories(id)
|
|
41
|
+
)
|
|
42
|
+
`);
|
|
43
|
+
db.run(`CREATE INDEX IF NOT EXISTS idx_share_tokens_memory ON share_tokens(memory_id)`);
|
|
44
|
+
}
|
|
45
|
+
catch (error) {
|
|
46
|
+
throw new DatabaseError('Failed to initialize multi-agent sharing', error);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
// ============ Direct Sharing ============
|
|
50
|
+
/**
|
|
51
|
+
* Share a memory with specific agents
|
|
52
|
+
*/
|
|
53
|
+
export function shareMemoryToAgents(memoryId, sharedByAgentId, targetAgentIds, targetProjectId, permission = 'read', expiresAt) {
|
|
54
|
+
const records = [];
|
|
55
|
+
for (const agentId of targetAgentIds) {
|
|
56
|
+
const record = shareMemory(memoryId, sharedByAgentId, agentId, targetProjectId, permission, expiresAt);
|
|
57
|
+
records.push(record);
|
|
58
|
+
}
|
|
59
|
+
return records;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Share a memory to a project (all agents in project)
|
|
63
|
+
*/
|
|
64
|
+
export function shareMemoryToProject(memoryId, sharedByAgentId, targetProjectId, permission = 'read', expiresAt) {
|
|
65
|
+
// Use '*' as the agent ID to indicate project-wide sharing
|
|
66
|
+
return shareMemory(memoryId, sharedByAgentId, '*', targetProjectId, permission, expiresAt);
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Internal share memory function
|
|
70
|
+
*/
|
|
71
|
+
function shareMemory(memoryId, sharedByAgentId, sharedToAgentId, sharedToProjectId, permission, expiresAt) {
|
|
72
|
+
const id = uuidv4();
|
|
73
|
+
const now = new Date().toISOString();
|
|
74
|
+
try {
|
|
75
|
+
run(`INSERT INTO shared_memories (id, memory_id, shared_by_agent_id, shared_to_agent_id, shared_to_project_id, permission, shared_at, expires_at)
|
|
76
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?)`, [
|
|
77
|
+
id,
|
|
78
|
+
memoryId,
|
|
79
|
+
sharedByAgentId,
|
|
80
|
+
sharedToAgentId,
|
|
81
|
+
sharedToProjectId,
|
|
82
|
+
permission,
|
|
83
|
+
now,
|
|
84
|
+
expiresAt?.toISOString() || null
|
|
85
|
+
]);
|
|
86
|
+
return {
|
|
87
|
+
id,
|
|
88
|
+
memoryId,
|
|
89
|
+
sharedByAgentId,
|
|
90
|
+
sharedToAgentId,
|
|
91
|
+
sharedToProjectId,
|
|
92
|
+
permission,
|
|
93
|
+
sharedAt: new Date(now),
|
|
94
|
+
expiresAt: expiresAt || null
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
catch (error) {
|
|
98
|
+
throw new DatabaseError('Failed to share memory', error);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Get shared memories for an agent
|
|
103
|
+
*/
|
|
104
|
+
export function getSharedMemoriesForAgent(agentId, projectId, includeExpired = false) {
|
|
105
|
+
try {
|
|
106
|
+
let sql = `
|
|
107
|
+
SELECT s.*, m.content, m.priority, m.project_tags, m.anchored, m.access_count, m.version, m.updated_by, m.parent_id, m.lineage, m.created_at as memory_created_at, m.updated_at as memory_updated_at, m.expires_at as memory_expires_at, m.deleted
|
|
108
|
+
FROM shared_memories s
|
|
109
|
+
JOIN memories m ON s.memory_id = m.id
|
|
110
|
+
WHERE (s.shared_to_agent_id = ? OR s.shared_to_agent_id = '*')
|
|
111
|
+
AND m.deleted = 0
|
|
112
|
+
`;
|
|
113
|
+
const params = [agentId];
|
|
114
|
+
if (projectId) {
|
|
115
|
+
sql += ' AND s.shared_to_project_id = ?';
|
|
116
|
+
params.push(projectId);
|
|
117
|
+
}
|
|
118
|
+
if (!includeExpired) {
|
|
119
|
+
sql += ' AND (s.expires_at IS NULL OR datetime(s.expires_at) > datetime(?))';
|
|
120
|
+
params.push(new Date().toISOString());
|
|
121
|
+
}
|
|
122
|
+
sql += ' ORDER BY s.shared_at DESC';
|
|
123
|
+
const rows = query(sql, params);
|
|
124
|
+
return rows.map(row => ({
|
|
125
|
+
id: row.id,
|
|
126
|
+
memoryId: row.memory_id,
|
|
127
|
+
sharedByAgentId: row.shared_by_agent_id,
|
|
128
|
+
sharedToAgentId: row.shared_to_agent_id,
|
|
129
|
+
sharedToProjectId: row.shared_to_project_id,
|
|
130
|
+
permission: row.permission,
|
|
131
|
+
sharedAt: new Date(row.shared_at),
|
|
132
|
+
expiresAt: row.expires_at ? new Date(row.expires_at) : null,
|
|
133
|
+
memory: mapMemoryRow(row)
|
|
134
|
+
}));
|
|
135
|
+
}
|
|
136
|
+
catch (error) {
|
|
137
|
+
throw new DatabaseError('Failed to get shared memories', error);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Revoke a shared memory
|
|
142
|
+
*/
|
|
143
|
+
export function revokeSharedMemory(shareId) {
|
|
144
|
+
try {
|
|
145
|
+
run(`DELETE FROM shared_memories WHERE id = ?`, [shareId]);
|
|
146
|
+
}
|
|
147
|
+
catch (error) {
|
|
148
|
+
throw new DatabaseError('Failed to revoke shared memory', error);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Revoke all shares of a memory
|
|
153
|
+
*/
|
|
154
|
+
export function revokeAllSharesForMemory(memoryId) {
|
|
155
|
+
try {
|
|
156
|
+
const result = run(`DELETE FROM shared_memories WHERE memory_id = ?`, [memoryId]);
|
|
157
|
+
return result.changes;
|
|
158
|
+
}
|
|
159
|
+
catch (error) {
|
|
160
|
+
throw new DatabaseError('Failed to revoke shared memories', error);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
// ============ Token-Based Sharing ============
|
|
164
|
+
/**
|
|
165
|
+
* Create a share token for a memory
|
|
166
|
+
*/
|
|
167
|
+
export function createShareToken(memoryId, sharedByAgentId, permission = 'read', options = {}) {
|
|
168
|
+
const token = uuidv4();
|
|
169
|
+
const now = new Date().toISOString();
|
|
170
|
+
try {
|
|
171
|
+
run(`INSERT INTO share_tokens (token, memory_id, shared_by_agent_id, permission, created_at, expires_at, max_uses)
|
|
172
|
+
VALUES (?, ?, ?, ?, ?, ?, ?)`, [
|
|
173
|
+
token,
|
|
174
|
+
memoryId,
|
|
175
|
+
sharedByAgentId,
|
|
176
|
+
permission,
|
|
177
|
+
now,
|
|
178
|
+
options.expiresAt?.toISOString() || null,
|
|
179
|
+
options.maxUses || null
|
|
180
|
+
]);
|
|
181
|
+
return {
|
|
182
|
+
token,
|
|
183
|
+
memoryId,
|
|
184
|
+
sharedByAgentId,
|
|
185
|
+
permission,
|
|
186
|
+
createdAt: new Date(now),
|
|
187
|
+
expiresAt: options.expiresAt || null,
|
|
188
|
+
useCount: 0,
|
|
189
|
+
maxUses: options.maxUses || null
|
|
190
|
+
};
|
|
191
|
+
}
|
|
192
|
+
catch (error) {
|
|
193
|
+
throw new DatabaseError('Failed to create share token', error);
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* Redeem a share token
|
|
198
|
+
*/
|
|
199
|
+
export function redeemShareToken(token) {
|
|
200
|
+
try {
|
|
201
|
+
// Get token
|
|
202
|
+
const tokenRows = query(`SELECT * FROM share_tokens WHERE token = ?`, [token]);
|
|
203
|
+
if (tokenRows.length === 0) {
|
|
204
|
+
return null;
|
|
205
|
+
}
|
|
206
|
+
const tokenRow = tokenRows[0];
|
|
207
|
+
const now = new Date();
|
|
208
|
+
// Check expiration
|
|
209
|
+
if (tokenRow.expires_at && new Date(tokenRow.expires_at) < now) {
|
|
210
|
+
return null;
|
|
211
|
+
}
|
|
212
|
+
// Check max uses
|
|
213
|
+
if (tokenRow.max_uses !== null && tokenRow.use_count >= tokenRow.max_uses) {
|
|
214
|
+
return null;
|
|
215
|
+
}
|
|
216
|
+
// Get memory
|
|
217
|
+
const memory = getMemory(tokenRow.memory_id);
|
|
218
|
+
if (!memory) {
|
|
219
|
+
return null;
|
|
220
|
+
}
|
|
221
|
+
// Increment use count
|
|
222
|
+
run(`UPDATE share_tokens SET use_count = use_count + 1 WHERE token = ?`, [token]);
|
|
223
|
+
return {
|
|
224
|
+
memory,
|
|
225
|
+
permission: tokenRow.permission
|
|
226
|
+
};
|
|
227
|
+
}
|
|
228
|
+
catch (error) {
|
|
229
|
+
throw new DatabaseError('Failed to redeem share token', error);
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* Delete expired tokens
|
|
234
|
+
*/
|
|
235
|
+
export function cleanupExpiredTokens() {
|
|
236
|
+
try {
|
|
237
|
+
const result = run(`DELETE FROM share_tokens WHERE expires_at IS NOT NULL AND datetime(expires_at) < datetime(?)`, [new Date().toISOString()]);
|
|
238
|
+
return result.changes;
|
|
239
|
+
}
|
|
240
|
+
catch (error) {
|
|
241
|
+
throw new DatabaseError('Failed to cleanup expired tokens', error);
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
function mapMemoryRow(row) {
|
|
245
|
+
return {
|
|
246
|
+
id: row.id,
|
|
247
|
+
userId: row.user_id,
|
|
248
|
+
agentId: row.agent_id,
|
|
249
|
+
projectId: row.project_id,
|
|
250
|
+
content: row.content,
|
|
251
|
+
priority: row.priority,
|
|
252
|
+
projectTags: JSON.parse(row.project_tags || '[]'),
|
|
253
|
+
anchored: row.anchored === 1,
|
|
254
|
+
accessCount: row.access_count,
|
|
255
|
+
version: row.version,
|
|
256
|
+
updatedBy: row.updated_by,
|
|
257
|
+
parentId: row.parent_id,
|
|
258
|
+
lineage: JSON.parse(row.lineage || '[]'),
|
|
259
|
+
createdAt: new Date(row.memory_created_at || row.created_at),
|
|
260
|
+
updatedAt: new Date(row.memory_updated_at || row.updated_at),
|
|
261
|
+
expiresAt: row.memory_expires_at ? new Date(row.memory_expires_at) : (row.expires_at ? new Date(row.expires_at) : null),
|
|
262
|
+
deleted: row.deleted === 1
|
|
263
|
+
};
|
|
264
|
+
}
|
|
265
|
+
// ============ Service Wrapper ============
|
|
266
|
+
export function getMultiAgentSharingService() {
|
|
267
|
+
return {
|
|
268
|
+
shareMemoryToAgents,
|
|
269
|
+
shareMemoryToProject,
|
|
270
|
+
getSharedMemoriesForAgent,
|
|
271
|
+
revokeSharedMemory,
|
|
272
|
+
revokeAllSharesForMemory,
|
|
273
|
+
createShareToken,
|
|
274
|
+
redeemShareToken,
|
|
275
|
+
cleanupExpiredTokens
|
|
276
|
+
};
|
|
277
|
+
}
|
|
278
|
+
//# sourceMappingURL=multi-agent-sharing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"multi-agent-sharing.js","sourceRoot":"","sources":["../../src/services/multi-agent-sharing.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Reranker Service
|
|
3
|
+
* Implements two-stage retrieval: recall candidates, then rerank with scoring
|
|
4
|
+
*/
|
|
5
|
+
import { Memory, IsolationContext } from '../models/types.js';
|
|
6
|
+
export interface RerankConfig {
|
|
7
|
+
initialRecallLimit: number;
|
|
8
|
+
finalLimit: number;
|
|
9
|
+
rerankWeight: {
|
|
10
|
+
semantic: number;
|
|
11
|
+
keyword: number;
|
|
12
|
+
recency: number;
|
|
13
|
+
importance: number;
|
|
14
|
+
};
|
|
15
|
+
importanceThreshold: number;
|
|
16
|
+
}
|
|
17
|
+
export interface RerankedResult {
|
|
18
|
+
memory: Memory;
|
|
19
|
+
originalScore: number;
|
|
20
|
+
rerankedScore: number;
|
|
21
|
+
rerankFactors: {
|
|
22
|
+
semanticScore: number;
|
|
23
|
+
keywordScore: number;
|
|
24
|
+
recencyScore: number;
|
|
25
|
+
importanceScore: number;
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
export interface RerankedSearchResult {
|
|
29
|
+
results: RerankedResult[];
|
|
30
|
+
totalCandidates: number;
|
|
31
|
+
searchMode: string;
|
|
32
|
+
}
|
|
33
|
+
declare class RerankerService {
|
|
34
|
+
private config;
|
|
35
|
+
constructor(config?: Partial<RerankConfig>);
|
|
36
|
+
/**
|
|
37
|
+
* Two-stage retrieval with reranking
|
|
38
|
+
*/
|
|
39
|
+
search(query: string, isolation?: IsolationContext, projectTags?: string[], mode?: 'semantic' | 'keyword' | 'hybrid'): Promise<RerankedSearchResult>;
|
|
40
|
+
/**
|
|
41
|
+
* Stage 1: Recall candidates using multiple strategies
|
|
42
|
+
*/
|
|
43
|
+
private recallCandidates;
|
|
44
|
+
/**
|
|
45
|
+
* Stage 2: Rerank candidates using multiple signals
|
|
46
|
+
*/
|
|
47
|
+
private rerank;
|
|
48
|
+
/**
|
|
49
|
+
* Compute individual reranking factors
|
|
50
|
+
*/
|
|
51
|
+
private computeRerankFactors;
|
|
52
|
+
/**
|
|
53
|
+
* Compute semantic similarity score
|
|
54
|
+
*/
|
|
55
|
+
private computeSemanticScore;
|
|
56
|
+
/**
|
|
57
|
+
* Compute keyword match score
|
|
58
|
+
*/
|
|
59
|
+
private computeKeywordScore;
|
|
60
|
+
/**
|
|
61
|
+
* Compute recency score (exponential decay)
|
|
62
|
+
*/
|
|
63
|
+
private computeRecencyScore;
|
|
64
|
+
/**
|
|
65
|
+
* Compute importance score
|
|
66
|
+
*/
|
|
67
|
+
private computeImportanceScore;
|
|
68
|
+
/**
|
|
69
|
+
* Compute final score from factors
|
|
70
|
+
*/
|
|
71
|
+
private computeFinalScore;
|
|
72
|
+
/**
|
|
73
|
+
* Filter results by importance threshold
|
|
74
|
+
*/
|
|
75
|
+
filterByImportance(results: RerankedResult[]): RerankedResult[];
|
|
76
|
+
/**
|
|
77
|
+
* Get configuration
|
|
78
|
+
*/
|
|
79
|
+
getConfig(): RerankConfig;
|
|
80
|
+
/**
|
|
81
|
+
* Update configuration
|
|
82
|
+
*/
|
|
83
|
+
updateConfig(updates: Partial<RerankConfig>): void;
|
|
84
|
+
}
|
|
85
|
+
export declare function getRerankerService(config?: Partial<RerankConfig>): RerankerService;
|
|
86
|
+
export declare function resetRerankerService(): void;
|
|
87
|
+
export {};
|
|
88
|
+
//# sourceMappingURL=reranker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reranker.d.ts","sourceRoot":"","sources":["../../src/services/reranker.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAK9D,MAAM,WAAW,YAAY;IAC3B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE;QACZ,QAAQ,EAAE,MAAM,CAAC;QACjB,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,EAAE,MAAM,CAAC;QAChB,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC;IACF,mBAAmB,EAAE,MAAM,CAAC;CAC7B;AAcD,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE;QACb,aAAa,EAAE,MAAM,CAAC;QACtB,YAAY,EAAE,MAAM,CAAC;QACrB,YAAY,EAAE,MAAM,CAAC;QACrB,eAAe,EAAE,MAAM,CAAC;KACzB,CAAC;CACH;AAED,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,cAAc,EAAE,CAAC;IAC1B,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,cAAM,eAAe;IACnB,OAAO,CAAC,MAAM,CAAe;gBAEjB,MAAM,GAAE,OAAO,CAAC,YAAY,CAAM;IAI9C;;OAEG;IACG,MAAM,CACV,KAAK,EAAE,MAAM,EACb,SAAS,CAAC,EAAE,gBAAgB,EAC5B,WAAW,CAAC,EAAE,MAAM,EAAE,EACtB,IAAI,GAAE,UAAU,GAAG,SAAS,GAAG,QAAmB,GACjD,OAAO,CAAC,oBAAoB,CAAC;IAchC;;OAEG;YACW,gBAAgB;IAkF9B;;OAEG;YACW,MAAM;IA2BpB;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAyB5B;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAgB5B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAe3B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAY3B;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAqB9B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAWzB;;OAEG;IACH,kBAAkB,CAAC,OAAO,EAAE,cAAc,EAAE,GAAG,cAAc,EAAE;IAI/D;;OAEG;IACH,SAAS,IAAI,YAAY;IAIzB;;OAEG;IACH,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG,IAAI;CAGnD;AAMD,wBAAgB,kBAAkB,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG,eAAe,CAKlF;AAED,wBAAgB,oBAAoB,IAAI,IAAI,CAE3C"}
|
|
@@ -0,0 +1,234 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Reranker Service
|
|
3
|
+
* Implements two-stage retrieval: recall candidates, then rerank with scoring
|
|
4
|
+
*/
|
|
5
|
+
import { searchMemoriesVector, searchMemoriesHybrid, searchMemoriesBM25, listMemories } from '../schema/memory.js';
|
|
6
|
+
import { generateFixedEmbedding, generateFixedQueryEmbedding } from './embedding-fixed.js';
|
|
7
|
+
import { isHighPriority } from '../utils/priority.js';
|
|
8
|
+
const DEFAULT_RERANK_CONFIG = {
|
|
9
|
+
initialRecallLimit: 50,
|
|
10
|
+
finalLimit: 10,
|
|
11
|
+
rerankWeight: {
|
|
12
|
+
semantic: 0.4,
|
|
13
|
+
keyword: 0.3,
|
|
14
|
+
recency: 0.2,
|
|
15
|
+
importance: 0.1
|
|
16
|
+
},
|
|
17
|
+
importanceThreshold: 0.5
|
|
18
|
+
};
|
|
19
|
+
class RerankerService {
|
|
20
|
+
config;
|
|
21
|
+
constructor(config = {}) {
|
|
22
|
+
this.config = { ...DEFAULT_RERANK_CONFIG, ...config };
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Two-stage retrieval with reranking
|
|
26
|
+
*/
|
|
27
|
+
async search(query, isolation, projectTags, mode = 'hybrid') {
|
|
28
|
+
// Stage 1: Recall candidates
|
|
29
|
+
const candidates = await this.recallCandidates(query, isolation, projectTags, mode);
|
|
30
|
+
// Stage 2: Rerank
|
|
31
|
+
const reranked = await this.rerank(query, candidates, isolation);
|
|
32
|
+
return {
|
|
33
|
+
results: reranked.slice(0, this.config.finalLimit),
|
|
34
|
+
totalCandidates: candidates.length,
|
|
35
|
+
searchMode: mode
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Stage 1: Recall candidates using multiple strategies
|
|
40
|
+
*/
|
|
41
|
+
async recallCandidates(query, isolation, projectTags, mode = 'hybrid') {
|
|
42
|
+
const candidates = new Map();
|
|
43
|
+
const limit = this.config.initialRecallLimit;
|
|
44
|
+
// Semantic recall
|
|
45
|
+
if (mode === 'semantic' || mode === 'hybrid') {
|
|
46
|
+
try {
|
|
47
|
+
const queryEmbedding = generateFixedQueryEmbedding(query);
|
|
48
|
+
const semanticResults = searchMemoriesVector(queryEmbedding, projectTags, limit, 0.05, // Lower threshold for recall
|
|
49
|
+
isolation);
|
|
50
|
+
for (const result of semanticResults) {
|
|
51
|
+
candidates.set(result.id, { ...result, originalScore: result.similarity });
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
// Fallback to other methods
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
// Keyword recall
|
|
59
|
+
if (mode === 'keyword' || mode === 'hybrid') {
|
|
60
|
+
const keywordResults = searchMemoriesBM25(query, projectTags, limit, isolation);
|
|
61
|
+
for (const memory of keywordResults) {
|
|
62
|
+
if (!candidates.has(memory.id)) {
|
|
63
|
+
candidates.set(memory.id, { ...memory, originalScore: 0.5 });
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
// Hybrid recall
|
|
68
|
+
if (mode === 'hybrid') {
|
|
69
|
+
try {
|
|
70
|
+
const queryEmbedding = generateFixedQueryEmbedding(query);
|
|
71
|
+
const hybridResults = searchMemoriesHybrid(query, queryEmbedding, projectTags, limit, 0.5, 0.5, isolation);
|
|
72
|
+
for (const result of hybridResults) {
|
|
73
|
+
if (!candidates.has(result.id)) {
|
|
74
|
+
candidates.set(result.id, { ...result, originalScore: result.combinedScore });
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
catch {
|
|
79
|
+
// Ignore
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
// Add high-priority anchored memories regardless of search
|
|
83
|
+
const allMemories = listMemories(projectTags, isolation);
|
|
84
|
+
const anchoredHighPriority = allMemories.filter(m => m.anchored || isHighPriority(m.priority));
|
|
85
|
+
for (const memory of anchoredHighPriority) {
|
|
86
|
+
if (!candidates.has(memory.id)) {
|
|
87
|
+
candidates.set(memory.id, { ...memory, originalScore: 0.9 });
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
return Array.from(candidates.values());
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Stage 2: Rerank candidates using multiple signals
|
|
94
|
+
*/
|
|
95
|
+
async rerank(query, candidates, _isolation) {
|
|
96
|
+
const queryLower = query.toLowerCase();
|
|
97
|
+
const queryTerms = queryLower.split(/\s+/).filter(t => t.length > 2);
|
|
98
|
+
const reranked = [];
|
|
99
|
+
for (const candidate of candidates) {
|
|
100
|
+
const factors = this.computeRerankFactors(candidate, queryLower, queryTerms);
|
|
101
|
+
const rerankedScore = this.computeFinalScore(factors);
|
|
102
|
+
reranked.push({
|
|
103
|
+
memory: candidate,
|
|
104
|
+
originalScore: 'originalScore' in candidate ? candidate.originalScore : 0.5,
|
|
105
|
+
rerankedScore,
|
|
106
|
+
rerankFactors: factors
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
// Sort by reranked score
|
|
110
|
+
reranked.sort((a, b) => b.rerankedScore - a.rerankedScore);
|
|
111
|
+
return reranked;
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Compute individual reranking factors
|
|
115
|
+
*/
|
|
116
|
+
computeRerankFactors(memory, queryLower, queryTerms) {
|
|
117
|
+
// Semantic score (based on content similarity)
|
|
118
|
+
const semanticScore = this.computeSemanticScore(memory.content, queryLower);
|
|
119
|
+
// Keyword match score
|
|
120
|
+
const keywordScore = this.computeKeywordScore(memory.content, queryTerms);
|
|
121
|
+
// Recency score (decay over time)
|
|
122
|
+
const recencyScore = this.computeRecencyScore(memory.updatedAt);
|
|
123
|
+
// Importance score (based on priority and access patterns)
|
|
124
|
+
const importanceScore = this.computeImportanceScore(memory);
|
|
125
|
+
return {
|
|
126
|
+
semanticScore,
|
|
127
|
+
keywordScore,
|
|
128
|
+
recencyScore,
|
|
129
|
+
importanceScore
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Compute semantic similarity score
|
|
134
|
+
*/
|
|
135
|
+
computeSemanticScore(content, query) {
|
|
136
|
+
const contentEmbedding = generateFixedEmbedding(content);
|
|
137
|
+
const queryEmbedding = generateFixedQueryEmbedding(query);
|
|
138
|
+
// Compute cosine similarity
|
|
139
|
+
let dot = 0, normA = 0, normB = 0;
|
|
140
|
+
for (let i = 0; i < contentEmbedding.length && i < queryEmbedding.length; i++) {
|
|
141
|
+
dot += contentEmbedding[i] * queryEmbedding[i];
|
|
142
|
+
normA += contentEmbedding[i] * contentEmbedding[i];
|
|
143
|
+
normB += queryEmbedding[i] * queryEmbedding[i];
|
|
144
|
+
}
|
|
145
|
+
const cosine = normA > 0 && normB > 0 ? dot / (Math.sqrt(normA) * Math.sqrt(normB)) : 0;
|
|
146
|
+
return Math.max(0, Math.min(1, cosine));
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Compute keyword match score
|
|
150
|
+
*/
|
|
151
|
+
computeKeywordScore(content, queryTerms) {
|
|
152
|
+
if (queryTerms.length === 0)
|
|
153
|
+
return 0.5;
|
|
154
|
+
const contentLower = content.toLowerCase();
|
|
155
|
+
let matches = 0;
|
|
156
|
+
for (const term of queryTerms) {
|
|
157
|
+
if (contentLower.includes(term)) {
|
|
158
|
+
matches++;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
return matches / queryTerms.length;
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Compute recency score (exponential decay)
|
|
165
|
+
*/
|
|
166
|
+
computeRecencyScore(updatedAt) {
|
|
167
|
+
const now = new Date();
|
|
168
|
+
const ageMs = now.getTime() - updatedAt.getTime();
|
|
169
|
+
const ageDays = ageMs / (1000 * 60 * 60 * 24);
|
|
170
|
+
// Exponential decay with half-life of 7 days
|
|
171
|
+
const halfLifeDays = 7;
|
|
172
|
+
const decay = Math.pow(0.5, ageDays / halfLifeDays);
|
|
173
|
+
return Math.max(0.1, Math.min(1, decay));
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Compute importance score
|
|
177
|
+
*/
|
|
178
|
+
computeImportanceScore(memory) {
|
|
179
|
+
// Base score from priority
|
|
180
|
+
const priorityScore = {
|
|
181
|
+
anchored: 1.0,
|
|
182
|
+
constraint: 0.9,
|
|
183
|
+
decision: 0.7,
|
|
184
|
+
preference: 0.5,
|
|
185
|
+
fact: 0.3
|
|
186
|
+
};
|
|
187
|
+
const baseScore = priorityScore[memory.priority] ?? 0.5;
|
|
188
|
+
// Boost for anchored memories
|
|
189
|
+
const anchoredBoost = memory.anchored ? 0.1 : 0;
|
|
190
|
+
// Boost for frequently accessed memories (logarithmic)
|
|
191
|
+
const accessBoost = Math.min(0.2, Math.log10(memory.accessCount + 1) * 0.1);
|
|
192
|
+
return Math.min(1, baseScore + anchoredBoost + accessBoost);
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Compute final score from factors
|
|
196
|
+
*/
|
|
197
|
+
computeFinalScore(factors) {
|
|
198
|
+
const { semantic, keyword, recency, importance } = this.config.rerankWeight;
|
|
199
|
+
return (factors.semanticScore * semantic +
|
|
200
|
+
factors.keywordScore * keyword +
|
|
201
|
+
factors.recencyScore * recency +
|
|
202
|
+
factors.importanceScore * importance);
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* Filter results by importance threshold
|
|
206
|
+
*/
|
|
207
|
+
filterByImportance(results) {
|
|
208
|
+
return results.filter(r => r.rerankFactors.importanceScore >= this.config.importanceThreshold);
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* Get configuration
|
|
212
|
+
*/
|
|
213
|
+
getConfig() {
|
|
214
|
+
return { ...this.config };
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* Update configuration
|
|
218
|
+
*/
|
|
219
|
+
updateConfig(updates) {
|
|
220
|
+
this.config = { ...this.config, ...updates };
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
// ============ Singleton ============
|
|
224
|
+
let rerankerInstance = null;
|
|
225
|
+
export function getRerankerService(config) {
|
|
226
|
+
if (!rerankerInstance) {
|
|
227
|
+
rerankerInstance = new RerankerService(config);
|
|
228
|
+
}
|
|
229
|
+
return rerankerInstance;
|
|
230
|
+
}
|
|
231
|
+
export function resetRerankerService() {
|
|
232
|
+
rerankerInstance = null;
|
|
233
|
+
}
|
|
234
|
+
//# sourceMappingURL=reranker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reranker.js","sourceRoot":"","sources":["../../src/services/reranker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Triple Extraction Pipeline
|
|
3
|
+
* Extracts knowledge graph triples (entity-relation-entity) from memories and conversations
|
|
4
|
+
*/
|
|
5
|
+
import { getEntity, KGExtractionResult } from '../schema/knowledge-graph.js';
|
|
6
|
+
import type { Memory } from '../models/types.js';
|
|
7
|
+
export interface ExtractionConfig {
|
|
8
|
+
minConfidence?: number;
|
|
9
|
+
entityTypes?: string[];
|
|
10
|
+
includeFacts?: boolean;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Extract knowledge graph triples from a memory
|
|
14
|
+
*/
|
|
15
|
+
export declare function extractTriplesFromMemory(memory: Memory, config?: ExtractionConfig): KGExtractionResult;
|
|
16
|
+
/**
|
|
17
|
+
* Extract triples from multiple memories
|
|
18
|
+
*/
|
|
19
|
+
export declare function extractTriplesFromMemories(memories: Memory[], config?: ExtractionConfig): KGExtractionResult;
|
|
20
|
+
/**
|
|
21
|
+
* Extract triples from conversation turns
|
|
22
|
+
*/
|
|
23
|
+
export interface ConversationTurn {
|
|
24
|
+
role: 'user' | 'assistant';
|
|
25
|
+
content: string;
|
|
26
|
+
}
|
|
27
|
+
export declare function extractTriplesFromConversation(turns: ConversationTurn[], config?: ExtractionConfig): KGExtractionResult;
|
|
28
|
+
/**
|
|
29
|
+
* Get context for a memory from the knowledge graph
|
|
30
|
+
*/
|
|
31
|
+
export declare function getMemoryContext(_memoryId: string): {
|
|
32
|
+
relatedEntities: ReturnType<typeof getEntity>[];
|
|
33
|
+
relatedRelations: Awaited<ReturnType<typeof import('../schema/knowledge-graph.js').getRelationsByEntity>>;
|
|
34
|
+
};
|
|
35
|
+
//# sourceMappingURL=triple-extractor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"triple-extractor.d.ts","sourceRoot":"","sources":["../../src/services/triple-extractor.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,SAAS,EAA4C,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AACvH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAyHjD,MAAM,WAAW,gBAAgB;IAC/B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAOD;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,GAAE,gBAAqB,GAAG,kBAAkB,CAuG1G;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,MAAM,GAAE,gBAAqB,GAAG,kBAAkB,CAqChH;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;IAC3B,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,8BAA8B,CAC5C,KAAK,EAAE,gBAAgB,EAAE,EACzB,MAAM,GAAE,gBAAqB,GAC5B,kBAAkB,CA2BpB;AA0BD;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG;IACnD,eAAe,EAAE,UAAU,CAAC,OAAO,SAAS,CAAC,EAAE,CAAC;IAChD,gBAAgB,EAAE,OAAO,CAAC,UAAU,CAAC,cAAc,8BAA8B,EAAE,oBAAoB,CAAC,CAAC,CAAC;CAC3G,CAOA"}
|