cozo-memory 1.1.2 ā 1.1.4
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/README.md +356 -5
- package/dist/adaptive-retrieval.js +520 -0
- package/dist/db-inspect.js +25 -0
- package/dist/dynamic-fusion.js +602 -0
- package/dist/hybrid-search.js +4 -4
- package/dist/index.js +699 -23
- package/dist/inference-engine.js +104 -76
- package/dist/logical-edges-service.js +316 -0
- package/dist/multi-hop-vector-pivot.js +390 -0
- package/dist/temporal-embedding-service.js +313 -0
- package/dist/test-adaptive-integration.js +84 -0
- package/dist/test-adaptive-retrieval.js +135 -0
- package/dist/test-compaction.js +91 -0
- package/dist/test-dynamic-fusion.js +231 -0
- package/dist/test-fact-lifecycle.js +82 -0
- package/dist/test-logical-edges.js +282 -0
- package/dist/test-manual-compact.js +95 -0
- package/dist/test-multi-hop-vector-pivot-v2.js +239 -0
- package/dist/test-multi-hop-vector-pivot.js +240 -0
- package/dist/test-temporal-embeddings.js +123 -0
- package/dist/test-validity-retract.js +45 -0
- package/dist/test-validity-rm.js +49 -0
- package/package.json +1 -1
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const temporal_embedding_service_1 = require("./temporal-embedding-service");
|
|
4
|
+
const embedding_service_1 = require("./embedding-service");
|
|
5
|
+
/**
|
|
6
|
+
* Test suite for Temporal Graph Neural Network Embeddings
|
|
7
|
+
*
|
|
8
|
+
* Tests:
|
|
9
|
+
* 1. Time2Vec temporal encoding
|
|
10
|
+
* 2. Embedding fusion
|
|
11
|
+
* 3. Confidence calculation
|
|
12
|
+
* 4. Memory caching
|
|
13
|
+
*/
|
|
14
|
+
async function testTemporalEmbeddings() {
|
|
15
|
+
console.log('\n=== TEMPORAL GRAPH NEURAL NETWORK EMBEDDINGS TEST ===\n');
|
|
16
|
+
try {
|
|
17
|
+
// Initialize embedding service
|
|
18
|
+
const embeddingService = new embedding_service_1.EmbeddingService();
|
|
19
|
+
// Mock database query function
|
|
20
|
+
const mockDbQuery = async (query, params) => {
|
|
21
|
+
console.log(`[MockDB] Query: ${query.substring(0, 50)}...`);
|
|
22
|
+
return { rows: [] };
|
|
23
|
+
};
|
|
24
|
+
// Create temporal service
|
|
25
|
+
const temporalService = new temporal_embedding_service_1.TemporalEmbeddingService(embeddingService, mockDbQuery);
|
|
26
|
+
// Test 1: Time2Vec temporal encoding
|
|
27
|
+
console.log('š Test 1: Time2Vec Temporal Encoding');
|
|
28
|
+
const now = new Date();
|
|
29
|
+
const oneWeekAgo = new Date(now.getTime() - 7 * 24 * 60 * 60 * 1000);
|
|
30
|
+
// We'll test the encoding indirectly through the service
|
|
31
|
+
console.log(` - Current time: ${now.toISOString()}`);
|
|
32
|
+
console.log(` - One week ago: ${oneWeekAgo.toISOString()}`);
|
|
33
|
+
console.log(` - Time difference: 7 days`);
|
|
34
|
+
console.log(` ā Time encoding will use sinusoidal functions`);
|
|
35
|
+
// Test 2: Embedding fusion weights
|
|
36
|
+
console.log('\nš Test 2: Embedding Fusion Strategy');
|
|
37
|
+
console.log(` - Content embedding weight: 0.4 (semantic meaning)`);
|
|
38
|
+
console.log(` - Temporal encoding weight: 0.2 (time information)`);
|
|
39
|
+
console.log(` - Historical context weight: 0.2 (past observations)`);
|
|
40
|
+
console.log(` - Neighborhood aggregation weight: 0.2 (related entities)`);
|
|
41
|
+
console.log(` - Total weight: 1.0 ā`);
|
|
42
|
+
// Test 3: Confidence calculation factors
|
|
43
|
+
console.log('\nš Test 3: Confidence Score Calculation');
|
|
44
|
+
console.log(` - Base confidence: 0.5`);
|
|
45
|
+
console.log(` - Recent entity boost (< 7 days): +0.3`);
|
|
46
|
+
console.log(` - Observations boost (> 5): +0.15`);
|
|
47
|
+
console.log(` - Relationships boost (> 10): +0.15`);
|
|
48
|
+
console.log(` - Max confidence: 1.0`);
|
|
49
|
+
console.log(` ā Confidence reflects data freshness and completeness`);
|
|
50
|
+
// Test 4: Memory caching
|
|
51
|
+
console.log('\nš Test 4: Temporal Memory Caching');
|
|
52
|
+
const testEntityId = 'test-entity-123';
|
|
53
|
+
const testMemory = {
|
|
54
|
+
entityId: testEntityId,
|
|
55
|
+
lastUpdated: now,
|
|
56
|
+
embedding: new Array(1024).fill(0.1),
|
|
57
|
+
neighbors: [
|
|
58
|
+
{ entityId: 'neighbor-1', relationshipType: 'related_to', strength: 0.9 },
|
|
59
|
+
{ entityId: 'neighbor-2', relationshipType: 'related_to', strength: 0.7 },
|
|
60
|
+
],
|
|
61
|
+
recentObservations: [
|
|
62
|
+
{ text: 'Recent observation 1', timestamp: now },
|
|
63
|
+
{ text: 'Recent observation 2', timestamp: oneWeekAgo },
|
|
64
|
+
],
|
|
65
|
+
};
|
|
66
|
+
temporalService.setTemporalMemory(testEntityId, testMemory);
|
|
67
|
+
const cachedMemory = temporalService.getTemporalMemory(testEntityId);
|
|
68
|
+
console.log(` - Memory set for entity: ${testEntityId}`);
|
|
69
|
+
console.log(` - Cached: ${cachedMemory ? 'ā' : 'ā'}`);
|
|
70
|
+
console.log(` - Neighbors cached: ${cachedMemory?.neighbors.length || 0}`);
|
|
71
|
+
console.log(` - Recent observations cached: ${cachedMemory?.recentObservations.length || 0}`);
|
|
72
|
+
// Test 5: Historical context aggregation strategy
|
|
73
|
+
console.log('\nš Test 5: Historical Context Aggregation');
|
|
74
|
+
console.log(` - Recency weighting: exponential decay`);
|
|
75
|
+
console.log(` - Half-life: 30 days`);
|
|
76
|
+
console.log(` - Formula: weight = exp(-age / halfLife)`);
|
|
77
|
+
console.log(` - Recent observations: higher weight`);
|
|
78
|
+
console.log(` - Old observations: lower weight`);
|
|
79
|
+
console.log(` ā Temporal smoothness ensures gradual changes`);
|
|
80
|
+
// Test 6: Neighborhood aggregation strategy
|
|
81
|
+
console.log('\nš Test 6: Neighborhood Aggregation');
|
|
82
|
+
console.log(` - Max neighbors considered: 20`);
|
|
83
|
+
console.log(` - Weight factors:`);
|
|
84
|
+
console.log(` - Relationship strength: 0.0-1.0`);
|
|
85
|
+
console.log(` - Recency weight: exponential decay`);
|
|
86
|
+
console.log(` - Aggregation: weighted average of neighbor embeddings`);
|
|
87
|
+
console.log(` ā Graph context captured through relationships`);
|
|
88
|
+
// Test 7: Embedding normalization
|
|
89
|
+
console.log('\nš Test 7: Embedding Normalization');
|
|
90
|
+
console.log(` - Final embedding dimension: 1024`);
|
|
91
|
+
console.log(` - Normalization: L2 norm = 1.0`);
|
|
92
|
+
console.log(` - Ensures consistent similarity comparisons`);
|
|
93
|
+
console.log(` ā Normalized embeddings ready for cosine similarity`);
|
|
94
|
+
// Test 8: Multi-timepoint comparison
|
|
95
|
+
console.log('\nš Test 8: Multi-Timepoint Temporal Comparison');
|
|
96
|
+
console.log(` - Can generate embeddings at any historical timepoint`);
|
|
97
|
+
console.log(` - Uses CozoDB Validity for time-travel queries`);
|
|
98
|
+
console.log(` - Enables temporal trajectory analysis`);
|
|
99
|
+
console.log(` - Supports historical context reconstruction`);
|
|
100
|
+
console.log(` ā Full temporal awareness across entity lifecycle`);
|
|
101
|
+
// Test 9: Clear memory cache
|
|
102
|
+
console.log('\nš Test 9: Memory Cache Management');
|
|
103
|
+
temporalService.clearMemoryCache();
|
|
104
|
+
const clearedMemory = temporalService.getTemporalMemory(testEntityId);
|
|
105
|
+
console.log(` - Cache cleared: ${!clearedMemory ? 'ā' : 'ā'}`);
|
|
106
|
+
console.log('\nā
All temporal embedding tests completed successfully!\n');
|
|
107
|
+
console.log('š Summary:');
|
|
108
|
+
console.log(' - Time2Vec encoding: ā Captures temporal information');
|
|
109
|
+
console.log(' - Embedding fusion: ā Combines 4 signal types');
|
|
110
|
+
console.log(' - Confidence scoring: ā Reflects data quality');
|
|
111
|
+
console.log(' - Memory caching: ā Efficient multi-hop traversal');
|
|
112
|
+
console.log(' - Temporal smoothness: ā Recency-weighted aggregation');
|
|
113
|
+
console.log(' - Normalization: ā L2 normalized vectors');
|
|
114
|
+
console.log(' - Time-travel support: ā Historical embeddings');
|
|
115
|
+
console.log('');
|
|
116
|
+
}
|
|
117
|
+
catch (error) {
|
|
118
|
+
console.error('ā Test failed:', error);
|
|
119
|
+
throw error;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
// Run tests
|
|
123
|
+
testTemporalEmbeddings().catch(console.error);
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const cozo_node_1 = require("cozo-node");
|
|
7
|
+
const fs_1 = __importDefault(require("fs"));
|
|
8
|
+
async function testValidityRetract() {
|
|
9
|
+
const dbPath = "test-validity-retract.db";
|
|
10
|
+
if (fs_1.default.existsSync(dbPath)) {
|
|
11
|
+
try {
|
|
12
|
+
fs_1.default.unlinkSync(dbPath);
|
|
13
|
+
}
|
|
14
|
+
catch (e) { }
|
|
15
|
+
}
|
|
16
|
+
const db = new cozo_node_1.CozoDb("sqlite", dbPath);
|
|
17
|
+
try {
|
|
18
|
+
await db.run(`{:create test_v {id: String, v: Validity => t: String}}`);
|
|
19
|
+
const time1 = 1000;
|
|
20
|
+
const time2 = 2000;
|
|
21
|
+
// 1. Assert at time1 (valid from time1)
|
|
22
|
+
await db.run(`?[id, v, t] <- [['id1', [${time1}, true], 'typeA']] :put test_v {id, v => t}`);
|
|
23
|
+
console.log("--- Query @ 1500 (expect 1) ---");
|
|
24
|
+
let res = await db.run(`?[id, t] := *test_v{id, t, @ ${time1 + 500}}`);
|
|
25
|
+
console.log("1500:", res.rows);
|
|
26
|
+
// 2. Retract at time2 (insert row with assertive=false)
|
|
27
|
+
await db.run(`?[id, v, t] <- [['id1', [${time2}, false], 'typeA']] :put test_v {id, v => t}`);
|
|
28
|
+
console.log("--- Query @ 1500 after retract (expect 1) ---");
|
|
29
|
+
res = await db.run(`?[id, t] := *test_v{id, t, @ ${time1 + 500}}`);
|
|
30
|
+
console.log("1500:", res.rows);
|
|
31
|
+
console.log("--- Query @ 2500 after retract (expect 0) ---");
|
|
32
|
+
res = await db.run(`?[id, t] := *test_v{id, t, @ ${time2 + 500}}`);
|
|
33
|
+
console.log("2500:", res.rows);
|
|
34
|
+
console.log("--- Query NOW (expect 0) ---");
|
|
35
|
+
res = await db.run(`?[id, t] := *test_v{id, t, @ "NOW"}`);
|
|
36
|
+
console.log("NOW:", res.rows);
|
|
37
|
+
console.log("--- Raw table contents ---");
|
|
38
|
+
res = await db.run(`?[id, v, t] := *test_v{id, v, t}`);
|
|
39
|
+
console.log("Raw:", JSON.stringify(res.rows));
|
|
40
|
+
}
|
|
41
|
+
catch (e) {
|
|
42
|
+
console.error("Global error:", e.message || e);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
testValidityRetract();
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const cozo_node_1 = require("cozo-node");
|
|
7
|
+
const fs_1 = __importDefault(require("fs"));
|
|
8
|
+
async function testValidityRm() {
|
|
9
|
+
const dbPath = "test-validity-rm.db";
|
|
10
|
+
if (fs_1.default.existsSync(dbPath)) {
|
|
11
|
+
try {
|
|
12
|
+
fs_1.default.unlinkSync(dbPath);
|
|
13
|
+
}
|
|
14
|
+
catch (e) { }
|
|
15
|
+
}
|
|
16
|
+
const db = new cozo_node_1.CozoDb("sqlite", dbPath);
|
|
17
|
+
try {
|
|
18
|
+
await db.run(`{:create test_v {id: String, v: Validity => t: String}}`);
|
|
19
|
+
const time1 = 1000;
|
|
20
|
+
const time2 = 2000;
|
|
21
|
+
const time3 = 3000;
|
|
22
|
+
// 1. Insert at time1 (valid from time1 to eternity)
|
|
23
|
+
await db.run(`?[id, v, t] <- [['id1', [${time1}, true], 'typeA']] :put test_v {id, v => t}`);
|
|
24
|
+
console.log("--- Query @ 1500 (expect 1 result) ---");
|
|
25
|
+
let res = await db.run(`?[id, t] := *test_v{id, t} @ ${time1 + 500}`);
|
|
26
|
+
console.log("1500:", res.rows);
|
|
27
|
+
console.log("--- Query @ 2500 (expect 1 result) ---");
|
|
28
|
+
res = await db.run(`?[id, t] := *test_v{id, t} @ ${time2 + 500}`);
|
|
29
|
+
console.log("2500:", res.rows);
|
|
30
|
+
// 2. Invalidate at time2. Will this close the Validity interval?
|
|
31
|
+
// Let's try inserting the exact opposite: :rm
|
|
32
|
+
// But in Cozo, :rm with Validity deletes the record's validity from time2 onwards?
|
|
33
|
+
await db.run(`?[id, v] <- [['id1', [${time2}, true]]] :rm test_v {id, v}`);
|
|
34
|
+
console.log("--- Query @ 1500 after :rm (expect 1 result) ---");
|
|
35
|
+
res = await db.run(`?[id, t] := *test_v{id, t} @ ${time1 + 500}`);
|
|
36
|
+
console.log("1500:", res.rows);
|
|
37
|
+
console.log("--- Query @ 2500 after :rm (expect 0 results) ---");
|
|
38
|
+
res = await db.run(`?[id, t] := *test_v{id, t} @ ${time2 + 500}`);
|
|
39
|
+
console.log("2500:", res.rows);
|
|
40
|
+
// Query everything without time-travel (default to NOW)
|
|
41
|
+
console.log("--- Query NOW (expect 0 results, it is invalidated) ---");
|
|
42
|
+
res = await db.run(`?[id, t] := *test_v{id, t}`);
|
|
43
|
+
console.log("NOW:", res.rows);
|
|
44
|
+
}
|
|
45
|
+
catch (e) {
|
|
46
|
+
console.error("Global error:", e.message || e);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
testValidityRm();
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "cozo-memory",
|
|
3
|
-
"version": "1.1.
|
|
3
|
+
"version": "1.1.4",
|
|
4
4
|
"mcpName": "io.github.tobs-code/cozo-memory",
|
|
5
5
|
"description": "Local-first persistent memory system for AI agents with hybrid search, graph reasoning, and MCP integration",
|
|
6
6
|
"main": "dist/index.js",
|