@theihtisham/agent-shadow-brain 5.2.0 → 6.0.2
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 +310 -1014
- package/dist/brain/agent-firewall.d.ts +7 -0
- package/dist/brain/agent-firewall.d.ts.map +1 -0
- package/dist/brain/agent-firewall.js +152 -0
- package/dist/brain/agent-firewall.js.map +1 -0
- package/dist/brain/agent-handoff.d.ts +19 -0
- package/dist/brain/agent-handoff.d.ts.map +1 -0
- package/dist/brain/agent-handoff.js +127 -0
- package/dist/brain/agent-handoff.js.map +1 -0
- package/dist/brain/air-gap.d.ts +23 -0
- package/dist/brain/air-gap.d.ts.map +1 -0
- package/dist/brain/air-gap.js +137 -0
- package/dist/brain/air-gap.js.map +1 -0
- package/dist/brain/attention-heatmap.d.ts +24 -0
- package/dist/brain/attention-heatmap.d.ts.map +1 -0
- package/dist/brain/attention-heatmap.js +108 -0
- package/dist/brain/attention-heatmap.js.map +1 -0
- package/dist/brain/auto-setup.js +19 -14
- package/dist/brain/auto-setup.js.map +1 -1
- package/dist/brain/auto-update.js +1 -1
- package/dist/brain/brain-3d.d.ts +79 -0
- package/dist/brain/brain-3d.d.ts.map +1 -0
- package/dist/brain/brain-3d.js +468 -0
- package/dist/brain/brain-3d.js.map +1 -0
- package/dist/brain/brain-active-learner.d.ts +74 -0
- package/dist/brain/brain-active-learner.d.ts.map +1 -0
- package/dist/brain/brain-active-learner.js +425 -0
- package/dist/brain/brain-active-learner.js.map +1 -0
- package/dist/brain/brain-ascii.d.ts +32 -0
- package/dist/brain/brain-ascii.d.ts.map +1 -0
- package/dist/brain/brain-ascii.js +402 -0
- package/dist/brain/brain-ascii.js.map +1 -0
- package/dist/brain/brain-chat.d.ts +42 -0
- package/dist/brain/brain-chat.d.ts.map +1 -0
- package/dist/brain/brain-chat.js +162 -0
- package/dist/brain/brain-chat.js.map +1 -0
- package/dist/brain/brain-cinema.d.ts +45 -0
- package/dist/brain/brain-cinema.d.ts.map +1 -0
- package/dist/brain/brain-cinema.js +393 -0
- package/dist/brain/brain-cinema.js.map +1 -0
- package/dist/brain/brain-coach.d.ts +45 -0
- package/dist/brain/brain-coach.d.ts.map +1 -0
- package/dist/brain/brain-coach.js +383 -0
- package/dist/brain/brain-coach.js.map +1 -0
- package/dist/brain/brain-consolidator.d.ts +56 -0
- package/dist/brain/brain-consolidator.d.ts.map +1 -0
- package/dist/brain/brain-consolidator.js +386 -0
- package/dist/brain/brain-consolidator.js.map +1 -0
- package/dist/brain/brain-contradictions.d.ts +57 -0
- package/dist/brain/brain-contradictions.d.ts.map +1 -0
- package/dist/brain/brain-contradictions.js +443 -0
- package/dist/brain/brain-contradictions.js.map +1 -0
- package/dist/brain/brain-diff.d.ts +61 -0
- package/dist/brain/brain-diff.d.ts.map +1 -0
- package/dist/brain/brain-diff.js +439 -0
- package/dist/brain/brain-diff.js.map +1 -0
- package/dist/brain/brain-dna.d.ts +59 -0
- package/dist/brain/brain-dna.d.ts.map +1 -0
- package/dist/brain/brain-dna.js +336 -0
- package/dist/brain/brain-dna.js.map +1 -0
- package/dist/brain/brain-doppelganger.d.ts +32 -0
- package/dist/brain/brain-doppelganger.d.ts.map +1 -0
- package/dist/brain/brain-doppelganger.js +417 -0
- package/dist/brain/brain-doppelganger.js.map +1 -0
- package/dist/brain/brain-encryption.d.ts +14 -0
- package/dist/brain/brain-encryption.d.ts.map +1 -0
- package/dist/brain/brain-encryption.js +68 -0
- package/dist/brain/brain-encryption.js.map +1 -0
- package/dist/brain/brain-exchange.d.ts +30 -0
- package/dist/brain/brain-exchange.d.ts.map +1 -0
- package/dist/brain/brain-exchange.js +106 -0
- package/dist/brain/brain-exchange.js.map +1 -0
- package/dist/brain/brain-garden.d.ts +18 -0
- package/dist/brain/brain-garden.d.ts.map +1 -0
- package/dist/brain/brain-garden.js +81 -0
- package/dist/brain/brain-garden.js.map +1 -0
- package/dist/brain/brain-graph-walker.d.ts +54 -0
- package/dist/brain/brain-graph-walker.d.ts.map +1 -0
- package/dist/brain/brain-graph-walker.js +412 -0
- package/dist/brain/brain-graph-walker.js.map +1 -0
- package/dist/brain/brain-holiday-card.d.ts +50 -0
- package/dist/brain/brain-holiday-card.d.ts.map +1 -0
- package/dist/brain/brain-holiday-card.js +432 -0
- package/dist/brain/brain-holiday-card.js.map +1 -0
- package/dist/brain/brain-memes.d.ts +44 -0
- package/dist/brain/brain-memes.d.ts.map +1 -0
- package/dist/brain/brain-memes.js +438 -0
- package/dist/brain/brain-memes.js.map +1 -0
- package/dist/brain/brain-memory-tiers.d.ts +67 -0
- package/dist/brain/brain-memory-tiers.d.ts.map +1 -0
- package/dist/brain/brain-memory-tiers.js +292 -0
- package/dist/brain/brain-memory-tiers.js.map +1 -0
- package/dist/brain/brain-notebook.d.ts +68 -0
- package/dist/brain/brain-notebook.d.ts.map +1 -0
- package/dist/brain/brain-notebook.js +379 -0
- package/dist/brain/brain-notebook.js.map +1 -0
- package/dist/brain/brain-portability.js +1 -1
- package/dist/brain/brain-quantize.d.ts +62 -0
- package/dist/brain/brain-quantize.d.ts.map +1 -0
- package/dist/brain/brain-quantize.js +346 -0
- package/dist/brain/brain-quantize.js.map +1 -0
- package/dist/brain/brain-query-expander.d.ts +31 -0
- package/dist/brain/brain-query-expander.d.ts.map +1 -0
- package/dist/brain/brain-query-expander.js +417 -0
- package/dist/brain/brain-query-expander.js.map +1 -0
- package/dist/brain/brain-quest.d.ts +58 -0
- package/dist/brain/brain-quest.d.ts.map +1 -0
- package/dist/brain/brain-quest.js +541 -0
- package/dist/brain/brain-quest.js.map +1 -0
- package/dist/brain/brain-recall-cache.d.ts +73 -0
- package/dist/brain/brain-recall-cache.d.ts.map +1 -0
- package/dist/brain/brain-recall-cache.js +444 -0
- package/dist/brain/brain-recall-cache.js.map +1 -0
- package/dist/brain/brain-reflex.d.ts +55 -0
- package/dist/brain/brain-reflex.d.ts.map +1 -0
- package/dist/brain/brain-reflex.js +364 -0
- package/dist/brain/brain-reflex.js.map +1 -0
- package/dist/brain/brain-replay.d.ts +74 -0
- package/dist/brain/brain-replay.d.ts.map +1 -0
- package/dist/brain/brain-replay.js +336 -0
- package/dist/brain/brain-replay.js.map +1 -0
- package/dist/brain/brain-rerank.d.ts +39 -0
- package/dist/brain/brain-rerank.d.ts.map +1 -0
- package/dist/brain/brain-rerank.js +216 -0
- package/dist/brain/brain-rerank.js.map +1 -0
- package/dist/brain/brain-roast.d.ts +44 -0
- package/dist/brain/brain-roast.d.ts.map +1 -0
- package/dist/brain/brain-roast.js +566 -0
- package/dist/brain/brain-roast.js.map +1 -0
- package/dist/brain/brain-sonification.d.ts +57 -0
- package/dist/brain/brain-sonification.d.ts.map +1 -0
- package/dist/brain/brain-sonification.js +286 -0
- package/dist/brain/brain-sonification.js.map +1 -0
- package/dist/brain/brain-tarot.d.ts +49 -0
- package/dist/brain/brain-tarot.d.ts.map +1 -0
- package/dist/brain/brain-tarot.js +634 -0
- package/dist/brain/brain-tarot.js.map +1 -0
- package/dist/brain/brain-time-capsule.d.ts +80 -0
- package/dist/brain/brain-time-capsule.d.ts.map +1 -0
- package/dist/brain/brain-time-capsule.js +289 -0
- package/dist/brain/brain-time-capsule.js.map +1 -0
- package/dist/brain/brain-trophies.d.ts +60 -0
- package/dist/brain/brain-trophies.d.ts.map +1 -0
- package/dist/brain/brain-trophies.js +431 -0
- package/dist/brain/brain-trophies.js.map +1 -0
- package/dist/brain/brain-working-memory.d.ts +78 -0
- package/dist/brain/brain-working-memory.d.ts.map +1 -0
- package/dist/brain/brain-working-memory.js +367 -0
- package/dist/brain/brain-working-memory.js.map +1 -0
- package/dist/brain/branch-brain.d.ts +23 -0
- package/dist/brain/branch-brain.d.ts.map +1 -0
- package/dist/brain/branch-brain.js +159 -0
- package/dist/brain/branch-brain.js.map +1 -0
- package/dist/brain/calibration-monitor.d.ts +20 -0
- package/dist/brain/calibration-monitor.d.ts.map +1 -0
- package/dist/brain/calibration-monitor.js +144 -0
- package/dist/brain/calibration-monitor.js.map +1 -0
- package/dist/brain/causal-chains.d.ts +37 -0
- package/dist/brain/causal-chains.d.ts.map +1 -0
- package/dist/brain/causal-chains.js +250 -0
- package/dist/brain/causal-chains.js.map +1 -0
- package/dist/brain/collision-detective.d.ts +32 -0
- package/dist/brain/collision-detective.d.ts.map +1 -0
- package/dist/brain/collision-detective.js +233 -0
- package/dist/brain/collision-detective.js.map +1 -0
- package/dist/brain/confidence-gate.d.ts +69 -0
- package/dist/brain/confidence-gate.d.ts.map +1 -0
- package/dist/brain/confidence-gate.js +244 -0
- package/dist/brain/confidence-gate.js.map +1 -0
- package/dist/brain/constitution.d.ts +59 -0
- package/dist/brain/constitution.d.ts.map +1 -0
- package/dist/brain/constitution.js +315 -0
- package/dist/brain/constitution.js.map +1 -0
- package/dist/brain/cost-aware-spawner.d.ts +7 -0
- package/dist/brain/cost-aware-spawner.d.ts.map +1 -0
- package/dist/brain/cost-aware-spawner.js +77 -0
- package/dist/brain/cost-aware-spawner.js.map +1 -0
- package/dist/brain/dream-engine.d.ts +35 -0
- package/dist/brain/dream-engine.d.ts.map +1 -0
- package/dist/brain/dream-engine.js +273 -0
- package/dist/brain/dream-engine.js.map +1 -0
- package/dist/brain/embeddings-v2.d.ts +58 -0
- package/dist/brain/embeddings-v2.d.ts.map +1 -0
- package/dist/brain/embeddings-v2.js +344 -0
- package/dist/brain/embeddings-v2.js.map +1 -0
- package/dist/brain/embeddings.d.ts +27 -0
- package/dist/brain/embeddings.d.ts.map +1 -0
- package/dist/brain/embeddings.js +175 -0
- package/dist/brain/embeddings.js.map +1 -0
- package/dist/brain/forgetting-curve.d.ts +21 -0
- package/dist/brain/forgetting-curve.d.ts.map +1 -0
- package/dist/brain/forgetting-curve.js +174 -0
- package/dist/brain/forgetting-curve.js.map +1 -0
- package/dist/brain/formal-verification-bridge.d.ts +26 -0
- package/dist/brain/formal-verification-bridge.d.ts.map +1 -0
- package/dist/brain/formal-verification-bridge.js +219 -0
- package/dist/brain/formal-verification-bridge.js.map +1 -0
- package/dist/brain/global-brain.d.ts +8 -1
- package/dist/brain/global-brain.d.ts.map +1 -1
- package/dist/brain/global-brain.js +24 -0
- package/dist/brain/global-brain.js.map +1 -1
- package/dist/brain/hallucination-quarantine.d.ts +26 -0
- package/dist/brain/hallucination-quarantine.d.ts.map +1 -0
- package/dist/brain/hallucination-quarantine.js +135 -0
- package/dist/brain/hallucination-quarantine.js.map +1 -0
- package/dist/brain/hive-accelerator.d.ts +39 -0
- package/dist/brain/hive-accelerator.d.ts.map +1 -0
- package/dist/brain/hive-accelerator.js +152 -0
- package/dist/brain/hive-accelerator.js.map +1 -0
- package/dist/brain/hive-voice.d.ts +71 -0
- package/dist/brain/hive-voice.d.ts.map +1 -0
- package/dist/brain/hive-voice.js +352 -0
- package/dist/brain/hive-voice.js.map +1 -0
- package/dist/brain/json-output.d.ts +26 -0
- package/dist/brain/json-output.d.ts.map +1 -0
- package/dist/brain/json-output.js +112 -0
- package/dist/brain/json-output.js.map +1 -0
- package/dist/brain/l0-cache.js +1 -1
- package/dist/brain/l0-cache.js.map +1 -1
- package/dist/brain/local-llm.d.ts +20 -0
- package/dist/brain/local-llm.d.ts.map +1 -0
- package/dist/brain/local-llm.js +132 -0
- package/dist/brain/local-llm.js.map +1 -0
- package/dist/brain/markdown-export.d.ts +48 -0
- package/dist/brain/markdown-export.d.ts.map +1 -0
- package/dist/brain/markdown-export.js +382 -0
- package/dist/brain/markdown-export.js.map +1 -0
- package/dist/brain/mcp-server.d.ts +40 -0
- package/dist/brain/mcp-server.d.ts.map +1 -1
- package/dist/brain/mcp-server.js +395 -12
- package/dist/brain/mcp-server.js.map +1 -1
- package/dist/brain/model-registry.d.ts +96 -0
- package/dist/brain/model-registry.d.ts.map +1 -0
- package/dist/brain/model-registry.js +585 -0
- package/dist/brain/model-registry.js.map +1 -0
- package/dist/brain/multimodal-vision.d.ts +38 -0
- package/dist/brain/multimodal-vision.d.ts.map +1 -0
- package/dist/brain/multimodal-vision.js +257 -0
- package/dist/brain/multimodal-vision.js.map +1 -0
- package/dist/brain/orchestrator.js +1 -1
- package/dist/brain/otel-lite.d.ts +71 -0
- package/dist/brain/otel-lite.d.ts.map +1 -0
- package/dist/brain/otel-lite.js +232 -0
- package/dist/brain/otel-lite.js.map +1 -0
- package/dist/brain/pr-auto-review.d.ts +17 -0
- package/dist/brain/pr-auto-review.d.ts.map +1 -0
- package/dist/brain/pr-auto-review.js +73 -0
- package/dist/brain/pr-auto-review.js.map +1 -0
- package/dist/brain/pre-mortem.d.ts +21 -0
- package/dist/brain/pre-mortem.d.ts.map +1 -0
- package/dist/brain/pre-mortem.js +210 -0
- package/dist/brain/pre-mortem.js.map +1 -0
- package/dist/brain/prompt-cache.d.ts +54 -0
- package/dist/brain/prompt-cache.d.ts.map +1 -0
- package/dist/brain/prompt-cache.js +105 -0
- package/dist/brain/prompt-cache.js.map +1 -0
- package/dist/brain/reputation-ledger.d.ts +42 -0
- package/dist/brain/reputation-ledger.d.ts.map +1 -0
- package/dist/brain/reputation-ledger.js +326 -0
- package/dist/brain/reputation-ledger.js.map +1 -0
- package/dist/brain/session-hooks.d.ts +19 -0
- package/dist/brain/session-hooks.d.ts.map +1 -1
- package/dist/brain/session-hooks.js +249 -18
- package/dist/brain/session-hooks.js.map +1 -1
- package/dist/brain/subagent-bridge.d.ts +46 -0
- package/dist/brain/subagent-bridge.d.ts.map +1 -0
- package/dist/brain/subagent-bridge.js +364 -0
- package/dist/brain/subagent-bridge.js.map +1 -0
- package/dist/brain/swarm-debate.d.ts +22 -0
- package/dist/brain/swarm-debate.d.ts.map +1 -0
- package/dist/brain/swarm-debate.js +134 -0
- package/dist/brain/swarm-debate.js.map +1 -0
- package/dist/brain/team-brain-sync.d.ts +22 -0
- package/dist/brain/team-brain-sync.d.ts.map +1 -0
- package/dist/brain/team-brain-sync.js +132 -0
- package/dist/brain/team-brain-sync.js.map +1 -0
- package/dist/brain/token-economy.d.ts +25 -0
- package/dist/brain/token-economy.d.ts.map +1 -0
- package/dist/brain/token-economy.js +216 -0
- package/dist/brain/token-economy.js.map +1 -0
- package/dist/brain/voice-mode.d.ts +15 -0
- package/dist/brain/voice-mode.d.ts.map +1 -0
- package/dist/brain/voice-mode.js +97 -0
- package/dist/brain/voice-mode.js.map +1 -0
- package/dist/cli.js +1702 -4
- package/dist/cli.js.map +1 -1
- package/dist/dashboard/server.d.ts +6 -0
- package/dist/dashboard/server.d.ts.map +1 -1
- package/dist/dashboard/server.js +1118 -368
- package/dist/dashboard/server.js.map +1 -1
- package/dist/dashboard/v6-dashboard-html.d.ts +2 -0
- package/dist/dashboard/v6-dashboard-html.d.ts.map +1 -0
- package/dist/dashboard/v6-dashboard-html.js +2474 -0
- package/dist/dashboard/v6-dashboard-html.js.map +1 -0
- package/dist/index.d.ts +27 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +29 -1
- package/dist/index.js.map +1 -1
- package/dist/types.d.ts +518 -2
- package/dist/types.d.ts.map +1 -1
- package/package.json +33 -4
|
@@ -0,0 +1,346 @@
|
|
|
1
|
+
// src/brain/brain-quantize.ts — int8 vector quantization for the brain
|
|
2
|
+
// v6.0.2 — Hive Mind Edition
|
|
3
|
+
//
|
|
4
|
+
// Float32 vectors are 4x bigger on disk and in memory than they need to be for
|
|
5
|
+
// approximate-nearest-neighbor recall. Symmetric int8 quantization preserves
|
|
6
|
+
// recall to within ~1% on unit-norm vectors while shrinking the working set
|
|
7
|
+
// by 4x. That means the same RAM budget covers four times as many memories
|
|
8
|
+
// and the cold-start read of a sharded JSON index is dramatically faster.
|
|
9
|
+
//
|
|
10
|
+
// Design:
|
|
11
|
+
// - Symmetric per-vector int8: scale = max(|v_i|) / 127, q_i = round(v_i/scale).
|
|
12
|
+
// Per-vector scale (not per-tensor) handles the case where some memories
|
|
13
|
+
// have a much wider dynamic range than others (e.g. Ollama dense vs hash).
|
|
14
|
+
// - Compressed format ".q8" is a tight binary:
|
|
15
|
+
// magic : 4 bytes ascii "Q8I0"
|
|
16
|
+
// version : uint32 1
|
|
17
|
+
// dim : uint32 embedding dimension
|
|
18
|
+
// count : uint32 number of entries
|
|
19
|
+
// entries[] : { float64 scale; int8[dim] q; uint16 idLen; utf8 id[idLen] }
|
|
20
|
+
// - Direct cosine on int8: integer dot then divide by scaleA*scaleB and
|
|
21
|
+
// (dim * 127^2). Skips a dequantize-into-float32 round trip in the hot path.
|
|
22
|
+
//
|
|
23
|
+
// Exposed: BrainQuantize, getBrainQuantize(), resetBrainQuantizeForTests().
|
|
24
|
+
// .quantize(vec)
|
|
25
|
+
// .dequantize(q, scale)
|
|
26
|
+
// .cosineQuantized(a, scaleA, b, scaleB)
|
|
27
|
+
// .compressIndex(srcPath, outPath)
|
|
28
|
+
// .loadCompressedIndex(path)
|
|
29
|
+
// .quantizeRoundtripError(vectors)
|
|
30
|
+
import * as fs from 'fs';
|
|
31
|
+
import * as path from 'path';
|
|
32
|
+
const MAGIC = Buffer.from('Q8I0', 'ascii');
|
|
33
|
+
const VERSION = 1;
|
|
34
|
+
const HEADER_BYTES = 4 + 4 + 4 + 4; // magic + version + dim + count
|
|
35
|
+
export class BrainQuantize {
|
|
36
|
+
/** Symmetric int8 quantization with per-vector scale. */
|
|
37
|
+
quantize(vector) {
|
|
38
|
+
if (!vector || vector.length === 0)
|
|
39
|
+
return new Int8Array(0);
|
|
40
|
+
let maxAbs = 0;
|
|
41
|
+
for (let i = 0; i < vector.length; i++) {
|
|
42
|
+
const a = Math.abs(vector[i]);
|
|
43
|
+
if (a > maxAbs)
|
|
44
|
+
maxAbs = a;
|
|
45
|
+
}
|
|
46
|
+
const out = new Int8Array(vector.length);
|
|
47
|
+
if (maxAbs === 0)
|
|
48
|
+
return out; // all zeros — quantizes to all zeros
|
|
49
|
+
const scale = maxAbs / 127;
|
|
50
|
+
const inv = 1 / scale;
|
|
51
|
+
for (let i = 0; i < vector.length; i++) {
|
|
52
|
+
const q = Math.round(vector[i] * inv);
|
|
53
|
+
out[i] = q > 127 ? 127 : q < -127 ? -127 : q;
|
|
54
|
+
}
|
|
55
|
+
return out;
|
|
56
|
+
}
|
|
57
|
+
/** Recover an approximation of the original float vector. */
|
|
58
|
+
dequantize(q, scale) {
|
|
59
|
+
if (!q || q.length === 0)
|
|
60
|
+
return [];
|
|
61
|
+
const out = new Array(q.length);
|
|
62
|
+
for (let i = 0; i < q.length; i++)
|
|
63
|
+
out[i] = q[i] * scale;
|
|
64
|
+
return out;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Cosine similarity on quantized vectors WITHOUT dequantizing first.
|
|
68
|
+
*
|
|
69
|
+
* If `a` and `b` were derived from unit-norm float vectors, the cosine is
|
|
70
|
+
* just the dot product after rescaling. We compute the integer dot then
|
|
71
|
+
* apply `scaleA * scaleB` to convert back to the float dot, and clamp to
|
|
72
|
+
* [-1, 1] for numeric safety. Note: the dim/127^2 factor in the spec is the
|
|
73
|
+
* theoretical worst-case scale (when every element is ±127); the actual
|
|
74
|
+
* normalization is captured entirely by scaleA*scaleB, so we use that and
|
|
75
|
+
* do not double-divide. The clamp guards against quantization rounding
|
|
76
|
+
* pushing the result slightly out of range.
|
|
77
|
+
*/
|
|
78
|
+
cosineQuantized(a, scaleA, b, scaleB) {
|
|
79
|
+
if (!a || !b || a.length === 0 || b.length === 0)
|
|
80
|
+
return 0;
|
|
81
|
+
const n = Math.min(a.length, b.length);
|
|
82
|
+
let dot = 0;
|
|
83
|
+
for (let i = 0; i < n; i++)
|
|
84
|
+
dot += a[i] * b[i];
|
|
85
|
+
const sim = dot * scaleA * scaleB;
|
|
86
|
+
if (sim > 1)
|
|
87
|
+
return 1;
|
|
88
|
+
if (sim < -1)
|
|
89
|
+
return -1;
|
|
90
|
+
return sim;
|
|
91
|
+
}
|
|
92
|
+
/** Convert a v2 sharded JSON index into a single compressed .q8 binary. */
|
|
93
|
+
async compressIndex(srcPath, outPath) {
|
|
94
|
+
const start = Date.now();
|
|
95
|
+
const docs = this.readShardDocs(srcPath);
|
|
96
|
+
if (docs.length === 0) {
|
|
97
|
+
// Empty index → still write a valid empty file.
|
|
98
|
+
const header = Buffer.alloc(HEADER_BYTES);
|
|
99
|
+
MAGIC.copy(header, 0);
|
|
100
|
+
header.writeUInt32LE(VERSION, 4);
|
|
101
|
+
header.writeUInt32LE(0, 8);
|
|
102
|
+
header.writeUInt32LE(0, 12);
|
|
103
|
+
this.atomicWrite(outPath, header);
|
|
104
|
+
return {
|
|
105
|
+
originalBytes: this.measureBytes(srcPath),
|
|
106
|
+
compressedBytes: header.length,
|
|
107
|
+
compressionRatio: 0,
|
|
108
|
+
vectorCount: 0,
|
|
109
|
+
dim: 0,
|
|
110
|
+
encodingError: { meanAbs: 0, max: 0 },
|
|
111
|
+
durationMs: Date.now() - start,
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
const dim = docs[0].vector.length;
|
|
115
|
+
const quantized = [];
|
|
116
|
+
for (const d of docs) {
|
|
117
|
+
if (!d.vector || d.vector.length !== dim)
|
|
118
|
+
continue; // skip ragged
|
|
119
|
+
const q = this.quantize(d.vector);
|
|
120
|
+
const scale = this.scaleOf(d.vector);
|
|
121
|
+
quantized.push({ id: d.id, q, scale, original: d.vector });
|
|
122
|
+
}
|
|
123
|
+
// Estimate output size up front so we allocate one Buffer.
|
|
124
|
+
let bodyBytes = 0;
|
|
125
|
+
const idBufs = [];
|
|
126
|
+
for (const e of quantized) {
|
|
127
|
+
const idBuf = Buffer.from(e.id, 'utf-8');
|
|
128
|
+
idBufs.push(idBuf);
|
|
129
|
+
bodyBytes += 8 + dim + 2 + idBuf.length;
|
|
130
|
+
}
|
|
131
|
+
const totalBytes = HEADER_BYTES + bodyBytes;
|
|
132
|
+
const buf = Buffer.alloc(totalBytes);
|
|
133
|
+
MAGIC.copy(buf, 0);
|
|
134
|
+
buf.writeUInt32LE(VERSION, 4);
|
|
135
|
+
buf.writeUInt32LE(dim, 8);
|
|
136
|
+
buf.writeUInt32LE(quantized.length, 12);
|
|
137
|
+
let offset = HEADER_BYTES;
|
|
138
|
+
for (let i = 0; i < quantized.length; i++) {
|
|
139
|
+
const e = quantized[i];
|
|
140
|
+
buf.writeDoubleLE(e.scale, offset);
|
|
141
|
+
offset += 8;
|
|
142
|
+
// int8 array copy — Buffer views the Int8Array directly.
|
|
143
|
+
Buffer.from(e.q.buffer, e.q.byteOffset, e.q.byteLength).copy(buf, offset);
|
|
144
|
+
offset += dim;
|
|
145
|
+
const idBuf = idBufs[i];
|
|
146
|
+
buf.writeUInt16LE(idBuf.length, offset);
|
|
147
|
+
offset += 2;
|
|
148
|
+
idBuf.copy(buf, offset);
|
|
149
|
+
offset += idBuf.length;
|
|
150
|
+
}
|
|
151
|
+
this.atomicWrite(outPath, buf);
|
|
152
|
+
// Encoding error sample (cap at 500 vectors so this stays cheap).
|
|
153
|
+
const sampleN = Math.min(500, quantized.length);
|
|
154
|
+
let sumAbs = 0, maxAbs = 0, count = 0;
|
|
155
|
+
for (let i = 0; i < sampleN; i++) {
|
|
156
|
+
const e = quantized[i];
|
|
157
|
+
const recon = this.dequantize(e.q, e.scale);
|
|
158
|
+
for (let j = 0; j < dim; j++) {
|
|
159
|
+
const err = Math.abs(recon[j] - e.original[j]);
|
|
160
|
+
sumAbs += err;
|
|
161
|
+
if (err > maxAbs)
|
|
162
|
+
maxAbs = err;
|
|
163
|
+
count++;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
const originalBytes = this.measureBytes(srcPath);
|
|
167
|
+
return {
|
|
168
|
+
originalBytes,
|
|
169
|
+
compressedBytes: totalBytes,
|
|
170
|
+
compressionRatio: originalBytes > 0 ? +(originalBytes / totalBytes).toFixed(3) : 0,
|
|
171
|
+
vectorCount: quantized.length,
|
|
172
|
+
dim,
|
|
173
|
+
encodingError: {
|
|
174
|
+
meanAbs: count > 0 ? +(sumAbs / count).toFixed(6) : 0,
|
|
175
|
+
max: +maxAbs.toFixed(6),
|
|
176
|
+
},
|
|
177
|
+
durationMs: Date.now() - start,
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
/** Load a .q8 file and return vectors plus a ready-to-use recall function. */
|
|
181
|
+
async loadCompressedIndex(filePath) {
|
|
182
|
+
const buf = await fs.promises.readFile(filePath);
|
|
183
|
+
if (buf.length < HEADER_BYTES)
|
|
184
|
+
throw new Error(`q8 index too short: ${buf.length} bytes`);
|
|
185
|
+
if (buf.subarray(0, 4).compare(MAGIC) !== 0)
|
|
186
|
+
throw new Error('q8 index: bad magic');
|
|
187
|
+
const version = buf.readUInt32LE(4);
|
|
188
|
+
if (version !== VERSION)
|
|
189
|
+
throw new Error(`q8 index: unsupported version ${version}`);
|
|
190
|
+
const dim = buf.readUInt32LE(8);
|
|
191
|
+
const count = buf.readUInt32LE(12);
|
|
192
|
+
const vectors = new Map();
|
|
193
|
+
let offset = HEADER_BYTES;
|
|
194
|
+
for (let i = 0; i < count; i++) {
|
|
195
|
+
if (offset + 8 + dim + 2 > buf.length)
|
|
196
|
+
throw new Error(`q8 index truncated at entry ${i}`);
|
|
197
|
+
const scale = buf.readDoubleLE(offset);
|
|
198
|
+
offset += 8;
|
|
199
|
+
// Copy out of the parent buffer so the underlying ArrayBuffer can be GC'd
|
|
200
|
+
// and the Int8Array view stays tight to its dim bytes.
|
|
201
|
+
const q = new Int8Array(dim);
|
|
202
|
+
buf.copy(Buffer.from(q.buffer, q.byteOffset, q.byteLength), 0, offset, offset + dim);
|
|
203
|
+
offset += dim;
|
|
204
|
+
const idLen = buf.readUInt16LE(offset);
|
|
205
|
+
offset += 2;
|
|
206
|
+
if (offset + idLen > buf.length)
|
|
207
|
+
throw new Error(`q8 index truncated id at entry ${i}`);
|
|
208
|
+
const id = buf.subarray(offset, offset + idLen).toString('utf-8');
|
|
209
|
+
offset += idLen;
|
|
210
|
+
vectors.set(id, { q, scale });
|
|
211
|
+
}
|
|
212
|
+
const recallFn = (query, topK) => {
|
|
213
|
+
if (vectors.size === 0 || !query || query.length === 0 || topK <= 0)
|
|
214
|
+
return [];
|
|
215
|
+
const qVec = query.length === dim ? query : padOrTruncate(query, dim);
|
|
216
|
+
const qInt = this.quantize(qVec);
|
|
217
|
+
const qScale = this.scaleOf(qVec);
|
|
218
|
+
const hits = [];
|
|
219
|
+
for (const [id, entry] of vectors) {
|
|
220
|
+
const score = this.cosineQuantized(qInt, qScale, entry.q, entry.scale);
|
|
221
|
+
hits.push({ id, score });
|
|
222
|
+
}
|
|
223
|
+
hits.sort((a, b) => b.score - a.score);
|
|
224
|
+
return hits.slice(0, topK);
|
|
225
|
+
};
|
|
226
|
+
return { vectors, dim, recallFn };
|
|
227
|
+
}
|
|
228
|
+
/** Self-test: report mean / max absolute reconstruction error on `vectors`. */
|
|
229
|
+
quantizeRoundtripError(vectors) {
|
|
230
|
+
if (!vectors || vectors.length === 0)
|
|
231
|
+
return { meanAbs: 0, max: 0, samples: 0 };
|
|
232
|
+
let sum = 0, maxAbs = 0, n = 0;
|
|
233
|
+
for (const v of vectors) {
|
|
234
|
+
if (!v || v.length === 0)
|
|
235
|
+
continue;
|
|
236
|
+
const q = this.quantize(v);
|
|
237
|
+
const scale = this.scaleOf(v);
|
|
238
|
+
for (let i = 0; i < v.length; i++) {
|
|
239
|
+
const recon = q[i] * scale;
|
|
240
|
+
const err = Math.abs(recon - v[i]);
|
|
241
|
+
sum += err;
|
|
242
|
+
if (err > maxAbs)
|
|
243
|
+
maxAbs = err;
|
|
244
|
+
n++;
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
return {
|
|
248
|
+
meanAbs: n > 0 ? +(sum / n).toFixed(6) : 0,
|
|
249
|
+
max: +maxAbs.toFixed(6),
|
|
250
|
+
samples: n,
|
|
251
|
+
};
|
|
252
|
+
}
|
|
253
|
+
// ── Internals ──────────────────────────────────────────────────────────
|
|
254
|
+
scaleOf(vector) {
|
|
255
|
+
let maxAbs = 0;
|
|
256
|
+
for (let i = 0; i < vector.length; i++) {
|
|
257
|
+
const a = Math.abs(vector[i]);
|
|
258
|
+
if (a > maxAbs)
|
|
259
|
+
maxAbs = a;
|
|
260
|
+
}
|
|
261
|
+
return maxAbs === 0 ? 0 : maxAbs / 127;
|
|
262
|
+
}
|
|
263
|
+
readShardDocs(srcPath) {
|
|
264
|
+
// Accept either a single JSON file with {docs: [...]} or a directory of shards.
|
|
265
|
+
const docs = [];
|
|
266
|
+
try {
|
|
267
|
+
const stat = fs.statSync(srcPath);
|
|
268
|
+
if (stat.isDirectory()) {
|
|
269
|
+
for (const f of fs.readdirSync(srcPath)) {
|
|
270
|
+
if (!f.endsWith('.json'))
|
|
271
|
+
continue;
|
|
272
|
+
const raw = fs.readFileSync(path.join(srcPath, f), 'utf-8');
|
|
273
|
+
this.collectDocs(raw, docs);
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
else {
|
|
277
|
+
const raw = fs.readFileSync(srcPath, 'utf-8');
|
|
278
|
+
this.collectDocs(raw, docs);
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
catch { /* missing or unreadable → empty result */ }
|
|
282
|
+
return docs;
|
|
283
|
+
}
|
|
284
|
+
collectDocs(raw, out) {
|
|
285
|
+
try {
|
|
286
|
+
const parsed = JSON.parse(raw);
|
|
287
|
+
if (Array.isArray(parsed.docs)) {
|
|
288
|
+
for (const d of parsed.docs) {
|
|
289
|
+
if (d && typeof d.id === 'string' && Array.isArray(d.vector))
|
|
290
|
+
out.push({ id: d.id, vector: d.vector });
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
else if (parsed.vectors && typeof parsed.vectors === 'object') {
|
|
294
|
+
// Legacy v1 cache shape: { vectors: { id: number[] } }
|
|
295
|
+
for (const [id, vec] of Object.entries(parsed.vectors)) {
|
|
296
|
+
if (Array.isArray(vec))
|
|
297
|
+
out.push({ id, vector: vec });
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
catch { /* skip corrupt shard */ }
|
|
302
|
+
}
|
|
303
|
+
measureBytes(srcPath) {
|
|
304
|
+
try {
|
|
305
|
+
const stat = fs.statSync(srcPath);
|
|
306
|
+
if (stat.isFile())
|
|
307
|
+
return stat.size;
|
|
308
|
+
if (stat.isDirectory()) {
|
|
309
|
+
let total = 0;
|
|
310
|
+
for (const f of fs.readdirSync(srcPath)) {
|
|
311
|
+
try {
|
|
312
|
+
total += fs.statSync(path.join(srcPath, f)).size;
|
|
313
|
+
}
|
|
314
|
+
catch { /* skip */ }
|
|
315
|
+
}
|
|
316
|
+
return total;
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
catch { /* missing */ }
|
|
320
|
+
return 0;
|
|
321
|
+
}
|
|
322
|
+
atomicWrite(filePath, data) {
|
|
323
|
+
fs.mkdirSync(path.dirname(filePath), { recursive: true });
|
|
324
|
+
const tmp = filePath + '.tmp';
|
|
325
|
+
fs.writeFileSync(tmp, data);
|
|
326
|
+
fs.renameSync(tmp, filePath);
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
function padOrTruncate(v, dim) {
|
|
330
|
+
if (v.length === dim)
|
|
331
|
+
return v;
|
|
332
|
+
if (v.length > dim)
|
|
333
|
+
return v.slice(0, dim);
|
|
334
|
+
const out = v.slice();
|
|
335
|
+
while (out.length < dim)
|
|
336
|
+
out.push(0);
|
|
337
|
+
return out;
|
|
338
|
+
}
|
|
339
|
+
let _instance = null;
|
|
340
|
+
export function getBrainQuantize() {
|
|
341
|
+
if (!_instance)
|
|
342
|
+
_instance = new BrainQuantize();
|
|
343
|
+
return _instance;
|
|
344
|
+
}
|
|
345
|
+
export function resetBrainQuantizeForTests() { _instance = null; }
|
|
346
|
+
//# sourceMappingURL=brain-quantize.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"brain-quantize.js","sourceRoot":"","sources":["../../src/brain/brain-quantize.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
export type ExpansionTechnique = 'synonyms' | 'abbrev' | 'related' | 'hyde';
|
|
2
|
+
export interface ExpansionOptions {
|
|
3
|
+
techniques?: ExpansionTechnique[];
|
|
4
|
+
maxTerms?: number;
|
|
5
|
+
hydeModel?: string;
|
|
6
|
+
}
|
|
7
|
+
export interface ExpansionResult {
|
|
8
|
+
original: string;
|
|
9
|
+
expanded: string;
|
|
10
|
+
techniques_used: string[];
|
|
11
|
+
terms_added: string[];
|
|
12
|
+
hyde_doc?: string;
|
|
13
|
+
durationMs: number;
|
|
14
|
+
}
|
|
15
|
+
export declare class BrainQueryExpander {
|
|
16
|
+
/** Expand a query using selected techniques; returns the densified search text. */
|
|
17
|
+
expand(query: string, opts?: ExpansionOptions): Promise<ExpansionResult>;
|
|
18
|
+
/**
|
|
19
|
+
* Run all techniques and return the densest expansion. Best for direct use
|
|
20
|
+
* by retrievers that don't want to think about technique selection.
|
|
21
|
+
*/
|
|
22
|
+
combineAll(query: string, opts?: ExpansionOptions): Promise<ExpansionResult>;
|
|
23
|
+
private lookupRelatedEntities;
|
|
24
|
+
private generateHyde;
|
|
25
|
+
private probeHydeModel;
|
|
26
|
+
private templateHyde;
|
|
27
|
+
private persist;
|
|
28
|
+
}
|
|
29
|
+
export declare function getBrainQueryExpander(): BrainQueryExpander;
|
|
30
|
+
export declare function resetBrainQueryExpanderForTests(): void;
|
|
31
|
+
//# sourceMappingURL=brain-query-expander.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"brain-query-expander.d.ts","sourceRoot":"","sources":["../../src/brain/brain-query-expander.ts"],"names":[],"mappings":"AAkCA,MAAM,MAAM,kBAAkB,GAAG,UAAU,GAAG,QAAQ,GAAG,SAAS,GAAG,MAAM,CAAC;AAE5E,MAAM,WAAW,gBAAgB;IAC/B,UAAU,CAAC,EAAE,kBAAkB,EAAE,CAAC;IAClC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;CACpB;AA0LD,qBAAa,kBAAkB;IAC7B,mFAAmF;IAC7E,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,eAAe,CAAC;IAkF9E;;;OAGG;IACG,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,eAAe,CAAC;YASpE,qBAAqB;YAiCrB,YAAY;YAyBZ,cAAc;IAsB5B,OAAO,CAAC,YAAY;YAaN,OAAO;CAOtB;AAYD,wBAAgB,qBAAqB,IAAI,kBAAkB,CAG1D;AACD,wBAAgB,+BAA+B,IAAI,IAAI,CAAsB"}
|