@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,32 @@
1
+ import { AgentEditIntent, CollisionAlert, CollisionStats, AgentTool } from '../types.js';
2
+ export declare class CollisionDetective {
3
+ private intents;
4
+ private alerts;
5
+ private stats;
6
+ private initialized;
7
+ init(): Promise<void>;
8
+ /** Agent declares intent to edit a file range. Returns immediate collision alert if any. */
9
+ declareIntent(agentTool: AgentTool, sessionId: string, filePath: string, startLine: number, endLine: number, intent: string, ttlMs?: number): Promise<{
10
+ intent: AgentEditIntent;
11
+ collision: CollisionAlert | null;
12
+ }>;
13
+ /** Release an intent — agent finished or cancelled. */
14
+ releaseIntent(agentTool: AgentTool, sessionId: string, filePath: string): Promise<number>;
15
+ /** Mark a collision as resolved (by reassignment, merge, or user action). */
16
+ resolveCollision(alertId: string, resolution: string): Promise<boolean>;
17
+ /** All active (unresolved) alerts. */
18
+ activeAlerts(): CollisionAlert[];
19
+ /** Current stats snapshot. */
20
+ getStats(): CollisionStats;
21
+ /** List active intents (for dashboards / debugging). */
22
+ activeIntents(): AgentEditIntent[];
23
+ private detectForIntent;
24
+ private buildResolutionSuggestion;
25
+ private keyForIntent;
26
+ private sameSession;
27
+ private evictExpired;
28
+ private persist;
29
+ }
30
+ export declare function getCollisionDetective(): CollisionDetective;
31
+ export declare function resetCollisionDetectiveForTests(): void;
32
+ //# sourceMappingURL=collision-detective.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collision-detective.d.ts","sourceRoot":"","sources":["../../src/brain/collision-detective.ts"],"names":[],"mappings":"AAYA,OAAO,EACL,eAAe,EACf,cAAc,EACd,cAAc,EACd,SAAS,EACV,MAAM,aAAa,CAAC;AAuBrB,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,OAAO,CAA2C;IAC1D,OAAO,CAAC,MAAM,CAA0C;IACxD,OAAO,CAAC,KAAK,CAAgC;IAC7C,OAAO,CAAC,WAAW,CAAS;IAEtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAqC3B,4FAA4F;IACtF,aAAa,CACjB,SAAS,EAAE,SAAS,EACpB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,KAAK,GAAE,MAA8B,GACpC,OAAO,CAAC;QAAE,MAAM,EAAE,eAAe,CAAC;QAAC,SAAS,EAAE,cAAc,GAAG,IAAI,CAAA;KAAE,CAAC;IAsCzE,uDAAuD;IACjD,aAAa,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAiB/F,6EAA6E;IACvE,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAW7E,sCAAsC;IACtC,YAAY,IAAI,cAAc,EAAE;IAIhC,8BAA8B;IAC9B,QAAQ,IAAI,cAAc;IAM1B,wDAAwD;IACxD,aAAa,IAAI,eAAe,EAAE;IAOlC,OAAO,CAAC,eAAe;IAuCvB,OAAO,CAAC,yBAAyB;IAYjC,OAAO,CAAC,YAAY;IAIpB,OAAO,CAAC,WAAW;IAInB,OAAO,CAAC,YAAY;YAQN,OAAO;CAetB;AAID,wBAAgB,qBAAqB,IAAI,kBAAkB,CAG1D;AAED,wBAAgB,+BAA+B,IAAI,IAAI,CAEtD"}
@@ -0,0 +1,233 @@
1
+ // src/brain/collision-detective.ts — Agent Collision Detective
2
+ // v6.0.0 — Hive Mind Edition
3
+ //
4
+ // Real-time (not post-hoc git) detection of two+ agents about to edit the same
5
+ // file region. Agents declare their edit INTENT before touching the file, the
6
+ // detective maintains active intents, and any overlapping intent produces a
7
+ // CollisionAlert with a suggested resolution.
8
+ import * as fs from 'fs';
9
+ import * as path from 'path';
10
+ import * as os from 'os';
11
+ import * as crypto from 'crypto';
12
+ const INTENTS_PATH = path.join(os.homedir(), '.shadow-brain', 'collision-intents.json');
13
+ const DEFAULT_INTENT_TTL_MS = 10 * 60 * 1000; // 10 minutes
14
+ function emptyStats() {
15
+ return {
16
+ totalIntents: 0,
17
+ activeIntents: 0,
18
+ collisionsDetected: 0,
19
+ collisionsResolved: 0,
20
+ collisionsByAgent: {},
21
+ avgOverlapLines: 0,
22
+ };
23
+ }
24
+ export class CollisionDetective {
25
+ constructor() {
26
+ this.intents = new Map();
27
+ this.alerts = new Map();
28
+ this.stats = emptyStats();
29
+ this.initialized = false;
30
+ }
31
+ async init() {
32
+ if (this.initialized)
33
+ return;
34
+ fs.mkdirSync(path.dirname(INTENTS_PATH), { recursive: true });
35
+ if (fs.existsSync(INTENTS_PATH)) {
36
+ try {
37
+ const raw = fs.readFileSync(INTENTS_PATH, 'utf-8');
38
+ const parsed = JSON.parse(raw);
39
+ for (const intent of parsed.intents ?? []) {
40
+ const r = {
41
+ ...intent,
42
+ declaredAt: new Date(intent.declaredAt),
43
+ expiresAt: new Date(intent.expiresAt),
44
+ };
45
+ if (r.expiresAt.getTime() > Date.now()) {
46
+ this.intents.set(this.keyForIntent(r), r);
47
+ }
48
+ }
49
+ for (const alert of parsed.alerts ?? []) {
50
+ this.alerts.set(alert.id, {
51
+ ...alert,
52
+ detectedAt: new Date(alert.detectedAt),
53
+ conflictingIntents: alert.conflictingIntents.map(i => ({
54
+ ...i,
55
+ declaredAt: new Date(i.declaredAt),
56
+ expiresAt: new Date(i.expiresAt),
57
+ })),
58
+ });
59
+ }
60
+ if (parsed.stats)
61
+ this.stats = { ...emptyStats(), ...parsed.stats };
62
+ }
63
+ catch {
64
+ /* corrupt — start fresh */
65
+ }
66
+ }
67
+ this.initialized = true;
68
+ }
69
+ /** Agent declares intent to edit a file range. Returns immediate collision alert if any. */
70
+ async declareIntent(agentTool, sessionId, filePath, startLine, endLine, intent, ttlMs = DEFAULT_INTENT_TTL_MS) {
71
+ await this.init();
72
+ this.evictExpired();
73
+ const abs = path.resolve(filePath);
74
+ const declaration = {
75
+ agentTool,
76
+ sessionId,
77
+ filePath: abs,
78
+ startLine: Math.min(startLine, endLine),
79
+ endLine: Math.max(startLine, endLine),
80
+ intent,
81
+ declaredAt: new Date(),
82
+ expiresAt: new Date(Date.now() + ttlMs),
83
+ };
84
+ const key = this.keyForIntent(declaration);
85
+ this.intents.set(key, declaration);
86
+ this.stats.totalIntents++;
87
+ this.stats.activeIntents = this.intents.size;
88
+ this.stats.collisionsByAgent[agentTool] = this.stats.collisionsByAgent[agentTool] ?? 0;
89
+ const collision = this.detectForIntent(declaration);
90
+ if (collision) {
91
+ this.alerts.set(collision.id, collision);
92
+ this.stats.collisionsDetected++;
93
+ for (const conflict of collision.conflictingIntents) {
94
+ this.stats.collisionsByAgent[conflict.agentTool] = (this.stats.collisionsByAgent[conflict.agentTool] ?? 0) + 1;
95
+ }
96
+ const overlapSize = collision.overlapEndLine - collision.overlapStartLine + 1;
97
+ const n = this.stats.collisionsDetected;
98
+ this.stats.avgOverlapLines = this.stats.avgOverlapLines + (overlapSize - this.stats.avgOverlapLines) / n;
99
+ }
100
+ await this.persist();
101
+ return { intent: declaration, collision };
102
+ }
103
+ /** Release an intent — agent finished or cancelled. */
104
+ async releaseIntent(agentTool, sessionId, filePath) {
105
+ await this.init();
106
+ const abs = path.resolve(filePath);
107
+ let removed = 0;
108
+ for (const [key, intent] of this.intents) {
109
+ if (intent.agentTool === agentTool && intent.sessionId === sessionId && intent.filePath === abs) {
110
+ this.intents.delete(key);
111
+ removed++;
112
+ }
113
+ }
114
+ if (removed) {
115
+ this.stats.activeIntents = this.intents.size;
116
+ await this.persist();
117
+ }
118
+ return removed;
119
+ }
120
+ /** Mark a collision as resolved (by reassignment, merge, or user action). */
121
+ async resolveCollision(alertId, resolution) {
122
+ await this.init();
123
+ const alert = this.alerts.get(alertId);
124
+ if (!alert)
125
+ return false;
126
+ alert.suggestedResolution = resolution;
127
+ this.stats.collisionsResolved++;
128
+ this.alerts.delete(alertId);
129
+ await this.persist();
130
+ return true;
131
+ }
132
+ /** All active (unresolved) alerts. */
133
+ activeAlerts() {
134
+ return Array.from(this.alerts.values()).sort((a, b) => b.detectedAt.getTime() - a.detectedAt.getTime());
135
+ }
136
+ /** Current stats snapshot. */
137
+ getStats() {
138
+ this.evictExpired();
139
+ this.stats.activeIntents = this.intents.size;
140
+ return JSON.parse(JSON.stringify(this.stats));
141
+ }
142
+ /** List active intents (for dashboards / debugging). */
143
+ activeIntents() {
144
+ this.evictExpired();
145
+ return Array.from(this.intents.values()).sort((a, b) => a.filePath.localeCompare(b.filePath));
146
+ }
147
+ // ── Internals ─────────────────────────────────────────────────────────────
148
+ detectForIntent(newIntent) {
149
+ const conflicts = [];
150
+ let overlapStart = newIntent.startLine;
151
+ let overlapEnd = newIntent.endLine;
152
+ for (const existing of this.intents.values()) {
153
+ if (this.sameSession(existing, newIntent))
154
+ continue;
155
+ if (existing.filePath !== newIntent.filePath)
156
+ continue;
157
+ const intersectStart = Math.max(existing.startLine, newIntent.startLine);
158
+ const intersectEnd = Math.min(existing.endLine, newIntent.endLine);
159
+ if (intersectStart <= intersectEnd) {
160
+ conflicts.push(existing);
161
+ overlapStart = Math.max(overlapStart, intersectStart);
162
+ overlapEnd = Math.min(overlapEnd, intersectEnd);
163
+ }
164
+ }
165
+ if (!conflicts.length)
166
+ return null;
167
+ const severity = conflicts.length >= 2 ? 'critical'
168
+ : (overlapEnd - overlapStart + 1) >= 20 ? 'warning'
169
+ : 'info';
170
+ const suggestedResolution = this.buildResolutionSuggestion(newIntent, conflicts);
171
+ return {
172
+ id: `col-${crypto.randomBytes(6).toString('hex')}`,
173
+ filePath: newIntent.filePath,
174
+ conflictingIntents: [newIntent, ...conflicts],
175
+ overlapStartLine: overlapStart,
176
+ overlapEndLine: overlapEnd,
177
+ severity,
178
+ suggestedResolution,
179
+ detectedAt: new Date(),
180
+ };
181
+ }
182
+ buildResolutionSuggestion(newIntent, conflicts) {
183
+ const others = conflicts.map(c => `${c.agentTool} (${c.intent})`).join(', ');
184
+ const newer = newIntent;
185
+ const agents = [...new Set([newer.agentTool, ...conflicts.map(c => c.agentTool)])].join(', ');
186
+ return [
187
+ `${agents} have overlapping edit intents on ${path.basename(newer.filePath)} lines ${newer.startLine}-${newer.endLine}.`,
188
+ `Incoming: ${newer.agentTool} — ${newer.intent}`,
189
+ `Existing: ${others}`,
190
+ `Suggested: the newer intent waits 60s, re-plans around the in-flight edit, or spawns a merge-arbiter sub-agent.`,
191
+ ].join(' ');
192
+ }
193
+ keyForIntent(intent) {
194
+ return `${intent.filePath}::${intent.agentTool}::${intent.sessionId}::${intent.startLine}-${intent.endLine}`;
195
+ }
196
+ sameSession(a, b) {
197
+ return a.agentTool === b.agentTool && a.sessionId === b.sessionId;
198
+ }
199
+ evictExpired() {
200
+ const now = Date.now();
201
+ for (const [key, intent] of this.intents) {
202
+ if (intent.expiresAt.getTime() <= now)
203
+ this.intents.delete(key);
204
+ }
205
+ this.stats.activeIntents = this.intents.size;
206
+ }
207
+ async persist() {
208
+ try {
209
+ const payload = {
210
+ schemaVersion: 1,
211
+ intents: Array.from(this.intents.values()),
212
+ alerts: Array.from(this.alerts.values()),
213
+ stats: this.stats,
214
+ };
215
+ const tmp = INTENTS_PATH + '.tmp';
216
+ fs.writeFileSync(tmp, JSON.stringify(payload, null, 2));
217
+ fs.renameSync(tmp, INTENTS_PATH);
218
+ }
219
+ catch {
220
+ /* persistence non-fatal */
221
+ }
222
+ }
223
+ }
224
+ let _instance = null;
225
+ export function getCollisionDetective() {
226
+ if (!_instance)
227
+ _instance = new CollisionDetective();
228
+ return _instance;
229
+ }
230
+ export function resetCollisionDetectiveForTests() {
231
+ _instance = null;
232
+ }
233
+ //# sourceMappingURL=collision-detective.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collision-detective.js","sourceRoot":"","sources":["../../src/brain/collision-detective.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { SpawnCostEstimate, SubAgentSpawnRequest } from '../types.js';
2
+ export declare class CostAwareSpawner {
3
+ /** Estimate cost + recommendation for a planned sub-agent spawn. */
4
+ estimate(req: SubAgentSpawnRequest, desiredModel?: string): SpawnCostEstimate;
5
+ }
6
+ export declare function getCostAwareSpawner(): CostAwareSpawner;
7
+ //# sourceMappingURL=cost-aware-spawner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cost-aware-spawner.d.ts","sourceRoot":"","sources":["../../src/brain/cost-aware-spawner.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAyBtE,qBAAa,gBAAgB;IAC3B,oEAAoE;IACpE,QAAQ,CAAC,GAAG,EAAE,oBAAoB,EAAE,YAAY,SAAoB,GAAG,iBAAiB;CA2CzF;AAID,wBAAgB,mBAAmB,IAAI,gBAAgB,CAGtD"}
@@ -0,0 +1,77 @@
1
+ // src/brain/cost-aware-spawner.ts — Spawn sub-agents cost-aware
2
+ // v6.0.0 — Hive Mind Edition
3
+ //
4
+ // Before Shadow Brain spawns a sub-agent, estimate token cost and compare
5
+ // against the value of the decision. Route to a cheaper model (or local) when
6
+ // the trivial-task heuristic matches.
7
+ const MODEL_PRICING = {
8
+ 'claude-opus-4-7': { input: 15, output: 75 },
9
+ 'claude-sonnet-4-6': { input: 3, output: 15 },
10
+ 'claude-haiku-4-5': { input: 0.8, output: 4 },
11
+ 'gpt-5.4': { input: 10, output: 30 },
12
+ 'gpt-5.4-codex': { input: 10, output: 30 },
13
+ 'glm-5.1': { input: 0.5, output: 2 },
14
+ 'minimax-m2.7': { input: 0.6, output: 2.4 },
15
+ 'gemini-2.5-flash': { input: 0.15, output: 0.6 },
16
+ 'qwen2.5-coder:7b': { input: 0, output: 0 },
17
+ 'local': { input: 0, output: 0 },
18
+ };
19
+ const CHEAP_KEYWORDS = new Set([
20
+ 'typo', 'rename', 'format', 'lint', 'comment', 'docs',
21
+ 'readme', 'style', 'indent', 'whitespace', 'todo',
22
+ ]);
23
+ const EXPENSIVE_KEYWORDS = new Set([
24
+ 'architecture', 'security', 'migration', 'refactor',
25
+ 'auth', 'payment', 'crypto', 'billing', 'compliance',
26
+ ]);
27
+ export class CostAwareSpawner {
28
+ /** Estimate cost + recommendation for a planned sub-agent spawn. */
29
+ estimate(req, desiredModel = 'claude-opus-4-7') {
30
+ const tokenBudget = req.tokenBudget ?? 4000;
31
+ const estimatedInput = tokenBudget;
32
+ const estimatedOutput = Math.floor(tokenBudget * 0.4);
33
+ const pricing = MODEL_PRICING[desiredModel] ?? MODEL_PRICING['claude-opus-4-7'];
34
+ const cost = (estimatedInput * pricing.input + estimatedOutput * pricing.output) / 1000000;
35
+ const taskLower = req.taskDescription.toLowerCase();
36
+ const cheapHit = Array.from(CHEAP_KEYWORDS).some(k => taskLower.includes(k));
37
+ const expensiveHit = Array.from(EXPENSIVE_KEYWORDS).some(k => taskLower.includes(k));
38
+ let cheaperAlternative = null;
39
+ let recommendation = 'proceed';
40
+ let rationale = `Estimated $${cost.toFixed(4)} (${estimatedInput}+${estimatedOutput} tokens on ${desiredModel}).`;
41
+ if (cheapHit && !expensiveHit) {
42
+ const altPricing = MODEL_PRICING['qwen2.5-coder:7b'];
43
+ const altCost = (estimatedInput * altPricing.input + estimatedOutput * altPricing.output) / 1000000;
44
+ cheaperAlternative = { model: 'qwen2.5-coder:7b', costUsd: +altCost.toFixed(4) };
45
+ recommendation = 'use-alternative';
46
+ rationale = `Trivial task — route to local model (free) instead of ${desiredModel} ($${cost.toFixed(4)}).`;
47
+ }
48
+ else if (expensiveHit) {
49
+ recommendation = 'proceed';
50
+ rationale = `Critical task — ${desiredModel} is appropriate. Estimated $${cost.toFixed(4)}.`;
51
+ }
52
+ else if (cost > 0.05 && tokenBudget < 2000) {
53
+ const altPricing = MODEL_PRICING['claude-haiku-4-5'];
54
+ const altCost = (estimatedInput * altPricing.input + estimatedOutput * altPricing.output) / 1000000;
55
+ cheaperAlternative = { model: 'claude-haiku-4-5', costUsd: +altCost.toFixed(4) };
56
+ recommendation = 'use-alternative';
57
+ rationale = `Small task at $${cost.toFixed(4)} — Haiku can handle for ~$${altCost.toFixed(4)}.`;
58
+ }
59
+ return {
60
+ subAgentModel: desiredModel,
61
+ estimatedInputTokens: estimatedInput,
62
+ estimatedOutputTokens: estimatedOutput,
63
+ estimatedCostUsd: +cost.toFixed(4),
64
+ expectedValueScore: expensiveHit ? 1.0 : cheapHit ? 0.2 : 0.5,
65
+ cheaperAlternative,
66
+ recommendation,
67
+ rationale,
68
+ };
69
+ }
70
+ }
71
+ let _instance = null;
72
+ export function getCostAwareSpawner() {
73
+ if (!_instance)
74
+ _instance = new CostAwareSpawner();
75
+ return _instance;
76
+ }
77
+ //# sourceMappingURL=cost-aware-spawner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cost-aware-spawner.js","sourceRoot":"","sources":["../../src/brain/cost-aware-spawner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ import { DreamInsight, DreamType, DreamEngineConfig, DreamEngineStats } from '../types.js';
2
+ export declare class DreamEngine {
3
+ private brain;
4
+ private llm;
5
+ private config;
6
+ private dreams;
7
+ private stats;
8
+ private lastActivityAt;
9
+ private cycleTimer;
10
+ private initialized;
11
+ constructor(opts?: Partial<DreamEngineConfig>);
12
+ init(): Promise<void>;
13
+ /** Record that SOMETHING happened (agent activity). Resets idle timer. */
14
+ noteActivity(): void;
15
+ /** Start background reflection loop. Safe to call once; no-op if already running. */
16
+ start(): Promise<void>;
17
+ stop(): Promise<void>;
18
+ /** Run a single reflection pass. Exposed for tests + manual triggering. */
19
+ dreamOnce(): Promise<DreamInsight[]>;
20
+ listDreams(opts?: {
21
+ type?: DreamType;
22
+ unacknowledgedOnly?: boolean;
23
+ limit?: number;
24
+ }): DreamInsight[];
25
+ acknowledge(dreamId: string): Promise<boolean>;
26
+ getStats(): DreamEngineStats;
27
+ private tick;
28
+ private generate;
29
+ private promptForType;
30
+ private syntheticDream;
31
+ private persist;
32
+ }
33
+ export declare function getDreamEngine(opts?: Partial<DreamEngineConfig>): DreamEngine;
34
+ export declare function resetDreamEngineForTests(): void;
35
+ //# sourceMappingURL=dream-engine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dream-engine.d.ts","sourceRoot":"","sources":["../../src/brain/dream-engine.ts"],"names":[],"mappings":"AAiBA,OAAO,EACL,YAAY,EACZ,SAAS,EACT,iBAAiB,EACjB,gBAAgB,EAEjB,MAAM,aAAa,CAAC;AAoCrB,qBAAa,WAAW;IACtB,OAAO,CAAC,KAAK,CAAc;IAC3B,OAAO,CAAC,GAAG,CAAW;IACtB,OAAO,CAAC,MAAM,CAAoB;IAClC,OAAO,CAAC,MAAM,CAAwC;IACtD,OAAO,CAAC,KAAK,CAAkC;IAC/C,OAAO,CAAC,cAAc,CAAsB;IAC5C,OAAO,CAAC,UAAU,CAA+B;IACjD,OAAO,CAAC,WAAW,CAAS;gBAEhB,IAAI,GAAE,OAAO,CAAC,iBAAiB,CAAM;IAM3C,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IA2B3B,0EAA0E;IAC1E,YAAY,IAAI,IAAI;IAIpB,qFAAqF;IAC/E,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAStB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAM3B,2EAA2E;IACrE,SAAS,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;IAmC1C,UAAU,CAAC,IAAI,GAAE;QAAE,IAAI,CAAC,EAAE,SAAS,CAAC;QAAC,kBAAkB,CAAC,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAO,GAAG,YAAY,EAAE;IAQnG,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAUpD,QAAQ,IAAI,gBAAgB;YAMd,IAAI;YAMJ,QAAQ;IA2DtB,OAAO,CAAC,aAAa;IAerB,OAAO,CAAC,cAAc;YAgBR,OAAO;CAetB;AAID,wBAAgB,cAAc,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,iBAAiB,CAAC,GAAG,WAAW,CAG7E;AAED,wBAAgB,wBAAwB,IAAI,IAAI,CAE/C"}