@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,174 @@
1
+ // src/brain/forgetting-curve.ts — Ebbinghaus-inspired memory decay + sleep consolidation
2
+ // v6.0.0 — Hive Mind Edition
3
+ //
4
+ // Memory strength decays over time unless reinforced. During "sleep" cycles,
5
+ // memories that cross strength thresholds are promoted or demoted between
6
+ // hierarchical tiers (raw → summary → pattern → principle).
7
+ //
8
+ // Formula (simplified Ebbinghaus):
9
+ // strength(t) = initialStrength * exp(-t / halfLife)
10
+ // Half-life grows each time a memory is reinforced (spacing effect).
11
+ import * as fs from 'fs';
12
+ import * as path from 'path';
13
+ import * as os from 'os';
14
+ const STATE_PATH = path.join(os.homedir(), '.shadow-brain', 'forgetting.json');
15
+ const DEFAULT_HALF_LIFE_HOURS = 72;
16
+ const MIN_STRENGTH_BEFORE_FORGET = 0.05;
17
+ export class ForgettingCurve {
18
+ constructor() {
19
+ this.states = new Map();
20
+ this.reports = [];
21
+ this.cycleCount = 0;
22
+ this.initialized = false;
23
+ }
24
+ async init() {
25
+ if (this.initialized)
26
+ return;
27
+ fs.mkdirSync(path.dirname(STATE_PATH), { recursive: true });
28
+ if (fs.existsSync(STATE_PATH)) {
29
+ try {
30
+ const parsed = JSON.parse(fs.readFileSync(STATE_PATH, 'utf-8'));
31
+ for (const s of parsed.states ?? []) {
32
+ this.states.set(s.memoryId, { ...s, lastReinforced: new Date(s.lastReinforced) });
33
+ }
34
+ this.reports = (parsed.reports ?? []).map(r => ({ ...r, ranAt: new Date(r.ranAt) }));
35
+ this.cycleCount = this.reports.length;
36
+ }
37
+ catch {
38
+ /* skip */
39
+ }
40
+ }
41
+ this.initialized = true;
42
+ }
43
+ async track(memoryId, initialStrength = 1.0, consolidatedTier = 'raw') {
44
+ await this.init();
45
+ const existing = this.states.get(memoryId);
46
+ if (existing)
47
+ return existing;
48
+ const state = {
49
+ memoryId,
50
+ initialStrength,
51
+ currentStrength: initialStrength,
52
+ lastReinforced: new Date(),
53
+ accessCount: 1,
54
+ halfLifeHours: DEFAULT_HALF_LIFE_HOURS,
55
+ consolidatedTier,
56
+ };
57
+ this.states.set(memoryId, state);
58
+ await this.persist();
59
+ return state;
60
+ }
61
+ async reinforce(memoryId, strengthBoost = 0.2) {
62
+ await this.init();
63
+ const state = this.states.get(memoryId);
64
+ if (!state)
65
+ return null;
66
+ state.currentStrength = Math.min(1.0, state.currentStrength + strengthBoost);
67
+ state.accessCount++;
68
+ state.halfLifeHours = Math.min(24 * 90, state.halfLifeHours * 1.4); // spacing effect
69
+ state.lastReinforced = new Date();
70
+ await this.persist();
71
+ return state;
72
+ }
73
+ /** Run a consolidation sleep cycle. Returns a report of changes. */
74
+ async runConsolidation() {
75
+ await this.init();
76
+ const start = Date.now();
77
+ this.cycleCount++;
78
+ let promoted = 0;
79
+ let demoted = 0;
80
+ let forgotten = 0;
81
+ let strengthened = 0;
82
+ const now = Date.now();
83
+ const toForget = [];
84
+ for (const state of this.states.values()) {
85
+ const ageHours = (now - state.lastReinforced.getTime()) / (1000 * 60 * 60);
86
+ state.currentStrength = state.initialStrength * Math.exp(-ageHours / state.halfLifeHours);
87
+ if (state.currentStrength < MIN_STRENGTH_BEFORE_FORGET) {
88
+ toForget.push(state.memoryId);
89
+ forgotten++;
90
+ continue;
91
+ }
92
+ // Tier movement based on strength
93
+ const prevTier = state.consolidatedTier;
94
+ state.consolidatedTier = this.tierForStrength(state.currentStrength, state.accessCount);
95
+ if (this.tierRank(state.consolidatedTier) > this.tierRank(prevTier))
96
+ promoted++;
97
+ else if (this.tierRank(state.consolidatedTier) < this.tierRank(prevTier))
98
+ demoted++;
99
+ if (state.currentStrength >= 0.85)
100
+ strengthened++;
101
+ }
102
+ for (const id of toForget)
103
+ this.states.delete(id);
104
+ const report = {
105
+ cycle: this.cycleCount,
106
+ processedMemories: this.states.size + forgotten,
107
+ promoted,
108
+ demoted,
109
+ forgotten,
110
+ strengthened,
111
+ ranAt: new Date(),
112
+ durationMs: Date.now() - start,
113
+ };
114
+ this.reports.push(report);
115
+ if (this.reports.length > 50)
116
+ this.reports = this.reports.slice(-50);
117
+ await this.persist();
118
+ return report;
119
+ }
120
+ getState(memoryId) {
121
+ return this.states.get(memoryId) ?? null;
122
+ }
123
+ listStates(limit = 50) {
124
+ return Array.from(this.states.values())
125
+ .sort((a, b) => b.currentStrength - a.currentStrength)
126
+ .slice(0, limit);
127
+ }
128
+ listReports(limit = 20) {
129
+ return this.reports.slice(-limit).reverse();
130
+ }
131
+ // ── Internals ─────────────────────────────────────────────────────────────
132
+ tierForStrength(strength, accessCount) {
133
+ if (strength >= 0.9 && accessCount >= 10)
134
+ return 'principle';
135
+ if (strength >= 0.7 && accessCount >= 4)
136
+ return 'pattern';
137
+ if (strength >= 0.4)
138
+ return 'summary';
139
+ return 'raw';
140
+ }
141
+ tierRank(tier) {
142
+ switch (tier) {
143
+ case 'raw': return 0;
144
+ case 'summary': return 1;
145
+ case 'pattern': return 2;
146
+ case 'principle': return 3;
147
+ }
148
+ }
149
+ async persist() {
150
+ try {
151
+ const payload = {
152
+ schemaVersion: 1,
153
+ states: Array.from(this.states.values()),
154
+ reports: this.reports,
155
+ };
156
+ const tmp = STATE_PATH + '.tmp';
157
+ fs.writeFileSync(tmp, JSON.stringify(payload, null, 2));
158
+ fs.renameSync(tmp, STATE_PATH);
159
+ }
160
+ catch {
161
+ /* non-fatal */
162
+ }
163
+ }
164
+ }
165
+ let _instance = null;
166
+ export function getForgettingCurve() {
167
+ if (!_instance)
168
+ _instance = new ForgettingCurve();
169
+ return _instance;
170
+ }
171
+ export function resetForgettingCurveForTests() {
172
+ _instance = null;
173
+ }
174
+ //# sourceMappingURL=forgetting-curve.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"forgetting-curve.js","sourceRoot":"","sources":["../../src/brain/forgetting-curve.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import { FormalBridgeStats, FormalRule } from '../types.js';
2
+ export declare class FormalVerificationBridge {
3
+ private brain;
4
+ private rules;
5
+ private initialized;
6
+ constructor();
7
+ init(): Promise<void>;
8
+ /** Generate a formal rule from a memory by semantic pattern detection. */
9
+ generateFromMemory(memoryId: string): Promise<FormalRule | null>;
10
+ /** Generate a rule from raw natural-language text. */
11
+ generateFromText(text: string, sourceId?: string): Promise<FormalRule>;
12
+ /** Compile all formal rules into ESLint config snippet. */
13
+ exportEslintConfig(): string;
14
+ /** Compile all formal rules into Semgrep YAML. */
15
+ exportSemgrepYaml(): string;
16
+ /** Snapshot stats. */
17
+ stats(): FormalBridgeStats;
18
+ listRules(limit?: number): FormalRule[];
19
+ removeRule(id: string): Promise<boolean>;
20
+ private semgrepBlock;
21
+ private escapeRegex;
22
+ private persist;
23
+ }
24
+ export declare function getFormalBridge(): FormalVerificationBridge;
25
+ export declare function resetFormalBridgeForTests(): void;
26
+ //# sourceMappingURL=formal-verification-bridge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formal-verification-bridge.d.ts","sourceRoot":"","sources":["../../src/brain/formal-verification-bridge.ts"],"names":[],"mappings":"AAeA,OAAO,EACL,iBAAiB,EACjB,UAAU,EACX,MAAM,aAAa,CAAC;AAUrB,qBAAa,wBAAwB;IACnC,OAAO,CAAC,KAAK,CAAc;IAC3B,OAAO,CAAC,KAAK,CAAsC;IACnD,OAAO,CAAC,WAAW,CAAS;;IAMtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAiB3B,0EAA0E;IACpE,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAOtE,sDAAsD;IAChD,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IA4G5E,2DAA2D;IAC3D,kBAAkB,IAAI,MAAM;IAa5B,kDAAkD;IAClD,iBAAiB,IAAI,MAAM;IAQ3B,sBAAsB;IACtB,KAAK,IAAI,iBAAiB;IAiB1B,SAAS,CAAC,KAAK,SAAK,GAAG,UAAU,EAAE;IAM7B,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAS9C,OAAO,CAAC,YAAY;IAIpB,OAAO,CAAC,WAAW;YAIL,OAAO;CAatB;AAID,wBAAgB,eAAe,IAAI,wBAAwB,CAG1D;AAED,wBAAgB,yBAAyB,IAAI,IAAI,CAEhD"}
@@ -0,0 +1,219 @@
1
+ // src/brain/formal-verification-bridge.ts — Natural-language brain patterns → formal checks
2
+ // v6.0.0 — Hive Mind Edition
3
+ //
4
+ // Takes brain memories like "always use parameterized SQL queries" and generates:
5
+ // - ESLint rule snippet (for JS/TS)
6
+ // - Semgrep rule (for Python/Go/multi-language)
7
+ // - LSP diagnostic (generic regex + message + code)
8
+ //
9
+ // Bridges informal team knowledge into enforced compile-time spec. Shadow Brain
10
+ // is the first tool that does this auto-generation step.
11
+ import * as fs from 'fs';
12
+ import * as path from 'path';
13
+ import * as os from 'os';
14
+ import * as crypto from 'crypto';
15
+ import { getGlobalBrain } from './global-brain.js';
16
+ const RULES_PATH = path.join(os.homedir(), '.shadow-brain', 'formal-rules.json');
17
+ export class FormalVerificationBridge {
18
+ constructor() {
19
+ this.rules = new Map();
20
+ this.initialized = false;
21
+ this.brain = getGlobalBrain();
22
+ }
23
+ async init() {
24
+ if (this.initialized)
25
+ return;
26
+ fs.mkdirSync(path.dirname(RULES_PATH), { recursive: true });
27
+ await this.brain.init();
28
+ if (fs.existsSync(RULES_PATH)) {
29
+ try {
30
+ const parsed = JSON.parse(fs.readFileSync(RULES_PATH, 'utf-8'));
31
+ for (const r of parsed.rules ?? []) {
32
+ this.rules.set(r.id, { ...r, generatedAt: new Date(r.generatedAt) });
33
+ }
34
+ }
35
+ catch {
36
+ /* skip */
37
+ }
38
+ }
39
+ this.initialized = true;
40
+ }
41
+ /** Generate a formal rule from a memory by semantic pattern detection. */
42
+ async generateFromMemory(memoryId) {
43
+ await this.init();
44
+ const entry = this.brain.recallByIds([memoryId])[0];
45
+ if (!entry)
46
+ return null;
47
+ return this.generateFromText(entry.content, memoryId);
48
+ }
49
+ /** Generate a rule from raw natural-language text. */
50
+ async generateFromText(text, sourceId) {
51
+ await this.init();
52
+ const rule = {
53
+ id: `fr-${crypto.randomBytes(6).toString('hex')}`,
54
+ sourceMemoryId: sourceId ?? '',
55
+ naturalLanguage: text.slice(0, 400),
56
+ languageScope: [],
57
+ generatedAt: new Date(),
58
+ verified: false,
59
+ };
60
+ const lower = text.toLowerCase();
61
+ // SQL patterns
62
+ if (/(parameterized|prepared statement|no string concat).*sql|sql.*(parameterized|prepared)/.test(lower)
63
+ || /never.*(concatenate|interpolate).*sql/.test(lower)) {
64
+ rule.eslintRule = JSON.stringify({
65
+ 'no-restricted-syntax': [
66
+ 'error',
67
+ { selector: "TemplateLiteral[quasis.0.value.cooked=/SELECT|INSERT|UPDATE|DELETE/i]", message: 'Use parameterized SQL queries.' },
68
+ ],
69
+ }, null, 2);
70
+ rule.semgrepRule = this.semgrepBlock('brain.no-sql-string-concat', ['javascript', 'typescript', 'python', 'go'], '$X + "SELECT " + $Y', 'SQL string concatenation detected. Use parameterized queries.');
71
+ rule.lspDiagnostic = {
72
+ code: 'SB-SQL-001',
73
+ pattern: String.raw `\b(query|execute)\s*\(\s*\`[^\`]*(SELECT|INSERT|UPDATE|DELETE)[^\`]*\$\{`,
74
+ message: 'Interpolated SQL detected. Use parameterized queries (sqlite3/pg/knex).',
75
+ };
76
+ rule.languageScope = ['javascript', 'typescript', 'python', 'go'];
77
+ this.rules.set(rule.id, rule);
78
+ await this.persist();
79
+ return rule;
80
+ }
81
+ // Secret-in-code pattern
82
+ if (/don('|)?t (hard\s?code|commit|store).*(api[_-]?key|secret|token|password)/.test(lower)) {
83
+ rule.eslintRule = JSON.stringify({
84
+ 'no-restricted-syntax': [
85
+ 'error',
86
+ { selector: "Literal[raw=/(api[_-]?key|secret|token|password)\\s*[:=]/i]", message: 'Potential secret in source.' },
87
+ ],
88
+ }, null, 2);
89
+ rule.semgrepRule = this.semgrepBlock('brain.no-hardcoded-secrets', ['javascript', 'typescript', 'python', 'go', 'java'], '$VAR = "..."', 'Possible secret hardcoded in source. Use env vars.');
90
+ rule.lspDiagnostic = {
91
+ code: 'SB-SEC-001',
92
+ pattern: String.raw `(api[_-]?key|secret|token|password|passwd)\s*[:=]\s*["'][^"']{8,}["']`,
93
+ message: 'Possible hardcoded secret. Move to environment variables.',
94
+ };
95
+ rule.languageScope = ['javascript', 'typescript', 'python', 'go', 'java'];
96
+ this.rules.set(rule.id, rule);
97
+ await this.persist();
98
+ return rule;
99
+ }
100
+ // Bcrypt / password hashing
101
+ if (/bcrypt.*cost.*1[012]|argon2|hash.*password/.test(lower) && !/md5|sha1/.test(lower)) {
102
+ rule.lspDiagnostic = {
103
+ code: 'SB-SEC-002',
104
+ pattern: String.raw `\bbcrypt\.(hash|hashSync)\s*\([^,]+,\s*[0-9](?!\d)`,
105
+ message: 'bcrypt cost factor is too low. Use >=12 (project convention).',
106
+ };
107
+ rule.languageScope = ['javascript', 'typescript'];
108
+ this.rules.set(rule.id, rule);
109
+ await this.persist();
110
+ return rule;
111
+ }
112
+ // Generic "avoid X" pattern (catch-all)
113
+ const avoidMatch = lower.match(/avoid\s+([a-z0-9_\-. /]+)/);
114
+ if (avoidMatch) {
115
+ const target = avoidMatch[1].trim();
116
+ rule.lspDiagnostic = {
117
+ code: 'SB-GEN-001',
118
+ pattern: this.escapeRegex(target),
119
+ message: `Project memory advises avoiding "${target}".`,
120
+ };
121
+ rule.languageScope = ['any'];
122
+ this.rules.set(rule.id, rule);
123
+ await this.persist();
124
+ return rule;
125
+ }
126
+ // Fallback: no formal pattern matched
127
+ rule.lspDiagnostic = undefined;
128
+ rule.languageScope = [];
129
+ this.rules.set(rule.id, rule);
130
+ await this.persist();
131
+ return rule;
132
+ }
133
+ /** Compile all formal rules into ESLint config snippet. */
134
+ exportEslintConfig() {
135
+ const rules = {};
136
+ for (const r of this.rules.values()) {
137
+ if (r.eslintRule) {
138
+ try {
139
+ const obj = JSON.parse(r.eslintRule);
140
+ Object.assign(rules, obj);
141
+ }
142
+ catch { /* skip */ }
143
+ }
144
+ }
145
+ return JSON.stringify({ rules }, null, 2);
146
+ }
147
+ /** Compile all formal rules into Semgrep YAML. */
148
+ exportSemgrepYaml() {
149
+ const lines = ['rules:'];
150
+ for (const r of this.rules.values()) {
151
+ if (r.semgrepRule)
152
+ lines.push(r.semgrepRule);
153
+ }
154
+ return lines.join('\n');
155
+ }
156
+ /** Snapshot stats. */
157
+ stats() {
158
+ const byLang = {};
159
+ let verified = 0;
160
+ let lastGenerated = null;
161
+ for (const r of this.rules.values()) {
162
+ for (const lang of r.languageScope)
163
+ byLang[lang] = (byLang[lang] ?? 0) + 1;
164
+ if (r.verified)
165
+ verified++;
166
+ if (!lastGenerated || r.generatedAt > lastGenerated)
167
+ lastGenerated = r.generatedAt;
168
+ }
169
+ return {
170
+ totalRules: this.rules.size,
171
+ byLanguage: byLang,
172
+ verifiedRules: verified,
173
+ lastGenerated,
174
+ };
175
+ }
176
+ listRules(limit = 50) {
177
+ return Array.from(this.rules.values())
178
+ .sort((a, b) => b.generatedAt.getTime() - a.generatedAt.getTime())
179
+ .slice(0, limit);
180
+ }
181
+ async removeRule(id) {
182
+ await this.init();
183
+ const ok = this.rules.delete(id);
184
+ if (ok)
185
+ await this.persist();
186
+ return ok;
187
+ }
188
+ // ── Internals ─────────────────────────────────────────────────────────────
189
+ semgrepBlock(id, languages, pattern, message) {
190
+ return ` - id: ${id}\n languages: [${languages.join(', ')}]\n severity: WARNING\n message: "${message}"\n pattern: |\n ${pattern.replace(/\n/g, '\n ')}`;
191
+ }
192
+ escapeRegex(s) {
193
+ return s.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
194
+ }
195
+ async persist() {
196
+ try {
197
+ const payload = {
198
+ schemaVersion: 1,
199
+ rules: Array.from(this.rules.values()),
200
+ };
201
+ const tmp = RULES_PATH + '.tmp';
202
+ fs.writeFileSync(tmp, JSON.stringify(payload, null, 2));
203
+ fs.renameSync(tmp, RULES_PATH);
204
+ }
205
+ catch {
206
+ /* non-fatal */
207
+ }
208
+ }
209
+ }
210
+ let _instance = null;
211
+ export function getFormalBridge() {
212
+ if (!_instance)
213
+ _instance = new FormalVerificationBridge();
214
+ return _instance;
215
+ }
216
+ export function resetFormalBridgeForTests() {
217
+ _instance = null;
218
+ }
219
+ //# sourceMappingURL=formal-verification-bridge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formal-verification-bridge.js","sourceRoot":"","sources":["../../src/brain/formal-verification-bridge.ts"],"names":[],"mappings":"AAAA,4FAA4F;AAC5F,6BAA6B;AAC7B,EAAE;AACF,kFAAkF;AAClF,sCAAsC;AACtC,kDAAkD;AAClD,sDAAsD;AACtD,EAAE;AACF,gFAAgF;AAChF,yDAAyD;AAEzD,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,MAAM,MAAM,QAAQ,CAAC;AAKjC,OAAO,EAAE,cAAc,EAAe,MAAM,mBAAmB,CAAC;AAEhE,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,eAAe,EAAE,mBAAmB,CAAC,CAAC;AAOjF,MAAM,OAAO,wBAAwB;IAKnC;QAHQ,UAAK,GAA4B,IAAI,GAAG,EAAE,CAAC;QAC3C,gBAAW,GAAG,KAAK,CAAC;QAG1B,IAAI,CAAC,KAAK,GAAG,cAAc,EAAE,CAAC;IAChC,CAAC;IAED,KAAK,CAAC,IAAI;QACR,IAAI,IAAI,CAAC,WAAW;YAAE,OAAO;QAC7B,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC5D,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QACxB,IAAI,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAC9B,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAiB,CAAC;gBAChF,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,KAAK,IAAI,EAAE,EAAE,CAAC;oBACnC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,WAAW,EAAE,IAAI,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;gBACvE,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,UAAU;YACZ,CAAC;QACH,CAAC;QACD,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;IAC1B,CAAC;IAED,0EAA0E;IAC1E,KAAK,CAAC,kBAAkB,CAAC,QAAgB;QACvC,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAClB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACpD,IAAI,CAAC,KAAK;YAAE,OAAO,IAAI,CAAC;QACxB,OAAO,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IACxD,CAAC;IAED,sDAAsD;IACtD,KAAK,CAAC,gBAAgB,CAAC,IAAY,EAAE,QAAiB;QACpD,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAClB,MAAM,IAAI,GAAe;YACvB,EAAE,EAAE,MAAM,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE;YACjD,cAAc,EAAE,QAAQ,IAAI,EAAE;YAC9B,eAAe,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;YACnC,aAAa,EAAE,EAAE;YACjB,WAAW,EAAE,IAAI,IAAI,EAAE;YACvB,QAAQ,EAAE,KAAK;SAChB,CAAC;QAEF,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QAEjC,eAAe;QACf,IAAI,wFAAwF,CAAC,IAAI,CAAC,KAAK,CAAC;eACnG,uCAAuC,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YACzD,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,SAAS,CAC9B;gBACE,sBAAsB,EAAE;oBACtB,OAAO;oBACP,EAAE,QAAQ,EAAE,uEAAuE,EAAE,OAAO,EAAE,gCAAgC,EAAE;iBACjI;aACF,EACD,IAAI,EACJ,CAAC,CACF,CAAC;YACF,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,YAAY,CAClC,4BAA4B,EAC5B,CAAC,YAAY,EAAE,YAAY,EAAE,QAAQ,EAAE,IAAI,CAAC,EAC5C,qBAAqB,EACrB,+DAA+D,CAChE,CAAC;YACF,IAAI,CAAC,aAAa,GAAG;gBACnB,IAAI,EAAE,YAAY;gBAClB,OAAO,EAAE,MAAM,CAAC,GAAG,CAAA,0EAA0E;gBAC7F,OAAO,EAAE,yEAAyE;aACnF,CAAC;YACF,IAAI,CAAC,aAAa,GAAG,CAAC,YAAY,EAAE,YAAY,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;YAClE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;YAC9B,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;YACrB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,yBAAyB;QACzB,IAAI,2EAA2E,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YAC5F,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,SAAS,CAC9B;gBACE,sBAAsB,EAAE;oBACtB,OAAO;oBACP,EAAE,QAAQ,EAAE,6DAA6D,EAAE,OAAO,EAAE,6BAA6B,EAAE;iBACpH;aACF,EACD,IAAI,EACJ,CAAC,CACF,CAAC;YACF,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,YAAY,CAClC,4BAA4B,EAC5B,CAAC,YAAY,EAAE,YAAY,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,CAAC,EACpD,cAAc,EACd,oDAAoD,CACrD,CAAC;YACF,IAAI,CAAC,aAAa,GAAG;gBACnB,IAAI,EAAE,YAAY;gBAClB,OAAO,EAAE,MAAM,CAAC,GAAG,CAAA,uEAAuE;gBAC1F,OAAO,EAAE,2DAA2D;aACrE,CAAC;YACF,IAAI,CAAC,aAAa,GAAG,CAAC,YAAY,EAAE,YAAY,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;YAC1E,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;YAC9B,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;YACrB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,4BAA4B;QAC5B,IAAI,4CAA4C,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YACxF,IAAI,CAAC,aAAa,GAAG;gBACnB,IAAI,EAAE,YAAY;gBAClB,OAAO,EAAE,MAAM,CAAC,GAAG,CAAA,oDAAoD;gBACvE,OAAO,EAAE,+DAA+D;aACzE,CAAC;YACF,IAAI,CAAC,aAAa,GAAG,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC;YAClD,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;YAC9B,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;YACrB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,wCAAwC;QACxC,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAC;QAC5D,IAAI,UAAU,EAAE,CAAC;YACf,MAAM,MAAM,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YACpC,IAAI,CAAC,aAAa,GAAG;gBACnB,IAAI,EAAE,YAAY;gBAClB,OAAO,EAAE,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC;gBACjC,OAAO,EAAE,oCAAoC,MAAM,IAAI;aACxD,CAAC;YACF,IAAI,CAAC,aAAa,GAAG,CAAC,KAAK,CAAC,CAAC;YAC7B,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;YAC9B,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;YACrB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,sCAAsC;QACtC,IAAI,CAAC,aAAa,GAAG,SAAS,CAAC;QAC/B,IAAI,CAAC,aAAa,GAAG,EAAE,CAAC;QACxB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;QAC9B,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;QACrB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,2DAA2D;IAC3D,kBAAkB;QAChB,MAAM,KAAK,GAA4B,EAAE,CAAC;QAC1C,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;YACpC,IAAI,CAAC,CAAC,UAAU,EAAE,CAAC;gBACjB,IAAI,CAAC;oBACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;oBACrC,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;gBAC5B,CAAC;gBAAC,MAAM,CAAC,CAAC,UAAU,CAAC,CAAC;YACxB,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAC5C,CAAC;IAED,kDAAkD;IAClD,iBAAiB;QACf,MAAM,KAAK,GAAG,CAAC,QAAQ,CAAC,CAAC;QACzB,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;YACpC,IAAI,CAAC,CAAC,WAAW;gBAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;QAC/C,CAAC;QACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAED,sBAAsB;IACtB,KAAK;QACH,MAAM,MAAM,GAA2B,EAAE,CAAC;QAC1C,IAAI,QAAQ,GAAG,CAAC,CAAC;QACjB,IAAI,aAAa,GAAgB,IAAI,CAAC;QACtC,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;YACpC,KAAK,MAAM,IAAI,IAAI,CAAC,CAAC,aAAa;gBAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;YAC3E,IAAI,CAAC,CAAC,QAAQ;gBAAE,QAAQ,EAAE,CAAC;YAC3B,IAAI,CAAC,aAAa,IAAI,CAAC,CAAC,WAAW,GAAG,aAAa;gBAAE,aAAa,GAAG,CAAC,CAAC,WAAW,CAAC;QACrF,CAAC;QACD,OAAO;YACL,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI;YAC3B,UAAU,EAAE,MAAM;YAClB,aAAa,EAAE,QAAQ;YACvB,aAAa;SACd,CAAC;IACJ,CAAC;IAED,SAAS,CAAC,KAAK,GAAG,EAAE;QAClB,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;aACnC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC;aACjE,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IACrB,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,EAAU;QACzB,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAClB,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACjC,IAAI,EAAE;YAAE,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;QAC7B,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,6EAA6E;IAErE,YAAY,CAAC,EAAU,EAAE,SAAmB,EAAE,OAAe,EAAE,OAAe;QACpF,OAAO,WAAW,EAAE,qBAAqB,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,2CAA2C,OAAO,4BAA4B,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,UAAU,CAAC,EAAE,CAAC;IAClL,CAAC;IAEO,WAAW,CAAC,CAAS;QAC3B,OAAO,CAAC,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;IAClD,CAAC;IAEO,KAAK,CAAC,OAAO;QACnB,IAAI,CAAC;YACH,MAAM,OAAO,GAAiB;gBAC5B,aAAa,EAAE,CAAC;gBAChB,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;aACvC,CAAC;YACF,MAAM,GAAG,GAAG,UAAU,GAAG,MAAM,CAAC;YAChC,EAAE,CAAC,aAAa,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YACxD,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;QACjC,CAAC;QAAC,MAAM,CAAC;YACP,eAAe;QACjB,CAAC;IACH,CAAC;CACF;AAED,IAAI,SAAS,GAAoC,IAAI,CAAC;AAEtD,MAAM,UAAU,eAAe;IAC7B,IAAI,CAAC,SAAS;QAAE,SAAS,GAAG,IAAI,wBAAwB,EAAE,CAAC;IAC3D,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,yBAAyB;IACvC,SAAS,GAAG,IAAI,CAAC;AACnB,CAAC"}
@@ -0,0 +1,63 @@
1
+ import { AgentTool, GlobalBrainConfig, GlobalBrainStats, GlobalEntry, BrainTimelineEvent } from '../types.js';
2
+ /**
3
+ * Singleton Global Brain — the source of truth for all projects + agents.
4
+ *
5
+ * Storage: JSON file at ~/.shadow-brain/global.json (zero new deps).
6
+ * In-memory Map keyed by entry.id for O(1) ID lookups.
7
+ */
8
+ export declare class GlobalBrain {
9
+ private static instance;
10
+ private config;
11
+ private entries;
12
+ private projects;
13
+ private agents;
14
+ private writeQueue;
15
+ private syncTimer;
16
+ private stats;
17
+ private startedAt;
18
+ private initialized;
19
+ private dirty;
20
+ private constructor();
21
+ static getInstance(config?: Partial<GlobalBrainConfig>): GlobalBrain;
22
+ init(): Promise<void>;
23
+ /** Generate a stable project ID from absolute path */
24
+ static projectIdFor(rootDir: string): string;
25
+ registerProject(rootDir: string, name?: string): string;
26
+ registerAgent(agent: AgentTool): void;
27
+ /** Queue a write — resolves true on success */
28
+ write(entry: Omit<GlobalEntry, 'id' | 'createdAt' | 'lastAccessed' | 'accessCount'>): Promise<boolean>;
29
+ /** Direct synchronous write — bypasses queue */
30
+ writeSync(entry: Omit<GlobalEntry, 'id' | 'createdAt' | 'lastAccessed' | 'accessCount'>): string;
31
+ /** Recall entries — cross-project + cross-agent */
32
+ recall(opts?: {
33
+ projectId?: string;
34
+ agentTool?: AgentTool;
35
+ category?: string;
36
+ keywords?: string[];
37
+ limit?: number;
38
+ minImportance?: number;
39
+ }): GlobalEntry[];
40
+ /** Bump access count for an entry */
41
+ touch(id: string): void;
42
+ recallByIds(ids: string[]): GlobalEntry[];
43
+ /** Chronological proof stream for dashboards, handoffs, and launch demos. */
44
+ timeline(opts?: {
45
+ projectId?: string;
46
+ agentTool?: AgentTool;
47
+ category?: string;
48
+ limit?: number;
49
+ }): BrainTimelineEvent[];
50
+ getStats(): GlobalBrainStats;
51
+ /** Force a sync of pending writes to disk */
52
+ sync(): Promise<void>;
53
+ private maybeAutoMaintenance;
54
+ /** Auto-prune: drop low-importance, rarely-accessed entries when over threshold */
55
+ private prune;
56
+ private persist;
57
+ private startSyncLoop;
58
+ private refreshStats;
59
+ private estimateSizeMB;
60
+ shutdown(): Promise<void>;
61
+ }
62
+ export declare function getGlobalBrain(config?: Partial<GlobalBrainConfig>): GlobalBrain;
63
+ //# sourceMappingURL=global-brain.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"global-brain.d.ts","sourceRoot":"","sources":["../../src/brain/global-brain.ts"],"names":[],"mappings":"AAkBA,OAAO,EACL,SAAS,EACT,iBAAiB,EACjB,gBAAgB,EAChB,WAAW,EACX,kBAAkB,EACnB,MAAM,aAAa,CAAC;AAyBrB;;;;;GAKG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAA4B;IACnD,OAAO,CAAC,MAAM,CAAoB;IAClC,OAAO,CAAC,OAAO,CAAuC;IACtD,OAAO,CAAC,QAAQ,CAA8G;IAC9H,OAAO,CAAC,MAAM,CAA6G;IAC3H,OAAO,CAAC,UAAU,CAAsB;IACxC,OAAO,CAAC,SAAS,CAA+B;IAChD,OAAO,CAAC,KAAK,CAAmB;IAChC,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,KAAK,CAAS;IAEtB,OAAO;IAmBP,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,iBAAiB,CAAC,GAAG,WAAW;IAO9D,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAgC3B,sDAAsD;IACtD,MAAM,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;IAK5C,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM;IAoBvD,aAAa,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI;IAarC,+CAA+C;IACzC,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,GAAG,WAAW,GAAG,cAAc,GAAG,aAAa,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;IAoB5G,gDAAgD;IAChD,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,GAAG,WAAW,GAAG,cAAc,GAAG,aAAa,CAAC,GAAG,MAAM;IAkBhG,mDAAmD;IACnD,MAAM,CAAC,IAAI,GAAE;QACX,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,SAAS,CAAC,EAAE,SAAS,CAAC;QACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;QACpB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,aAAa,CAAC,EAAE,MAAM,CAAC;KACnB,GAAG,WAAW,EAAE;IA+BtB,qCAAqC;IACrC,KAAK,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAQvB,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,WAAW,EAAE;IASzC,6EAA6E;IAC7E,QAAQ,CAAC,IAAI,GAAE;QACb,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,SAAS,CAAC,EAAE,SAAS,CAAC;QACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,KAAK,CAAC,EAAE,MAAM,CAAC;KACX,GAAG,kBAAkB,EAAE;IAuB7B,QAAQ,IAAI,gBAAgB;IAK5B,6CAA6C;IACvC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAyB3B,OAAO,CAAC,oBAAoB;IAO5B,mFAAmF;IACnF,OAAO,CAAC,KAAK;IAeb,OAAO,CAAC,OAAO;IAcf,OAAO,CAAC,aAAa;IAOrB,OAAO,CAAC,YAAY;IAWpB,OAAO,CAAC,cAAc;IAShB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;CAMhC;AAED,wBAAgB,cAAc,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,iBAAiB,CAAC,GAAG,WAAW,CAE/E"}