aifastdb 3.10.5 → 3.10.7

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.
Files changed (73) hide show
  1. package/aifastdb.node +0 -0
  2. package/aifastdb.win32-x64-msvc.node +0 -0
  3. package/dist/concurrent-document-store.d.ts +4 -0
  4. package/dist/concurrent-document-store.d.ts.map +1 -1
  5. package/dist/concurrent-document-store.js +6 -0
  6. package/dist/concurrent-document-store.js.map +1 -1
  7. package/dist/find-async-baseline.d.ts +33 -0
  8. package/dist/find-async-baseline.d.ts.map +1 -0
  9. package/dist/find-async-baseline.js +424 -0
  10. package/dist/find-async-baseline.js.map +1 -0
  11. package/dist/find-async-bench.d.ts +22 -0
  12. package/dist/find-async-bench.d.ts.map +1 -0
  13. package/dist/find-async-bench.js +322 -0
  14. package/dist/find-async-bench.js.map +1 -0
  15. package/dist/find-async-verify.d.ts +23 -0
  16. package/dist/find-async-verify.d.ts.map +1 -0
  17. package/dist/find-async-verify.js +286 -0
  18. package/dist/find-async-verify.js.map +1 -0
  19. package/dist/hnsw-insert-profile-verify.d.ts +35 -0
  20. package/dist/hnsw-insert-profile-verify.d.ts.map +1 -0
  21. package/dist/hnsw-insert-profile-verify.js +250 -0
  22. package/dist/hnsw-insert-profile-verify.js.map +1 -0
  23. package/dist/micro-batcher-benchmark.d.ts +3 -0
  24. package/dist/micro-batcher-benchmark.d.ts.map +1 -0
  25. package/dist/micro-batcher-benchmark.js +296 -0
  26. package/dist/micro-batcher-benchmark.js.map +1 -0
  27. package/dist/micro-batcher.d.ts +97 -0
  28. package/dist/micro-batcher.d.ts.map +1 -0
  29. package/dist/micro-batcher.js +77 -0
  30. package/dist/micro-batcher.js.map +1 -0
  31. package/dist/native.d.ts +71 -0
  32. package/dist/native.d.ts.map +1 -1
  33. package/dist/native.js +6 -1
  34. package/dist/native.js.map +1 -1
  35. package/dist/phase-387-reproducibility-audit.d.ts +3 -0
  36. package/dist/phase-387-reproducibility-audit.d.ts.map +1 -0
  37. package/dist/phase-387-reproducibility-audit.js +236 -0
  38. package/dist/phase-387-reproducibility-audit.js.map +1 -0
  39. package/dist/phase-390-baseline-multiseed.d.ts +3 -0
  40. package/dist/phase-390-baseline-multiseed.d.ts.map +1 -0
  41. package/dist/phase-390-baseline-multiseed.js +241 -0
  42. package/dist/phase-390-baseline-multiseed.js.map +1 -0
  43. package/dist/phase-390-t2-mb-grid-sweep.d.ts +3 -0
  44. package/dist/phase-390-t2-mb-grid-sweep.d.ts.map +1 -0
  45. package/dist/phase-390-t2-mb-grid-sweep.js +291 -0
  46. package/dist/phase-390-t2-mb-grid-sweep.js.map +1 -0
  47. package/dist/read-profiler-verify.js +236 -1
  48. package/dist/read-profiler-verify.js.map +1 -1
  49. package/dist/remember-many-spawn-benchmark.d.ts +3 -0
  50. package/dist/remember-many-spawn-benchmark.d.ts.map +1 -0
  51. package/dist/remember-many-spawn-benchmark.js +163 -0
  52. package/dist/remember-many-spawn-benchmark.js.map +1 -0
  53. package/dist/remember-spawn-benchmark.d.ts +3 -0
  54. package/dist/remember-spawn-benchmark.d.ts.map +1 -0
  55. package/dist/remember-spawn-benchmark.js +230 -0
  56. package/dist/remember-spawn-benchmark.js.map +1 -0
  57. package/dist/remember-spawn-receipt-benchmark.d.ts +3 -0
  58. package/dist/remember-spawn-receipt-benchmark.d.ts.map +1 -0
  59. package/dist/remember-spawn-receipt-benchmark.js +266 -0
  60. package/dist/remember-spawn-receipt-benchmark.js.map +1 -0
  61. package/dist/sgv2-async-verify.d.ts +17 -0
  62. package/dist/sgv2-async-verify.d.ts.map +1 -0
  63. package/dist/sgv2-async-verify.js +217 -0
  64. package/dist/sgv2-async-verify.js.map +1 -0
  65. package/dist/social-graph-v2-read-benchmark.d.ts +11 -2
  66. package/dist/social-graph-v2-read-benchmark.d.ts.map +1 -1
  67. package/dist/social-graph-v2-read-benchmark.js +145 -3
  68. package/dist/social-graph-v2-read-benchmark.js.map +1 -1
  69. package/dist/social-graph-v2.d.ts +65 -4
  70. package/dist/social-graph-v2.d.ts.map +1 -1
  71. package/dist/social-graph-v2.js +72 -6
  72. package/dist/social-graph-v2.js.map +1 -1
  73. package/package.json +1 -1
@@ -0,0 +1,217 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ /**
4
+ * phase-380/T380.3 (E380.B) — semantic regression guard for the new
5
+ * `getTagMembersAsync` / `listTagsAsync` / `getPersonsByAttributeAsync`
6
+ * NAPI async wrappers on `SocialGraphV2`.
7
+ *
8
+ * Same contract as `find-async-verify.ts`:
9
+ * 1. async length == sync length
10
+ * 2. when limit >= total_hits, sorted-id projection equality
11
+ * (per-node predicate is implicit because the sync side itself was
12
+ * validated in phase-377; we just check sync vs async.)
13
+ *
14
+ * Run after `npx tsc`:
15
+ * node packages/node/dist/sgv2-async-verify.js
16
+ */
17
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
18
+ if (k2 === undefined) k2 = k;
19
+ var desc = Object.getOwnPropertyDescriptor(m, k);
20
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
21
+ desc = { enumerable: true, get: function() { return m[k]; } };
22
+ }
23
+ Object.defineProperty(o, k2, desc);
24
+ }) : (function(o, m, k, k2) {
25
+ if (k2 === undefined) k2 = k;
26
+ o[k2] = m[k];
27
+ }));
28
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
29
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
30
+ }) : function(o, v) {
31
+ o["default"] = v;
32
+ });
33
+ var __importStar = (this && this.__importStar) || (function () {
34
+ var ownKeys = function(o) {
35
+ ownKeys = Object.getOwnPropertyNames || function (o) {
36
+ var ar = [];
37
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
38
+ return ar;
39
+ };
40
+ return ownKeys(o);
41
+ };
42
+ return function (mod) {
43
+ if (mod && mod.__esModule) return mod;
44
+ var result = {};
45
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
46
+ __setModuleDefault(result, mod);
47
+ return result;
48
+ };
49
+ })();
50
+ Object.defineProperty(exports, "__esModule", { value: true });
51
+ const fs = __importStar(require("fs"));
52
+ const os = __importStar(require("os"));
53
+ const path = __importStar(require("path"));
54
+ const social_graph_v2_1 = require("./social-graph-v2");
55
+ function makeTempDir(prefix) {
56
+ return fs.mkdtempSync(path.join(os.tmpdir(), prefix));
57
+ }
58
+ function cleanupDir(dir) {
59
+ try {
60
+ fs.rmSync(dir, { recursive: true, force: true });
61
+ }
62
+ catch {
63
+ /* swallow */
64
+ }
65
+ }
66
+ function idsSorted(entities) {
67
+ return entities.map((e) => e.id).sort();
68
+ }
69
+ function seedGraph(graph, options) {
70
+ // Persons
71
+ for (let i = 0; i < options.persons; i += 1) {
72
+ graph.addPerson({ id: `p-${i}`, name: `Person ${i}` });
73
+ }
74
+ // Hot company tag with options.hotTagMembers tagged members.
75
+ const hotTag = graph.addTag({ name: 'TechCorp', tagType: 'company' });
76
+ for (let i = 0; i < options.hotTagMembers; i += 1) {
77
+ graph.tagPerson(`p-${i}`, hotTag.id);
78
+ }
79
+ // Hot attribute (e.g., industry=tech) shared by hotAttrHolders persons.
80
+ const hotAttr = graph.findOrCreateAttribute('industry', 'tech');
81
+ for (let i = 0; i < options.hotAttrHolders; i += 1) {
82
+ graph.setPersonAttribute(`p-${i}`, hotAttr.id);
83
+ }
84
+ // Filler company tags so listTags has volume to paginate over.
85
+ for (let i = 0; i < options.fillerTags; i += 1) {
86
+ graph.addTag({ name: `Co-${i}`, tagType: 'company' });
87
+ }
88
+ return {
89
+ hotTagId: hotTag.id,
90
+ hotAttrId: hotAttr.id,
91
+ totalHotMembers: options.hotTagMembers,
92
+ totalHotHolders: options.hotAttrHolders,
93
+ fillerCompanyTags: options.fillerTags + 1, // + the hotTag itself (also company)
94
+ };
95
+ }
96
+ async function checkGetTagMembers(graph, tagId, options, total) {
97
+ const sync = graph.getTagMembers(tagId, options);
98
+ const a = await graph.getTagMembersAsync(tagId, options);
99
+ const tag = `getTagMembers(limit=${options?.limit ?? '∞'},offset=${options?.offset ?? 0})`;
100
+ if (sync.length !== a.length) {
101
+ return { scenario: tag, count: sync.length, pass: false, detail: `len mismatch: sync=${sync.length} async=${a.length}` };
102
+ }
103
+ const limit = options?.limit ?? Infinity;
104
+ if (limit >= total) {
105
+ const ks = JSON.stringify(idsSorted(sync));
106
+ const ka = JSON.stringify(idsSorted(a));
107
+ if (ks !== ka) {
108
+ return { scenario: tag, count: sync.length, pass: false, detail: `full-set element mismatch (limit ${limit} >= ${total})` };
109
+ }
110
+ }
111
+ return { scenario: tag, count: sync.length, pass: true };
112
+ }
113
+ async function checkListTags(graph, filter, totalKnown) {
114
+ const sync = graph.listTags(filter);
115
+ const a = await graph.listTagsAsync(filter);
116
+ const tag = `listTags(${filter ? JSON.stringify(filter) : 'all'})`;
117
+ if (sync.length !== a.length) {
118
+ return { scenario: tag, count: sync.length, pass: false, detail: `len mismatch: sync=${sync.length} async=${a.length}` };
119
+ }
120
+ // For listTags we always check full-set equality when no name filter is set
121
+ // (limit caps the count, but listTags_limited inside core uses iter().take —
122
+ // documented same "any subset, no order" contract). When the limit covers
123
+ // the whole population, equality must hold.
124
+ if (filter?.limit === undefined || (totalKnown !== undefined && filter.limit >= totalKnown)) {
125
+ const ks = JSON.stringify(idsSorted(sync));
126
+ const ka = JSON.stringify(idsSorted(a));
127
+ if (ks !== ka) {
128
+ return {
129
+ scenario: tag,
130
+ count: sync.length,
131
+ pass: false,
132
+ detail: `element mismatch (sync=${sync.length}, async=${a.length}, sortedId differ)`,
133
+ };
134
+ }
135
+ }
136
+ return { scenario: tag, count: sync.length, pass: true };
137
+ }
138
+ async function checkGetPersonsByAttribute(graph, attrId, options, total) {
139
+ const sync = graph.getPersonsByAttribute(attrId, options);
140
+ const a = await graph.getPersonsByAttributeAsync(attrId, options);
141
+ const tag = `getPersonsByAttribute(limit=${options?.limit ?? '∞'},offset=${options?.offset ?? 0})`;
142
+ if (sync.length !== a.length) {
143
+ return { scenario: tag, count: sync.length, pass: false, detail: `len mismatch: sync=${sync.length} async=${a.length}` };
144
+ }
145
+ const limit = options?.limit ?? Infinity;
146
+ if (limit >= total) {
147
+ const ks = JSON.stringify(idsSorted(sync));
148
+ const ka = JSON.stringify(idsSorted(a));
149
+ if (ks !== ka) {
150
+ return { scenario: tag, count: sync.length, pass: false, detail: `full-set element mismatch (limit ${limit} >= ${total})` };
151
+ }
152
+ }
153
+ return { scenario: tag, count: sync.length, pass: true };
154
+ }
155
+ async function main() {
156
+ const dir = makeTempDir('phase380-sgv2-verify-');
157
+ const graph = new social_graph_v2_1.SocialGraphV2({ path: path.join(dir, 'graph'), walEnabled: false });
158
+ console.log('============================================================');
159
+ console.log(' phase-380/T380.3 — SGV2 *Async semantic verify');
160
+ console.log('============================================================');
161
+ try {
162
+ const seed = {
163
+ persons: 1500,
164
+ hotTagMembers: 1000,
165
+ hotAttrHolders: 800,
166
+ fillerTags: 50,
167
+ };
168
+ console.log(` → seeding persons=${seed.persons}, hotTagMembers=${seed.hotTagMembers}, hotAttr=${seed.hotAttrHolders}, fillers=${seed.fillerTags}...`);
169
+ const s = seedGraph(graph, seed);
170
+ console.log(` hotTagId=${s.hotTagId}, hotAttrId=${s.hotAttrId}, fillerCompanyTags=${s.fillerCompanyTags}`);
171
+ const checks = [];
172
+ // getTagMembers: legacy (no options), small limit, large limit, full set
173
+ checks.push(await checkGetTagMembers(graph, s.hotTagId, undefined, s.totalHotMembers));
174
+ checks.push(await checkGetTagMembers(graph, s.hotTagId, { limit: 10 }, s.totalHotMembers));
175
+ checks.push(await checkGetTagMembers(graph, s.hotTagId, { limit: 50 }, s.totalHotMembers));
176
+ checks.push(await checkGetTagMembers(graph, s.hotTagId, { limit: s.totalHotMembers + 50 }, s.totalHotMembers));
177
+ checks.push(await checkGetTagMembers(graph, s.hotTagId, { limit: 20, offset: 5 }, s.totalHotMembers));
178
+ // listTags: all, by tagType, by name fragment, with limit (limit >= total: full set check)
179
+ checks.push(await checkListTags(graph, undefined));
180
+ checks.push(await checkListTags(graph, { tagType: 'company' }, s.fillerCompanyTags));
181
+ checks.push(await checkListTags(graph, { tagType: 'company', limit: 10 }, s.fillerCompanyTags));
182
+ checks.push(await checkListTags(graph, { tagType: 'company', limit: s.fillerCompanyTags + 10 }, s.fillerCompanyTags));
183
+ // getPersonsByAttribute: legacy, small/large limit, full set, with offset
184
+ checks.push(await checkGetPersonsByAttribute(graph, s.hotAttrId, undefined, s.totalHotHolders));
185
+ checks.push(await checkGetPersonsByAttribute(graph, s.hotAttrId, { limit: 10 }, s.totalHotHolders));
186
+ checks.push(await checkGetPersonsByAttribute(graph, s.hotAttrId, { limit: 50 }, s.totalHotHolders));
187
+ checks.push(await checkGetPersonsByAttribute(graph, s.hotAttrId, { limit: s.totalHotHolders + 25 }, s.totalHotHolders));
188
+ checks.push(await checkGetPersonsByAttribute(graph, s.hotAttrId, { limit: 20, offset: 5 }, s.totalHotHolders));
189
+ console.log('');
190
+ let allPass = true;
191
+ for (const c of checks) {
192
+ const tag = c.pass ? 'PASS' : 'FAIL';
193
+ console.log(` ${tag} ${c.scenario.padEnd(60)} count=${c.count}`);
194
+ if (!c.pass) {
195
+ console.log(` \u21B3 ${c.detail}`);
196
+ allPass = false;
197
+ }
198
+ }
199
+ console.log('');
200
+ if (allPass) {
201
+ console.log(' \u2713 all scenarios pass — async wrappers preserve sync semantics');
202
+ process.exit(0);
203
+ }
204
+ else {
205
+ console.log(' \u2717 regressions detected');
206
+ process.exit(1);
207
+ }
208
+ }
209
+ finally {
210
+ cleanupDir(dir);
211
+ }
212
+ }
213
+ main().catch((err) => {
214
+ console.error('phase-380 SGV2 verify failed:', err);
215
+ process.exit(1);
216
+ });
217
+ //# sourceMappingURL=sgv2-async-verify.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sgv2-async-verify.js","sourceRoot":"","sources":["../ts/sgv2-async-verify.ts"],"names":[],"mappings":"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"}
@@ -1,19 +1,28 @@
1
1
  #!/usr/bin/env node
2
2
  /**
3
- * SocialGraphV2 read-path baseline (phase-378/T378.5).
3
+ * SocialGraphV2 read-path baseline (phase-378/T378.5, extended in phase-377/T377.1).
4
4
  *
5
5
  * Drives the high-frequency read paths instrumented by
6
6
  * `social::concurrent::read_profiler` and dumps the profile snapshot per
7
7
  * scenario so we can establish baseline numbers + identify the hottest
8
8
  * sub-slots.
9
9
  *
10
- * Scenarios:
10
+ * Scenarios (phase-378):
11
11
  * - getPerson (single-id point read)
12
12
  * - listPersons (full-scan O(N_persons))
13
13
  * - getFriends (relation walk + entity lookup)
14
14
  * - areFriends (boolean relation existence)
15
15
  * - listRelations (full relation scan)
16
16
  * - getEntityRelations(per-entity relation walk)
17
+ *
18
+ * Scenarios (phase-377/T377.1, tag/attribute scan baseline):
19
+ * - getTagMembers_high (1000 members per tag, the hot Scan M1/M2 target)
20
+ * - getTagMembers_med (100 members per tag)
21
+ * - getTagMembers_low (10 members per tag)
22
+ * - listTags_all (no filter, multi-type union)
23
+ * - listTags_company (single tag_type filter)
24
+ * - getPersonsByAttr_hot (1000 holders, hot key)
25
+ * - getPersonsByAttr_rare(10 holders, rare key)
17
26
  */
18
27
  export {};
19
28
  //# sourceMappingURL=social-graph-v2-read-benchmark.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"social-graph-v2-read-benchmark.d.ts","sourceRoot":"","sources":["../ts/social-graph-v2-read-benchmark.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;GAeG"}
1
+ {"version":3,"file":"social-graph-v2-read-benchmark.d.ts","sourceRoot":"","sources":["../ts/social-graph-v2-read-benchmark.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG"}
@@ -1,20 +1,29 @@
1
1
  #!/usr/bin/env node
2
2
  "use strict";
3
3
  /**
4
- * SocialGraphV2 read-path baseline (phase-378/T378.5).
4
+ * SocialGraphV2 read-path baseline (phase-378/T378.5, extended in phase-377/T377.1).
5
5
  *
6
6
  * Drives the high-frequency read paths instrumented by
7
7
  * `social::concurrent::read_profiler` and dumps the profile snapshot per
8
8
  * scenario so we can establish baseline numbers + identify the hottest
9
9
  * sub-slots.
10
10
  *
11
- * Scenarios:
11
+ * Scenarios (phase-378):
12
12
  * - getPerson (single-id point read)
13
13
  * - listPersons (full-scan O(N_persons))
14
14
  * - getFriends (relation walk + entity lookup)
15
15
  * - areFriends (boolean relation existence)
16
16
  * - listRelations (full relation scan)
17
17
  * - getEntityRelations(per-entity relation walk)
18
+ *
19
+ * Scenarios (phase-377/T377.1, tag/attribute scan baseline):
20
+ * - getTagMembers_high (1000 members per tag, the hot Scan M1/M2 target)
21
+ * - getTagMembers_med (100 members per tag)
22
+ * - getTagMembers_low (10 members per tag)
23
+ * - listTags_all (no filter, multi-type union)
24
+ * - listTags_company (single tag_type filter)
25
+ * - getPersonsByAttr_hot (1000 holders, hot key)
26
+ * - getPersonsByAttr_rare(10 holders, rare key)
18
27
  */
19
28
  var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
20
29
  if (k2 === undefined) k2 = k;
@@ -99,7 +108,77 @@ async function main() {
99
108
  if (a !== b)
100
109
  graph.addFriend(a, b);
101
110
  }
102
- console.log(`[seed] done in ${((performance.now() - t0) / 1000).toFixed(1)}s`);
111
+ console.log(`[seed] persons+friends done in ${((performance.now() - t0) / 1000).toFixed(1)}s`);
112
+ // ------------------------------------------------------------------
113
+ // phase-377/T377.1 tag + attribute seed
114
+ // ------------------------------------------------------------------
115
+ // Three cardinality buckets so we can see how reverse indexing pays
116
+ // off vs. flat scans: hot (1000 holders), med (100 holders), rare (10 holders).
117
+ // We deliberately mix tag_type=company (single-class fast path) and
118
+ // tag_type=skill (multi-class union path) to exercise list_tags both ways.
119
+ console.log(`[seed] adding tags + attributes for phase-377 scenarios ...`);
120
+ const tSeedTags = performance.now();
121
+ const HOT_TAG_CARD = Math.min(1000, opt.persons);
122
+ const MED_TAG_CARD = Math.min(100, opt.persons);
123
+ const LOW_TAG_CARD = Math.min(10, opt.persons);
124
+ const hotTagIds = [];
125
+ const medTagIds = [];
126
+ const lowTagIds = [];
127
+ for (let i = 0; i < 3; i++) {
128
+ hotTagIds.push(graph.addTag({ name: `hot-tag-${i}`, tagType: 'company' }).id);
129
+ }
130
+ for (let i = 0; i < 3; i++) {
131
+ medTagIds.push(graph.addTag({ name: `med-tag-${i}`, tagType: 'skill' }).id);
132
+ }
133
+ for (let i = 0; i < 5; i++) {
134
+ lowTagIds.push(graph.addTag({ name: `low-tag-${i}`, tagType: 'interest' }).id);
135
+ }
136
+ // phase-377/T377.5 (E377.D): expand the listTags result set so that
137
+ // limit pushdown has measurable e2e impact. T377.1 had ~3 company
138
+ // entities, which made `listTags({tagType:'company'})` a 1.3 µs noise
139
+ // floor. We seed 1000 additional non-tagged filler company tags so the
140
+ // legacy full-set materialize traverses 1003 entities while a
141
+ // `{ limit: 10 }` request only pages 10. Filler tags do NOT participate
142
+ // in `tagPerson` so getTagMembers_high baselines are unaffected.
143
+ const FILLER_LIST_TAGS_CARD = 1000;
144
+ for (let i = 0; i < FILLER_LIST_TAGS_CARD; i++) {
145
+ graph.addTag({ name: `filler-co-${i}`, tagType: 'company' });
146
+ }
147
+ // Distribute persons into tags. Use disjoint partitions per cardinality
148
+ // bucket so getTagMembers(hot) returns exactly HOT_TAG_CARD persons, etc.
149
+ for (const t of hotTagIds) {
150
+ for (let i = 0; i < HOT_TAG_CARD; i++)
151
+ graph.tagPerson(ids[i], t);
152
+ }
153
+ for (const t of medTagIds) {
154
+ for (let i = 0; i < MED_TAG_CARD; i++)
155
+ graph.tagPerson(ids[i], t);
156
+ }
157
+ for (const t of lowTagIds) {
158
+ for (let i = 0; i < LOW_TAG_CARD; i++)
159
+ graph.tagPerson(ids[i], t);
160
+ }
161
+ const HOT_ATTR_CARD = Math.min(1000, opt.persons);
162
+ const RARE_ATTR_CARD = Math.min(10, opt.persons);
163
+ const hotAttrIds = [];
164
+ const rareAttrIds = [];
165
+ for (let i = 0; i < 3; i++) {
166
+ hotAttrIds.push(graph.addAttribute({ category: 'industry', value: `hot-${i}` }).id);
167
+ }
168
+ for (let i = 0; i < 5; i++) {
169
+ rareAttrIds.push(graph.addAttribute({ category: 'mbti', value: `rare-${i}` }).id);
170
+ }
171
+ for (const a of hotAttrIds) {
172
+ for (let i = 0; i < HOT_ATTR_CARD; i++)
173
+ graph.setPersonAttribute(ids[i], a);
174
+ }
175
+ for (const a of rareAttrIds) {
176
+ for (let i = 0; i < RARE_ATTR_CARD; i++)
177
+ graph.setPersonAttribute(ids[i], a);
178
+ }
179
+ console.log(`[seed] tags+attrs done in ${((performance.now() - tSeedTags) / 1000).toFixed(1)}s`);
180
+ console.log(`[seed] hot tags=${hotTagIds.length} card=${HOT_TAG_CARD} med tags=${medTagIds.length} card=${MED_TAG_CARD} low tags=${lowTagIds.length} card=${LOW_TAG_CARD}`);
181
+ console.log(`[seed] hot attrs=${hotAttrIds.length} card=${HOT_ATTR_CARD} rare attrs=${rareAttrIds.length} card=${RARE_ATTR_CARD}`);
103
182
  const results = [];
104
183
  function runScenario(name, runs, fn) {
105
184
  graph.readProfileReset();
@@ -138,6 +217,69 @@ async function main() {
138
217
  runScenario('getEntityRelations', Math.min(opt.reads / 5, 10000) | 0, () => {
139
218
  graph.getEntityRelations(ids[(Math.random() * opt.persons) | 0]);
140
219
  });
220
+ // ------------------------------------------------------------------
221
+ // phase-377/T377.1 tag-scan baseline scenarios
222
+ // ------------------------------------------------------------------
223
+ // Cap iterations per scenario at min(reads/100, 200) — same convention
224
+ // listPersons uses — because each call is O(N) and we want bounded wall.
225
+ const SCAN_RUNS = Math.max(50, Math.min((opt.reads / 100) | 0, 200));
226
+ runScenario('getTagMembers_high', SCAN_RUNS, () => {
227
+ graph.getTagMembers(hotTagIds[(Math.random() * hotTagIds.length) | 0]);
228
+ });
229
+ runScenario('getTagMembers_med', SCAN_RUNS, () => {
230
+ graph.getTagMembers(medTagIds[(Math.random() * medTagIds.length) | 0]);
231
+ });
232
+ runScenario('getTagMembers_low', SCAN_RUNS, () => {
233
+ graph.getTagMembers(lowTagIds[(Math.random() * lowTagIds.length) | 0]);
234
+ });
235
+ // phase-377/T377.3 (E377.B): NAPI smart-routing scenarios. Same hot
236
+ // tag, but pass `{ limit }` so the call routes through
237
+ // get_tag_members_limited and only `limit` entities cross the FFI
238
+ // boundary. Compare against `getTagMembers_high` (no options) for the
239
+ // e2e ratio.
240
+ runScenario('getTagMembers_high_limit10', SCAN_RUNS * 5, () => {
241
+ graph.getTagMembers(hotTagIds[(Math.random() * hotTagIds.length) | 0], { limit: 10 });
242
+ });
243
+ runScenario('getTagMembers_high_limit50', SCAN_RUNS * 2, () => {
244
+ graph.getTagMembers(hotTagIds[(Math.random() * hotTagIds.length) | 0], { limit: 50 });
245
+ });
246
+ runScenario('listTags_all', SCAN_RUNS, () => {
247
+ graph.listTags();
248
+ });
249
+ runScenario('listTags_company', SCAN_RUNS, () => {
250
+ graph.listTags({ tagType: 'company' });
251
+ });
252
+ // phase-377/T377.5 (E377.D): NAPI listTags smart routing scenarios.
253
+ // Same `tagType: 'company'` filter (1003 entities) but with explicit
254
+ // `limit` so the call routes through `list_tags_limited`'s paginated
255
+ // type-index lookup. Compare against `listTags_company` for e2e ratio.
256
+ runScenario('listTags_company_limit10', SCAN_RUNS * 5, () => {
257
+ graph.listTags({ tagType: 'company', limit: 10 });
258
+ });
259
+ runScenario('listTags_company_limit50', SCAN_RUNS * 2, () => {
260
+ graph.listTags({ tagType: 'company', limit: 50 });
261
+ });
262
+ runScenario('listTags_all_limit10', SCAN_RUNS * 5, () => {
263
+ graph.listTags({ limit: 10 });
264
+ });
265
+ runScenario('getPersonsByAttr_hot', SCAN_RUNS, () => {
266
+ graph.getPersonsByAttribute(hotAttrIds[(Math.random() * hotAttrIds.length) | 0]);
267
+ });
268
+ runScenario('getPersonsByAttr_rare', SCAN_RUNS, () => {
269
+ graph.getPersonsByAttribute(rareAttrIds[(Math.random() * rareAttrIds.length) | 0]);
270
+ });
271
+ // phase-377/T377.7 (E377.F): NAPI smart-routing scenarios for
272
+ // getPersonsByAttribute. Same hot 1000-holder attribute, but pass
273
+ // `{ limit }` so the call routes through
274
+ // get_persons_by_attribute_limited and only `limit` entities cross
275
+ // the FFI boundary. Compare against `getPersonsByAttr_hot` (no
276
+ // options) for the e2e ratio.
277
+ runScenario('getPersonsByAttr_hot_limit10', SCAN_RUNS * 5, () => {
278
+ graph.getPersonsByAttribute(hotAttrIds[(Math.random() * hotAttrIds.length) | 0], { limit: 10 });
279
+ });
280
+ runScenario('getPersonsByAttr_hot_limit50', SCAN_RUNS * 2, () => {
281
+ graph.getPersonsByAttribute(hotAttrIds[(Math.random() * hotAttrIds.length) | 0], { limit: 50 });
282
+ });
141
283
  console.log('\n============================================================');
142
284
  console.log(' Summary');
143
285
  console.log('============================================================');
@@ -1 +1 @@
1
- {"version":3,"file":"social-graph-v2-read-benchmark.js","sourceRoot":"","sources":["../ts/social-graph-v2-read-benchmark.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"social-graph-v2-read-benchmark.js","sourceRoot":"","sources":["../ts/social-graph-v2-read-benchmark.ts"],"names":[],"mappings":"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"}
@@ -391,9 +391,34 @@ export declare class SocialGraphV2 {
391
391
  */
392
392
  getPersonTags(personId: string): Entity[];
393
393
  /**
394
- * Get all members of a tag
394
+ * Get all members of a tag.
395
+ *
396
+ * phase-377/T377.3 (E377.B): pass `{ limit, offset }` to push the
397
+ * truncation into the Rust core via `get_tag_members_limited`. This
398
+ * avoids materializing every member entity through the NAPI boundary
399
+ * for hot-cardinality tags.
400
+ *
401
+ * @param tagId Tag entity id.
402
+ * @param options Optional `{ limit?: number; offset?: number }`. When
403
+ * omitted, the call routes through the legacy `(None, None)` wrapper
404
+ * and returns every member (backwards compatible).
405
+ */
406
+ getTagMembers(tagId: string, options?: {
407
+ limit?: number;
408
+ offset?: number;
409
+ }): Entity[];
410
+ /**
411
+ * phase-380/T380.3: async wrapper around `getTagMembers`.
412
+ *
413
+ * Promise-returning equivalent that lets concurrent callers
414
+ * (`Promise.all([...])`) actually parallelise on SGV2's tokio runtime
415
+ * instead of serialising through the NAPI sync round-trip. Routing is
416
+ * byte-for-byte identical to `getTagMembers`.
395
417
  */
396
- getTagMembers(tagId: string): Entity[];
418
+ getTagMembersAsync(tagId: string, options?: {
419
+ limit?: number;
420
+ offset?: number;
421
+ }): Promise<Entity[]>;
397
422
  /**
398
423
  * Set parent tag relationship
399
424
  */
@@ -463,9 +488,37 @@ export declare class SocialGraphV2 {
463
488
  */
464
489
  getPersonAttributes(personId: string): Entity[];
465
490
  /**
466
- * Get persons by attribute
491
+ * Get persons by attribute.
492
+ *
493
+ * When `options.limit` or `options.offset` is provided, the call routes
494
+ * through phase-377/T377.7's `get_persons_by_attribute_limited` core
495
+ * fast path (NAPI smart routing). Without options, the legacy full-set
496
+ * wrapper is used so existing callers preserve byte-for-byte BC.
497
+ *
498
+ * @example
499
+ * ```typescript
500
+ * // Legacy: every holder
501
+ * const all = social.getPersonsByAttribute(attrId);
502
+ *
503
+ * // Limit pushdown: avoids cloning N entities + serializing them across NAPI
504
+ * const top10 = social.getPersonsByAttribute(attrId, { limit: 10 });
505
+ * ```
506
+ */
507
+ getPersonsByAttribute(attrId: string, options?: {
508
+ limit?: number;
509
+ offset?: number;
510
+ }): Entity[];
511
+ /**
512
+ * phase-380/T380.3: async wrapper around `getPersonsByAttribute`.
513
+ *
514
+ * Promise-returning equivalent for concurrent callers. Same smart
515
+ * routing as the sync version (T377.7 limit pushdown when options
516
+ * provided, legacy `(None, None)` wrapper otherwise).
467
517
  */
468
- getPersonsByAttribute(attrId: string): Entity[];
518
+ getPersonsByAttributeAsync(attrId: string, options?: {
519
+ limit?: number;
520
+ offset?: number;
521
+ }): Promise<Entity[]>;
469
522
  /**
470
523
  * Set a person's birthday (YYYY-MM-DD format)
471
524
  */
@@ -1467,6 +1520,14 @@ export declare class SocialGraphV2 {
1467
1520
  * ```
1468
1521
  */
1469
1522
  listTags(filter?: TagFilter): Entity[];
1523
+ /**
1524
+ * phase-380/T380.3: async wrapper around `listTags`.
1525
+ *
1526
+ * Promise-returning equivalent for concurrent callers. Routing matches
1527
+ * the sync version exactly (filter shape, T377.4 type_index_paginated
1528
+ * fast path when filter.limit is set).
1529
+ */
1530
+ listTagsAsync(filter?: TagFilter): Promise<Entity[]>;
1470
1531
  /**
1471
1532
  * List all relations with optional filter
1472
1533
  *