@theihtisham/agent-shadow-brain 5.2.0 → 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 (161) hide show
  1. package/README.md +225 -1029
  2. package/dist/brain/agent-firewall.d.ts +7 -0
  3. package/dist/brain/agent-firewall.d.ts.map +1 -0
  4. package/dist/brain/agent-firewall.js +152 -0
  5. package/dist/brain/agent-firewall.js.map +1 -0
  6. package/dist/brain/agent-handoff.d.ts +19 -0
  7. package/dist/brain/agent-handoff.d.ts.map +1 -0
  8. package/dist/brain/agent-handoff.js +127 -0
  9. package/dist/brain/agent-handoff.js.map +1 -0
  10. package/dist/brain/air-gap.d.ts +23 -0
  11. package/dist/brain/air-gap.d.ts.map +1 -0
  12. package/dist/brain/air-gap.js +137 -0
  13. package/dist/brain/air-gap.js.map +1 -0
  14. package/dist/brain/attention-heatmap.d.ts +24 -0
  15. package/dist/brain/attention-heatmap.d.ts.map +1 -0
  16. package/dist/brain/attention-heatmap.js +108 -0
  17. package/dist/brain/attention-heatmap.js.map +1 -0
  18. package/dist/brain/auto-setup.js +19 -14
  19. package/dist/brain/auto-setup.js.map +1 -1
  20. package/dist/brain/auto-update.js +1 -1
  21. package/dist/brain/brain-chat.d.ts +42 -0
  22. package/dist/brain/brain-chat.d.ts.map +1 -0
  23. package/dist/brain/brain-chat.js +162 -0
  24. package/dist/brain/brain-chat.js.map +1 -0
  25. package/dist/brain/brain-encryption.d.ts +14 -0
  26. package/dist/brain/brain-encryption.d.ts.map +1 -0
  27. package/dist/brain/brain-encryption.js +68 -0
  28. package/dist/brain/brain-encryption.js.map +1 -0
  29. package/dist/brain/brain-exchange.d.ts +30 -0
  30. package/dist/brain/brain-exchange.d.ts.map +1 -0
  31. package/dist/brain/brain-exchange.js +106 -0
  32. package/dist/brain/brain-exchange.js.map +1 -0
  33. package/dist/brain/brain-garden.d.ts +18 -0
  34. package/dist/brain/brain-garden.d.ts.map +1 -0
  35. package/dist/brain/brain-garden.js +81 -0
  36. package/dist/brain/brain-garden.js.map +1 -0
  37. package/dist/brain/brain-portability.js +1 -1
  38. package/dist/brain/branch-brain.d.ts +23 -0
  39. package/dist/brain/branch-brain.d.ts.map +1 -0
  40. package/dist/brain/branch-brain.js +159 -0
  41. package/dist/brain/branch-brain.js.map +1 -0
  42. package/dist/brain/calibration-monitor.d.ts +20 -0
  43. package/dist/brain/calibration-monitor.d.ts.map +1 -0
  44. package/dist/brain/calibration-monitor.js +144 -0
  45. package/dist/brain/calibration-monitor.js.map +1 -0
  46. package/dist/brain/causal-chains.d.ts +37 -0
  47. package/dist/brain/causal-chains.d.ts.map +1 -0
  48. package/dist/brain/causal-chains.js +250 -0
  49. package/dist/brain/causal-chains.js.map +1 -0
  50. package/dist/brain/collision-detective.d.ts +32 -0
  51. package/dist/brain/collision-detective.d.ts.map +1 -0
  52. package/dist/brain/collision-detective.js +233 -0
  53. package/dist/brain/collision-detective.js.map +1 -0
  54. package/dist/brain/cost-aware-spawner.d.ts +7 -0
  55. package/dist/brain/cost-aware-spawner.d.ts.map +1 -0
  56. package/dist/brain/cost-aware-spawner.js +77 -0
  57. package/dist/brain/cost-aware-spawner.js.map +1 -0
  58. package/dist/brain/dream-engine.d.ts +35 -0
  59. package/dist/brain/dream-engine.d.ts.map +1 -0
  60. package/dist/brain/dream-engine.js +273 -0
  61. package/dist/brain/dream-engine.js.map +1 -0
  62. package/dist/brain/embeddings.d.ts +27 -0
  63. package/dist/brain/embeddings.d.ts.map +1 -0
  64. package/dist/brain/embeddings.js +175 -0
  65. package/dist/brain/embeddings.js.map +1 -0
  66. package/dist/brain/forgetting-curve.d.ts +21 -0
  67. package/dist/brain/forgetting-curve.d.ts.map +1 -0
  68. package/dist/brain/forgetting-curve.js +174 -0
  69. package/dist/brain/forgetting-curve.js.map +1 -0
  70. package/dist/brain/formal-verification-bridge.d.ts +26 -0
  71. package/dist/brain/formal-verification-bridge.d.ts.map +1 -0
  72. package/dist/brain/formal-verification-bridge.js +219 -0
  73. package/dist/brain/formal-verification-bridge.js.map +1 -0
  74. package/dist/brain/global-brain.d.ts +8 -1
  75. package/dist/brain/global-brain.d.ts.map +1 -1
  76. package/dist/brain/global-brain.js +24 -0
  77. package/dist/brain/global-brain.js.map +1 -1
  78. package/dist/brain/hallucination-quarantine.d.ts +26 -0
  79. package/dist/brain/hallucination-quarantine.d.ts.map +1 -0
  80. package/dist/brain/hallucination-quarantine.js +135 -0
  81. package/dist/brain/hallucination-quarantine.js.map +1 -0
  82. package/dist/brain/hive-accelerator.d.ts +39 -0
  83. package/dist/brain/hive-accelerator.d.ts.map +1 -0
  84. package/dist/brain/hive-accelerator.js +152 -0
  85. package/dist/brain/hive-accelerator.js.map +1 -0
  86. package/dist/brain/json-output.d.ts +26 -0
  87. package/dist/brain/json-output.d.ts.map +1 -0
  88. package/dist/brain/json-output.js +112 -0
  89. package/dist/brain/json-output.js.map +1 -0
  90. package/dist/brain/l0-cache.js +1 -1
  91. package/dist/brain/l0-cache.js.map +1 -1
  92. package/dist/brain/local-llm.d.ts +20 -0
  93. package/dist/brain/local-llm.d.ts.map +1 -0
  94. package/dist/brain/local-llm.js +132 -0
  95. package/dist/brain/local-llm.js.map +1 -0
  96. package/dist/brain/mcp-server.d.ts +40 -0
  97. package/dist/brain/mcp-server.d.ts.map +1 -1
  98. package/dist/brain/mcp-server.js +395 -12
  99. package/dist/brain/mcp-server.js.map +1 -1
  100. package/dist/brain/model-registry.d.ts +96 -0
  101. package/dist/brain/model-registry.d.ts.map +1 -0
  102. package/dist/brain/model-registry.js +585 -0
  103. package/dist/brain/model-registry.js.map +1 -0
  104. package/dist/brain/orchestrator.js +1 -1
  105. package/dist/brain/pr-auto-review.d.ts +17 -0
  106. package/dist/brain/pr-auto-review.d.ts.map +1 -0
  107. package/dist/brain/pr-auto-review.js +73 -0
  108. package/dist/brain/pr-auto-review.js.map +1 -0
  109. package/dist/brain/pre-mortem.d.ts +21 -0
  110. package/dist/brain/pre-mortem.d.ts.map +1 -0
  111. package/dist/brain/pre-mortem.js +210 -0
  112. package/dist/brain/pre-mortem.js.map +1 -0
  113. package/dist/brain/prompt-cache.d.ts +54 -0
  114. package/dist/brain/prompt-cache.d.ts.map +1 -0
  115. package/dist/brain/prompt-cache.js +105 -0
  116. package/dist/brain/prompt-cache.js.map +1 -0
  117. package/dist/brain/reputation-ledger.d.ts +42 -0
  118. package/dist/brain/reputation-ledger.d.ts.map +1 -0
  119. package/dist/brain/reputation-ledger.js +326 -0
  120. package/dist/brain/reputation-ledger.js.map +1 -0
  121. package/dist/brain/session-hooks.d.ts +19 -0
  122. package/dist/brain/session-hooks.d.ts.map +1 -1
  123. package/dist/brain/session-hooks.js +249 -18
  124. package/dist/brain/session-hooks.js.map +1 -1
  125. package/dist/brain/subagent-bridge.d.ts +46 -0
  126. package/dist/brain/subagent-bridge.d.ts.map +1 -0
  127. package/dist/brain/subagent-bridge.js +364 -0
  128. package/dist/brain/subagent-bridge.js.map +1 -0
  129. package/dist/brain/swarm-debate.d.ts +22 -0
  130. package/dist/brain/swarm-debate.d.ts.map +1 -0
  131. package/dist/brain/swarm-debate.js +134 -0
  132. package/dist/brain/swarm-debate.js.map +1 -0
  133. package/dist/brain/team-brain-sync.d.ts +22 -0
  134. package/dist/brain/team-brain-sync.d.ts.map +1 -0
  135. package/dist/brain/team-brain-sync.js +132 -0
  136. package/dist/brain/team-brain-sync.js.map +1 -0
  137. package/dist/brain/token-economy.d.ts +25 -0
  138. package/dist/brain/token-economy.d.ts.map +1 -0
  139. package/dist/brain/token-economy.js +216 -0
  140. package/dist/brain/token-economy.js.map +1 -0
  141. package/dist/brain/voice-mode.d.ts +15 -0
  142. package/dist/brain/voice-mode.d.ts.map +1 -0
  143. package/dist/brain/voice-mode.js +97 -0
  144. package/dist/brain/voice-mode.js.map +1 -0
  145. package/dist/cli.js +823 -4
  146. package/dist/cli.js.map +1 -1
  147. package/dist/dashboard/server.d.ts +6 -0
  148. package/dist/dashboard/server.d.ts.map +1 -1
  149. package/dist/dashboard/server.js +1118 -368
  150. package/dist/dashboard/server.js.map +1 -1
  151. package/dist/dashboard/v6-dashboard-html.d.ts +2 -0
  152. package/dist/dashboard/v6-dashboard-html.d.ts.map +1 -0
  153. package/dist/dashboard/v6-dashboard-html.js +2474 -0
  154. package/dist/dashboard/v6-dashboard-html.js.map +1 -0
  155. package/dist/index.d.ts +27 -0
  156. package/dist/index.d.ts.map +1 -1
  157. package/dist/index.js +29 -1
  158. package/dist/index.js.map +1 -1
  159. package/dist/types.d.ts +518 -2
  160. package/dist/types.d.ts.map +1 -1
  161. package/package.json +33 -4
@@ -0,0 +1,132 @@
1
+ // src/brain/team-brain-sync.ts — Peer-to-peer team brain sync (no server)
2
+ // v6.0.0 — Hive Mind Edition
3
+ //
4
+ // Team brain sync primitive: a peer discovery + message packaging layer. The
5
+ // transport is pluggable (WebRTC in the dashboard browser bundle, or HTTP
6
+ // loopback for server-less ops testing). This module maintains the STATE
7
+ // (peer list, last-sync-hashes) and the CONTENT envelope for memory sync.
8
+ //
9
+ // NOTE: This is the signaling/state layer. The actual WebRTC data channel
10
+ // lives in the browser dashboard (dashboard/server.ts serves the static
11
+ // bundle which uses native RTCPeerConnection).
12
+ import * as fs from 'fs';
13
+ import * as path from 'path';
14
+ import * as os from 'os';
15
+ import * as crypto from 'crypto';
16
+ const TEAM_PATH = path.join(os.homedir(), '.shadow-brain', 'team-sync.json');
17
+ export class TeamBrainSync {
18
+ constructor() {
19
+ this.peers = new Map();
20
+ this.outbox = [];
21
+ this.initialized = false;
22
+ this.peerId = crypto.randomBytes(8).toString('hex');
23
+ this.displayName = os.userInfo().username || 'unknown';
24
+ }
25
+ async init() {
26
+ if (this.initialized)
27
+ return;
28
+ fs.mkdirSync(path.dirname(TEAM_PATH), { recursive: true });
29
+ if (fs.existsSync(TEAM_PATH)) {
30
+ try {
31
+ const parsed = JSON.parse(fs.readFileSync(TEAM_PATH, 'utf-8'));
32
+ this.peerId = parsed.peerId ?? this.peerId;
33
+ this.displayName = parsed.displayName ?? this.displayName;
34
+ for (const p of parsed.peers ?? []) {
35
+ this.peers.set(p.peerId, {
36
+ ...p,
37
+ connectedAt: new Date(p.connectedAt),
38
+ lastSeenAt: new Date(p.lastSeenAt),
39
+ });
40
+ }
41
+ this.outbox = (parsed.outbox ?? []).map(m => ({ ...m, timestamp: new Date(m.timestamp) }));
42
+ }
43
+ catch {
44
+ /* skip */
45
+ }
46
+ }
47
+ this.initialized = true;
48
+ }
49
+ setDisplayName(name) {
50
+ this.displayName = name || 'unknown';
51
+ }
52
+ selfInfo() {
53
+ return {
54
+ peerId: this.peerId,
55
+ displayName: this.displayName,
56
+ agentTools: [],
57
+ connectedAt: new Date(),
58
+ lastSeenAt: new Date(),
59
+ sharedMemoryCount: 0,
60
+ };
61
+ }
62
+ async registerPeer(peer) {
63
+ await this.init();
64
+ const full = {
65
+ ...peer,
66
+ connectedAt: new Date(),
67
+ lastSeenAt: new Date(),
68
+ };
69
+ this.peers.set(full.peerId, full);
70
+ await this.persist();
71
+ return full;
72
+ }
73
+ async heartbeat(peerId, agentTools) {
74
+ await this.init();
75
+ const p = this.peers.get(peerId);
76
+ if (!p)
77
+ return false;
78
+ p.lastSeenAt = new Date();
79
+ if (agentTools)
80
+ p.agentTools = agentTools;
81
+ await this.persist();
82
+ return true;
83
+ }
84
+ async enqueue(message) {
85
+ await this.init();
86
+ const full = { ...message, timestamp: new Date() };
87
+ this.outbox.push(full);
88
+ if (this.outbox.length > 500)
89
+ this.outbox = this.outbox.slice(-500);
90
+ await this.persist();
91
+ return full;
92
+ }
93
+ drainOutbox() {
94
+ const drained = [...this.outbox];
95
+ this.outbox = [];
96
+ this.persist().catch(() => { });
97
+ return drained;
98
+ }
99
+ listPeers() {
100
+ return Array.from(this.peers.values()).sort((a, b) => b.lastSeenAt.getTime() - a.lastSeenAt.getTime());
101
+ }
102
+ getPeerId() {
103
+ return this.peerId;
104
+ }
105
+ async persist() {
106
+ try {
107
+ const payload = {
108
+ schemaVersion: 1,
109
+ peerId: this.peerId,
110
+ displayName: this.displayName,
111
+ peers: Array.from(this.peers.values()),
112
+ outbox: this.outbox,
113
+ };
114
+ const tmp = TEAM_PATH + '.tmp';
115
+ fs.writeFileSync(tmp, JSON.stringify(payload, null, 2));
116
+ fs.renameSync(tmp, TEAM_PATH);
117
+ }
118
+ catch {
119
+ /* non-fatal */
120
+ }
121
+ }
122
+ }
123
+ let _instance = null;
124
+ export function getTeamBrainSync() {
125
+ if (!_instance)
126
+ _instance = new TeamBrainSync();
127
+ return _instance;
128
+ }
129
+ export function resetTeamBrainSyncForTests() {
130
+ _instance = null;
131
+ }
132
+ //# sourceMappingURL=team-brain-sync.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"team-brain-sync.js","sourceRoot":"","sources":["../../src/brain/team-brain-sync.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,6BAA6B;AAC7B,EAAE;AACF,6EAA6E;AAC7E,0EAA0E;AAC1E,yEAAyE;AACzE,0EAA0E;AAC1E,EAAE;AACF,0EAA0E;AAC1E,wEAAwE;AACxE,+CAA+C;AAE/C,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;AAOjC,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,eAAe,EAAE,gBAAgB,CAAC,CAAC;AAU7E,MAAM,OAAO,aAAa;IAOxB;QAJQ,UAAK,GAA8B,IAAI,GAAG,EAAE,CAAC;QAC7C,WAAM,GAAsB,EAAE,CAAC;QAC/B,gBAAW,GAAG,KAAK,CAAC;QAG1B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACpD,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,IAAI,SAAS,CAAC;IACzD,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,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,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC;gBAC3C,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW,IAAI,IAAI,CAAC,WAAW,CAAC;gBAC1D,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,KAAK,IAAI,EAAE,EAAE,CAAC;oBACnC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE;wBACvB,GAAG,CAAC;wBACJ,WAAW,EAAE,IAAI,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC;wBACpC,UAAU,EAAE,IAAI,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC;qBACnC,CAAC,CAAC;gBACL,CAAC;gBACD,IAAI,CAAC,MAAM,GAAG,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,SAAS,EAAE,IAAI,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC;YAC7F,CAAC;YAAC,MAAM,CAAC;gBACP,UAAU;YACZ,CAAC;QACH,CAAC;QACD,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;IAC1B,CAAC;IAED,cAAc,CAAC,IAAY;QACzB,IAAI,CAAC,WAAW,GAAG,IAAI,IAAI,SAAS,CAAC;IACvC,CAAC;IAED,QAAQ;QACN,OAAO;YACL,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,UAAU,EAAE,EAAE;YACd,WAAW,EAAE,IAAI,IAAI,EAAE;YACvB,UAAU,EAAE,IAAI,IAAI,EAAE;YACtB,iBAAiB,EAAE,CAAC;SACrB,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,IAAsD;QACvE,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAClB,MAAM,IAAI,GAAiB;YACzB,GAAG,IAAI;YACP,WAAW,EAAE,IAAI,IAAI,EAAE;YACvB,UAAU,EAAE,IAAI,IAAI,EAAE;SACvB,CAAC;QACF,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QAClC,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;QACrB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,MAAc,EAAE,UAAwB;QACtD,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAClB,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACjC,IAAI,CAAC,CAAC;YAAE,OAAO,KAAK,CAAC;QACrB,CAAC,CAAC,UAAU,GAAG,IAAI,IAAI,EAAE,CAAC;QAC1B,IAAI,UAAU;YAAE,CAAC,CAAC,UAAU,GAAG,UAAU,CAAC;QAC1C,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;QACrB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,OAA2C;QACvD,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAClB,MAAM,IAAI,GAAoB,EAAE,GAAG,OAAO,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,EAAE,CAAC;QACpE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACvB,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,GAAG;YAAE,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC;QACpE,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;QACrB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,WAAW;QACT,MAAM,OAAO,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;QACjC,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;QACjB,IAAI,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAC/B,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,SAAS;QACP,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC,CAAC;IACzG,CAAC;IAED,SAAS;QACP,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAEO,KAAK,CAAC,OAAO;QACnB,IAAI,CAAC;YACH,MAAM,OAAO,GAAiB;gBAC5B,aAAa,EAAE,CAAC;gBAChB,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,WAAW,EAAE,IAAI,CAAC,WAAW;gBAC7B,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;gBACtC,MAAM,EAAE,IAAI,CAAC,MAAM;aACpB,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,GAAyB,IAAI,CAAC;AAE3C,MAAM,UAAU,gBAAgB;IAC9B,IAAI,CAAC,SAAS;QAAE,SAAS,GAAG,IAAI,aAAa,EAAE,CAAC;IAChD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,0BAA0B;IACxC,SAAS,GAAG,IAAI,CAAC;AACnB,CAAC"}
@@ -0,0 +1,25 @@
1
+ import { AgentTool, TokenEconomyStats, TokenSpendRecord } from '../types.js';
2
+ export declare class TokenEconomy {
3
+ private records;
4
+ private savingsOpportunitiesUsd;
5
+ private initialized;
6
+ init(): Promise<void>;
7
+ /** Record a token spend event. */
8
+ record(input: {
9
+ agentTool: AgentTool;
10
+ model: string;
11
+ inputTokens: number;
12
+ outputTokens: number;
13
+ taskCategory?: string;
14
+ }): Promise<TokenSpendRecord>;
15
+ /** Report aggregate spend + projections + savings opportunities. */
16
+ report(): Promise<TokenEconomyStats>;
17
+ /** Total saved by routing to cheaper models (returned as tweetable USD). */
18
+ getSavingsUsd(): number;
19
+ private computeSavings;
20
+ private detectRedundantCalls;
21
+ private persistStats;
22
+ }
23
+ export declare function getTokenEconomy(): TokenEconomy;
24
+ export declare function resetTokenEconomyForTests(): void;
25
+ //# sourceMappingURL=token-economy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-economy.d.ts","sourceRoot":"","sources":["../../src/brain/token-economy.ts"],"names":[],"mappings":"AAWA,OAAO,EACL,SAAS,EACT,iBAAiB,EACjB,gBAAgB,EACjB,MAAM,aAAa,CAAC;AA2BrB,qBAAa,YAAY;IACvB,OAAO,CAAC,OAAO,CAA0B;IACzC,OAAO,CAAC,uBAAuB,CAAa;IAC5C,OAAO,CAAC,WAAW,CAAS;IAEtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IA6B3B,kCAAkC;IAC5B,MAAM,CAAC,KAAK,EAAE;QAClB,SAAS,EAAE,SAAS,CAAC;QACrB,KAAK,EAAE,MAAM,CAAC;QACd,WAAW,EAAE,MAAM,CAAC;QACpB,YAAY,EAAE,MAAM,CAAC;QACrB,YAAY,CAAC,EAAE,MAAM,CAAC;KACvB,GAAG,OAAO,CAAC,gBAAgB,CAAC;IA2B7B,oEAAoE;IAC9D,MAAM,IAAI,OAAO,CAAC,iBAAiB,CAAC;IAmD1C,4EAA4E;IAC5E,aAAa,IAAI,MAAM;IAMvB,OAAO,CAAC,cAAc;IAqCtB,OAAO,CAAC,oBAAoB;YAwBd,YAAY;CAe3B;AAID,wBAAgB,eAAe,IAAI,YAAY,CAG9C;AAED,wBAAgB,yBAAyB,IAAI,IAAI,CAEhD"}
@@ -0,0 +1,216 @@
1
+ // src/brain/token-economy.ts — Cross-agent token spend tracker + cost predictor
2
+ // v6.0.0 — Hive Mind Edition
3
+ //
4
+ // Tracks token usage across every connected agent. Predicts monthly spend,
5
+ // identifies savings opportunities (e.g., calls that could run on cheaper
6
+ // models), and exposes a simple "you saved $X" number for README badges.
7
+ import * as fs from 'fs';
8
+ import * as path from 'path';
9
+ import * as os from 'os';
10
+ import * as crypto from 'crypto';
11
+ const SPEND_PATH = path.join(os.homedir(), '.shadow-brain', 'token-spend.jsonl');
12
+ const STATS_PATH = path.join(os.homedir(), '.shadow-brain', 'token-economy.json');
13
+ // Per-1M-tokens USD pricing (rough, for projection only)
14
+ const MODEL_PRICING = {
15
+ 'claude-opus-4-7': { input: 15, output: 75 },
16
+ 'claude-sonnet-4-6': { input: 3, output: 15 },
17
+ 'claude-haiku-4-5': { input: 0.8, output: 4 },
18
+ 'gpt-5.4': { input: 10, output: 30 },
19
+ 'gpt-5.4-codex': { input: 10, output: 30 },
20
+ 'glm-5.1': { input: 0.5, output: 2 },
21
+ 'minimax-m2.7': { input: 0.6, output: 2.4 },
22
+ 'gemini-2.5-flash': { input: 0.15, output: 0.6 },
23
+ 'deepseek-671b': { input: 0, output: 0 }, // local/free
24
+ 'qwen2.5-coder:7b': { input: 0, output: 0 }, // local
25
+ 'local': { input: 0, output: 0 },
26
+ };
27
+ export class TokenEconomy {
28
+ constructor() {
29
+ this.records = [];
30
+ this.savingsOpportunitiesUsd = 0;
31
+ this.initialized = false;
32
+ }
33
+ async init() {
34
+ if (this.initialized)
35
+ return;
36
+ fs.mkdirSync(path.dirname(SPEND_PATH), { recursive: true });
37
+ if (fs.existsSync(SPEND_PATH)) {
38
+ try {
39
+ const raw = fs.readFileSync(SPEND_PATH, 'utf-8');
40
+ for (const line of raw.split('\n')) {
41
+ if (!line.trim())
42
+ continue;
43
+ const r = JSON.parse(line);
44
+ this.records.push({ ...r, timestamp: new Date(r.timestamp) });
45
+ }
46
+ }
47
+ catch {
48
+ /* skip */
49
+ }
50
+ }
51
+ if (fs.existsSync(STATS_PATH)) {
52
+ try {
53
+ const parsed = JSON.parse(fs.readFileSync(STATS_PATH, 'utf-8'));
54
+ this.savingsOpportunitiesUsd = parsed.savingsOpportunitiesUsd ?? 0;
55
+ }
56
+ catch {
57
+ /* skip */
58
+ }
59
+ }
60
+ this.initialized = true;
61
+ }
62
+ /** Record a token spend event. */
63
+ async record(input) {
64
+ await this.init();
65
+ const model = input.model || 'local';
66
+ const pricing = MODEL_PRICING[model] ?? { input: 1, output: 3 };
67
+ const cost = (input.inputTokens * pricing.input + input.outputTokens * pricing.output) / 1000000;
68
+ const record = {
69
+ id: `spend-${crypto.randomBytes(6).toString('hex')}`,
70
+ agentTool: input.agentTool,
71
+ model,
72
+ inputTokens: input.inputTokens,
73
+ outputTokens: input.outputTokens,
74
+ estimatedCostUsd: +cost.toFixed(6),
75
+ taskCategory: input.taskCategory ?? 'general',
76
+ timestamp: new Date(),
77
+ };
78
+ this.records.push(record);
79
+ try {
80
+ fs.appendFileSync(SPEND_PATH, JSON.stringify(record) + '\n');
81
+ }
82
+ catch {
83
+ /* non-fatal */
84
+ }
85
+ return record;
86
+ }
87
+ /** Report aggregate spend + projections + savings opportunities. */
88
+ async report() {
89
+ await this.init();
90
+ const byAgent = {};
91
+ const byModel = {};
92
+ const byCategory = {};
93
+ let totalSpend = 0;
94
+ let totalInput = 0;
95
+ let totalOutput = 0;
96
+ for (const r of this.records) {
97
+ totalSpend += r.estimatedCostUsd;
98
+ totalInput += r.inputTokens;
99
+ totalOutput += r.outputTokens;
100
+ byAgent[r.agentTool] = byAgent[r.agentTool] ?? { spendUsd: 0, calls: 0 };
101
+ byAgent[r.agentTool].spendUsd += r.estimatedCostUsd;
102
+ byAgent[r.agentTool].calls++;
103
+ byModel[r.model] = byModel[r.model] ?? { spendUsd: 0, calls: 0 };
104
+ byModel[r.model].spendUsd += r.estimatedCostUsd;
105
+ byModel[r.model].calls++;
106
+ byCategory[r.taskCategory] = byCategory[r.taskCategory] ?? { spendUsd: 0, calls: 0 };
107
+ byCategory[r.taskCategory].spendUsd += r.estimatedCostUsd;
108
+ byCategory[r.taskCategory].calls++;
109
+ }
110
+ // Project monthly spend from last 7 days
111
+ const weekAgo = Date.now() - 7 * 24 * 60 * 60 * 1000;
112
+ const recent = this.records.filter(r => r.timestamp.getTime() >= weekAgo);
113
+ const weeklySpend = recent.reduce((acc, r) => acc + r.estimatedCostUsd, 0);
114
+ const monthlyProjectionUsd = +(weeklySpend * (30 / 7)).toFixed(2);
115
+ const { savings, suggestions } = this.computeSavings(recent);
116
+ this.savingsOpportunitiesUsd = savings;
117
+ await this.persistStats(monthlyProjectionUsd, savings);
118
+ return {
119
+ totalSpendUsd: +totalSpend.toFixed(4),
120
+ totalInputTokens: totalInput,
121
+ totalOutputTokens: totalOutput,
122
+ byAgent,
123
+ byModel,
124
+ byCategory,
125
+ monthlyProjectionUsd,
126
+ savingsOpportunitiesUsd: +savings.toFixed(2),
127
+ suggestions,
128
+ };
129
+ }
130
+ /** Total saved by routing to cheaper models (returned as tweetable USD). */
131
+ getSavingsUsd() {
132
+ return +this.savingsOpportunitiesUsd.toFixed(2);
133
+ }
134
+ // ── Internals ─────────────────────────────────────────────────────────────
135
+ computeSavings(records) {
136
+ const suggestions = [];
137
+ let savings = 0;
138
+ // Opus calls that could pass with Haiku (heuristic: small tasks = general/category)
139
+ const opusCalls = records.filter(r => r.model.includes('opus'));
140
+ if (opusCalls.length) {
141
+ const opusSpend = opusCalls.reduce((acc, r) => acc + r.estimatedCostUsd, 0);
142
+ const haikuPricing = MODEL_PRICING['claude-haiku-4-5'];
143
+ const opusPricing = MODEL_PRICING['claude-opus-4-7'];
144
+ const ratio = (haikuPricing.input + haikuPricing.output) / (opusPricing.input + opusPricing.output);
145
+ const potentialSave = opusSpend * (1 - ratio) * 0.43; // assume 43% are Haiku-able
146
+ savings += potentialSave;
147
+ suggestions.push(`~43% of Opus calls ($${opusSpend.toFixed(2)}) could route to Haiku → ~$${potentialSave.toFixed(2)} saved.`);
148
+ }
149
+ // Calls >1500 tokens → consider MiniMax/GLM
150
+ const bigCalls = records.filter(r => r.inputTokens > 1500 && r.model.includes('gpt'));
151
+ if (bigCalls.length) {
152
+ const bigSpend = bigCalls.reduce((acc, r) => acc + r.estimatedCostUsd, 0);
153
+ const potentialSave = bigSpend * 0.35;
154
+ savings += potentialSave;
155
+ suggestions.push(`${bigCalls.length} GPT calls exceed 1500 input tokens — route large-context to MiniMax/GLM for ~$${potentialSave.toFixed(2)} saved.`);
156
+ }
157
+ // Redundant calls (identical input within 1h) → cache
158
+ const cacheable = this.detectRedundantCalls(records);
159
+ if (cacheable.savings > 0) {
160
+ savings += cacheable.savings;
161
+ suggestions.push(`${cacheable.count} redundant calls detected — Shadow Brain cache could save ~$${cacheable.savings.toFixed(2)}.`);
162
+ }
163
+ if (!suggestions.length)
164
+ suggestions.push('No obvious routing wins. Running lean already.');
165
+ return { savings, suggestions };
166
+ }
167
+ detectRedundantCalls(records) {
168
+ // Simple approximation: calls within 60 min on same agent+category+model
169
+ const buckets = new Map();
170
+ for (const r of records) {
171
+ const key = `${r.agentTool}::${r.model}::${r.taskCategory}`;
172
+ const list = buckets.get(key) ?? [];
173
+ list.push(r);
174
+ buckets.set(key, list);
175
+ }
176
+ let redundant = 0;
177
+ let savings = 0;
178
+ for (const list of buckets.values()) {
179
+ list.sort((a, b) => a.timestamp.getTime() - b.timestamp.getTime());
180
+ for (let i = 1; i < list.length; i++) {
181
+ const gap = list[i].timestamp.getTime() - list[i - 1].timestamp.getTime();
182
+ if (gap < 60 * 60 * 1000) {
183
+ redundant++;
184
+ savings += list[i].estimatedCostUsd * 0.4;
185
+ }
186
+ }
187
+ }
188
+ return { count: redundant, savings };
189
+ }
190
+ async persistStats(monthly, savings) {
191
+ try {
192
+ const shape = {
193
+ schemaVersion: 1,
194
+ monthlyProjectionUsd: monthly,
195
+ savingsOpportunitiesUsd: savings,
196
+ lastRecalculated: new Date().toISOString(),
197
+ };
198
+ const tmp = STATS_PATH + '.tmp';
199
+ fs.writeFileSync(tmp, JSON.stringify(shape, null, 2));
200
+ fs.renameSync(tmp, STATS_PATH);
201
+ }
202
+ catch {
203
+ /* non-fatal */
204
+ }
205
+ }
206
+ }
207
+ let _instance = null;
208
+ export function getTokenEconomy() {
209
+ if (!_instance)
210
+ _instance = new TokenEconomy();
211
+ return _instance;
212
+ }
213
+ export function resetTokenEconomyForTests() {
214
+ _instance = null;
215
+ }
216
+ //# sourceMappingURL=token-economy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-economy.js","sourceRoot":"","sources":["../../src/brain/token-economy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import { VoiceCommandResult } from '../types.js';
2
+ export interface VoiceProcessInput {
3
+ transcript: string;
4
+ confidence?: number;
5
+ projectDir?: string;
6
+ }
7
+ export declare class VoiceMode {
8
+ private brain;
9
+ constructor();
10
+ process(input: VoiceProcessInput): Promise<VoiceCommandResult>;
11
+ history(limit?: number): VoiceCommandResult[];
12
+ }
13
+ export declare function getVoiceMode(): VoiceMode;
14
+ export declare function resetVoiceModeForTests(): void;
15
+ //# sourceMappingURL=voice-mode.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"voice-mode.d.ts","sourceRoot":"","sources":["../../src/brain/voice-mode.ts"],"names":[],"mappings":"AAcA,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAKjD,MAAM,WAAW,iBAAiB;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,qBAAa,SAAS;IACpB,OAAO,CAAC,KAAK,CAAc;;IAMrB,OAAO,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAmDpE,OAAO,CAAC,KAAK,SAAK,GAAG,kBAAkB,EAAE;CAa1C;AAID,wBAAgB,YAAY,IAAI,SAAS,CAGxC;AAED,wBAAgB,sBAAsB,IAAI,IAAI,CAE7C"}
@@ -0,0 +1,97 @@
1
+ // src/brain/voice-mode.ts — Voice command entry point
2
+ // v6.0.0 — Hive Mind Edition
3
+ //
4
+ // Minimal voice integration surface — the CLI and dashboard accept transcribed
5
+ // text and route through the intent engine. Actual audio capture lives in the
6
+ // companion browser bundle (dashboard) or external tools like macOS Dictation.
7
+ // This module provides:
8
+ // - Intent parsing for voice commands
9
+ // - Structured response formatting (ready for TTS)
10
+ // - Persisted command history for dashboard
11
+ import * as fs from 'fs';
12
+ import * as path from 'path';
13
+ import * as os from 'os';
14
+ import { getGlobalBrain } from './global-brain.js';
15
+ const HISTORY_PATH = path.join(os.homedir(), '.shadow-brain', 'voice-history.jsonl');
16
+ export class VoiceMode {
17
+ constructor() {
18
+ this.brain = getGlobalBrain();
19
+ }
20
+ async process(input) {
21
+ await this.brain.init();
22
+ const transcript = input.transcript.trim();
23
+ const lower = transcript.toLowerCase();
24
+ let intent = 'unknown';
25
+ let response = '';
26
+ if (/summariz(e|ed).*yesterday|recap yesterday|what did .+ learn yesterday/.test(lower)) {
27
+ intent = 'recap-yesterday';
28
+ const yesterday = Date.now() - 24 * 60 * 60 * 1000;
29
+ const events = this.brain
30
+ .timeline({ limit: 50 })
31
+ .filter(e => e.createdAt.getTime() >= yesterday);
32
+ response = events.length
33
+ ? `Yesterday: ${events.length} memory events. Top category: ${events[0].category}. First: ${events[0].content.slice(0, 140)}`
34
+ : 'No brain activity from yesterday.';
35
+ }
36
+ else if (/show.*dreams?|what.*dream/.test(lower)) {
37
+ intent = 'show-dreams';
38
+ response = 'Listing recent dream insights via shadow-brain dream list.';
39
+ }
40
+ else if (/brain status|hive mind status|how.*brain/.test(lower)) {
41
+ intent = 'status';
42
+ const stats = this.brain.getStats();
43
+ response = `Hive Mind v6.0: ${stats.totalEntries} memories across ${stats.totalProjects} projects and ${stats.totalAgents} agents. Hit rate ${Math.round(stats.hitRate * 100)}%.`;
44
+ }
45
+ else if (/stop watching|pause brain|quiet mode/.test(lower)) {
46
+ intent = 'pause';
47
+ response = 'Pausing Shadow Brain is not supported from voice in this build. Use: shadow-brain off.';
48
+ }
49
+ else if (/dash(board)?/.test(lower)) {
50
+ intent = 'open-dashboard';
51
+ response = 'The dashboard is at http://localhost:7341 when running.';
52
+ }
53
+ else {
54
+ response = `I heard "${transcript.slice(0, 120)}". Try: "brain status", "recap yesterday", or "show dreams".`;
55
+ }
56
+ const result = {
57
+ transcript,
58
+ confidence: input.confidence ?? 0.9,
59
+ intent,
60
+ response,
61
+ timestamp: new Date(),
62
+ };
63
+ try {
64
+ fs.mkdirSync(path.dirname(HISTORY_PATH), { recursive: true });
65
+ fs.appendFileSync(HISTORY_PATH, JSON.stringify(result) + '\n');
66
+ }
67
+ catch {
68
+ /* non-fatal */
69
+ }
70
+ return result;
71
+ }
72
+ history(limit = 20) {
73
+ if (!fs.existsSync(HISTORY_PATH))
74
+ return [];
75
+ try {
76
+ const raw = fs.readFileSync(HISTORY_PATH, 'utf-8');
77
+ const lines = raw.split('\n').filter(Boolean).slice(-limit);
78
+ return lines.map(l => {
79
+ const p = JSON.parse(l);
80
+ return { ...p, timestamp: new Date(p.timestamp) };
81
+ });
82
+ }
83
+ catch {
84
+ return [];
85
+ }
86
+ }
87
+ }
88
+ let _instance = null;
89
+ export function getVoiceMode() {
90
+ if (!_instance)
91
+ _instance = new VoiceMode();
92
+ return _instance;
93
+ }
94
+ export function resetVoiceModeForTests() {
95
+ _instance = null;
96
+ }
97
+ //# sourceMappingURL=voice-mode.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"voice-mode.js","sourceRoot":"","sources":["../../src/brain/voice-mode.ts"],"names":[],"mappings":"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"}