@theihtisham/agent-shadow-brain 5.1.1 → 6.0.0

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 (183) hide show
  1. package/README.md +355 -1095
  2. package/dist/adapters/copilot.d.ts +14 -0
  3. package/dist/adapters/copilot.d.ts.map +1 -0
  4. package/dist/adapters/copilot.js +93 -0
  5. package/dist/adapters/copilot.js.map +1 -0
  6. package/dist/adapters/cursor.d.ts +13 -0
  7. package/dist/adapters/cursor.d.ts.map +1 -0
  8. package/dist/adapters/cursor.js +96 -0
  9. package/dist/adapters/cursor.js.map +1 -0
  10. package/dist/adapters/index.d.ts +4 -1
  11. package/dist/adapters/index.d.ts.map +1 -1
  12. package/dist/adapters/index.js +7 -3
  13. package/dist/adapters/index.js.map +1 -1
  14. package/dist/adapters/windsurf.d.ts +14 -0
  15. package/dist/adapters/windsurf.d.ts.map +1 -0
  16. package/dist/adapters/windsurf.js +107 -0
  17. package/dist/adapters/windsurf.js.map +1 -0
  18. package/dist/brain/agent-firewall.d.ts +7 -0
  19. package/dist/brain/agent-firewall.d.ts.map +1 -0
  20. package/dist/brain/agent-firewall.js +152 -0
  21. package/dist/brain/agent-firewall.js.map +1 -0
  22. package/dist/brain/agent-handoff.d.ts +19 -0
  23. package/dist/brain/agent-handoff.d.ts.map +1 -0
  24. package/dist/brain/agent-handoff.js +127 -0
  25. package/dist/brain/agent-handoff.js.map +1 -0
  26. package/dist/brain/air-gap.d.ts +23 -0
  27. package/dist/brain/air-gap.d.ts.map +1 -0
  28. package/dist/brain/air-gap.js +137 -0
  29. package/dist/brain/air-gap.js.map +1 -0
  30. package/dist/brain/attention-heatmap.d.ts +24 -0
  31. package/dist/brain/attention-heatmap.d.ts.map +1 -0
  32. package/dist/brain/attention-heatmap.js +108 -0
  33. package/dist/brain/attention-heatmap.js.map +1 -0
  34. package/dist/brain/auto-setup.js +19 -14
  35. package/dist/brain/auto-setup.js.map +1 -1
  36. package/dist/brain/auto-update.js +1 -1
  37. package/dist/brain/brain-chat.d.ts +42 -0
  38. package/dist/brain/brain-chat.d.ts.map +1 -0
  39. package/dist/brain/brain-chat.js +162 -0
  40. package/dist/brain/brain-chat.js.map +1 -0
  41. package/dist/brain/brain-encryption.d.ts +14 -0
  42. package/dist/brain/brain-encryption.d.ts.map +1 -0
  43. package/dist/brain/brain-encryption.js +68 -0
  44. package/dist/brain/brain-encryption.js.map +1 -0
  45. package/dist/brain/brain-exchange.d.ts +30 -0
  46. package/dist/brain/brain-exchange.d.ts.map +1 -0
  47. package/dist/brain/brain-exchange.js +106 -0
  48. package/dist/brain/brain-exchange.js.map +1 -0
  49. package/dist/brain/brain-garden.d.ts +18 -0
  50. package/dist/brain/brain-garden.d.ts.map +1 -0
  51. package/dist/brain/brain-garden.js +81 -0
  52. package/dist/brain/brain-garden.js.map +1 -0
  53. package/dist/brain/brain-portability.js +1 -1
  54. package/dist/brain/branch-brain.d.ts +23 -0
  55. package/dist/brain/branch-brain.d.ts.map +1 -0
  56. package/dist/brain/branch-brain.js +159 -0
  57. package/dist/brain/branch-brain.js.map +1 -0
  58. package/dist/brain/calibration-monitor.d.ts +20 -0
  59. package/dist/brain/calibration-monitor.d.ts.map +1 -0
  60. package/dist/brain/calibration-monitor.js +144 -0
  61. package/dist/brain/calibration-monitor.js.map +1 -0
  62. package/dist/brain/causal-chains.d.ts +37 -0
  63. package/dist/brain/causal-chains.d.ts.map +1 -0
  64. package/dist/brain/causal-chains.js +250 -0
  65. package/dist/brain/causal-chains.js.map +1 -0
  66. package/dist/brain/collision-detective.d.ts +32 -0
  67. package/dist/brain/collision-detective.d.ts.map +1 -0
  68. package/dist/brain/collision-detective.js +233 -0
  69. package/dist/brain/collision-detective.js.map +1 -0
  70. package/dist/brain/cost-aware-spawner.d.ts +7 -0
  71. package/dist/brain/cost-aware-spawner.d.ts.map +1 -0
  72. package/dist/brain/cost-aware-spawner.js +77 -0
  73. package/dist/brain/cost-aware-spawner.js.map +1 -0
  74. package/dist/brain/dream-engine.d.ts +35 -0
  75. package/dist/brain/dream-engine.d.ts.map +1 -0
  76. package/dist/brain/dream-engine.js +273 -0
  77. package/dist/brain/dream-engine.js.map +1 -0
  78. package/dist/brain/embeddings.d.ts +27 -0
  79. package/dist/brain/embeddings.d.ts.map +1 -0
  80. package/dist/brain/embeddings.js +175 -0
  81. package/dist/brain/embeddings.js.map +1 -0
  82. package/dist/brain/forgetting-curve.d.ts +21 -0
  83. package/dist/brain/forgetting-curve.d.ts.map +1 -0
  84. package/dist/brain/forgetting-curve.js +174 -0
  85. package/dist/brain/forgetting-curve.js.map +1 -0
  86. package/dist/brain/formal-verification-bridge.d.ts +26 -0
  87. package/dist/brain/formal-verification-bridge.d.ts.map +1 -0
  88. package/dist/brain/formal-verification-bridge.js +219 -0
  89. package/dist/brain/formal-verification-bridge.js.map +1 -0
  90. package/dist/brain/global-brain.d.ts +63 -0
  91. package/dist/brain/global-brain.d.ts.map +1 -0
  92. package/dist/brain/global-brain.js +348 -0
  93. package/dist/brain/global-brain.js.map +1 -0
  94. package/dist/brain/hallucination-quarantine.d.ts +26 -0
  95. package/dist/brain/hallucination-quarantine.d.ts.map +1 -0
  96. package/dist/brain/hallucination-quarantine.js +135 -0
  97. package/dist/brain/hallucination-quarantine.js.map +1 -0
  98. package/dist/brain/hive-accelerator.d.ts +39 -0
  99. package/dist/brain/hive-accelerator.d.ts.map +1 -0
  100. package/dist/brain/hive-accelerator.js +152 -0
  101. package/dist/brain/hive-accelerator.js.map +1 -0
  102. package/dist/brain/json-output.d.ts +26 -0
  103. package/dist/brain/json-output.d.ts.map +1 -0
  104. package/dist/brain/json-output.js +112 -0
  105. package/dist/brain/json-output.js.map +1 -0
  106. package/dist/brain/l0-cache.d.ts +40 -0
  107. package/dist/brain/l0-cache.d.ts.map +1 -0
  108. package/dist/brain/l0-cache.js +176 -0
  109. package/dist/brain/l0-cache.js.map +1 -0
  110. package/dist/brain/local-llm.d.ts +20 -0
  111. package/dist/brain/local-llm.d.ts.map +1 -0
  112. package/dist/brain/local-llm.js +132 -0
  113. package/dist/brain/local-llm.js.map +1 -0
  114. package/dist/brain/mcp-server.d.ts +44 -0
  115. package/dist/brain/mcp-server.d.ts.map +1 -1
  116. package/dist/brain/mcp-server.js +486 -12
  117. package/dist/brain/mcp-server.js.map +1 -1
  118. package/dist/brain/model-registry.d.ts +96 -0
  119. package/dist/brain/model-registry.d.ts.map +1 -0
  120. package/dist/brain/model-registry.js +585 -0
  121. package/dist/brain/model-registry.js.map +1 -0
  122. package/dist/brain/orchestrator.js +1 -1
  123. package/dist/brain/pr-auto-review.d.ts +17 -0
  124. package/dist/brain/pr-auto-review.d.ts.map +1 -0
  125. package/dist/brain/pr-auto-review.js +73 -0
  126. package/dist/brain/pr-auto-review.js.map +1 -0
  127. package/dist/brain/pre-mortem.d.ts +21 -0
  128. package/dist/brain/pre-mortem.d.ts.map +1 -0
  129. package/dist/brain/pre-mortem.js +210 -0
  130. package/dist/brain/pre-mortem.js.map +1 -0
  131. package/dist/brain/prompt-cache.d.ts +54 -0
  132. package/dist/brain/prompt-cache.d.ts.map +1 -0
  133. package/dist/brain/prompt-cache.js +105 -0
  134. package/dist/brain/prompt-cache.js.map +1 -0
  135. package/dist/brain/reputation-ledger.d.ts +42 -0
  136. package/dist/brain/reputation-ledger.d.ts.map +1 -0
  137. package/dist/brain/reputation-ledger.js +326 -0
  138. package/dist/brain/reputation-ledger.js.map +1 -0
  139. package/dist/brain/session-hooks.d.ts +47 -0
  140. package/dist/brain/session-hooks.d.ts.map +1 -0
  141. package/dist/brain/session-hooks.js +706 -0
  142. package/dist/brain/session-hooks.js.map +1 -0
  143. package/dist/brain/subagent-bridge.d.ts +46 -0
  144. package/dist/brain/subagent-bridge.d.ts.map +1 -0
  145. package/dist/brain/subagent-bridge.js +364 -0
  146. package/dist/brain/subagent-bridge.js.map +1 -0
  147. package/dist/brain/subconscious.d.ts +34 -0
  148. package/dist/brain/subconscious.d.ts.map +1 -0
  149. package/dist/brain/subconscious.js +275 -0
  150. package/dist/brain/subconscious.js.map +1 -0
  151. package/dist/brain/swarm-debate.d.ts +22 -0
  152. package/dist/brain/swarm-debate.d.ts.map +1 -0
  153. package/dist/brain/swarm-debate.js +134 -0
  154. package/dist/brain/swarm-debate.js.map +1 -0
  155. package/dist/brain/team-brain-sync.d.ts +22 -0
  156. package/dist/brain/team-brain-sync.d.ts.map +1 -0
  157. package/dist/brain/team-brain-sync.js +132 -0
  158. package/dist/brain/team-brain-sync.js.map +1 -0
  159. package/dist/brain/token-economy.d.ts +25 -0
  160. package/dist/brain/token-economy.d.ts.map +1 -0
  161. package/dist/brain/token-economy.js +216 -0
  162. package/dist/brain/token-economy.js.map +1 -0
  163. package/dist/brain/voice-mode.d.ts +15 -0
  164. package/dist/brain/voice-mode.d.ts.map +1 -0
  165. package/dist/brain/voice-mode.js +97 -0
  166. package/dist/brain/voice-mode.js.map +1 -0
  167. package/dist/cli.js +990 -6
  168. package/dist/cli.js.map +1 -1
  169. package/dist/dashboard/server.d.ts +6 -0
  170. package/dist/dashboard/server.d.ts.map +1 -1
  171. package/dist/dashboard/server.js +1118 -368
  172. package/dist/dashboard/server.js.map +1 -1
  173. package/dist/dashboard/v6-dashboard-html.d.ts +2 -0
  174. package/dist/dashboard/v6-dashboard-html.d.ts.map +1 -0
  175. package/dist/dashboard/v6-dashboard-html.js +2474 -0
  176. package/dist/dashboard/v6-dashboard-html.js.map +1 -0
  177. package/dist/index.d.ts +27 -0
  178. package/dist/index.d.ts.map +1 -1
  179. package/dist/index.js +29 -1
  180. package/dist/index.js.map +1 -1
  181. package/dist/types.d.ts +644 -1
  182. package/dist/types.d.ts.map +1 -1
  183. package/package.json +77 -12
@@ -0,0 +1,152 @@
1
+ // src/brain/hive-accelerator.ts — SSSP + TurboQuant accelerator for v6.0 modules
2
+ // v6.0.0 — Hive Mind Edition
3
+ //
4
+ // Re-uses the existing SSSP router (O(m log^(2/3) n), arXiv 2504.17033) and
5
+ // TurboMemory (PolarQuant + QJL, ICLR 2026 — 6x vector compression) to make
6
+ // Hive Mind modules faster and more memory-efficient:
7
+ //
8
+ // - Causal Chains → SSSP for ancestor/descendant traversal
9
+ // - SABB sliver scoring → TurboQuant vector similarity
10
+ // - Brain Exchange payloads → TurboQuant compression before serialization
11
+ // - Attention Heatmap → TurboQuant similarity between decision and memories
12
+ //
13
+ // Modules call these helpers when available; fall back to naive paths if the
14
+ // accelerator can't be initialized.
15
+ import { SSSPRouter } from './sssp-router.js';
16
+ import { TurboMemory } from './turbo-memory.js';
17
+ export class HiveAccelerator {
18
+ constructor() {
19
+ this.initialized = false;
20
+ this.sssp = new SSSPRouter();
21
+ this.turbo = new TurboMemory();
22
+ }
23
+ async init() {
24
+ if (this.initialized)
25
+ return;
26
+ this.initialized = true;
27
+ }
28
+ /**
29
+ * Rebuild the SSSP graph from causal links for O(m log^(2/3) n) traversal.
30
+ * Each link contributes two directed edges (cause → effect).
31
+ */
32
+ buildCausalGraph(links) {
33
+ const nodes = new Map();
34
+ for (const link of links) {
35
+ const list = nodes.get(link.causeId) ?? [];
36
+ list.push({ targetId: link.effectId, latency: 1 - link.strength });
37
+ nodes.set(link.causeId, list);
38
+ // Also register effect nodes so graph is complete
39
+ if (!nodes.has(link.effectId))
40
+ nodes.set(link.effectId, []);
41
+ }
42
+ const nodeArr = [];
43
+ for (const [id, connections] of nodes)
44
+ nodeArr.push({ id, connections });
45
+ this.sssp.buildGraph(nodeArr);
46
+ }
47
+ /** Run BMSSP from a source node — returns distances + predecessors. */
48
+ traverseCausal(sourceId) {
49
+ try {
50
+ const sssp = this.sssp;
51
+ if (typeof sssp.bmssp === 'function')
52
+ return sssp.bmssp(sourceId);
53
+ if (typeof sssp.computeShortestPath === 'function')
54
+ return sssp.computeShortestPath(sourceId);
55
+ if (typeof sssp.run === 'function')
56
+ return sssp.run(sourceId);
57
+ if (typeof sssp.shortestPaths === 'function')
58
+ return sssp.shortestPaths(sourceId);
59
+ return null;
60
+ }
61
+ catch {
62
+ return null;
63
+ }
64
+ }
65
+ /**
66
+ * Store a compressed vector representation of a memory for faster SABB /
67
+ * heatmap similarity scoring. Uses PolarQuant + QJL (3 bits/dim).
68
+ */
69
+ async storeCompressed(id, vector, metadata = {}) {
70
+ try {
71
+ const t = this.turbo;
72
+ if (typeof t.store === 'function')
73
+ return t.store(id, vector, metadata);
74
+ if (typeof t.add === 'function')
75
+ return t.add(id, vector, metadata);
76
+ if (typeof t.upsert === 'function')
77
+ return t.upsert(id, vector, metadata);
78
+ return null;
79
+ }
80
+ catch {
81
+ return null;
82
+ }
83
+ }
84
+ /** Semantic similarity search — returns top-K matching memories. */
85
+ async similaritySearch(queryVector, k = 5) {
86
+ try {
87
+ const t = this.turbo;
88
+ if (typeof t.search === 'function')
89
+ return t.search(queryVector, k);
90
+ if (typeof t.topK === 'function')
91
+ return t.topK(queryVector, k);
92
+ if (typeof t.query === 'function')
93
+ return t.query(queryVector, k);
94
+ return [];
95
+ }
96
+ catch {
97
+ return [];
98
+ }
99
+ }
100
+ /** Convert text to a simple 64-dim vector (character n-gram hash). Cheap, deterministic. */
101
+ static textToVector(text, dim = 64) {
102
+ const v = new Array(dim).fill(0);
103
+ const normalized = text.toLowerCase().replace(/[^a-z0-9\s]/g, ' ');
104
+ for (let i = 0; i < normalized.length - 2; i++) {
105
+ const tri = normalized.slice(i, i + 3);
106
+ let h = 0;
107
+ for (let c = 0; c < tri.length; c++)
108
+ h = (h * 31 + tri.charCodeAt(c)) >>> 0;
109
+ v[h % dim] += 1;
110
+ }
111
+ // L2 normalize
112
+ let norm = 0;
113
+ for (const x of v)
114
+ norm += x * x;
115
+ norm = Math.sqrt(norm) || 1;
116
+ for (let i = 0; i < dim; i++)
117
+ v[i] = v[i] / norm;
118
+ return v;
119
+ }
120
+ /** Cosine similarity between two vectors. */
121
+ static cosine(a, b) {
122
+ let dot = 0;
123
+ let na = 0;
124
+ let nb = 0;
125
+ for (let i = 0; i < a.length && i < b.length; i++) {
126
+ dot += a[i] * b[i];
127
+ na += a[i] * a[i];
128
+ nb += b[i] * b[i];
129
+ }
130
+ return dot / ((Math.sqrt(na) || 1) * (Math.sqrt(nb) || 1));
131
+ }
132
+ status() {
133
+ const g = this.sssp.graph ?? { nodeCount: 0, edgeCount: 0 };
134
+ const m = this.turbo.memoryStore ?? { entries: [], compressionRatio: 6 };
135
+ return {
136
+ ssspNodes: g.nodeCount ?? 0,
137
+ ssspEdges: g.edgeCount ?? 0,
138
+ turboEntries: (m.entries ?? []).length,
139
+ turboCompressionRatio: m.compressionRatio ?? 6,
140
+ };
141
+ }
142
+ }
143
+ let _instance = null;
144
+ export function getHiveAccelerator() {
145
+ if (!_instance)
146
+ _instance = new HiveAccelerator();
147
+ return _instance;
148
+ }
149
+ export function resetHiveAcceleratorForTests() {
150
+ _instance = null;
151
+ }
152
+ //# sourceMappingURL=hive-accelerator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hive-accelerator.js","sourceRoot":"","sources":["../../src/brain/hive-accelerator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import { z, ZodSchema } from 'zod';
2
+ export interface JsonOutputOptions<T> {
3
+ system?: string;
4
+ maxTokens?: number;
5
+ maxRetries?: number;
6
+ featureName?: string;
7
+ fallback?: T;
8
+ /** Extra instruction to append — e.g. "Respond ONLY with JSON matching {...}". */
9
+ schemaHint?: string;
10
+ /** Cache identical requests (default: true). */
11
+ useCache?: boolean;
12
+ }
13
+ /**
14
+ * Ask the LLM for JSON that satisfies a Zod schema.
15
+ * Returns parsed T, or opts.fallback if every retry failed.
16
+ */
17
+ export declare function generateJson<T>(prompt: string, schema: ZodSchema<T>, opts?: JsonOutputOptions<T>): Promise<{
18
+ value: T;
19
+ provider: string;
20
+ model: string;
21
+ attempts: number;
22
+ cached?: boolean;
23
+ }>;
24
+ /** Re-export Zod for downstream brain modules that want to define schemas. */
25
+ export { z };
26
+ //# sourceMappingURL=json-output.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-output.d.ts","sourceRoot":"","sources":["../../src/brain/json-output.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,CAAC,EAAE,SAAS,EAAE,MAAM,KAAK,CAAC;AAInC,MAAM,WAAW,iBAAiB,CAAC,CAAC;IAClC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,CAAC,CAAC;IACb,kFAAkF;IAClF,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gDAAgD;IAChD,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED;;;GAGG;AACH,wBAAsB,YAAY,CAAC,CAAC,EAClC,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC,EACpB,IAAI,GAAE,iBAAiB,CAAC,CAAC,CAAM,GAC9B,OAAO,CAAC;IAAE,KAAK,EAAE,CAAC,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC,CAkD5F;AAsCD,8EAA8E;AAC9E,OAAO,EAAE,CAAC,EAAE,CAAC"}
@@ -0,0 +1,112 @@
1
+ // src/brain/json-output.ts — Structured JSON output helper
2
+ // v6.0.0 — Hive Mind Edition
3
+ //
4
+ // Wraps ModelRegistry.generate with strict JSON schema enforcement and retry.
5
+ // If the model returns free text or malformed JSON, extract → parse → validate
6
+ // against a Zod schema; retry up to N times with a repair prompt; fall back to
7
+ // a safe default if all retries fail.
8
+ import { z } from 'zod';
9
+ import { getModelRegistry } from './model-registry.js';
10
+ import { getPromptCache } from './prompt-cache.js';
11
+ /**
12
+ * Ask the LLM for JSON that satisfies a Zod schema.
13
+ * Returns parsed T, or opts.fallback if every retry failed.
14
+ */
15
+ export async function generateJson(prompt, schema, opts = {}) {
16
+ const registry = getModelRegistry();
17
+ await registry.init();
18
+ const cache = getPromptCache();
19
+ const maxRetries = opts.maxRetries ?? 2;
20
+ const hint = opts.schemaHint ?? 'Respond ONLY with a single valid JSON object. No markdown, no prose, no code fences.';
21
+ const fullPrompt = `${prompt}\n\n${hint}`;
22
+ let lastText = '';
23
+ let lastProvider = 'none';
24
+ let lastModel = 'fallback';
25
+ for (let attempt = 0; attempt <= maxRetries; attempt++) {
26
+ const repairSuffix = attempt > 0
27
+ ? `\n\nYour previous response was invalid or did not match the schema. Your previous output was:\n${lastText.slice(0, 400)}\n\nReturn valid JSON only.`
28
+ : '';
29
+ const effectivePrompt = fullPrompt + repairSuffix;
30
+ const doGenerate = () => registry.generate(effectivePrompt, {
31
+ system: opts.system,
32
+ maxTokens: opts.maxTokens ?? 800,
33
+ featureName: opts.featureName,
34
+ });
35
+ const response = opts.useCache === false
36
+ ? await doGenerate()
37
+ : await cache.wrap({ prompt: effectivePrompt, system: opts.system, provider: 'lead', model: 'lead', estimatedTokens: Math.ceil(effectivePrompt.length / 4) + (opts.maxTokens ?? 800), estimatedCostUsd: 0.002 }, doGenerate);
38
+ lastText = response.text || '';
39
+ lastProvider = response.provider;
40
+ lastModel = response.model;
41
+ const extracted = extractJson(lastText);
42
+ if (extracted !== null) {
43
+ const parsed = schema.safeParse(extracted);
44
+ if (parsed.success) {
45
+ return { value: parsed.data, provider: lastProvider, model: lastModel, attempts: attempt + 1 };
46
+ }
47
+ }
48
+ // try again
49
+ }
50
+ if (opts.fallback !== undefined) {
51
+ return { value: opts.fallback, provider: lastProvider, model: lastModel, attempts: maxRetries + 1 };
52
+ }
53
+ throw new Error('Failed to extract valid JSON after ' + (maxRetries + 1) + ' attempts. Last text: ' + lastText.slice(0, 200));
54
+ }
55
+ /**
56
+ * Attempt to extract a JSON object from a blob of text. Tolerates code fences,
57
+ * leading/trailing prose, unbalanced whitespace.
58
+ */
59
+ function extractJson(text) {
60
+ if (!text)
61
+ return null;
62
+ const clean = text.replace(/```json\s*|```\s*/g, '');
63
+ try {
64
+ return JSON.parse(clean);
65
+ }
66
+ catch { /* try harder */ }
67
+ // Find the largest balanced {...} or [...] substring
68
+ const firstBrace = clean.search(/[{[]/);
69
+ if (firstBrace < 0)
70
+ return null;
71
+ let depth = 0;
72
+ let inString = false;
73
+ let escape = false;
74
+ for (let i = firstBrace; i < clean.length; i++) {
75
+ const c = clean[i];
76
+ if (inString) {
77
+ if (escape) {
78
+ escape = false;
79
+ continue;
80
+ }
81
+ if (c === '\\') {
82
+ escape = true;
83
+ continue;
84
+ }
85
+ if (c === '"')
86
+ inString = false;
87
+ continue;
88
+ }
89
+ if (c === '"') {
90
+ inString = true;
91
+ continue;
92
+ }
93
+ if (c === '{' || c === '[')
94
+ depth++;
95
+ else if (c === '}' || c === ']') {
96
+ depth--;
97
+ if (depth === 0) {
98
+ const candidate = clean.slice(firstBrace, i + 1);
99
+ try {
100
+ return JSON.parse(candidate);
101
+ }
102
+ catch {
103
+ return null;
104
+ }
105
+ }
106
+ }
107
+ }
108
+ return null;
109
+ }
110
+ /** Re-export Zod for downstream brain modules that want to define schemas. */
111
+ export { z };
112
+ //# sourceMappingURL=json-output.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-output.js","sourceRoot":"","sources":["../../src/brain/json-output.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ import { L0CacheEntry, L0CacheStats } from '../types.js';
2
+ export interface L0CacheOptions {
3
+ bytesLimit?: number;
4
+ /** Estimate bytes for a value when computing budget */
5
+ byteEstimator?: (value: unknown) => number;
6
+ }
7
+ /** Generic L0 cache. Construct one per logical namespace (recall, vectors, etc.) */
8
+ export declare class L0Cache<T = unknown> {
9
+ private map;
10
+ private bytesUsed;
11
+ private bytesLimit;
12
+ private byteEstimator;
13
+ private hits;
14
+ private misses;
15
+ private evictions;
16
+ private accessTimingsNs;
17
+ constructor(opts?: L0CacheOptions);
18
+ /** Get a value from the cache — sub-microsecond on hit */
19
+ get(key: string): T | undefined;
20
+ /** Set a value — evicts LRU entries if over budget */
21
+ set(key: string, value: T): void;
22
+ /** Check existence without touching LRU */
23
+ has(key: string): boolean;
24
+ /** Remove a single entry */
25
+ delete(key: string): boolean;
26
+ /** Clear all entries */
27
+ clear(): void;
28
+ /** Get cache stats */
29
+ getStats(): L0CacheStats;
30
+ /** Iterate entries (for warm-restart persistence) */
31
+ entries(): IterableIterator<[string, L0CacheEntry<T>]>;
32
+ /** Resize the byte budget — evicts if shrinking */
33
+ resize(newBytesLimit: number): void;
34
+ private evictOldest;
35
+ private recordTiming;
36
+ }
37
+ export declare function getCache<T = unknown>(namespace: string, opts?: L0CacheOptions): L0Cache<T>;
38
+ export declare function getAllCacheStats(): Record<string, L0CacheStats>;
39
+ export declare function clearAllCaches(): void;
40
+ //# sourceMappingURL=l0-cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"l0-cache.d.ts","sourceRoot":"","sources":["../../src/brain/l0-cache.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAIzD,MAAM,WAAW,cAAc;IAC7B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,uDAAuD;IACvD,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,MAAM,CAAC;CAC5C;AAgBD,oFAAoF;AACpF,qBAAa,OAAO,CAAC,CAAC,GAAG,OAAO;IAC9B,OAAO,CAAC,GAAG,CAA2C;IACtD,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,aAAa,CAA6B;IAElD,OAAO,CAAC,IAAI,CAAK;IACjB,OAAO,CAAC,MAAM,CAAK;IACnB,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,eAAe,CAAgB;gBAE3B,IAAI,GAAE,cAAmB;IAKrC,0DAA0D;IAC1D,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS;IAqB/B,sDAAsD;IACtD,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI;IA4BhC,2CAA2C;IAC3C,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAIzB,4BAA4B;IAC5B,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAO5B,wBAAwB;IACxB,KAAK,IAAI,IAAI;IAKb,sBAAsB;IACtB,QAAQ,IAAI,YAAY;IAyBxB,qDAAqD;IACrD,OAAO,IAAI,gBAAgB,CAAC,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;IAItD,mDAAmD;IACnD,MAAM,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI;IAOnC,OAAO,CAAC,WAAW;IAUnB,OAAO,CAAC,YAAY;CAOrB;AAKD,wBAAgB,QAAQ,CAAC,CAAC,GAAG,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,CAAC,CAAC,CAO1F;AAED,wBAAgB,gBAAgB,IAAI,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAM/D;AAED,wBAAgB,cAAc,IAAI,IAAI,CAErC"}
@@ -0,0 +1,176 @@
1
+ // src/brain/l0-cache.ts — L0 In-Memory Hot Tier (v5.2.0)
2
+ //
3
+ // Sub-millisecond recall for the hottest brain entries. Sits in front of the
4
+ // global JSON brain. Map-based, LRU-evicted, byte-budget-bounded.
5
+ //
6
+ // Design:
7
+ // - Pure JavaScript Map (insertion-ordered → easy LRU)
8
+ // - Byte budget (default 64MB) prevents memory bloat
9
+ // - Tracks hit/miss for adaptive prefetch decisions
10
+ // - Auto-evict least-recently-accessed when budget exceeded
11
+ const DEFAULT_BYTES_LIMIT = 64 * 1024 * 1024; // 64MB
12
+ /** Default byte estimator — works for strings, objects, arrays */
13
+ function defaultByteEstimator(value) {
14
+ if (value == null)
15
+ return 8;
16
+ if (typeof value === 'string')
17
+ return value.length * 2;
18
+ if (typeof value === 'number')
19
+ return 8;
20
+ if (typeof value === 'boolean')
21
+ return 4;
22
+ if (value instanceof Uint8Array)
23
+ return value.byteLength;
24
+ try {
25
+ return JSON.stringify(value).length * 2;
26
+ }
27
+ catch {
28
+ return 64;
29
+ }
30
+ }
31
+ /** Generic L0 cache. Construct one per logical namespace (recall, vectors, etc.) */
32
+ export class L0Cache {
33
+ constructor(opts = {}) {
34
+ this.map = new Map();
35
+ this.bytesUsed = 0;
36
+ this.hits = 0;
37
+ this.misses = 0;
38
+ this.evictions = 0;
39
+ this.accessTimingsNs = [];
40
+ this.bytesLimit = opts.bytesLimit ?? DEFAULT_BYTES_LIMIT;
41
+ this.byteEstimator = opts.byteEstimator ?? defaultByteEstimator;
42
+ }
43
+ /** Get a value from the cache — sub-microsecond on hit */
44
+ get(key) {
45
+ const start = process.hrtime.bigint();
46
+ const entry = this.map.get(key);
47
+ if (!entry) {
48
+ this.misses++;
49
+ this.recordTiming(start);
50
+ return undefined;
51
+ }
52
+ // LRU touch — re-insert at end of map
53
+ this.map.delete(key);
54
+ entry.hits++;
55
+ entry.lastAccessed = Date.now();
56
+ this.map.set(key, entry);
57
+ this.hits++;
58
+ this.recordTiming(start);
59
+ return entry.value;
60
+ }
61
+ /** Set a value — evicts LRU entries if over budget */
62
+ set(key, value) {
63
+ const bytes = this.byteEstimator(value);
64
+ // If key already exists, subtract its bytes first
65
+ const existing = this.map.get(key);
66
+ if (existing) {
67
+ this.bytesUsed -= existing.bytes;
68
+ this.map.delete(key);
69
+ }
70
+ // Make room
71
+ while (this.bytesUsed + bytes > this.bytesLimit && this.map.size > 0) {
72
+ this.evictOldest();
73
+ }
74
+ const entry = {
75
+ key,
76
+ value,
77
+ hits: 0,
78
+ insertedAt: Date.now(),
79
+ lastAccessed: Date.now(),
80
+ bytes,
81
+ };
82
+ this.map.set(key, entry);
83
+ this.bytesUsed += bytes;
84
+ }
85
+ /** Check existence without touching LRU */
86
+ has(key) {
87
+ return this.map.has(key);
88
+ }
89
+ /** Remove a single entry */
90
+ delete(key) {
91
+ const entry = this.map.get(key);
92
+ if (!entry)
93
+ return false;
94
+ this.bytesUsed -= entry.bytes;
95
+ return this.map.delete(key);
96
+ }
97
+ /** Clear all entries */
98
+ clear() {
99
+ this.map.clear();
100
+ this.bytesUsed = 0;
101
+ }
102
+ /** Get cache stats */
103
+ getStats() {
104
+ const total = this.hits + this.misses;
105
+ const avgAccessNs = this.accessTimingsNs.length
106
+ ? this.accessTimingsNs.reduce((a, b) => a + b, 0) / this.accessTimingsNs.length
107
+ : 0;
108
+ // Top 10 most-hit keys
109
+ const topKeys = Array.from(this.map.values())
110
+ .sort((a, b) => b.hits - a.hits)
111
+ .slice(0, 10)
112
+ .map(e => ({ key: e.key, hits: e.hits }));
113
+ return {
114
+ entries: this.map.size,
115
+ bytesUsed: this.bytesUsed,
116
+ bytesLimit: this.bytesLimit,
117
+ hits: this.hits,
118
+ misses: this.misses,
119
+ hitRate: total ? this.hits / total : 0,
120
+ evictions: this.evictions,
121
+ avgAccessNs,
122
+ topKeys,
123
+ };
124
+ }
125
+ /** Iterate entries (for warm-restart persistence) */
126
+ entries() {
127
+ return this.map.entries();
128
+ }
129
+ /** Resize the byte budget — evicts if shrinking */
130
+ resize(newBytesLimit) {
131
+ this.bytesLimit = newBytesLimit;
132
+ while (this.bytesUsed > this.bytesLimit && this.map.size > 0) {
133
+ this.evictOldest();
134
+ }
135
+ }
136
+ evictOldest() {
137
+ // First entry in Map = oldest by insertion (and we re-insert on touch → LRU)
138
+ const oldest = this.map.keys().next().value;
139
+ if (oldest === undefined)
140
+ return;
141
+ const entry = this.map.get(oldest);
142
+ if (entry)
143
+ this.bytesUsed -= entry.bytes;
144
+ this.map.delete(oldest);
145
+ this.evictions++;
146
+ }
147
+ recordTiming(startNs) {
148
+ const elapsedNs = Number(process.hrtime.bigint() - startNs);
149
+ this.accessTimingsNs.push(elapsedNs);
150
+ if (this.accessTimingsNs.length > 1000) {
151
+ this.accessTimingsNs.shift();
152
+ }
153
+ }
154
+ }
155
+ /** Process-wide singleton caches — one per logical namespace */
156
+ const caches = new Map();
157
+ export function getCache(namespace, opts) {
158
+ let cache = caches.get(namespace);
159
+ if (!cache) {
160
+ cache = new L0Cache(opts);
161
+ caches.set(namespace, cache);
162
+ }
163
+ return cache;
164
+ }
165
+ export function getAllCacheStats() {
166
+ const out = {};
167
+ for (const [name, cache] of caches.entries()) {
168
+ out[name] = cache.getStats();
169
+ }
170
+ return out;
171
+ }
172
+ export function clearAllCaches() {
173
+ for (const cache of caches.values())
174
+ cache.clear();
175
+ }
176
+ //# sourceMappingURL=l0-cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"l0-cache.js","sourceRoot":"","sources":["../../src/brain/l0-cache.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import { LocalLLMConfig, LocalLLMProvider, LocalLLMResponse } from '../types.js';
2
+ export declare class LocalLLM {
3
+ private config;
4
+ constructor(config?: Partial<LocalLLMConfig>);
5
+ /** Check if the local provider is reachable. */
6
+ isAvailable(): Promise<boolean>;
7
+ /** Generate text locally. Falls back to deterministic stub when unreachable. */
8
+ generate(prompt: string, system?: string): Promise<LocalLLMResponse>;
9
+ /** Rough per-call cost in USD for a local model — effectively zero (electricity). */
10
+ static estimatedCostUsd(_tokens: number): number;
11
+ getConfig(): LocalLLMConfig;
12
+ setConfig(patch: Partial<LocalLLMConfig>): void;
13
+ private generateOllama;
14
+ private fallback;
15
+ }
16
+ export declare function getLocalLLM(config?: Partial<LocalLLMConfig>): LocalLLM;
17
+ export declare function resetLocalLLMForTests(): void;
18
+ /** Map a generic provider preference to a LocalLLMProvider. */
19
+ export declare function preferredLocalProvider(pref?: string): LocalLLMProvider;
20
+ //# sourceMappingURL=local-llm.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-llm.d.ts","sourceRoot":"","sources":["../../src/brain/local-llm.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAWjF,qBAAa,QAAQ;IACnB,OAAO,CAAC,MAAM,CAAiB;gBAEnB,MAAM,GAAE,OAAO,CAAC,cAAc,CAAM;IAIhD,gDAAgD;IAC1C,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAarC,gFAAgF;IAC1E,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAuB1E,qFAAqF;IACrF,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;IAIhD,SAAS,IAAI,cAAc;IAI3B,SAAS,CAAC,KAAK,EAAE,OAAO,CAAC,cAAc,CAAC,GAAG,IAAI;YAMjC,cAAc;IA8B5B,OAAO,CAAC,QAAQ;CAejB;AAID,wBAAgB,WAAW,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,GAAG,QAAQ,CAItE;AAED,wBAAgB,qBAAqB,IAAI,IAAI,CAE5C;AAED,+DAA+D;AAC/D,wBAAgB,sBAAsB,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,gBAAgB,CAGtE"}