aifastdb 2.9.8 → 3.1.3
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/aifastdb.win32-x64-msvc.node +0 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/llm-gateway.d.ts +73 -0
- package/dist/llm-gateway.d.ts.map +1 -1
- package/dist/llm-gateway.js.map +1 -1
- package/dist/mcp-server/index.d.ts +3 -1
- package/dist/mcp-server/index.d.ts.map +1 -1
- package/dist/mcp-server/index.js +146 -1
- package/dist/mcp-server/index.js.map +1 -1
- package/dist/social-graph-v2.d.ts +2 -1
- package/dist/social-graph-v2.d.ts.map +1 -1
- package/dist/social-graph-v2.js +14 -3
- package/dist/social-graph-v2.js.map +1 -1
- package/package.json +4 -1
- package/dist/carpool/carpool-matcher.test.d.ts +0 -9
- package/dist/carpool/carpool-matcher.test.d.ts.map +0 -1
- package/dist/carpool/carpool-matcher.test.js +0 -403
- package/dist/carpool/carpool-matcher.test.js.map +0 -1
- package/dist/carpool/carpool-repo.test.d.ts +0 -9
- package/dist/carpool/carpool-repo.test.d.ts.map +0 -1
- package/dist/carpool/carpool-repo.test.js +0 -452
- package/dist/carpool/carpool-repo.test.js.map +0 -1
- package/dist/carpool/carpool-service.test.d.ts +0 -9
- package/dist/carpool/carpool-service.test.d.ts.map +0 -1
- package/dist/carpool/carpool-service.test.js +0 -455
- package/dist/carpool/carpool-service.test.js.map +0 -1
- package/dist/carpool/vehicle.test.d.ts +0 -8
- package/dist/carpool/vehicle.test.d.ts.map +0 -1
- package/dist/carpool/vehicle.test.js +0 -540
- package/dist/carpool/vehicle.test.js.map +0 -1
- package/dist/social-graph-v2-traversal.test.d.ts +0 -14
- package/dist/social-graph-v2-traversal.test.d.ts.map +0 -1
- package/dist/social-graph-v2-traversal.test.js +0 -202
- package/dist/social-graph-v2-traversal.test.js.map +0 -1
- package/dist/social-graph-v2-uri.test.d.ts +0 -12
- package/dist/social-graph-v2-uri.test.d.ts.map +0 -1
- package/dist/social-graph-v2-uri.test.js +0 -131
- package/dist/social-graph-v2-uri.test.js.map +0 -1
- package/dist/social-graph-v2-vector.test.d.ts +0 -14
- package/dist/social-graph-v2-vector.test.d.ts.map +0 -1
- package/dist/social-graph-v2-vector.test.js +0 -241
- package/dist/social-graph-v2-vector.test.js.map +0 -1
|
@@ -1,202 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
"use strict";
|
|
3
|
-
/**
|
|
4
|
-
* SocialGraphV2 Graph Traversal & Mutations — Integration Test (T107.4)
|
|
5
|
-
*
|
|
6
|
-
* Covers:
|
|
7
|
-
* - outgoingByType / incomingByType (typed relation queries)
|
|
8
|
-
* - extractSubgraph (N-hop sub-graph extraction)
|
|
9
|
-
* - traverse (BFS/DFS/WeightedBFS)
|
|
10
|
-
* - applyMutations (batch graph mutations)
|
|
11
|
-
* - updateRelationWeight / adjustRelationWeight / updateRelationMetadata
|
|
12
|
-
* - dynamicRecordAccess / dynamicDemote / dynamicPromote / dynamicScan
|
|
13
|
-
*/
|
|
14
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
15
|
-
if (k2 === undefined) k2 = k;
|
|
16
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
17
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
18
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
19
|
-
}
|
|
20
|
-
Object.defineProperty(o, k2, desc);
|
|
21
|
-
}) : (function(o, m, k, k2) {
|
|
22
|
-
if (k2 === undefined) k2 = k;
|
|
23
|
-
o[k2] = m[k];
|
|
24
|
-
}));
|
|
25
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
26
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
27
|
-
}) : function(o, v) {
|
|
28
|
-
o["default"] = v;
|
|
29
|
-
});
|
|
30
|
-
var __importStar = (this && this.__importStar) || (function () {
|
|
31
|
-
var ownKeys = function(o) {
|
|
32
|
-
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
33
|
-
var ar = [];
|
|
34
|
-
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
35
|
-
return ar;
|
|
36
|
-
};
|
|
37
|
-
return ownKeys(o);
|
|
38
|
-
};
|
|
39
|
-
return function (mod) {
|
|
40
|
-
if (mod && mod.__esModule) return mod;
|
|
41
|
-
var result = {};
|
|
42
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
43
|
-
__setModuleDefault(result, mod);
|
|
44
|
-
return result;
|
|
45
|
-
};
|
|
46
|
-
})();
|
|
47
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
48
|
-
const os = __importStar(require("os"));
|
|
49
|
-
const path = __importStar(require("path"));
|
|
50
|
-
const fs = __importStar(require("fs"));
|
|
51
|
-
const social_graph_v2_1 = require("./social-graph-v2");
|
|
52
|
-
// ============================================================================
|
|
53
|
-
// Test Utilities
|
|
54
|
-
// ============================================================================
|
|
55
|
-
let passed = 0;
|
|
56
|
-
let failed = 0;
|
|
57
|
-
const failures = [];
|
|
58
|
-
function assert(condition, message) {
|
|
59
|
-
if (condition) {
|
|
60
|
-
passed++;
|
|
61
|
-
console.log(` ✅ ${message}`);
|
|
62
|
-
}
|
|
63
|
-
else {
|
|
64
|
-
failed++;
|
|
65
|
-
failures.push(message);
|
|
66
|
-
console.log(` ❌ ${message}`);
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
function section(name) {
|
|
70
|
-
console.log(`\n── ${name} ──`);
|
|
71
|
-
}
|
|
72
|
-
function createTempDir() {
|
|
73
|
-
const dir = path.join(os.tmpdir(), `sgv2-traversal-test-${Date.now()}-${Math.random().toString(36).slice(2)}`);
|
|
74
|
-
fs.mkdirSync(dir, { recursive: true });
|
|
75
|
-
return dir;
|
|
76
|
-
}
|
|
77
|
-
function cleanup(dir) {
|
|
78
|
-
try {
|
|
79
|
-
fs.rmSync(dir, { recursive: true, force: true });
|
|
80
|
-
}
|
|
81
|
-
catch { /* ignore */ }
|
|
82
|
-
}
|
|
83
|
-
// ============================================================================
|
|
84
|
-
// Main Test
|
|
85
|
-
// ============================================================================
|
|
86
|
-
async function main() {
|
|
87
|
-
console.log('=== SocialGraphV2 Traversal & Mutations Tests (Phase-107) ===\n');
|
|
88
|
-
const dir = createTempDir();
|
|
89
|
-
let sg;
|
|
90
|
-
try {
|
|
91
|
-
sg = social_graph_v2_1.SocialGraphV2.open(dir);
|
|
92
|
-
// Build a small test graph:
|
|
93
|
-
// Alice --FRIEND--> Bob --FRIEND--> Charlie
|
|
94
|
-
// Alice --COLLEAGUE--> Dave
|
|
95
|
-
// Bob --COLLEAGUE--> Eve
|
|
96
|
-
sg.addPerson({ id: 'alice', name: 'Alice', properties: { gender: 'F' } });
|
|
97
|
-
sg.addPerson({ id: 'bob', name: 'Bob', properties: { gender: 'M' } });
|
|
98
|
-
sg.addPerson({ id: 'charlie', name: 'Charlie', properties: { gender: 'M' } });
|
|
99
|
-
sg.addPerson({ id: 'dave', name: 'Dave', properties: { gender: 'M' } });
|
|
100
|
-
sg.addPerson({ id: 'eve', name: 'Eve', properties: { gender: 'F' } });
|
|
101
|
-
sg.addFriend('alice', 'bob', { relationType: 'friend', weight: 0.9 });
|
|
102
|
-
sg.addFriend('bob', 'charlie', { relationType: 'friend', weight: 0.8 });
|
|
103
|
-
sg.addFriend('alice', 'dave', { relationType: 'colleague', weight: 0.5 });
|
|
104
|
-
sg.addFriend('bob', 'eve', { relationType: 'colleague', weight: 0.3 });
|
|
105
|
-
// ── Typed Relation Queries ──
|
|
106
|
-
section('outgoingByType / incomingByType');
|
|
107
|
-
const friendsFromAlice = sg.outgoingByType('alice', 'FRIEND');
|
|
108
|
-
assert(friendsFromAlice.length >= 1, `outgoingByType FRIEND from Alice found ${friendsFromAlice.length} relation(s)`);
|
|
109
|
-
const colleaguesFromAlice = sg.outgoingByType('alice', 'COLLEAGUE');
|
|
110
|
-
assert(colleaguesFromAlice.length >= 1, `outgoingByType COLLEAGUE from Alice found ${colleaguesFromAlice.length} relation(s)`);
|
|
111
|
-
const incomingToBob = sg.incomingByType('bob', 'FRIEND');
|
|
112
|
-
assert(incomingToBob.length >= 1, `incomingByType FRIEND to Bob found ${incomingToBob.length} relation(s)`);
|
|
113
|
-
// ── Sub-graph Extraction ──
|
|
114
|
-
section('extractSubgraph');
|
|
115
|
-
const subgraph1 = sg.extractSubgraph('alice', { max_hops: 1 });
|
|
116
|
-
assert(subgraph1 != null, 'extractSubgraph returned a result');
|
|
117
|
-
assert(subgraph1.root_id === 'alice', 'subgraph root_id is alice');
|
|
118
|
-
assert(subgraph1.entity_count >= 3, `subgraph 1-hop has ${subgraph1.entity_count} entities (≥3 expected: alice+bob+dave)`);
|
|
119
|
-
const subgraph2 = sg.extractSubgraph('alice', { max_hops: 2 });
|
|
120
|
-
assert(subgraph2.entity_count >= 4, `subgraph 2-hop has ${subgraph2.entity_count} entities (≥4 expected)`);
|
|
121
|
-
const subgraphFiltered = sg.extractSubgraph('alice', { max_hops: 2, relation_type_filter: ['FRIEND'] });
|
|
122
|
-
// With FRIEND filter: alice → bob → charlie, should not include dave/eve (COLLEAGUE)
|
|
123
|
-
assert(subgraphFiltered.entity_count >= 2, `subgraph FRIEND-only has ${subgraphFiltered.entity_count} entities`);
|
|
124
|
-
// ── Graph Traversal ──
|
|
125
|
-
section('traverse');
|
|
126
|
-
const bfsResult = sg.traverse('alice', { max_hops: 3, strategy: 'BFS' });
|
|
127
|
-
assert(bfsResult != null, 'BFS traverse returned a result');
|
|
128
|
-
assert(bfsResult.visited_order.length >= 3, `BFS visited ${bfsResult.visited_order.length} entities`);
|
|
129
|
-
assert(bfsResult.visited_order[0] === 'alice', 'BFS starts with alice');
|
|
130
|
-
const dfsResult = sg.traverse('alice', { max_hops: 3, strategy: 'DFS' });
|
|
131
|
-
assert(dfsResult != null, 'DFS traverse returned a result');
|
|
132
|
-
assert(dfsResult.visited_order.length >= 3, `DFS visited ${dfsResult.visited_order.length} entities`);
|
|
133
|
-
const weightedResult = sg.traverse('alice', { max_hops: 2, strategy: 'WeightedBFS' });
|
|
134
|
-
assert(weightedResult != null, 'WeightedBFS traverse returned a result');
|
|
135
|
-
assert(weightedResult.visited_order.length >= 2, `WeightedBFS visited ${weightedResult.visited_order.length} entities`);
|
|
136
|
-
// ── Relation Weight Updates ──
|
|
137
|
-
section('updateRelationWeight / adjustRelationWeight / updateRelationMetadata');
|
|
138
|
-
// Find a relation to update
|
|
139
|
-
const aliceRels = sg.getEntityRelations('alice');
|
|
140
|
-
const friendRel = aliceRels.find((r) => r.relation_type === 'FRIEND' || r.relationType === 'FRIEND');
|
|
141
|
-
if (friendRel) {
|
|
142
|
-
const relId = friendRel.id;
|
|
143
|
-
await sg.updateRelationWeight(relId, 'alice', 0.95);
|
|
144
|
-
assert(true, `updateRelationWeight succeeded for relation ${relId}`);
|
|
145
|
-
await sg.adjustRelationWeight(relId, 'alice', 0.02);
|
|
146
|
-
assert(true, `adjustRelationWeight succeeded for relation ${relId}`);
|
|
147
|
-
await sg.updateRelationMetadata(relId, 'alice', 'note', 'best-friend');
|
|
148
|
-
assert(true, `updateRelationMetadata succeeded for relation ${relId}`);
|
|
149
|
-
}
|
|
150
|
-
else {
|
|
151
|
-
assert(false, 'Could not find a FRIEND relation to test updates on');
|
|
152
|
-
}
|
|
153
|
-
// ── Batch Mutations ──
|
|
154
|
-
section('applyMutations');
|
|
155
|
-
const mutCount = await sg.applyMutations([
|
|
156
|
-
{
|
|
157
|
-
type: 'PutEntity',
|
|
158
|
-
entity: { id: 'frank', name: 'Frank', entity_type: 'person', properties: {}, memory_refs: [], created_at: Date.now(), updated_at: Date.now() },
|
|
159
|
-
},
|
|
160
|
-
{
|
|
161
|
-
type: 'PutRelation',
|
|
162
|
-
relation: { id: 'rel-frank-alice', source: 'frank', target: 'alice', relation_type: 'FRIEND', weight: 0.7, bidirectional: false, metadata: {}, created_at: Date.now() },
|
|
163
|
-
},
|
|
164
|
-
]);
|
|
165
|
-
assert(mutCount === 2, `applyMutations applied ${mutCount} mutations (expected 2)`);
|
|
166
|
-
// Verify the entity was created
|
|
167
|
-
const frank = sg.getEntity('frank');
|
|
168
|
-
assert(frank != null, 'Frank entity exists after PutEntity mutation');
|
|
169
|
-
// ── Dynamic Node Management ──
|
|
170
|
-
section('dynamicRecordAccess / dynamicDemote / dynamicPromote');
|
|
171
|
-
const stats = sg.dynamicRecordAccess('alice');
|
|
172
|
-
assert(stats != null, 'dynamicRecordAccess returned stats for alice');
|
|
173
|
-
if (stats) {
|
|
174
|
-
assert(stats.hit_count >= 1, `alice hit_count=${stats.hit_count} after recordAccess`);
|
|
175
|
-
}
|
|
176
|
-
const demoted = sg.dynamicDemote('charlie');
|
|
177
|
-
assert(typeof demoted === 'boolean', `dynamicDemote returned boolean: ${demoted}`);
|
|
178
|
-
const isShadow = sg.isShadowEntity('charlie');
|
|
179
|
-
assert(typeof isShadow === 'boolean', `isShadowEntity returned boolean: ${isShadow}`);
|
|
180
|
-
if (isShadow) {
|
|
181
|
-
const promoted = sg.dynamicPromote('charlie');
|
|
182
|
-
assert(typeof promoted === 'boolean', `dynamicPromote returned boolean: ${promoted}`);
|
|
183
|
-
}
|
|
184
|
-
// ── Summary ──
|
|
185
|
-
console.log(`\n${'═'.repeat(50)}`);
|
|
186
|
-
console.log(`Total: ${passed + failed} | ✅ Passed: ${passed} | ❌ Failed: ${failed}`);
|
|
187
|
-
if (failures.length > 0) {
|
|
188
|
-
console.log('\nFailures:');
|
|
189
|
-
failures.forEach((f) => console.log(` - ${f}`));
|
|
190
|
-
}
|
|
191
|
-
console.log(`${'═'.repeat(50)}`);
|
|
192
|
-
}
|
|
193
|
-
finally {
|
|
194
|
-
cleanup(dir);
|
|
195
|
-
}
|
|
196
|
-
process.exit(failed > 0 ? 1 : 0);
|
|
197
|
-
}
|
|
198
|
-
main().catch((err) => {
|
|
199
|
-
console.error('Fatal error:', err);
|
|
200
|
-
process.exit(2);
|
|
201
|
-
});
|
|
202
|
-
//# sourceMappingURL=social-graph-v2-traversal.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"social-graph-v2-traversal.test.js","sourceRoot":"","sources":["../ts/social-graph-v2-traversal.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
/**
|
|
3
|
-
* SocialGraphV2 URI / Path Indexing — Integration Test (T132.5)
|
|
4
|
-
*
|
|
5
|
-
* Covers:
|
|
6
|
-
* - anchorUpsert() auto URI/path generation
|
|
7
|
-
* - anchorFindByUri() direct URI lookup
|
|
8
|
-
* - anchorListByPath() directory-style browsing
|
|
9
|
-
* - anchorBackfillUriPath() idempotent migration API
|
|
10
|
-
*/
|
|
11
|
-
export {};
|
|
12
|
-
//# sourceMappingURL=social-graph-v2-uri.test.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"social-graph-v2-uri.test.d.ts","sourceRoot":"","sources":["../ts/social-graph-v2-uri.test.ts"],"names":[],"mappings":";AACA;;;;;;;;GAQG"}
|
|
@@ -1,131 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
"use strict";
|
|
3
|
-
/**
|
|
4
|
-
* SocialGraphV2 URI / Path Indexing — Integration Test (T132.5)
|
|
5
|
-
*
|
|
6
|
-
* Covers:
|
|
7
|
-
* - anchorUpsert() auto URI/path generation
|
|
8
|
-
* - anchorFindByUri() direct URI lookup
|
|
9
|
-
* - anchorListByPath() directory-style browsing
|
|
10
|
-
* - anchorBackfillUriPath() idempotent migration API
|
|
11
|
-
*/
|
|
12
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
13
|
-
if (k2 === undefined) k2 = k;
|
|
14
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
15
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
16
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
17
|
-
}
|
|
18
|
-
Object.defineProperty(o, k2, desc);
|
|
19
|
-
}) : (function(o, m, k, k2) {
|
|
20
|
-
if (k2 === undefined) k2 = k;
|
|
21
|
-
o[k2] = m[k];
|
|
22
|
-
}));
|
|
23
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
24
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
25
|
-
}) : function(o, v) {
|
|
26
|
-
o["default"] = v;
|
|
27
|
-
});
|
|
28
|
-
var __importStar = (this && this.__importStar) || (function () {
|
|
29
|
-
var ownKeys = function(o) {
|
|
30
|
-
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
31
|
-
var ar = [];
|
|
32
|
-
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
33
|
-
return ar;
|
|
34
|
-
};
|
|
35
|
-
return ownKeys(o);
|
|
36
|
-
};
|
|
37
|
-
return function (mod) {
|
|
38
|
-
if (mod && mod.__esModule) return mod;
|
|
39
|
-
var result = {};
|
|
40
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
41
|
-
__setModuleDefault(result, mod);
|
|
42
|
-
return result;
|
|
43
|
-
};
|
|
44
|
-
})();
|
|
45
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
46
|
-
const os = __importStar(require("os"));
|
|
47
|
-
const path = __importStar(require("path"));
|
|
48
|
-
const fs = __importStar(require("fs"));
|
|
49
|
-
const social_graph_v2_1 = require("./social-graph-v2");
|
|
50
|
-
let passed = 0;
|
|
51
|
-
let failed = 0;
|
|
52
|
-
const failures = [];
|
|
53
|
-
function assert(condition, message) {
|
|
54
|
-
if (condition) {
|
|
55
|
-
passed++;
|
|
56
|
-
console.log(` OK ${message}`);
|
|
57
|
-
}
|
|
58
|
-
else {
|
|
59
|
-
failed++;
|
|
60
|
-
failures.push(message);
|
|
61
|
-
console.log(` FAIL ${message}`);
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
function section(name) {
|
|
65
|
-
console.log(`\n-- ${name} --`);
|
|
66
|
-
}
|
|
67
|
-
function createTempDir() {
|
|
68
|
-
const dir = path.join(os.tmpdir(), `sgv2-uri-test-${Date.now()}-${Math.random().toString(36).slice(2)}`);
|
|
69
|
-
fs.mkdirSync(dir, { recursive: true });
|
|
70
|
-
return dir;
|
|
71
|
-
}
|
|
72
|
-
function cleanup(dir) {
|
|
73
|
-
try {
|
|
74
|
-
fs.rmSync(dir, { recursive: true, force: true });
|
|
75
|
-
}
|
|
76
|
-
catch {
|
|
77
|
-
// ignore
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
async function main() {
|
|
81
|
-
console.log('=== SocialGraphV2 URI / Path Integration Test (Phase-132) ===');
|
|
82
|
-
const dir = createTempDir();
|
|
83
|
-
let sg = null;
|
|
84
|
-
try {
|
|
85
|
-
sg = social_graph_v2_1.SocialGraphV2.open(dir);
|
|
86
|
-
section('anchorUpsert auto URI/path');
|
|
87
|
-
const rag = sg.anchorUpsert('RagChat', 'module', 'RAG chat module');
|
|
88
|
-
const planner = sg.anchorUpsert('Query Planner', 'module', 'planner module');
|
|
89
|
-
const concept = sg.anchorUpsert('Score Propagation', 'concept', 'ranking strategy');
|
|
90
|
-
assert(!!rag.uri && rag.uri.startsWith('aidb://memory/anchors/module/'), 'rag.uri generated');
|
|
91
|
-
assert(rag.path === 'anchors/module/ragchat', 'rag.path normalized to anchors/module/ragchat');
|
|
92
|
-
assert(planner.path === 'anchors/module/query-planner', 'planner.path slug normalized');
|
|
93
|
-
assert(concept.path === 'anchors/concept/score-propagation', 'concept.path slug normalized');
|
|
94
|
-
section('anchorFindByUri direct lookup');
|
|
95
|
-
const foundByUri = rag.uri ? sg.anchorFindByUri(rag.uri) : null;
|
|
96
|
-
assert(foundByUri !== null, 'anchorFindByUri returns anchor');
|
|
97
|
-
assert(foundByUri?.id === rag.id, 'anchorFindByUri returns expected anchor id');
|
|
98
|
-
section('anchorListByPath directory browsing');
|
|
99
|
-
const moduleAnchors = sg.anchorListByPath('anchors/module');
|
|
100
|
-
assert(moduleAnchors.length >= 2, 'path prefix anchors/module returns module anchors');
|
|
101
|
-
assert(moduleAnchors.some((a) => a.id === rag.id) &&
|
|
102
|
-
moduleAnchors.some((a) => a.id === planner.id), 'module path contains rag and planner anchors');
|
|
103
|
-
assert(moduleAnchors.every((a) => (a.path ?? '').startsWith('anchors/module/')), 'module path result items keep module prefix');
|
|
104
|
-
const moduleAnchorsByUri = sg.anchorListByPath('aidb://memory/anchors/module');
|
|
105
|
-
assert(moduleAnchorsByUri.length >= 2, 'URI prefix works for directory listing');
|
|
106
|
-
section('anchorBackfillUriPath idempotent migration API');
|
|
107
|
-
const first = sg.anchorBackfillUriPath();
|
|
108
|
-
assert(first.total_anchors >= 3, 'backfill report total_anchors is valid');
|
|
109
|
-
assert(first.updated_anchors === 0, 'fresh data should not need backfill updates');
|
|
110
|
-
const second = sg.anchorBackfillUriPath();
|
|
111
|
-
assert(second.updated_anchors === 0, 'second backfill remains zero updates (idempotent)');
|
|
112
|
-
assert(second.unchanged_anchors >= 3, 'second backfill unchanged_anchors is valid');
|
|
113
|
-
console.log(`\nTotal: ${passed + failed} | Passed: ${passed} | Failed: ${failed}`);
|
|
114
|
-
if (failures.length > 0) {
|
|
115
|
-
console.log('Failures:');
|
|
116
|
-
for (const f of failures)
|
|
117
|
-
console.log(` - ${f}`);
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
finally {
|
|
121
|
-
if (sg)
|
|
122
|
-
sg.shutdown();
|
|
123
|
-
cleanup(dir);
|
|
124
|
-
}
|
|
125
|
-
process.exit(failed > 0 ? 1 : 0);
|
|
126
|
-
}
|
|
127
|
-
main().catch((err) => {
|
|
128
|
-
console.error('Fatal error:', err);
|
|
129
|
-
process.exit(2);
|
|
130
|
-
});
|
|
131
|
-
//# sourceMappingURL=social-graph-v2-uri.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"social-graph-v2-uri.test.js","sourceRoot":"","sources":["../ts/social-graph-v2-uri.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
/**
|
|
3
|
-
* SocialGraphV2 Vector Search — Integration Test (T32.4)
|
|
4
|
-
*
|
|
5
|
-
* Covers:
|
|
6
|
-
* - Vector search configuration via constructor
|
|
7
|
-
* - isVectorSearchEnabled / vectorCount
|
|
8
|
-
* - indexEntity / removeEntityVector
|
|
9
|
-
* - searchEntitiesByVector (k-NN)
|
|
10
|
-
* - hybridSearch (vector + text fusion)
|
|
11
|
-
* - Entity type filtering
|
|
12
|
-
*/
|
|
13
|
-
export {};
|
|
14
|
-
//# sourceMappingURL=social-graph-v2-vector.test.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"social-graph-v2-vector.test.d.ts","sourceRoot":"","sources":["../ts/social-graph-v2-vector.test.ts"],"names":[],"mappings":";AACA;;;;;;;;;;GAUG"}
|
|
@@ -1,241 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
"use strict";
|
|
3
|
-
/**
|
|
4
|
-
* SocialGraphV2 Vector Search — Integration Test (T32.4)
|
|
5
|
-
*
|
|
6
|
-
* Covers:
|
|
7
|
-
* - Vector search configuration via constructor
|
|
8
|
-
* - isVectorSearchEnabled / vectorCount
|
|
9
|
-
* - indexEntity / removeEntityVector
|
|
10
|
-
* - searchEntitiesByVector (k-NN)
|
|
11
|
-
* - hybridSearch (vector + text fusion)
|
|
12
|
-
* - Entity type filtering
|
|
13
|
-
*/
|
|
14
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
15
|
-
if (k2 === undefined) k2 = k;
|
|
16
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
17
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
18
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
19
|
-
}
|
|
20
|
-
Object.defineProperty(o, k2, desc);
|
|
21
|
-
}) : (function(o, m, k, k2) {
|
|
22
|
-
if (k2 === undefined) k2 = k;
|
|
23
|
-
o[k2] = m[k];
|
|
24
|
-
}));
|
|
25
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
26
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
27
|
-
}) : function(o, v) {
|
|
28
|
-
o["default"] = v;
|
|
29
|
-
});
|
|
30
|
-
var __importStar = (this && this.__importStar) || (function () {
|
|
31
|
-
var ownKeys = function(o) {
|
|
32
|
-
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
33
|
-
var ar = [];
|
|
34
|
-
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
35
|
-
return ar;
|
|
36
|
-
};
|
|
37
|
-
return ownKeys(o);
|
|
38
|
-
};
|
|
39
|
-
return function (mod) {
|
|
40
|
-
if (mod && mod.__esModule) return mod;
|
|
41
|
-
var result = {};
|
|
42
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
43
|
-
__setModuleDefault(result, mod);
|
|
44
|
-
return result;
|
|
45
|
-
};
|
|
46
|
-
})();
|
|
47
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
48
|
-
const os = __importStar(require("os"));
|
|
49
|
-
const path = __importStar(require("path"));
|
|
50
|
-
const fs = __importStar(require("fs"));
|
|
51
|
-
const social_graph_v2_1 = require("./social-graph-v2");
|
|
52
|
-
// ============================================================================
|
|
53
|
-
// Test Utilities
|
|
54
|
-
// ============================================================================
|
|
55
|
-
let passed = 0;
|
|
56
|
-
let failed = 0;
|
|
57
|
-
const failures = [];
|
|
58
|
-
function assert(condition, message) {
|
|
59
|
-
if (condition) {
|
|
60
|
-
passed++;
|
|
61
|
-
console.log(` ✅ ${message}`);
|
|
62
|
-
}
|
|
63
|
-
else {
|
|
64
|
-
failed++;
|
|
65
|
-
failures.push(message);
|
|
66
|
-
console.log(` ❌ ${message}`);
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
function assertThrows(fn, message) {
|
|
70
|
-
try {
|
|
71
|
-
fn();
|
|
72
|
-
failed++;
|
|
73
|
-
failures.push(`${message} (no error thrown)`);
|
|
74
|
-
console.log(` ❌ ${message} (no error thrown)`);
|
|
75
|
-
}
|
|
76
|
-
catch {
|
|
77
|
-
passed++;
|
|
78
|
-
console.log(` ✅ ${message}`);
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
function section(name) {
|
|
82
|
-
console.log(`\n━━━ ${name} ━━━`);
|
|
83
|
-
}
|
|
84
|
-
/** Create a simple embedding vector of given dimension filled with a base value */
|
|
85
|
-
function makeEmbedding(dim, base) {
|
|
86
|
-
const vec = [];
|
|
87
|
-
for (let i = 0; i < dim; i++) {
|
|
88
|
-
vec.push(base + i * 0.001);
|
|
89
|
-
}
|
|
90
|
-
return vec;
|
|
91
|
-
}
|
|
92
|
-
// ============================================================================
|
|
93
|
-
// Main Test
|
|
94
|
-
// ============================================================================
|
|
95
|
-
async function main() {
|
|
96
|
-
const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'sg-vector-test-'));
|
|
97
|
-
console.log(`Test directory: ${tmpDir}`);
|
|
98
|
-
try {
|
|
99
|
-
// ================================================================
|
|
100
|
-
// 1. Vector search disabled (default)
|
|
101
|
-
// ================================================================
|
|
102
|
-
section('1. Vector search disabled by default');
|
|
103
|
-
{
|
|
104
|
-
const sg = social_graph_v2_1.SocialGraphV2.open(path.join(tmpDir, 'no-vector'));
|
|
105
|
-
assert(sg.isVectorSearchEnabled() === false, 'isVectorSearchEnabled() should be false');
|
|
106
|
-
assert(sg.vectorCount() === 0, 'vectorCount() should be 0');
|
|
107
|
-
sg.shutdown();
|
|
108
|
-
}
|
|
109
|
-
// ================================================================
|
|
110
|
-
// 2. Vector search enabled via config
|
|
111
|
-
// ================================================================
|
|
112
|
-
section('2. Enable vector search via config');
|
|
113
|
-
const DIM = 4;
|
|
114
|
-
const sg = new social_graph_v2_1.SocialGraphV2({
|
|
115
|
-
path: path.join(tmpDir, 'with-vector'),
|
|
116
|
-
walEnabled: true,
|
|
117
|
-
vectorSearch: { dimension: DIM },
|
|
118
|
-
});
|
|
119
|
-
assert(sg.isVectorSearchEnabled() === true, 'isVectorSearchEnabled() should be true');
|
|
120
|
-
assert(sg.vectorCount() === 0, 'vectorCount() should be 0 initially');
|
|
121
|
-
// ================================================================
|
|
122
|
-
// 3. Add entities and index them
|
|
123
|
-
// ================================================================
|
|
124
|
-
section('3. Index entities with vectors');
|
|
125
|
-
const alice = sg.addPerson({ name: 'Alice' });
|
|
126
|
-
const bob = sg.addPerson({ name: 'Bob' });
|
|
127
|
-
const charlie = sg.addPerson({ name: 'Charlie' });
|
|
128
|
-
const embAlice = makeEmbedding(DIM, 0.1); // close to 0.1
|
|
129
|
-
const embBob = makeEmbedding(DIM, 0.5); // close to 0.5
|
|
130
|
-
const embCharlie = makeEmbedding(DIM, 0.9); // close to 0.9
|
|
131
|
-
sg.indexEntity(alice.id, embAlice);
|
|
132
|
-
assert(sg.vectorCount() === 1, 'vectorCount() should be 1 after indexing Alice');
|
|
133
|
-
sg.indexEntity(bob.id, embBob);
|
|
134
|
-
sg.indexEntity(charlie.id, embCharlie);
|
|
135
|
-
assert(sg.vectorCount() === 3, 'vectorCount() should be 3 after indexing all');
|
|
136
|
-
// ================================================================
|
|
137
|
-
// 4. indexEntity on non-existent entity should throw
|
|
138
|
-
// ================================================================
|
|
139
|
-
section('4. indexEntity error cases');
|
|
140
|
-
assertThrows(() => sg.indexEntity('non-existent-id', makeEmbedding(DIM, 0.0)), 'indexEntity on non-existent entity should throw');
|
|
141
|
-
// ================================================================
|
|
142
|
-
// 5. searchEntitiesByVector — basic k-NN
|
|
143
|
-
// ================================================================
|
|
144
|
-
section('5. searchEntitiesByVector (k-NN)');
|
|
145
|
-
// Query close to Alice's embedding
|
|
146
|
-
const queryNearAlice = makeEmbedding(DIM, 0.11);
|
|
147
|
-
const results1 = sg.searchEntitiesByVector(queryNearAlice, 3);
|
|
148
|
-
assert(results1.length === 3, 'Should return 3 results');
|
|
149
|
-
assert(results1[0].entityId === alice.id, 'Closest to Alice query should be Alice');
|
|
150
|
-
assert(typeof results1[0].score === 'number', 'Result should have numeric score');
|
|
151
|
-
assert(results1[0].entity !== null, 'Result should have entity data');
|
|
152
|
-
console.log(` Top result: ${results1[0].entity.name} (score=${results1[0].score.toFixed(4)})`);
|
|
153
|
-
// Query close to Charlie's embedding
|
|
154
|
-
const queryNearCharlie = makeEmbedding(DIM, 0.89);
|
|
155
|
-
const results2 = sg.searchEntitiesByVector(queryNearCharlie, 1);
|
|
156
|
-
assert(results2.length === 1, 'Should return 1 result with k=1');
|
|
157
|
-
assert(results2[0].entityId === charlie.id, 'Closest to Charlie query should be Charlie');
|
|
158
|
-
// ================================================================
|
|
159
|
-
// 6. searchEntitiesByVector — with entity type filter
|
|
160
|
-
// ================================================================
|
|
161
|
-
section('6. Entity type filtering');
|
|
162
|
-
// Add a non-person entity
|
|
163
|
-
const techTag = sg.addTag({ name: 'Tech', tagType: 'skill' });
|
|
164
|
-
sg.indexEntity(techTag.id, makeEmbedding(DIM, 0.12)); // close to Alice
|
|
165
|
-
const personResults = sg.searchEntitiesByVector(queryNearAlice, 10, 'person');
|
|
166
|
-
assert(personResults.every(r => r.entity.entity_type === 'person'), 'Filtering by person should only return person entities');
|
|
167
|
-
console.log(` person-only results: ${personResults.length}`);
|
|
168
|
-
// ================================================================
|
|
169
|
-
// 7. removeEntityVector
|
|
170
|
-
// ================================================================
|
|
171
|
-
section('7. removeEntityVector');
|
|
172
|
-
const countBefore = sg.vectorCount();
|
|
173
|
-
sg.removeEntityVector(alice.id);
|
|
174
|
-
// HNSW soft-delete: count may or may not decrease, but search should not return removed entity
|
|
175
|
-
const resultsAfterRemove = sg.searchEntitiesByVector(embAlice, 10);
|
|
176
|
-
assert(resultsAfterRemove.every(r => r.entityId !== alice.id), 'Removed entity should not appear in search results');
|
|
177
|
-
console.log(` vectorCount before=${countBefore}, after=${sg.vectorCount()}`);
|
|
178
|
-
// ================================================================
|
|
179
|
-
// 8. Idempotent re-index
|
|
180
|
-
// ================================================================
|
|
181
|
-
section('8. Idempotent re-index');
|
|
182
|
-
// Re-indexing same entity should not error
|
|
183
|
-
sg.indexEntity(bob.id, makeEmbedding(DIM, 0.6));
|
|
184
|
-
assert(true, 'Re-indexing Bob should not throw');
|
|
185
|
-
// Bob should still be searchable
|
|
186
|
-
const reindexResults = sg.searchEntitiesByVector(makeEmbedding(DIM, 0.6), 1);
|
|
187
|
-
assert(reindexResults.length >= 1, 'Bob should be searchable after re-index');
|
|
188
|
-
// ================================================================
|
|
189
|
-
// 9. hybridSearch
|
|
190
|
-
// ================================================================
|
|
191
|
-
section('9. hybridSearch');
|
|
192
|
-
// Vector + text hybrid
|
|
193
|
-
const hybridResults = sg.hybridSearch(embBob, 'Bob', 5);
|
|
194
|
-
assert(hybridResults.length > 0, 'hybridSearch should return results');
|
|
195
|
-
console.log(` hybridSearch results: ${hybridResults.length}`);
|
|
196
|
-
for (const r of hybridResults.slice(0, 3)) {
|
|
197
|
-
console.log(` ${r.entityId}: score=${r.score.toFixed(4)}, name=${r.entity?.name}`);
|
|
198
|
-
}
|
|
199
|
-
// Text-only hybrid
|
|
200
|
-
const textOnlyResults = sg.hybridSearch(null, 'Charlie', 5);
|
|
201
|
-
assert(textOnlyResults.length > 0, 'Text-only hybridSearch should return results');
|
|
202
|
-
// Vector-only hybrid
|
|
203
|
-
const vecOnlyResults = sg.hybridSearch(embCharlie, null, 5);
|
|
204
|
-
assert(vecOnlyResults.length > 0, 'Vector-only hybridSearch should return results');
|
|
205
|
-
// ================================================================
|
|
206
|
-
// 10. Async indexEntity
|
|
207
|
-
// ================================================================
|
|
208
|
-
section('10. Async API');
|
|
209
|
-
const dave = sg.addPerson({ name: 'Dave' });
|
|
210
|
-
await sg.indexEntityAsync(dave.id, makeEmbedding(DIM, 0.3));
|
|
211
|
-
assert(true, 'indexEntityAsync should complete without error');
|
|
212
|
-
const asyncResults = sg.searchEntitiesByVector(makeEmbedding(DIM, 0.3), 1);
|
|
213
|
-
assert(asyncResults.length >= 1, 'Dave should be found after async indexing');
|
|
214
|
-
// ================================================================
|
|
215
|
-
// Cleanup
|
|
216
|
-
// ================================================================
|
|
217
|
-
sg.flush();
|
|
218
|
-
sg.shutdown();
|
|
219
|
-
// ================================================================
|
|
220
|
-
// Summary
|
|
221
|
-
// ================================================================
|
|
222
|
-
console.log('\n' + '='.repeat(60));
|
|
223
|
-
console.log(`T32.4 Results: ${passed} passed, ${failed} failed`);
|
|
224
|
-
if (failures.length > 0) {
|
|
225
|
-
console.log('Failures:');
|
|
226
|
-
for (const f of failures) {
|
|
227
|
-
console.log(` - ${f}`);
|
|
228
|
-
}
|
|
229
|
-
}
|
|
230
|
-
console.log('='.repeat(60));
|
|
231
|
-
process.exit(failed > 0 ? 1 : 0);
|
|
232
|
-
}
|
|
233
|
-
finally {
|
|
234
|
-
fs.rmSync(tmpDir, { recursive: true, force: true });
|
|
235
|
-
}
|
|
236
|
-
}
|
|
237
|
-
main().catch(err => {
|
|
238
|
-
console.error('Test error:', err);
|
|
239
|
-
process.exit(1);
|
|
240
|
-
});
|
|
241
|
-
//# sourceMappingURL=social-graph-v2-vector.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"social-graph-v2-vector.test.js","sourceRoot":"","sources":["../ts/social-graph-v2-vector.test.ts"],"names":[],"mappings":"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"}
|