@theihtisham/agent-shadow-brain 6.0.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.
Files changed (144) hide show
  1. package/README.md +107 -7
  2. package/dist/brain/brain-3d.d.ts +79 -0
  3. package/dist/brain/brain-3d.d.ts.map +1 -0
  4. package/dist/brain/brain-3d.js +468 -0
  5. package/dist/brain/brain-3d.js.map +1 -0
  6. package/dist/brain/brain-active-learner.d.ts +74 -0
  7. package/dist/brain/brain-active-learner.d.ts.map +1 -0
  8. package/dist/brain/brain-active-learner.js +425 -0
  9. package/dist/brain/brain-active-learner.js.map +1 -0
  10. package/dist/brain/brain-ascii.d.ts +32 -0
  11. package/dist/brain/brain-ascii.d.ts.map +1 -0
  12. package/dist/brain/brain-ascii.js +402 -0
  13. package/dist/brain/brain-ascii.js.map +1 -0
  14. package/dist/brain/brain-cinema.d.ts +45 -0
  15. package/dist/brain/brain-cinema.d.ts.map +1 -0
  16. package/dist/brain/brain-cinema.js +393 -0
  17. package/dist/brain/brain-cinema.js.map +1 -0
  18. package/dist/brain/brain-coach.d.ts +45 -0
  19. package/dist/brain/brain-coach.d.ts.map +1 -0
  20. package/dist/brain/brain-coach.js +383 -0
  21. package/dist/brain/brain-coach.js.map +1 -0
  22. package/dist/brain/brain-consolidator.d.ts +56 -0
  23. package/dist/brain/brain-consolidator.d.ts.map +1 -0
  24. package/dist/brain/brain-consolidator.js +386 -0
  25. package/dist/brain/brain-consolidator.js.map +1 -0
  26. package/dist/brain/brain-contradictions.d.ts +57 -0
  27. package/dist/brain/brain-contradictions.d.ts.map +1 -0
  28. package/dist/brain/brain-contradictions.js +443 -0
  29. package/dist/brain/brain-contradictions.js.map +1 -0
  30. package/dist/brain/brain-diff.d.ts +61 -0
  31. package/dist/brain/brain-diff.d.ts.map +1 -0
  32. package/dist/brain/brain-diff.js +439 -0
  33. package/dist/brain/brain-diff.js.map +1 -0
  34. package/dist/brain/brain-dna.d.ts +59 -0
  35. package/dist/brain/brain-dna.d.ts.map +1 -0
  36. package/dist/brain/brain-dna.js +336 -0
  37. package/dist/brain/brain-dna.js.map +1 -0
  38. package/dist/brain/brain-doppelganger.d.ts +32 -0
  39. package/dist/brain/brain-doppelganger.d.ts.map +1 -0
  40. package/dist/brain/brain-doppelganger.js +417 -0
  41. package/dist/brain/brain-doppelganger.js.map +1 -0
  42. package/dist/brain/brain-graph-walker.d.ts +54 -0
  43. package/dist/brain/brain-graph-walker.d.ts.map +1 -0
  44. package/dist/brain/brain-graph-walker.js +412 -0
  45. package/dist/brain/brain-graph-walker.js.map +1 -0
  46. package/dist/brain/brain-holiday-card.d.ts +50 -0
  47. package/dist/brain/brain-holiday-card.d.ts.map +1 -0
  48. package/dist/brain/brain-holiday-card.js +432 -0
  49. package/dist/brain/brain-holiday-card.js.map +1 -0
  50. package/dist/brain/brain-memes.d.ts +44 -0
  51. package/dist/brain/brain-memes.d.ts.map +1 -0
  52. package/dist/brain/brain-memes.js +438 -0
  53. package/dist/brain/brain-memes.js.map +1 -0
  54. package/dist/brain/brain-memory-tiers.d.ts +67 -0
  55. package/dist/brain/brain-memory-tiers.d.ts.map +1 -0
  56. package/dist/brain/brain-memory-tiers.js +292 -0
  57. package/dist/brain/brain-memory-tiers.js.map +1 -0
  58. package/dist/brain/brain-notebook.d.ts +68 -0
  59. package/dist/brain/brain-notebook.d.ts.map +1 -0
  60. package/dist/brain/brain-notebook.js +379 -0
  61. package/dist/brain/brain-notebook.js.map +1 -0
  62. package/dist/brain/brain-quantize.d.ts +62 -0
  63. package/dist/brain/brain-quantize.d.ts.map +1 -0
  64. package/dist/brain/brain-quantize.js +346 -0
  65. package/dist/brain/brain-quantize.js.map +1 -0
  66. package/dist/brain/brain-query-expander.d.ts +31 -0
  67. package/dist/brain/brain-query-expander.d.ts.map +1 -0
  68. package/dist/brain/brain-query-expander.js +417 -0
  69. package/dist/brain/brain-query-expander.js.map +1 -0
  70. package/dist/brain/brain-quest.d.ts +58 -0
  71. package/dist/brain/brain-quest.d.ts.map +1 -0
  72. package/dist/brain/brain-quest.js +541 -0
  73. package/dist/brain/brain-quest.js.map +1 -0
  74. package/dist/brain/brain-recall-cache.d.ts +73 -0
  75. package/dist/brain/brain-recall-cache.d.ts.map +1 -0
  76. package/dist/brain/brain-recall-cache.js +444 -0
  77. package/dist/brain/brain-recall-cache.js.map +1 -0
  78. package/dist/brain/brain-reflex.d.ts +55 -0
  79. package/dist/brain/brain-reflex.d.ts.map +1 -0
  80. package/dist/brain/brain-reflex.js +364 -0
  81. package/dist/brain/brain-reflex.js.map +1 -0
  82. package/dist/brain/brain-replay.d.ts +74 -0
  83. package/dist/brain/brain-replay.d.ts.map +1 -0
  84. package/dist/brain/brain-replay.js +336 -0
  85. package/dist/brain/brain-replay.js.map +1 -0
  86. package/dist/brain/brain-rerank.d.ts +39 -0
  87. package/dist/brain/brain-rerank.d.ts.map +1 -0
  88. package/dist/brain/brain-rerank.js +216 -0
  89. package/dist/brain/brain-rerank.js.map +1 -0
  90. package/dist/brain/brain-roast.d.ts +44 -0
  91. package/dist/brain/brain-roast.d.ts.map +1 -0
  92. package/dist/brain/brain-roast.js +566 -0
  93. package/dist/brain/brain-roast.js.map +1 -0
  94. package/dist/brain/brain-sonification.d.ts +57 -0
  95. package/dist/brain/brain-sonification.d.ts.map +1 -0
  96. package/dist/brain/brain-sonification.js +286 -0
  97. package/dist/brain/brain-sonification.js.map +1 -0
  98. package/dist/brain/brain-tarot.d.ts +49 -0
  99. package/dist/brain/brain-tarot.d.ts.map +1 -0
  100. package/dist/brain/brain-tarot.js +634 -0
  101. package/dist/brain/brain-tarot.js.map +1 -0
  102. package/dist/brain/brain-time-capsule.d.ts +80 -0
  103. package/dist/brain/brain-time-capsule.d.ts.map +1 -0
  104. package/dist/brain/brain-time-capsule.js +289 -0
  105. package/dist/brain/brain-time-capsule.js.map +1 -0
  106. package/dist/brain/brain-trophies.d.ts +60 -0
  107. package/dist/brain/brain-trophies.d.ts.map +1 -0
  108. package/dist/brain/brain-trophies.js +431 -0
  109. package/dist/brain/brain-trophies.js.map +1 -0
  110. package/dist/brain/brain-working-memory.d.ts +78 -0
  111. package/dist/brain/brain-working-memory.d.ts.map +1 -0
  112. package/dist/brain/brain-working-memory.js +367 -0
  113. package/dist/brain/brain-working-memory.js.map +1 -0
  114. package/dist/brain/confidence-gate.d.ts +69 -0
  115. package/dist/brain/confidence-gate.d.ts.map +1 -0
  116. package/dist/brain/confidence-gate.js +244 -0
  117. package/dist/brain/confidence-gate.js.map +1 -0
  118. package/dist/brain/constitution.d.ts +59 -0
  119. package/dist/brain/constitution.d.ts.map +1 -0
  120. package/dist/brain/constitution.js +315 -0
  121. package/dist/brain/constitution.js.map +1 -0
  122. package/dist/brain/embeddings-v2.d.ts +58 -0
  123. package/dist/brain/embeddings-v2.d.ts.map +1 -0
  124. package/dist/brain/embeddings-v2.js +344 -0
  125. package/dist/brain/embeddings-v2.js.map +1 -0
  126. package/dist/brain/hive-voice.d.ts +71 -0
  127. package/dist/brain/hive-voice.d.ts.map +1 -0
  128. package/dist/brain/hive-voice.js +352 -0
  129. package/dist/brain/hive-voice.js.map +1 -0
  130. package/dist/brain/markdown-export.d.ts +48 -0
  131. package/dist/brain/markdown-export.d.ts.map +1 -0
  132. package/dist/brain/markdown-export.js +382 -0
  133. package/dist/brain/markdown-export.js.map +1 -0
  134. package/dist/brain/multimodal-vision.d.ts +38 -0
  135. package/dist/brain/multimodal-vision.d.ts.map +1 -0
  136. package/dist/brain/multimodal-vision.js +257 -0
  137. package/dist/brain/multimodal-vision.js.map +1 -0
  138. package/dist/brain/otel-lite.d.ts +71 -0
  139. package/dist/brain/otel-lite.d.ts.map +1 -0
  140. package/dist/brain/otel-lite.js +232 -0
  141. package/dist/brain/otel-lite.js.map +1 -0
  142. package/dist/cli.js +881 -2
  143. package/dist/cli.js.map +1 -1
  144. package/package.json +2 -2
@@ -0,0 +1,58 @@
1
+ import { EventEmitter } from 'events';
2
+ import { Embeddings } from './embeddings.js';
3
+ export interface SearchHit {
4
+ id: string;
5
+ score: number;
6
+ text: string;
7
+ metadata?: Record<string, unknown>;
8
+ }
9
+ export interface IndexStats {
10
+ count: number;
11
+ shards: number;
12
+ avgNeighbors: number;
13
+ ollamaModel: string | null;
14
+ ollamaPullState: 'idle' | 'pulling' | 'complete' | 'failed';
15
+ approxBytes: number;
16
+ }
17
+ export declare class EmbeddingsV2 extends EventEmitter {
18
+ private docs;
19
+ private entryPoint;
20
+ private nextShard;
21
+ private currentShardBytes;
22
+ private initialized;
23
+ private pullState;
24
+ private readonly embeddings;
25
+ private readonly M;
26
+ private readonly efConstruct;
27
+ private readonly efSearch;
28
+ constructor(opts?: {
29
+ embeddings?: Embeddings;
30
+ M?: number;
31
+ efConstruct?: number;
32
+ efSearch?: number;
33
+ });
34
+ init(): Promise<void>;
35
+ /** Index a document. Replaces any prior doc with the same id. */
36
+ addDocument(id: string, text: string, metadata?: Record<string, unknown>): Promise<void>;
37
+ /** Approximate top-K nearest neighbors by cosine similarity. */
38
+ search(query: string, topK?: number): Promise<SearchHit[]>;
39
+ /** Remove a document from the index. */
40
+ delete(id: string): Promise<boolean>;
41
+ count(): number;
42
+ stats(): IndexStats;
43
+ flush(): Promise<void>;
44
+ private linkNode;
45
+ private detachNode;
46
+ private greedySearch;
47
+ private dotById;
48
+ private loadShards;
49
+ private pickShardFor;
50
+ private shardCount;
51
+ private persistShard;
52
+ private shardBytes;
53
+ private approxBytes;
54
+ private maybeAutoPull;
55
+ }
56
+ export declare function getEmbeddingsV2(): EmbeddingsV2;
57
+ export declare function resetEmbeddingsV2ForTests(): void;
58
+ //# sourceMappingURL=embeddings-v2.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embeddings-v2.d.ts","sourceRoot":"","sources":["../../src/brain/embeddings-v2.ts"],"names":[],"mappings":"AA+BA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAAE,UAAU,EAAiB,MAAM,iBAAiB,CAAC;AAyB5D,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,eAAe,EAAE,MAAM,GAAG,SAAS,GAAG,UAAU,GAAG,QAAQ,CAAC;IAC5D,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,qBAAa,YAAa,SAAQ,YAAY;IAC5C,OAAO,CAAC,IAAI,CAAsC;IAClD,OAAO,CAAC,UAAU,CAAuB;IACzC,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,iBAAiB,CAAK;IAC9B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,SAAS,CAAyC;IAC1D,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAa;IACxC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAS;IAC3B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;gBAEtB,IAAI,CAAC,EAAE;QAAE,UAAU,CAAC,EAAE,UAAU,CAAC;QAAC,CAAC,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE;IAQ7F,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAS3B,iEAAiE;IAC3D,WAAW,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAmB9F,gEAAgE;IAC1D,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,SAAK,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IAc5D,wCAAwC;IAClC,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAW1C,KAAK,IAAI,MAAM;IAEf,KAAK,IAAI,UAAU;IAab,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAO5B,OAAO,CAAC,QAAQ;IAsBhB,OAAO,CAAC,UAAU;IAUlB,OAAO,CAAC,YAAY;IAkCpB,OAAO,CAAC,OAAO;IAOf,OAAO,CAAC,UAAU;IAkBlB,OAAO,CAAC,YAAY;IAWpB,OAAO,CAAC,UAAU;YAIJ,YAAY;IAe1B,OAAO,CAAC,UAAU;IAOlB,OAAO,CAAC,WAAW;YAYL,aAAa;CA2C5B;AAUD,wBAAgB,eAAe,IAAI,YAAY,CAG9C;AACD,wBAAgB,yBAAyB,IAAI,IAAI,CAAsB"}
@@ -0,0 +1,344 @@
1
+ // src/brain/embeddings-v2.ts — Indexed ANN vector store on top of Embeddings
2
+ // v6.0.2 — Hive Mind Edition
3
+ //
4
+ // Composes the v1 `Embeddings` class (hashing / Ollama dense vectors) with an
5
+ // in-memory hand-rolled HNSW-like graph index. Avoids the O(n) flat scan of
6
+ // the v1 cache for larger corpora — target <100ms recall over 10k vectors.
7
+ //
8
+ // Why hand-rolled and not hnswlib-node? Zero-dep constraint, must compile
9
+ // clean on Windows without prebuilt natives. A simplified hierarchical small-
10
+ // world graph with greedy descent + a single-layer ef-search is plenty for
11
+ // the corpus sizes a single developer's brain stores (typically <50k items).
12
+ //
13
+ // Persistence: sharded JSON files under ~/.shadow-brain/embeddings/.
14
+ // Each shard caps at ~5MB; new docs roll over to a fresh shard.
15
+ //
16
+ // Auto-pull: if Ollama is reachable but no embedding model is installed,
17
+ // POSTs to /api/pull (stream=true) for `nomic-embed-text` and emits progress
18
+ // events so callers can show a spinner. Falls back to hashing if Ollama is
19
+ // unreachable so this class is always usable offline.
20
+ //
21
+ // Exposed: EmbeddingsV2, getEmbeddingsV2(), resetEmbeddingsV2ForTests().
22
+ // .addDocument(id, text, metadata?)
23
+ // .search(query, topK)
24
+ // .delete(id)
25
+ // .count()
26
+ // .stats()
27
+ // on('pull-progress' | 'pull-complete' | 'pull-error', cb)
28
+ import * as fs from 'fs';
29
+ import * as path from 'path';
30
+ import * as os from 'os';
31
+ import { EventEmitter } from 'events';
32
+ import { getEmbeddings } from './embeddings.js';
33
+ const INDEX_DIR = path.join(os.homedir(), '.shadow-brain', 'embeddings');
34
+ const SHARD_MAX_BYTES = 5 * 1024 * 1024;
35
+ const SHARD_PREFIX = 'index-v2.';
36
+ const DEFAULT_EF_SEARCH = 32;
37
+ const DEFAULT_EF_CONSTRUCT = 16;
38
+ const DEFAULT_M = 8;
39
+ const PULL_MODEL = 'nomic-embed-text';
40
+ export class EmbeddingsV2 extends EventEmitter {
41
+ constructor(opts) {
42
+ super();
43
+ this.docs = new Map();
44
+ this.entryPoint = null;
45
+ this.nextShard = 0;
46
+ this.currentShardBytes = 0;
47
+ this.initialized = false;
48
+ this.pullState = 'idle';
49
+ this.embeddings = opts?.embeddings ?? getEmbeddings();
50
+ this.M = opts?.M ?? DEFAULT_M;
51
+ this.efConstruct = opts?.efConstruct ?? DEFAULT_EF_CONSTRUCT;
52
+ this.efSearch = opts?.efSearch ?? DEFAULT_EF_SEARCH;
53
+ }
54
+ async init() {
55
+ if (this.initialized)
56
+ return;
57
+ fs.mkdirSync(INDEX_DIR, { recursive: true });
58
+ await this.embeddings.init();
59
+ this.loadShards();
60
+ this.maybeAutoPull().catch(err => this.emit('pull-error', err));
61
+ this.initialized = true;
62
+ }
63
+ /** Index a document. Replaces any prior doc with the same id. */
64
+ async addDocument(id, text, metadata) {
65
+ await this.init();
66
+ const vector = await this.embeddings.embed(text);
67
+ if (this.docs.has(id))
68
+ this.detachNode(id);
69
+ const doc = {
70
+ id,
71
+ text,
72
+ vector,
73
+ metadata,
74
+ neighbors: [],
75
+ shard: this.pickShardFor(text),
76
+ };
77
+ this.docs.set(id, doc);
78
+ this.linkNode(doc);
79
+ if (!this.entryPoint)
80
+ this.entryPoint = id;
81
+ await this.persistShard(doc.shard);
82
+ }
83
+ /** Approximate top-K nearest neighbors by cosine similarity. */
84
+ async search(query, topK = 10) {
85
+ await this.init();
86
+ if (this.docs.size === 0 || !this.entryPoint)
87
+ return [];
88
+ const qVec = await this.embeddings.embed(query);
89
+ const candidates = this.greedySearch(qVec, Math.max(topK, this.efSearch));
90
+ const hits = [];
91
+ for (const c of candidates.slice(0, topK)) {
92
+ const doc = this.docs.get(c.id);
93
+ if (!doc)
94
+ continue;
95
+ hits.push({ id: c.id, score: c.score, text: doc.text, metadata: doc.metadata });
96
+ }
97
+ return hits;
98
+ }
99
+ /** Remove a document from the index. */
100
+ async delete(id) {
101
+ await this.init();
102
+ const doc = this.docs.get(id);
103
+ if (!doc)
104
+ return false;
105
+ this.detachNode(id);
106
+ this.docs.delete(id);
107
+ if (this.entryPoint === id)
108
+ this.entryPoint = this.docs.keys().next().value ?? null;
109
+ await this.persistShard(doc.shard);
110
+ return true;
111
+ }
112
+ count() { return this.docs.size; }
113
+ stats() {
114
+ const neighborSum = Array.from(this.docs.values()).reduce((s, d) => s + d.neighbors.length, 0);
115
+ const shards = new Set(Array.from(this.docs.values()).map(d => d.shard)).size;
116
+ return {
117
+ count: this.docs.size,
118
+ shards,
119
+ avgNeighbors: this.docs.size ? +(neighborSum / this.docs.size).toFixed(2) : 0,
120
+ ollamaModel: this.embeddings.ollamaModel ?? null,
121
+ ollamaPullState: this.pullState,
122
+ approxBytes: this.approxBytes(),
123
+ };
124
+ }
125
+ async flush() {
126
+ const dirtyShards = new Set(Array.from(this.docs.values()).map(d => d.shard));
127
+ for (const s of dirtyShards)
128
+ await this.persistShard(s);
129
+ }
130
+ // -- Index core ----------------------------------------------------------
131
+ linkNode(doc) {
132
+ if (!this.entryPoint || this.docs.size === 1)
133
+ return;
134
+ const candidates = this.greedySearch(doc.vector, this.efConstruct);
135
+ const selected = candidates.slice(0, this.M);
136
+ doc.neighbors = selected.map(c => c.id);
137
+ for (const c of selected) {
138
+ const peer = this.docs.get(c.id);
139
+ if (!peer)
140
+ continue;
141
+ if (!peer.neighbors.includes(doc.id)) {
142
+ peer.neighbors.push(doc.id);
143
+ // Cap peer fan-out so the graph stays small-world. Keep the M nearest.
144
+ if (peer.neighbors.length > this.M * 2) {
145
+ const scored = peer.neighbors
146
+ .map(nid => ({ id: nid, score: this.dotById(peer.vector, nid) }))
147
+ .sort((a, b) => b.score - a.score)
148
+ .slice(0, this.M * 2);
149
+ peer.neighbors = scored.map(s => s.id);
150
+ }
151
+ }
152
+ }
153
+ }
154
+ detachNode(id) {
155
+ const doc = this.docs.get(id);
156
+ if (!doc)
157
+ return;
158
+ for (const peerId of doc.neighbors) {
159
+ const peer = this.docs.get(peerId);
160
+ if (!peer)
161
+ continue;
162
+ peer.neighbors = peer.neighbors.filter(n => n !== id);
163
+ }
164
+ }
165
+ greedySearch(query, ef) {
166
+ const visited = new Set();
167
+ const start = this.entryPoint;
168
+ const startDoc = this.docs.get(start);
169
+ if (!startDoc)
170
+ return [];
171
+ const frontier = [
172
+ { id: start, score: dot(query, startDoc.vector) },
173
+ ];
174
+ const best = [...frontier];
175
+ visited.add(start);
176
+ while (frontier.length) {
177
+ frontier.sort((a, b) => b.score - a.score);
178
+ const current = frontier.shift();
179
+ // Stop if our worst kept best is still better than this candidate.
180
+ if (best.length >= ef && current.score < best[best.length - 1].score)
181
+ break;
182
+ const doc = this.docs.get(current.id);
183
+ if (!doc)
184
+ continue;
185
+ for (const nid of doc.neighbors) {
186
+ if (visited.has(nid))
187
+ continue;
188
+ visited.add(nid);
189
+ const peer = this.docs.get(nid);
190
+ if (!peer)
191
+ continue;
192
+ const s = dot(query, peer.vector);
193
+ frontier.push({ id: nid, score: s });
194
+ best.push({ id: nid, score: s });
195
+ best.sort((a, b) => b.score - a.score);
196
+ if (best.length > ef)
197
+ best.pop();
198
+ }
199
+ }
200
+ return best;
201
+ }
202
+ dotById(query, id) {
203
+ const doc = this.docs.get(id);
204
+ return doc ? dot(query, doc.vector) : -Infinity;
205
+ }
206
+ // -- Persistence ---------------------------------------------------------
207
+ loadShards() {
208
+ const files = fs.existsSync(INDEX_DIR)
209
+ ? fs.readdirSync(INDEX_DIR).filter(f => f.startsWith(SHARD_PREFIX) && f.endsWith('.json'))
210
+ : [];
211
+ for (const file of files) {
212
+ try {
213
+ const raw = fs.readFileSync(path.join(INDEX_DIR, file), 'utf-8');
214
+ const payload = JSON.parse(raw);
215
+ for (const d of payload.docs ?? []) {
216
+ this.docs.set(d.id, { ...d, shard: payload.shard });
217
+ }
218
+ this.nextShard = Math.max(this.nextShard, payload.shard + 1);
219
+ }
220
+ catch { /* skip corrupt shard */ }
221
+ }
222
+ this.entryPoint = this.docs.keys().next().value ?? null;
223
+ this.currentShardBytes = this.shardBytes(Math.max(0, this.nextShard - 1));
224
+ }
225
+ pickShardFor(text) {
226
+ const approx = text.length * 4 + 256; // text bytes + vector + neighbors overhead
227
+ if (this.currentShardBytes + approx > SHARD_MAX_BYTES) {
228
+ this.nextShard = Math.max(this.nextShard, this.shardCount());
229
+ this.currentShardBytes = 0;
230
+ return this.nextShard++;
231
+ }
232
+ this.currentShardBytes += approx;
233
+ return Math.max(0, this.nextShard - 1);
234
+ }
235
+ shardCount() {
236
+ return new Set(Array.from(this.docs.values()).map(d => d.shard)).size;
237
+ }
238
+ async persistShard(shard) {
239
+ try {
240
+ const docs = Array.from(this.docs.values()).filter(d => d.shard === shard);
241
+ const payload = {
242
+ schemaVersion: 1,
243
+ shard,
244
+ docs: docs.map(({ shard: _s, ...rest }) => rest),
245
+ };
246
+ const file = path.join(INDEX_DIR, `${SHARD_PREFIX}${shard}.json`);
247
+ const tmp = file + '.tmp';
248
+ fs.writeFileSync(tmp, JSON.stringify(payload));
249
+ fs.renameSync(tmp, file);
250
+ }
251
+ catch { /* non-fatal */ }
252
+ }
253
+ shardBytes(shard) {
254
+ try {
255
+ const file = path.join(INDEX_DIR, `${SHARD_PREFIX}${shard}.json`);
256
+ return fs.existsSync(file) ? fs.statSync(file).size : 0;
257
+ }
258
+ catch {
259
+ return 0;
260
+ }
261
+ }
262
+ approxBytes() {
263
+ let total = 0;
264
+ if (!fs.existsSync(INDEX_DIR))
265
+ return 0;
266
+ for (const f of fs.readdirSync(INDEX_DIR)) {
267
+ if (!f.startsWith(SHARD_PREFIX))
268
+ continue;
269
+ try {
270
+ total += fs.statSync(path.join(INDEX_DIR, f)).size;
271
+ }
272
+ catch { /* skip */ }
273
+ }
274
+ return total;
275
+ }
276
+ // -- Ollama auto-pull ----------------------------------------------------
277
+ async maybeAutoPull() {
278
+ const emb = this.embeddings;
279
+ if (emb.ollamaModel)
280
+ return; // already have a model
281
+ const baseUrl = emb.ollamaBaseUrl ?? 'http://127.0.0.1:11434';
282
+ try {
283
+ const probe = await fetch(baseUrl + '/api/tags', { signal: AbortSignal.timeout(2000) });
284
+ if (!probe.ok)
285
+ return; // no Ollama, stay on hashing fallback
286
+ }
287
+ catch {
288
+ return;
289
+ }
290
+ this.pullState = 'pulling';
291
+ this.emit('pull-progress', { model: PULL_MODEL, status: 'starting', percent: 0 });
292
+ try {
293
+ const res = await fetch(baseUrl + '/api/pull', {
294
+ method: 'POST',
295
+ headers: { 'Content-Type': 'application/json' },
296
+ body: JSON.stringify({ name: PULL_MODEL, stream: true }),
297
+ });
298
+ if (!res.ok || !res.body)
299
+ throw new Error(`pull failed: ${res.status}`);
300
+ const reader = res.body.getReader();
301
+ const decoder = new TextDecoder();
302
+ let buf = '';
303
+ while (true) {
304
+ const { value, done } = await reader.read();
305
+ if (done)
306
+ break;
307
+ buf += decoder.decode(value, { stream: true });
308
+ const lines = buf.split('\n');
309
+ buf = lines.pop() ?? '';
310
+ for (const line of lines) {
311
+ if (!line.trim())
312
+ continue;
313
+ try {
314
+ const obj = JSON.parse(line);
315
+ const percent = obj.total && obj.completed ? +(obj.completed / obj.total * 100).toFixed(1) : 0;
316
+ this.emit('pull-progress', { model: PULL_MODEL, status: obj.status ?? 'pulling', percent });
317
+ }
318
+ catch { /* skip non-JSON line */ }
319
+ }
320
+ }
321
+ this.pullState = 'complete';
322
+ this.emit('pull-complete', { model: PULL_MODEL });
323
+ }
324
+ catch (err) {
325
+ this.pullState = 'failed';
326
+ this.emit('pull-error', err);
327
+ }
328
+ }
329
+ }
330
+ function dot(a, b) {
331
+ let d = 0;
332
+ const n = Math.min(a.length, b.length);
333
+ for (let i = 0; i < n; i++)
334
+ d += a[i] * b[i];
335
+ return d;
336
+ }
337
+ let _instance = null;
338
+ export function getEmbeddingsV2() {
339
+ if (!_instance)
340
+ _instance = new EmbeddingsV2();
341
+ return _instance;
342
+ }
343
+ export function resetEmbeddingsV2ForTests() { _instance = null; }
344
+ //# sourceMappingURL=embeddings-v2.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embeddings-v2.js","sourceRoot":"","sources":["../../src/brain/embeddings-v2.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,71 @@
1
+ export type VotingMode = 'unanimous' | 'majority' | 'weighted';
2
+ export interface AgentSpec {
3
+ /** Friendly label used in output / SVG */
4
+ name: string;
5
+ /** Ollama model tag (e.g. 'qwen2.5-coder:7b'). If missing, treated as "external". */
6
+ model?: string;
7
+ /** Sampling temperature. */
8
+ temperature?: number;
9
+ /** Optional system prompt to nudge perspective. */
10
+ systemPrompt?: string;
11
+ /** Trust weight ∈ [0, 1]. Defaults to 1. */
12
+ weight?: number;
13
+ }
14
+ export interface AgentVote {
15
+ agent: string;
16
+ position: string;
17
+ confidence: number;
18
+ reasoning: string;
19
+ weight: number;
20
+ }
21
+ export interface HiveVote {
22
+ question: string;
23
+ consensus: string;
24
+ confidence: number;
25
+ votes: AgentVote[];
26
+ dissents: AgentVote[];
27
+ distribution: {
28
+ byConfidence: number[];
29
+ byPosition: Record<string, number>;
30
+ };
31
+ transcript: string;
32
+ svg: string;
33
+ mode: VotingMode;
34
+ durationMs: number;
35
+ capturedAt: string;
36
+ }
37
+ export interface AskOptions {
38
+ agents?: AgentSpec[];
39
+ rounds?: number;
40
+ allowDissent?: boolean;
41
+ mode?: VotingMode;
42
+ projectDir?: string;
43
+ ollamaUrl?: string;
44
+ }
45
+ export declare class HiveVoice {
46
+ private ollamaBaseUrl;
47
+ private cachedModels;
48
+ constructor(ollamaUrl?: string);
49
+ /** Ask the hive a question. Returns a HiveVote with consensus + SVG card. */
50
+ ask(question: string, opts?: AskOptions): Promise<HiveVote>;
51
+ /** List recent hive votes for a project. */
52
+ list(projectDir?: string, limit?: number): Array<{
53
+ file: string;
54
+ capturedAt: string;
55
+ question: string;
56
+ }>;
57
+ private resolveAgents;
58
+ private probeOllamaModels;
59
+ private askAgent;
60
+ private callOllama;
61
+ private parseVote;
62
+ private deterministicStub;
63
+ private tally;
64
+ private distribute;
65
+ private renderSvg;
66
+ private projectStoreDir;
67
+ private persist;
68
+ }
69
+ export declare function getHiveVoice(): HiveVoice;
70
+ export declare function resetHiveVoiceForTests(): void;
71
+ //# sourceMappingURL=hive-voice.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hive-voice.d.ts","sourceRoot":"","sources":["../../src/brain/hive-voice.ts"],"names":[],"mappings":"AAsBA,MAAM,MAAM,UAAU,GAAG,WAAW,GAAG,UAAU,GAAG,UAAU,CAAC;AAE/D,MAAM,WAAW,SAAS;IACxB,0CAA0C;IAC1C,IAAI,EAAE,MAAM,CAAC;IACb,qFAAqF;IACrF,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,4BAA4B;IAC5B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,mDAAmD;IACnD,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,4CAA4C;IAC5C,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,QAAQ;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB,QAAQ,EAAE,SAAS,EAAE,CAAC;IACtB,YAAY,EAAE;QACZ,YAAY,EAAE,MAAM,EAAE,CAAC;QACvB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KACpC,CAAC;IACF,UAAU,EAAE,MAAM,CAAC;IACnB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,UAAU,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,qBAAa,SAAS;IACpB,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,YAAY,CAAyB;gBAEjC,SAAS,SAA2B;IAIhD,6EAA6E;IACvE,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,GAAE,UAAe,GAAG,OAAO,CAAC,QAAQ,CAAC;IA2CrE,4CAA4C;IAC5C,IAAI,CAAC,UAAU,SAAgB,EAAE,KAAK,SAAK,GAAG,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;YAgB7F,aAAa;YAgCb,iBAAiB;YAsBjB,QAAQ;YAkBR,UAAU;IAmBxB,OAAO,CAAC,SAAS;IAqBjB,OAAO,CAAC,iBAAiB;IAazB,OAAO,CAAC,KAAK;IAmCb,OAAO,CAAC,UAAU;IAclB,OAAO,CAAC,SAAS;IA2DjB,OAAO,CAAC,eAAe;YAIT,OAAO;CAUtB;AA4BD,wBAAgB,YAAY,IAAI,SAAS,CAGxC;AACD,wBAAgB,sBAAsB,IAAI,IAAI,CAAsB"}