@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,159 @@
1
+ // src/brain/branch-brain.ts — Branch Brains (git-aware memory context)
2
+ // v6.0.0 — Hive Mind Edition
3
+ //
4
+ // When you switch git branches, the brain's active memory set switches too.
5
+ // Memories are tagged `branch:<name>` or `global` when created. Git-aware
6
+ // filtering keeps the mental model aligned with the branch you're on.
7
+ import * as fs from 'fs';
8
+ import * as path from 'path';
9
+ import * as os from 'os';
10
+ import { getGlobalBrain, GlobalBrain } from './global-brain.js';
11
+ const TAGS_PATH = path.join(os.homedir(), '.shadow-brain', 'branch-tags.json');
12
+ export class BranchBrain {
13
+ constructor() {
14
+ this.tags = new Map(); // memoryId → tags
15
+ this.lastBranchByProject = new Map();
16
+ this.initialized = false;
17
+ this.brain = getGlobalBrain();
18
+ }
19
+ async init() {
20
+ if (this.initialized)
21
+ return;
22
+ fs.mkdirSync(path.dirname(TAGS_PATH), { recursive: true });
23
+ await this.brain.init();
24
+ if (fs.existsSync(TAGS_PATH)) {
25
+ try {
26
+ const parsed = JSON.parse(fs.readFileSync(TAGS_PATH, 'utf-8'));
27
+ for (const t of parsed.tags ?? []) {
28
+ const rehy = { ...t, taggedAt: new Date(t.taggedAt) };
29
+ const existing = this.tags.get(rehy.memoryId) ?? [];
30
+ existing.push(rehy);
31
+ this.tags.set(rehy.memoryId, existing);
32
+ }
33
+ for (const [proj, br] of Object.entries(parsed.lastBranchByProject ?? {})) {
34
+ this.lastBranchByProject.set(proj, br);
35
+ }
36
+ }
37
+ catch {
38
+ /* skip */
39
+ }
40
+ }
41
+ this.initialized = true;
42
+ }
43
+ /** Current branch from git for the given project dir. */
44
+ async currentBranch(projectDir) {
45
+ try {
46
+ const { execa } = await import('execa');
47
+ const { stdout } = await execa('git', ['branch', '--show-current'], { cwd: projectDir, reject: false });
48
+ return stdout.trim() || 'HEAD';
49
+ }
50
+ catch {
51
+ return 'HEAD';
52
+ }
53
+ }
54
+ /** Tag a memory as either global or branch-scoped. */
55
+ async tag(memoryId, branch, scope = 'branch') {
56
+ await this.init();
57
+ const tag = {
58
+ memoryId,
59
+ branch,
60
+ scope,
61
+ taggedAt: new Date(),
62
+ };
63
+ const existing = this.tags.get(memoryId) ?? [];
64
+ existing.push(tag);
65
+ this.tags.set(memoryId, existing);
66
+ await this.persist();
67
+ return tag;
68
+ }
69
+ /** Return the set of memory IDs active for a branch (branch-scoped + global). */
70
+ activeMemoryIds(branch) {
71
+ const ids = new Set();
72
+ for (const [memoryId, tagList] of this.tags) {
73
+ for (const t of tagList) {
74
+ if (t.scope === 'global' || t.branch === branch) {
75
+ ids.add(memoryId);
76
+ break;
77
+ }
78
+ }
79
+ }
80
+ return Array.from(ids);
81
+ }
82
+ /** Compute + return the current branch brain state. */
83
+ async getState(projectDir) {
84
+ await this.init();
85
+ const branch = await this.currentBranch(projectDir);
86
+ const projectId = GlobalBrain.projectIdFor(projectDir);
87
+ const last = this.lastBranchByProject.get(projectId);
88
+ let branchCount = 0;
89
+ let globalCount = 0;
90
+ const branchCategories = new Set();
91
+ const activeIds = this.activeMemoryIds(branch);
92
+ const branchActiveOnly = new Set();
93
+ for (const [memoryId, tagList] of this.tags) {
94
+ const hasGlobal = tagList.some(t => t.scope === 'global');
95
+ const hasThisBranch = tagList.some(t => t.scope === 'branch' && t.branch === branch);
96
+ if (hasGlobal)
97
+ globalCount++;
98
+ if (hasThisBranch) {
99
+ branchCount++;
100
+ branchActiveOnly.add(memoryId);
101
+ }
102
+ }
103
+ // Enrich branch categories from the brain
104
+ const branchEntries = this.brain.recallByIds(Array.from(branchActiveOnly));
105
+ for (const e of branchEntries)
106
+ branchCategories.add(e.category);
107
+ if (last !== branch) {
108
+ this.lastBranchByProject.set(projectId, branch);
109
+ await this.persist();
110
+ }
111
+ return {
112
+ currentBranch: branch,
113
+ activeMemoryIds: activeIds,
114
+ branchMemoryCount: branchCount,
115
+ globalMemoryCount: globalCount,
116
+ lastSwitchAt: new Date(),
117
+ branchSpecificCategories: Array.from(branchCategories),
118
+ };
119
+ }
120
+ /** Promote a branch-scoped memory to global (e.g., after merging). */
121
+ async promoteToGlobal(memoryId) {
122
+ await this.init();
123
+ const list = this.tags.get(memoryId);
124
+ if (!list)
125
+ return false;
126
+ list.push({ memoryId, branch: '*', scope: 'global', taggedAt: new Date() });
127
+ await this.persist();
128
+ return true;
129
+ }
130
+ // ── Internals ─────────────────────────────────────────────────────────────
131
+ async persist() {
132
+ try {
133
+ const flat = [];
134
+ for (const list of this.tags.values())
135
+ flat.push(...list);
136
+ const payload = {
137
+ schemaVersion: 1,
138
+ tags: flat,
139
+ lastBranchByProject: Object.fromEntries(this.lastBranchByProject.entries()),
140
+ };
141
+ const tmp = TAGS_PATH + '.tmp';
142
+ fs.writeFileSync(tmp, JSON.stringify(payload, null, 2));
143
+ fs.renameSync(tmp, TAGS_PATH);
144
+ }
145
+ catch {
146
+ /* non-fatal */
147
+ }
148
+ }
149
+ }
150
+ let _instance = null;
151
+ export function getBranchBrain() {
152
+ if (!_instance)
153
+ _instance = new BranchBrain();
154
+ return _instance;
155
+ }
156
+ export function resetBranchBrainForTests() {
157
+ _instance = null;
158
+ }
159
+ //# sourceMappingURL=branch-brain.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"branch-brain.js","sourceRoot":"","sources":["../../src/brain/branch-brain.ts"],"names":[],"mappings":"AAAA,uEAAuE;AACvE,6BAA6B;AAC7B,EAAE;AACF,4EAA4E;AAC5E,0EAA0E;AAC1E,sEAAsE;AAEtE,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AAKzB,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhE,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,eAAe,EAAE,kBAAkB,CAAC,CAAC;AAQ/E,MAAM,OAAO,WAAW;IAMtB;QAJQ,SAAI,GAAmC,IAAI,GAAG,EAAE,CAAC,CAAC,kBAAkB;QACpE,wBAAmB,GAAwB,IAAI,GAAG,EAAE,CAAC;QACrD,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,SAAS,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC3D,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QAExB,IAAI,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC7B,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,CAAiB,CAAC;gBAC/E,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,IAAI,IAAI,EAAE,EAAE,CAAC;oBAClC,MAAM,IAAI,GAAoB,EAAE,GAAG,CAAC,EAAE,QAAQ,EAAE,IAAI,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC;oBACvE,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;oBACpD,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBACpB,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;gBACzC,CAAC;gBACD,KAAK,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,mBAAmB,IAAI,EAAE,CAAC,EAAE,CAAC;oBAC1E,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;gBACzC,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,UAAU;YACZ,CAAC;QACH,CAAC;QACD,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;IAC1B,CAAC;IAED,yDAAyD;IACzD,KAAK,CAAC,aAAa,CAAC,UAAkB;QACpC,IAAI,CAAC;YACH,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,CAAC;YACxC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,gBAAgB,CAAC,EAAE,EAAE,GAAG,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;YACxG,OAAO,MAAM,CAAC,IAAI,EAAE,IAAI,MAAM,CAAC;QACjC,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,MAAM,CAAC;QAChB,CAAC;IACH,CAAC;IAED,sDAAsD;IACtD,KAAK,CAAC,GAAG,CAAC,QAAgB,EAAE,MAAc,EAAE,QAA6B,QAAQ;QAC/E,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAClB,MAAM,GAAG,GAAoB;YAC3B,QAAQ;YACR,MAAM;YACN,KAAK;YACL,QAAQ,EAAE,IAAI,IAAI,EAAE;SACrB,CAAC;QACF,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;QAC/C,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACnB,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAClC,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;QACrB,OAAO,GAAG,CAAC;IACb,CAAC;IAED,iFAAiF;IACjF,eAAe,CAAC,MAAc;QAC5B,MAAM,GAAG,GAAG,IAAI,GAAG,EAAU,CAAC;QAC9B,KAAK,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YAC5C,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;gBACxB,IAAI,CAAC,CAAC,KAAK,KAAK,QAAQ,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;oBAChD,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;oBAClB,MAAM;gBACR,CAAC;YACH,CAAC;QACH,CAAC;QACD,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACzB,CAAC;IAED,uDAAuD;IACvD,KAAK,CAAC,QAAQ,CAAC,UAAkB;QAC/B,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAClB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;QACpD,MAAM,SAAS,GAAG,WAAW,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;QACvD,MAAM,IAAI,GAAG,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAErD,IAAI,WAAW,GAAG,CAAC,CAAC;QACpB,IAAI,WAAW,GAAG,CAAC,CAAC;QACpB,MAAM,gBAAgB,GAAG,IAAI,GAAG,EAAU,CAAC;QAC3C,MAAM,SAAS,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;QAC/C,MAAM,gBAAgB,GAAG,IAAI,GAAG,EAAU,CAAC;QAE3C,KAAK,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YAC5C,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC;YAC1D,MAAM,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,QAAQ,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC;YACrF,IAAI,SAAS;gBAAE,WAAW,EAAE,CAAC;YAC7B,IAAI,aAAa,EAAE,CAAC;gBAClB,WAAW,EAAE,CAAC;gBACd,gBAAgB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YACjC,CAAC;QACH,CAAC;QAED,0CAA0C;QAC1C,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC;QAC3E,KAAK,MAAM,CAAC,IAAI,aAAa;YAAE,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;QAEhE,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;YACpB,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;YAChD,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;QACvB,CAAC;QAED,OAAO;YACL,aAAa,EAAE,MAAM;YACrB,eAAe,EAAE,SAAS;YAC1B,iBAAiB,EAAE,WAAW;YAC9B,iBAAiB,EAAE,WAAW;YAC9B,YAAY,EAAE,IAAI,IAAI,EAAE;YACxB,wBAAwB,EAAE,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC;SACvD,CAAC;IACJ,CAAC;IAED,sEAAsE;IACtE,KAAK,CAAC,eAAe,CAAC,QAAgB;QACpC,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAClB,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACrC,IAAI,CAAC,IAAI;YAAE,OAAO,KAAK,CAAC;QACxB,IAAI,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,IAAI,EAAE,EAAE,CAAC,CAAC;QAC5E,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;QACrB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,6EAA6E;IAErE,KAAK,CAAC,OAAO;QACnB,IAAI,CAAC;YACH,MAAM,IAAI,GAAsB,EAAE,CAAC;YACnC,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;gBAAE,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;YAC1D,MAAM,OAAO,GAAiB;gBAC5B,aAAa,EAAE,CAAC;gBAChB,IAAI,EAAE,IAAI;gBACV,mBAAmB,EAAE,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,mBAAmB,CAAC,OAAO,EAAE,CAAC;aAC5E,CAAC;YACF,MAAM,GAAG,GAAG,SAAS,GAAG,MAAM,CAAC;YAC/B,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,SAAS,CAAC,CAAC;QAChC,CAAC;QAAC,MAAM,CAAC;YACP,eAAe;QACjB,CAAC;IACH,CAAC;CACF;AAED,IAAI,SAAS,GAAuB,IAAI,CAAC;AAEzC,MAAM,UAAU,cAAc;IAC5B,IAAI,CAAC,SAAS;QAAE,SAAS,GAAG,IAAI,WAAW,EAAE,CAAC;IAC9C,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,wBAAwB;IACtC,SAAS,GAAG,IAAI,CAAC;AACnB,CAAC"}
@@ -0,0 +1,20 @@
1
+ import { AgentTool, CalibrationRecord, CalibrationScore } from '../types.js';
2
+ export declare class CalibrationMonitor {
3
+ private records;
4
+ private scores;
5
+ private initialized;
6
+ init(): Promise<void>;
7
+ record(rec: Omit<CalibrationRecord, 'recordedAt'> & {
8
+ recordedAt?: Date;
9
+ }): Promise<CalibrationScore>;
10
+ getScore(agentTool: AgentTool, category: string): CalibrationScore | null;
11
+ listScores(limit?: number): CalibrationScore[];
12
+ /** Multiplicative trust weight for a given agent+category (1.0 = as claimed). */
13
+ trustWeight(agentTool: AgentTool, category: string): number;
14
+ private recomputeScore;
15
+ private keyFor;
16
+ private persist;
17
+ }
18
+ export declare function getCalibrationMonitor(): CalibrationMonitor;
19
+ export declare function resetCalibrationMonitorForTests(): void;
20
+ //# sourceMappingURL=calibration-monitor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calibration-monitor.d.ts","sourceRoot":"","sources":["../../src/brain/calibration-monitor.ts"],"names":[],"mappings":"AAaA,OAAO,EACL,SAAS,EACT,iBAAiB,EACjB,gBAAgB,EACjB,MAAM,aAAa,CAAC;AAUrB,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,OAAO,CAA2B;IAC1C,OAAO,CAAC,MAAM,CAA4C;IAC1D,OAAO,CAAC,WAAW,CAAS;IAEtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAqBrB,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,iBAAiB,EAAE,YAAY,CAAC,GAAG;QAAE,UAAU,CAAC,EAAE,IAAI,CAAA;KAAE,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAa3G,QAAQ,CAAC,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,GAAG,gBAAgB,GAAG,IAAI;IAIzE,UAAU,CAAC,KAAK,SAAK,GAAG,gBAAgB,EAAE;IAM1C,iFAAiF;IACjF,WAAW,CAAC,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM;IAQ3D,OAAO,CAAC,cAAc;IAiDtB,OAAO,CAAC,MAAM;YAIA,OAAO;CActB;AAID,wBAAgB,qBAAqB,IAAI,kBAAkB,CAG1D;AAED,wBAAgB,+BAA+B,IAAI,IAAI,CAEtD"}
@@ -0,0 +1,144 @@
1
+ // src/brain/calibration-monitor.ts — Confidence calibration tracking
2
+ // v6.0.0 — Hive Mind Edition
3
+ //
4
+ // Does the AI know when it's right? Track every claim's confidence → outcome.
5
+ // Compute the Brier score per agent per category. Auto-adjust trust weights so
6
+ // downstream consumers can discount overconfident agents.
7
+ //
8
+ // Brier = mean squared error between claimed confidence and 0/1 outcome.
9
+ // Lower = better calibrated.
10
+ import * as fs from 'fs';
11
+ import * as path from 'path';
12
+ import * as os from 'os';
13
+ const DATA_PATH = path.join(os.homedir(), '.shadow-brain', 'calibration.json');
14
+ export class CalibrationMonitor {
15
+ constructor() {
16
+ this.records = [];
17
+ this.scores = new Map();
18
+ this.initialized = false;
19
+ }
20
+ async init() {
21
+ if (this.initialized)
22
+ return;
23
+ fs.mkdirSync(path.dirname(DATA_PATH), { recursive: true });
24
+ if (fs.existsSync(DATA_PATH)) {
25
+ try {
26
+ const parsed = JSON.parse(fs.readFileSync(DATA_PATH, 'utf-8'));
27
+ this.records = (parsed.records ?? []).map(r => ({
28
+ ...r,
29
+ recordedAt: new Date(r.recordedAt),
30
+ outcomeAt: new Date(r.outcomeAt),
31
+ }));
32
+ for (const s of parsed.scores ?? []) {
33
+ this.scores.set(this.keyFor(s.agentTool, s.category), { ...s, updatedAt: new Date(s.updatedAt) });
34
+ }
35
+ }
36
+ catch {
37
+ /* skip */
38
+ }
39
+ }
40
+ this.initialized = true;
41
+ }
42
+ async record(rec) {
43
+ await this.init();
44
+ const full = {
45
+ ...rec,
46
+ recordedAt: rec.recordedAt ?? new Date(),
47
+ outcomeAt: rec.outcomeAt ?? new Date(),
48
+ };
49
+ this.records.push(full);
50
+ const score = this.recomputeScore(full.agentTool, full.category);
51
+ await this.persist();
52
+ return score;
53
+ }
54
+ getScore(agentTool, category) {
55
+ return this.scores.get(this.keyFor(agentTool, category)) ?? null;
56
+ }
57
+ listScores(limit = 50) {
58
+ return Array.from(this.scores.values())
59
+ .sort((a, b) => a.brierScore - b.brierScore)
60
+ .slice(0, limit);
61
+ }
62
+ /** Multiplicative trust weight for a given agent+category (1.0 = as claimed). */
63
+ trustWeight(agentTool, category) {
64
+ const s = this.getScore(agentTool, category);
65
+ if (!s)
66
+ return 1.0;
67
+ return s.trustWeight;
68
+ }
69
+ // ── Internals ─────────────────────────────────────────────────────────────
70
+ recomputeScore(agentTool, category) {
71
+ const relevant = this.records.filter(r => r.agentTool === agentTool && r.category === category);
72
+ const sampleSize = relevant.length;
73
+ if (!sampleSize) {
74
+ const blank = {
75
+ agentTool,
76
+ category,
77
+ sampleSize: 0,
78
+ brierScore: 0,
79
+ calibrationError: 0,
80
+ overconfidenceRatio: 0,
81
+ trustWeight: 1.0,
82
+ updatedAt: new Date(),
83
+ };
84
+ this.scores.set(this.keyFor(agentTool, category), blank);
85
+ return blank;
86
+ }
87
+ let brierSum = 0;
88
+ let calErrSum = 0;
89
+ let overconfidentCount = 0;
90
+ for (const r of relevant) {
91
+ const outcomeBinary = r.actualOutcome === 'correct' ? 1 : r.actualOutcome === 'partial' ? 0.5 : 0;
92
+ const delta = r.claimedConfidence - outcomeBinary;
93
+ brierSum += delta * delta;
94
+ calErrSum += Math.abs(delta);
95
+ if (r.claimedConfidence > 0.7 && outcomeBinary < 0.5)
96
+ overconfidentCount++;
97
+ }
98
+ const brier = brierSum / sampleSize;
99
+ const calErr = calErrSum / sampleSize;
100
+ const overconfidenceRatio = overconfidentCount / sampleSize;
101
+ // Trust weight: 1.0 when calibrated, approaches 0.4 when badly over-confident
102
+ const trustWeight = +Math.max(0.4, 1 - calErr * 0.8 - overconfidenceRatio * 0.4).toFixed(3);
103
+ const score = {
104
+ agentTool,
105
+ category,
106
+ sampleSize,
107
+ brierScore: +brier.toFixed(4),
108
+ calibrationError: +calErr.toFixed(4),
109
+ overconfidenceRatio: +overconfidenceRatio.toFixed(3),
110
+ trustWeight,
111
+ updatedAt: new Date(),
112
+ };
113
+ this.scores.set(this.keyFor(agentTool, category), score);
114
+ return score;
115
+ }
116
+ keyFor(agent, category) {
117
+ return `${agent}::${category}`;
118
+ }
119
+ async persist() {
120
+ try {
121
+ const payload = {
122
+ schemaVersion: 1,
123
+ records: this.records,
124
+ scores: Array.from(this.scores.values()),
125
+ };
126
+ const tmp = DATA_PATH + '.tmp';
127
+ fs.writeFileSync(tmp, JSON.stringify(payload, null, 2));
128
+ fs.renameSync(tmp, DATA_PATH);
129
+ }
130
+ catch {
131
+ /* non-fatal */
132
+ }
133
+ }
134
+ }
135
+ let _instance = null;
136
+ export function getCalibrationMonitor() {
137
+ if (!_instance)
138
+ _instance = new CalibrationMonitor();
139
+ return _instance;
140
+ }
141
+ export function resetCalibrationMonitorForTests() {
142
+ _instance = null;
143
+ }
144
+ //# sourceMappingURL=calibration-monitor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calibration-monitor.js","sourceRoot":"","sources":["../../src/brain/calibration-monitor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ import { CausalLink, CausalChain } from '../types.js';
2
+ import { GlobalBrain } from './global-brain.js';
3
+ export declare class CausalChains {
4
+ private brain;
5
+ private links;
6
+ private byEffect;
7
+ private byCause;
8
+ private initialized;
9
+ constructor(brain?: GlobalBrain);
10
+ init(): Promise<void>;
11
+ /** Record that `effectId` was caused by `causeId`. */
12
+ link(effectId: string, causeId: string, rationale?: string, strength?: number): Promise<CausalLink>;
13
+ /** Walk back from an effect to trace all ancestor causes. */
14
+ trace(effectId: string, opts?: {
15
+ maxDepth?: number;
16
+ }): Promise<CausalChain>;
17
+ /** Walk forward from a cause to find all effects it influenced. */
18
+ influence(causeId: string, opts?: {
19
+ maxDepth?: number;
20
+ }): Promise<CausalChain>;
21
+ /** Simple stats for dashboards. */
22
+ stats(): {
23
+ totalLinks: number;
24
+ effects: number;
25
+ causes: number;
26
+ };
27
+ /** Remove a single link. */
28
+ unlink(linkId: string): Promise<boolean>;
29
+ private index;
30
+ private rebuildIndexes;
31
+ private nodeFromMemoryId;
32
+ private renderDot;
33
+ private persist;
34
+ }
35
+ export declare function getCausalChains(): CausalChains;
36
+ export declare function resetCausalChainsForTests(): void;
37
+ //# sourceMappingURL=causal-chains.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"causal-chains.d.ts","sourceRoot":"","sources":["../../src/brain/causal-chains.ts"],"names":[],"mappings":"AAiBA,OAAO,EACL,UAAU,EACV,WAAW,EAGZ,MAAM,aAAa,CAAC;AACrB,OAAO,EAAkB,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAShE,qBAAa,YAAY;IACvB,OAAO,CAAC,KAAK,CAAc;IAC3B,OAAO,CAAC,KAAK,CAAsC;IACnD,OAAO,CAAC,QAAQ,CAAwC;IACxD,OAAO,CAAC,OAAO,CAAwC;IACvD,OAAO,CAAC,WAAW,CAAS;gBAEhB,KAAK,CAAC,EAAE,WAAW;IAIzB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAuB3B,sDAAsD;IAChD,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,EAAE,QAAQ,SAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAgBtG,6DAA6D;IACvD,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,GAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAO,GAAG,OAAO,CAAC,WAAW,CAAC;IA8CrF,mEAAmE;IAC7D,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,GAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAO,GAAG,OAAO,CAAC,WAAW,CAAC;IA6CxF,mCAAmC;IACnC,KAAK,IAAI;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE;IAQhE,4BAA4B;IACtB,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAY9C,OAAO,CAAC,KAAK;IASb,OAAO,CAAC,cAAc;YAMR,gBAAgB;IA2B9B,OAAO,CAAC,SAAS;YAcH,OAAO;CAatB;AAID,wBAAgB,eAAe,IAAI,YAAY,CAG9C;AAED,wBAAgB,yBAAyB,IAAI,IAAI,CAEhD"}
@@ -0,0 +1,250 @@
1
+ // src/brain/causal-chains.ts — Causal Memory Chains
2
+ // v6.0.0 — Hive Mind Edition
3
+ //
4
+ // Every other tool logs events. Shadow Brain tracks CAUSES.
5
+ //
6
+ // When a brain write happens, it can optionally record its "parent cause" — the
7
+ // prior memory/decision that led to this new one. Over time this builds a DAG
8
+ // where you can ask: "Why did Claude use bcrypt@12?" and get a rendered chain
9
+ // all the way back to the user's original prompt weeks earlier.
10
+ //
11
+ // Storage: ~/.shadow-brain/causal-chains.json
12
+ // Output: Graphviz DOT + JSON chain trees.
13
+ import * as fs from 'fs';
14
+ import * as path from 'path';
15
+ import * as os from 'os';
16
+ import * as crypto from 'crypto';
17
+ import { getGlobalBrain } from './global-brain.js';
18
+ const CHAINS_PATH = path.join(os.homedir(), '.shadow-brain', 'causal-chains.json');
19
+ export class CausalChains {
20
+ constructor(brain) {
21
+ this.links = new Map();
22
+ this.byEffect = new Map();
23
+ this.byCause = new Map();
24
+ this.initialized = false;
25
+ this.brain = brain ?? getGlobalBrain();
26
+ }
27
+ async init() {
28
+ if (this.initialized)
29
+ return;
30
+ fs.mkdirSync(path.dirname(CHAINS_PATH), { recursive: true });
31
+ await this.brain.init();
32
+ if (fs.existsSync(CHAINS_PATH)) {
33
+ try {
34
+ const raw = fs.readFileSync(CHAINS_PATH, 'utf-8');
35
+ const parsed = JSON.parse(raw);
36
+ if (Array.isArray(parsed.links)) {
37
+ for (const link of parsed.links) {
38
+ const rehydrated = { ...link, createdAt: new Date(link.createdAt) };
39
+ this.links.set(rehydrated.id, rehydrated);
40
+ this.index(rehydrated);
41
+ }
42
+ }
43
+ }
44
+ catch {
45
+ /* corrupt file — start fresh */
46
+ }
47
+ }
48
+ this.initialized = true;
49
+ }
50
+ /** Record that `effectId` was caused by `causeId`. */
51
+ async link(effectId, causeId, rationale, strength = 1.0) {
52
+ await this.init();
53
+ const link = {
54
+ id: `cl-${crypto.randomBytes(6).toString('hex')}`,
55
+ effectId,
56
+ causeId,
57
+ rationale,
58
+ strength: Math.max(0, Math.min(1, strength)),
59
+ createdAt: new Date(),
60
+ };
61
+ this.links.set(link.id, link);
62
+ this.index(link);
63
+ await this.persist();
64
+ return link;
65
+ }
66
+ /** Walk back from an effect to trace all ancestor causes. */
67
+ async trace(effectId, opts = {}) {
68
+ await this.init();
69
+ const maxDepth = opts.maxDepth ?? 8;
70
+ const visited = new Set();
71
+ const nodesById = new Map();
72
+ const collectedLinks = [];
73
+ const queue = [{ id: effectId, depth: 0 }];
74
+ let maxReachedDepth = 0;
75
+ while (queue.length) {
76
+ const { id, depth } = queue.shift();
77
+ if (visited.has(id))
78
+ continue;
79
+ visited.add(id);
80
+ maxReachedDepth = Math.max(maxReachedDepth, depth);
81
+ const node = await this.nodeFromMemoryId(id, depth);
82
+ nodesById.set(id, node);
83
+ if (depth >= maxDepth)
84
+ continue;
85
+ const parents = this.byEffect.get(id) ?? [];
86
+ for (const link of parents) {
87
+ collectedLinks.push(link);
88
+ queue.push({ id: link.causeId, depth: depth + 1 });
89
+ }
90
+ }
91
+ // Fill parents/children
92
+ for (const link of collectedLinks) {
93
+ const effect = nodesById.get(link.effectId);
94
+ const cause = nodesById.get(link.causeId);
95
+ if (effect && !effect.parents.includes(link.causeId))
96
+ effect.parents.push(link.causeId);
97
+ if (cause && !cause.children.includes(link.effectId))
98
+ cause.children.push(link.effectId);
99
+ }
100
+ const nodes = Array.from(nodesById.values());
101
+ return {
102
+ rootId: effectId,
103
+ nodes,
104
+ links: collectedLinks,
105
+ maxDepth: maxReachedDepth,
106
+ generatedAt: new Date(),
107
+ dot: this.renderDot(nodes, collectedLinks),
108
+ };
109
+ }
110
+ /** Walk forward from a cause to find all effects it influenced. */
111
+ async influence(causeId, opts = {}) {
112
+ await this.init();
113
+ const maxDepth = opts.maxDepth ?? 8;
114
+ const visited = new Set();
115
+ const nodesById = new Map();
116
+ const collectedLinks = [];
117
+ const queue = [{ id: causeId, depth: 0 }];
118
+ let maxReachedDepth = 0;
119
+ while (queue.length) {
120
+ const { id, depth } = queue.shift();
121
+ if (visited.has(id))
122
+ continue;
123
+ visited.add(id);
124
+ maxReachedDepth = Math.max(maxReachedDepth, depth);
125
+ const node = await this.nodeFromMemoryId(id, depth);
126
+ nodesById.set(id, node);
127
+ if (depth >= maxDepth)
128
+ continue;
129
+ const children = this.byCause.get(id) ?? [];
130
+ for (const link of children) {
131
+ collectedLinks.push(link);
132
+ queue.push({ id: link.effectId, depth: depth + 1 });
133
+ }
134
+ }
135
+ for (const link of collectedLinks) {
136
+ const effect = nodesById.get(link.effectId);
137
+ const cause = nodesById.get(link.causeId);
138
+ if (effect && !effect.parents.includes(link.causeId))
139
+ effect.parents.push(link.causeId);
140
+ if (cause && !cause.children.includes(link.effectId))
141
+ cause.children.push(link.effectId);
142
+ }
143
+ const nodes = Array.from(nodesById.values());
144
+ return {
145
+ rootId: causeId,
146
+ nodes,
147
+ links: collectedLinks,
148
+ maxDepth: maxReachedDepth,
149
+ generatedAt: new Date(),
150
+ dot: this.renderDot(nodes, collectedLinks),
151
+ };
152
+ }
153
+ /** Simple stats for dashboards. */
154
+ stats() {
155
+ return {
156
+ totalLinks: this.links.size,
157
+ effects: this.byEffect.size,
158
+ causes: this.byCause.size,
159
+ };
160
+ }
161
+ /** Remove a single link. */
162
+ async unlink(linkId) {
163
+ await this.init();
164
+ const link = this.links.get(linkId);
165
+ if (!link)
166
+ return false;
167
+ this.links.delete(linkId);
168
+ this.rebuildIndexes();
169
+ await this.persist();
170
+ return true;
171
+ }
172
+ // ── Internals ─────────────────────────────────────────────────────────────
173
+ index(link) {
174
+ const effects = this.byEffect.get(link.effectId) ?? [];
175
+ effects.push(link);
176
+ this.byEffect.set(link.effectId, effects);
177
+ const causes = this.byCause.get(link.causeId) ?? [];
178
+ causes.push(link);
179
+ this.byCause.set(link.causeId, causes);
180
+ }
181
+ rebuildIndexes() {
182
+ this.byEffect.clear();
183
+ this.byCause.clear();
184
+ for (const link of this.links.values())
185
+ this.index(link);
186
+ }
187
+ async nodeFromMemoryId(id, depth) {
188
+ const entries = this.brain.recallByIds([id]);
189
+ const entry = entries[0];
190
+ if (entry) {
191
+ return {
192
+ id,
193
+ content: entry.content,
194
+ agentTool: entry.agentTool,
195
+ category: entry.category,
196
+ createdAt: entry.createdAt,
197
+ parents: [],
198
+ children: [],
199
+ depth,
200
+ };
201
+ }
202
+ return {
203
+ id,
204
+ content: `(memory ${id.slice(0, 8)} not found in global brain)`,
205
+ agentTool: 'claude-code',
206
+ category: 'unknown',
207
+ createdAt: new Date(0),
208
+ parents: [],
209
+ children: [],
210
+ depth,
211
+ };
212
+ }
213
+ renderDot(nodes, links) {
214
+ const lines = ['digraph CausalChain {', ' rankdir=LR;', ' node [shape=box, style=rounded];'];
215
+ for (const node of nodes) {
216
+ const label = `${node.agentTool}\\n[${node.category}]\\n${node.content.slice(0, 60).replace(/"/g, "'")}`;
217
+ lines.push(` "${node.id}" [label="${label}"];`);
218
+ }
219
+ for (const link of links) {
220
+ const rationale = link.rationale ? ` [label="${link.rationale.slice(0, 20).replace(/"/g, "'")}"]` : '';
221
+ lines.push(` "${link.causeId}" -> "${link.effectId}"${rationale};`);
222
+ }
223
+ lines.push('}');
224
+ return lines.join('\n');
225
+ }
226
+ async persist() {
227
+ try {
228
+ const payload = {
229
+ schemaVersion: 1,
230
+ links: Array.from(this.links.values()),
231
+ };
232
+ const tmp = CHAINS_PATH + '.tmp';
233
+ fs.writeFileSync(tmp, JSON.stringify(payload, null, 2));
234
+ fs.renameSync(tmp, CHAINS_PATH);
235
+ }
236
+ catch {
237
+ /* persistence non-fatal */
238
+ }
239
+ }
240
+ }
241
+ let _instance = null;
242
+ export function getCausalChains() {
243
+ if (!_instance)
244
+ _instance = new CausalChains();
245
+ return _instance;
246
+ }
247
+ export function resetCausalChainsForTests() {
248
+ _instance = null;
249
+ }
250
+ //# sourceMappingURL=causal-chains.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"causal-chains.js","sourceRoot":"","sources":["../../src/brain/causal-chains.ts"],"names":[],"mappings":"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"}