@theihtisham/agent-shadow-brain 5.2.0 → 6.0.2

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 (301) hide show
  1. package/README.md +310 -1014
  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-3d.d.ts +79 -0
  22. package/dist/brain/brain-3d.d.ts.map +1 -0
  23. package/dist/brain/brain-3d.js +468 -0
  24. package/dist/brain/brain-3d.js.map +1 -0
  25. package/dist/brain/brain-active-learner.d.ts +74 -0
  26. package/dist/brain/brain-active-learner.d.ts.map +1 -0
  27. package/dist/brain/brain-active-learner.js +425 -0
  28. package/dist/brain/brain-active-learner.js.map +1 -0
  29. package/dist/brain/brain-ascii.d.ts +32 -0
  30. package/dist/brain/brain-ascii.d.ts.map +1 -0
  31. package/dist/brain/brain-ascii.js +402 -0
  32. package/dist/brain/brain-ascii.js.map +1 -0
  33. package/dist/brain/brain-chat.d.ts +42 -0
  34. package/dist/brain/brain-chat.d.ts.map +1 -0
  35. package/dist/brain/brain-chat.js +162 -0
  36. package/dist/brain/brain-chat.js.map +1 -0
  37. package/dist/brain/brain-cinema.d.ts +45 -0
  38. package/dist/brain/brain-cinema.d.ts.map +1 -0
  39. package/dist/brain/brain-cinema.js +393 -0
  40. package/dist/brain/brain-cinema.js.map +1 -0
  41. package/dist/brain/brain-coach.d.ts +45 -0
  42. package/dist/brain/brain-coach.d.ts.map +1 -0
  43. package/dist/brain/brain-coach.js +383 -0
  44. package/dist/brain/brain-coach.js.map +1 -0
  45. package/dist/brain/brain-consolidator.d.ts +56 -0
  46. package/dist/brain/brain-consolidator.d.ts.map +1 -0
  47. package/dist/brain/brain-consolidator.js +386 -0
  48. package/dist/brain/brain-consolidator.js.map +1 -0
  49. package/dist/brain/brain-contradictions.d.ts +57 -0
  50. package/dist/brain/brain-contradictions.d.ts.map +1 -0
  51. package/dist/brain/brain-contradictions.js +443 -0
  52. package/dist/brain/brain-contradictions.js.map +1 -0
  53. package/dist/brain/brain-diff.d.ts +61 -0
  54. package/dist/brain/brain-diff.d.ts.map +1 -0
  55. package/dist/brain/brain-diff.js +439 -0
  56. package/dist/brain/brain-diff.js.map +1 -0
  57. package/dist/brain/brain-dna.d.ts +59 -0
  58. package/dist/brain/brain-dna.d.ts.map +1 -0
  59. package/dist/brain/brain-dna.js +336 -0
  60. package/dist/brain/brain-dna.js.map +1 -0
  61. package/dist/brain/brain-doppelganger.d.ts +32 -0
  62. package/dist/brain/brain-doppelganger.d.ts.map +1 -0
  63. package/dist/brain/brain-doppelganger.js +417 -0
  64. package/dist/brain/brain-doppelganger.js.map +1 -0
  65. package/dist/brain/brain-encryption.d.ts +14 -0
  66. package/dist/brain/brain-encryption.d.ts.map +1 -0
  67. package/dist/brain/brain-encryption.js +68 -0
  68. package/dist/brain/brain-encryption.js.map +1 -0
  69. package/dist/brain/brain-exchange.d.ts +30 -0
  70. package/dist/brain/brain-exchange.d.ts.map +1 -0
  71. package/dist/brain/brain-exchange.js +106 -0
  72. package/dist/brain/brain-exchange.js.map +1 -0
  73. package/dist/brain/brain-garden.d.ts +18 -0
  74. package/dist/brain/brain-garden.d.ts.map +1 -0
  75. package/dist/brain/brain-garden.js +81 -0
  76. package/dist/brain/brain-garden.js.map +1 -0
  77. package/dist/brain/brain-graph-walker.d.ts +54 -0
  78. package/dist/brain/brain-graph-walker.d.ts.map +1 -0
  79. package/dist/brain/brain-graph-walker.js +412 -0
  80. package/dist/brain/brain-graph-walker.js.map +1 -0
  81. package/dist/brain/brain-holiday-card.d.ts +50 -0
  82. package/dist/brain/brain-holiday-card.d.ts.map +1 -0
  83. package/dist/brain/brain-holiday-card.js +432 -0
  84. package/dist/brain/brain-holiday-card.js.map +1 -0
  85. package/dist/brain/brain-memes.d.ts +44 -0
  86. package/dist/brain/brain-memes.d.ts.map +1 -0
  87. package/dist/brain/brain-memes.js +438 -0
  88. package/dist/brain/brain-memes.js.map +1 -0
  89. package/dist/brain/brain-memory-tiers.d.ts +67 -0
  90. package/dist/brain/brain-memory-tiers.d.ts.map +1 -0
  91. package/dist/brain/brain-memory-tiers.js +292 -0
  92. package/dist/brain/brain-memory-tiers.js.map +1 -0
  93. package/dist/brain/brain-notebook.d.ts +68 -0
  94. package/dist/brain/brain-notebook.d.ts.map +1 -0
  95. package/dist/brain/brain-notebook.js +379 -0
  96. package/dist/brain/brain-notebook.js.map +1 -0
  97. package/dist/brain/brain-portability.js +1 -1
  98. package/dist/brain/brain-quantize.d.ts +62 -0
  99. package/dist/brain/brain-quantize.d.ts.map +1 -0
  100. package/dist/brain/brain-quantize.js +346 -0
  101. package/dist/brain/brain-quantize.js.map +1 -0
  102. package/dist/brain/brain-query-expander.d.ts +31 -0
  103. package/dist/brain/brain-query-expander.d.ts.map +1 -0
  104. package/dist/brain/brain-query-expander.js +417 -0
  105. package/dist/brain/brain-query-expander.js.map +1 -0
  106. package/dist/brain/brain-quest.d.ts +58 -0
  107. package/dist/brain/brain-quest.d.ts.map +1 -0
  108. package/dist/brain/brain-quest.js +541 -0
  109. package/dist/brain/brain-quest.js.map +1 -0
  110. package/dist/brain/brain-recall-cache.d.ts +73 -0
  111. package/dist/brain/brain-recall-cache.d.ts.map +1 -0
  112. package/dist/brain/brain-recall-cache.js +444 -0
  113. package/dist/brain/brain-recall-cache.js.map +1 -0
  114. package/dist/brain/brain-reflex.d.ts +55 -0
  115. package/dist/brain/brain-reflex.d.ts.map +1 -0
  116. package/dist/brain/brain-reflex.js +364 -0
  117. package/dist/brain/brain-reflex.js.map +1 -0
  118. package/dist/brain/brain-replay.d.ts +74 -0
  119. package/dist/brain/brain-replay.d.ts.map +1 -0
  120. package/dist/brain/brain-replay.js +336 -0
  121. package/dist/brain/brain-replay.js.map +1 -0
  122. package/dist/brain/brain-rerank.d.ts +39 -0
  123. package/dist/brain/brain-rerank.d.ts.map +1 -0
  124. package/dist/brain/brain-rerank.js +216 -0
  125. package/dist/brain/brain-rerank.js.map +1 -0
  126. package/dist/brain/brain-roast.d.ts +44 -0
  127. package/dist/brain/brain-roast.d.ts.map +1 -0
  128. package/dist/brain/brain-roast.js +566 -0
  129. package/dist/brain/brain-roast.js.map +1 -0
  130. package/dist/brain/brain-sonification.d.ts +57 -0
  131. package/dist/brain/brain-sonification.d.ts.map +1 -0
  132. package/dist/brain/brain-sonification.js +286 -0
  133. package/dist/brain/brain-sonification.js.map +1 -0
  134. package/dist/brain/brain-tarot.d.ts +49 -0
  135. package/dist/brain/brain-tarot.d.ts.map +1 -0
  136. package/dist/brain/brain-tarot.js +634 -0
  137. package/dist/brain/brain-tarot.js.map +1 -0
  138. package/dist/brain/brain-time-capsule.d.ts +80 -0
  139. package/dist/brain/brain-time-capsule.d.ts.map +1 -0
  140. package/dist/brain/brain-time-capsule.js +289 -0
  141. package/dist/brain/brain-time-capsule.js.map +1 -0
  142. package/dist/brain/brain-trophies.d.ts +60 -0
  143. package/dist/brain/brain-trophies.d.ts.map +1 -0
  144. package/dist/brain/brain-trophies.js +431 -0
  145. package/dist/brain/brain-trophies.js.map +1 -0
  146. package/dist/brain/brain-working-memory.d.ts +78 -0
  147. package/dist/brain/brain-working-memory.d.ts.map +1 -0
  148. package/dist/brain/brain-working-memory.js +367 -0
  149. package/dist/brain/brain-working-memory.js.map +1 -0
  150. package/dist/brain/branch-brain.d.ts +23 -0
  151. package/dist/brain/branch-brain.d.ts.map +1 -0
  152. package/dist/brain/branch-brain.js +159 -0
  153. package/dist/brain/branch-brain.js.map +1 -0
  154. package/dist/brain/calibration-monitor.d.ts +20 -0
  155. package/dist/brain/calibration-monitor.d.ts.map +1 -0
  156. package/dist/brain/calibration-monitor.js +144 -0
  157. package/dist/brain/calibration-monitor.js.map +1 -0
  158. package/dist/brain/causal-chains.d.ts +37 -0
  159. package/dist/brain/causal-chains.d.ts.map +1 -0
  160. package/dist/brain/causal-chains.js +250 -0
  161. package/dist/brain/causal-chains.js.map +1 -0
  162. package/dist/brain/collision-detective.d.ts +32 -0
  163. package/dist/brain/collision-detective.d.ts.map +1 -0
  164. package/dist/brain/collision-detective.js +233 -0
  165. package/dist/brain/collision-detective.js.map +1 -0
  166. package/dist/brain/confidence-gate.d.ts +69 -0
  167. package/dist/brain/confidence-gate.d.ts.map +1 -0
  168. package/dist/brain/confidence-gate.js +244 -0
  169. package/dist/brain/confidence-gate.js.map +1 -0
  170. package/dist/brain/constitution.d.ts +59 -0
  171. package/dist/brain/constitution.d.ts.map +1 -0
  172. package/dist/brain/constitution.js +315 -0
  173. package/dist/brain/constitution.js.map +1 -0
  174. package/dist/brain/cost-aware-spawner.d.ts +7 -0
  175. package/dist/brain/cost-aware-spawner.d.ts.map +1 -0
  176. package/dist/brain/cost-aware-spawner.js +77 -0
  177. package/dist/brain/cost-aware-spawner.js.map +1 -0
  178. package/dist/brain/dream-engine.d.ts +35 -0
  179. package/dist/brain/dream-engine.d.ts.map +1 -0
  180. package/dist/brain/dream-engine.js +273 -0
  181. package/dist/brain/dream-engine.js.map +1 -0
  182. package/dist/brain/embeddings-v2.d.ts +58 -0
  183. package/dist/brain/embeddings-v2.d.ts.map +1 -0
  184. package/dist/brain/embeddings-v2.js +344 -0
  185. package/dist/brain/embeddings-v2.js.map +1 -0
  186. package/dist/brain/embeddings.d.ts +27 -0
  187. package/dist/brain/embeddings.d.ts.map +1 -0
  188. package/dist/brain/embeddings.js +175 -0
  189. package/dist/brain/embeddings.js.map +1 -0
  190. package/dist/brain/forgetting-curve.d.ts +21 -0
  191. package/dist/brain/forgetting-curve.d.ts.map +1 -0
  192. package/dist/brain/forgetting-curve.js +174 -0
  193. package/dist/brain/forgetting-curve.js.map +1 -0
  194. package/dist/brain/formal-verification-bridge.d.ts +26 -0
  195. package/dist/brain/formal-verification-bridge.d.ts.map +1 -0
  196. package/dist/brain/formal-verification-bridge.js +219 -0
  197. package/dist/brain/formal-verification-bridge.js.map +1 -0
  198. package/dist/brain/global-brain.d.ts +8 -1
  199. package/dist/brain/global-brain.d.ts.map +1 -1
  200. package/dist/brain/global-brain.js +24 -0
  201. package/dist/brain/global-brain.js.map +1 -1
  202. package/dist/brain/hallucination-quarantine.d.ts +26 -0
  203. package/dist/brain/hallucination-quarantine.d.ts.map +1 -0
  204. package/dist/brain/hallucination-quarantine.js +135 -0
  205. package/dist/brain/hallucination-quarantine.js.map +1 -0
  206. package/dist/brain/hive-accelerator.d.ts +39 -0
  207. package/dist/brain/hive-accelerator.d.ts.map +1 -0
  208. package/dist/brain/hive-accelerator.js +152 -0
  209. package/dist/brain/hive-accelerator.js.map +1 -0
  210. package/dist/brain/hive-voice.d.ts +71 -0
  211. package/dist/brain/hive-voice.d.ts.map +1 -0
  212. package/dist/brain/hive-voice.js +352 -0
  213. package/dist/brain/hive-voice.js.map +1 -0
  214. package/dist/brain/json-output.d.ts +26 -0
  215. package/dist/brain/json-output.d.ts.map +1 -0
  216. package/dist/brain/json-output.js +112 -0
  217. package/dist/brain/json-output.js.map +1 -0
  218. package/dist/brain/l0-cache.js +1 -1
  219. package/dist/brain/l0-cache.js.map +1 -1
  220. package/dist/brain/local-llm.d.ts +20 -0
  221. package/dist/brain/local-llm.d.ts.map +1 -0
  222. package/dist/brain/local-llm.js +132 -0
  223. package/dist/brain/local-llm.js.map +1 -0
  224. package/dist/brain/markdown-export.d.ts +48 -0
  225. package/dist/brain/markdown-export.d.ts.map +1 -0
  226. package/dist/brain/markdown-export.js +382 -0
  227. package/dist/brain/markdown-export.js.map +1 -0
  228. package/dist/brain/mcp-server.d.ts +40 -0
  229. package/dist/brain/mcp-server.d.ts.map +1 -1
  230. package/dist/brain/mcp-server.js +395 -12
  231. package/dist/brain/mcp-server.js.map +1 -1
  232. package/dist/brain/model-registry.d.ts +96 -0
  233. package/dist/brain/model-registry.d.ts.map +1 -0
  234. package/dist/brain/model-registry.js +585 -0
  235. package/dist/brain/model-registry.js.map +1 -0
  236. package/dist/brain/multimodal-vision.d.ts +38 -0
  237. package/dist/brain/multimodal-vision.d.ts.map +1 -0
  238. package/dist/brain/multimodal-vision.js +257 -0
  239. package/dist/brain/multimodal-vision.js.map +1 -0
  240. package/dist/brain/orchestrator.js +1 -1
  241. package/dist/brain/otel-lite.d.ts +71 -0
  242. package/dist/brain/otel-lite.d.ts.map +1 -0
  243. package/dist/brain/otel-lite.js +232 -0
  244. package/dist/brain/otel-lite.js.map +1 -0
  245. package/dist/brain/pr-auto-review.d.ts +17 -0
  246. package/dist/brain/pr-auto-review.d.ts.map +1 -0
  247. package/dist/brain/pr-auto-review.js +73 -0
  248. package/dist/brain/pr-auto-review.js.map +1 -0
  249. package/dist/brain/pre-mortem.d.ts +21 -0
  250. package/dist/brain/pre-mortem.d.ts.map +1 -0
  251. package/dist/brain/pre-mortem.js +210 -0
  252. package/dist/brain/pre-mortem.js.map +1 -0
  253. package/dist/brain/prompt-cache.d.ts +54 -0
  254. package/dist/brain/prompt-cache.d.ts.map +1 -0
  255. package/dist/brain/prompt-cache.js +105 -0
  256. package/dist/brain/prompt-cache.js.map +1 -0
  257. package/dist/brain/reputation-ledger.d.ts +42 -0
  258. package/dist/brain/reputation-ledger.d.ts.map +1 -0
  259. package/dist/brain/reputation-ledger.js +326 -0
  260. package/dist/brain/reputation-ledger.js.map +1 -0
  261. package/dist/brain/session-hooks.d.ts +19 -0
  262. package/dist/brain/session-hooks.d.ts.map +1 -1
  263. package/dist/brain/session-hooks.js +249 -18
  264. package/dist/brain/session-hooks.js.map +1 -1
  265. package/dist/brain/subagent-bridge.d.ts +46 -0
  266. package/dist/brain/subagent-bridge.d.ts.map +1 -0
  267. package/dist/brain/subagent-bridge.js +364 -0
  268. package/dist/brain/subagent-bridge.js.map +1 -0
  269. package/dist/brain/swarm-debate.d.ts +22 -0
  270. package/dist/brain/swarm-debate.d.ts.map +1 -0
  271. package/dist/brain/swarm-debate.js +134 -0
  272. package/dist/brain/swarm-debate.js.map +1 -0
  273. package/dist/brain/team-brain-sync.d.ts +22 -0
  274. package/dist/brain/team-brain-sync.d.ts.map +1 -0
  275. package/dist/brain/team-brain-sync.js +132 -0
  276. package/dist/brain/team-brain-sync.js.map +1 -0
  277. package/dist/brain/token-economy.d.ts +25 -0
  278. package/dist/brain/token-economy.d.ts.map +1 -0
  279. package/dist/brain/token-economy.js +216 -0
  280. package/dist/brain/token-economy.js.map +1 -0
  281. package/dist/brain/voice-mode.d.ts +15 -0
  282. package/dist/brain/voice-mode.d.ts.map +1 -0
  283. package/dist/brain/voice-mode.js +97 -0
  284. package/dist/brain/voice-mode.js.map +1 -0
  285. package/dist/cli.js +1702 -4
  286. package/dist/cli.js.map +1 -1
  287. package/dist/dashboard/server.d.ts +6 -0
  288. package/dist/dashboard/server.d.ts.map +1 -1
  289. package/dist/dashboard/server.js +1118 -368
  290. package/dist/dashboard/server.js.map +1 -1
  291. package/dist/dashboard/v6-dashboard-html.d.ts +2 -0
  292. package/dist/dashboard/v6-dashboard-html.d.ts.map +1 -0
  293. package/dist/dashboard/v6-dashboard-html.js +2474 -0
  294. package/dist/dashboard/v6-dashboard-html.js.map +1 -0
  295. package/dist/index.d.ts +27 -0
  296. package/dist/index.d.ts.map +1 -1
  297. package/dist/index.js +29 -1
  298. package/dist/index.js.map +1 -1
  299. package/dist/types.d.ts +518 -2
  300. package/dist/types.d.ts.map +1 -1
  301. package/package.json +33 -4
@@ -0,0 +1,326 @@
1
+ // src/brain/reputation-ledger.ts — Agent Reputation Ledger (Ed25519-signed)
2
+ // v6.0.0 — Hive Mind Edition
3
+ //
4
+ // Every agent decision gets a cryptographically-signed receipt. Reputation is
5
+ // a portable artifact: accuracy rate, streak, per-category scores — all
6
+ // tamper-evident via Ed25519 signatures + a chained ledger hash.
7
+ //
8
+ // Enables: shareable trust badges, community leaderboards, auditable history.
9
+ // Nobody else ships this.
10
+ import * as fs from 'fs';
11
+ import * as path from 'path';
12
+ import * as os from 'os';
13
+ import * as crypto from 'crypto';
14
+ const REP_DIR = path.join(os.homedir(), '.shadow-brain', 'reputation');
15
+ const LEDGER_PATH = path.join(REP_DIR, 'ledger.jsonl');
16
+ const SCORES_PATH = path.join(REP_DIR, 'scores.json');
17
+ const KEYS_PATH = path.join(REP_DIR, 'keys.json');
18
+ export class ReputationLedger {
19
+ constructor() {
20
+ this.receipts = [];
21
+ this.scores = new Map();
22
+ this.keyPairs = new Map();
23
+ this.ledgerHash = crypto.createHash('sha256').update('shadow-brain-v6-genesis').digest('hex');
24
+ this.initialized = false;
25
+ }
26
+ async init() {
27
+ if (this.initialized)
28
+ return;
29
+ fs.mkdirSync(REP_DIR, { recursive: true });
30
+ // Load ledger
31
+ if (fs.existsSync(LEDGER_PATH)) {
32
+ try {
33
+ const raw = fs.readFileSync(LEDGER_PATH, 'utf-8');
34
+ for (const line of raw.split('\n')) {
35
+ if (!line.trim())
36
+ continue;
37
+ const receipt = JSON.parse(line);
38
+ this.receipts.push({
39
+ ...receipt,
40
+ signedAt: new Date(receipt.signedAt),
41
+ outcomeVerifiedAt: receipt.outcomeVerifiedAt ? new Date(receipt.outcomeVerifiedAt) : undefined,
42
+ });
43
+ }
44
+ }
45
+ catch {
46
+ /* skip corrupt lines silently */
47
+ }
48
+ }
49
+ // Load scores
50
+ if (fs.existsSync(SCORES_PATH)) {
51
+ try {
52
+ const parsed = JSON.parse(fs.readFileSync(SCORES_PATH, 'utf-8'));
53
+ for (const [k, v] of Object.entries(parsed.scores ?? {})) {
54
+ this.scores.set(k, { ...v, lastActive: new Date(v.lastActive) });
55
+ }
56
+ this.ledgerHash = parsed.ledgerHash ?? this.ledgerHash;
57
+ }
58
+ catch {
59
+ /* skip */
60
+ }
61
+ }
62
+ // Load keys
63
+ if (fs.existsSync(KEYS_PATH)) {
64
+ try {
65
+ const parsed = JSON.parse(fs.readFileSync(KEYS_PATH, 'utf-8'));
66
+ for (const [k, v] of Object.entries(parsed.keys ?? {})) {
67
+ this.keyPairs.set(k, v);
68
+ }
69
+ }
70
+ catch {
71
+ /* skip */
72
+ }
73
+ }
74
+ this.initialized = true;
75
+ }
76
+ /** Sign and record a decision. Returns receipt with signature. */
77
+ async sign(input) {
78
+ await this.init();
79
+ const key = this.keyFor(input.agentTool, input.agentVersion);
80
+ const kp = this.ensureKeyPair(key);
81
+ const payload = {
82
+ agentTool: input.agentTool,
83
+ agentVersion: input.agentVersion,
84
+ projectId: input.projectId,
85
+ decision: input.decision,
86
+ category: input.category,
87
+ confidence: input.confidence,
88
+ signedAt: new Date().toISOString(),
89
+ prevHash: this.ledgerHash,
90
+ };
91
+ const canonical = JSON.stringify(payload);
92
+ const signatureBytes = crypto.sign(null, Buffer.from(canonical, 'utf-8'), crypto.createPrivateKey({ key: kp.privateKey, format: 'pem' }));
93
+ const signature = signatureBytes.toString('base64');
94
+ const receipt = {
95
+ id: `rec-${crypto.randomBytes(6).toString('hex')}`,
96
+ agentTool: input.agentTool,
97
+ agentVersion: input.agentVersion,
98
+ projectId: input.projectId,
99
+ decision: input.decision,
100
+ category: input.category,
101
+ confidence: input.confidence,
102
+ signedAt: new Date(payload.signedAt),
103
+ signature,
104
+ publicKey: kp.publicKey,
105
+ };
106
+ this.receipts.push(receipt);
107
+ // Advance ledger hash
108
+ this.ledgerHash = crypto
109
+ .createHash('sha256')
110
+ .update(this.ledgerHash + canonical + signature)
111
+ .digest('hex');
112
+ // Append ledger line
113
+ try {
114
+ fs.appendFileSync(LEDGER_PATH, JSON.stringify(receipt) + '\n');
115
+ }
116
+ catch {
117
+ /* non-fatal */
118
+ }
119
+ this.updateScoreForReceipt(receipt, null);
120
+ await this.persistScores();
121
+ return receipt;
122
+ }
123
+ /** Record the outcome for a prior decision (correctness verdict). */
124
+ async recordOutcome(receiptId, verdict) {
125
+ await this.init();
126
+ const receipt = this.receipts.find(r => r.id === receiptId);
127
+ if (!receipt)
128
+ return false;
129
+ receipt.outcomeVerdict = verdict;
130
+ receipt.outcomeVerifiedAt = new Date();
131
+ this.updateScoreForReceipt(receipt, verdict);
132
+ await this.persistScores();
133
+ return true;
134
+ }
135
+ /** Verify a receipt's signature against its stored public key. */
136
+ async verify(receipt) {
137
+ await this.init();
138
+ try {
139
+ const payload = {
140
+ agentTool: receipt.agentTool,
141
+ agentVersion: receipt.agentVersion,
142
+ projectId: receipt.projectId,
143
+ decision: receipt.decision,
144
+ category: receipt.category,
145
+ confidence: receipt.confidence,
146
+ signedAt: receipt.signedAt.toISOString(),
147
+ };
148
+ // NOTE: prevHash was consumed at sign-time and isn't reproducible here.
149
+ // Full verify requires the ledger chain — treat sig validity as primary.
150
+ const canonical = JSON.stringify({ ...payload, prevHash: 'unknown' });
151
+ return crypto.verify(null, Buffer.from(canonical, 'utf-8'), crypto.createPublicKey({ key: receipt.publicKey, format: 'pem' }), Buffer.from(receipt.signature, 'base64'));
152
+ }
153
+ catch {
154
+ return false;
155
+ }
156
+ }
157
+ /** Get reputation for an agent (across all versions) or specific agent+version. */
158
+ getScore(agentTool, agentVersion) {
159
+ const key = agentVersion ? this.keyFor(agentTool, agentVersion) : this.keyFor(agentTool, '*');
160
+ if (agentVersion)
161
+ return this.scores.get(key) ?? null;
162
+ // aggregate across versions
163
+ let agg = null;
164
+ for (const [k, score] of this.scores) {
165
+ if (!k.startsWith(`${agentTool}::`))
166
+ continue;
167
+ if (!agg)
168
+ agg = this.blankScore(agentTool, '*');
169
+ agg.totalDecisions += score.totalDecisions;
170
+ agg.correct += score.correct;
171
+ agg.incorrect += score.incorrect;
172
+ agg.partial += score.partial;
173
+ for (const [cat, catScore] of Object.entries(score.categoryScores)) {
174
+ const existing = agg.categoryScores[cat] ?? { correct: 0, total: 0, accuracy: 0 };
175
+ existing.correct += catScore.correct;
176
+ existing.total += catScore.total;
177
+ existing.accuracy = existing.total ? existing.correct / existing.total : 0;
178
+ agg.categoryScores[cat] = existing;
179
+ }
180
+ if (score.lastActive.getTime() > agg.lastActive.getTime())
181
+ agg.lastActive = score.lastActive;
182
+ }
183
+ if (agg) {
184
+ const verified = agg.correct + agg.incorrect + agg.partial;
185
+ agg.accuracyRate = verified ? (agg.correct + agg.partial * 0.5) / verified : 0;
186
+ }
187
+ return agg;
188
+ }
189
+ /** Export reputation as a portable JSON suitable for sharing. */
190
+ exportPortable() {
191
+ return {
192
+ agents: Array.from(this.scores.values()).map(s => ({ ...s })),
193
+ ledgerHash: this.ledgerHash,
194
+ generatedAt: new Date().toISOString(),
195
+ };
196
+ }
197
+ /** Generate a shields.io-compatible badge line for a README. */
198
+ badge(agentTool, agentVersion) {
199
+ const score = this.getScore(agentTool, agentVersion);
200
+ if (!score)
201
+ return null;
202
+ const pct = Math.round(score.accuracyRate * 100);
203
+ const label = `${agentTool}${agentVersion ? `@${agentVersion}` : ''}`;
204
+ const color = pct >= 90 ? 'brightgreen' : pct >= 75 ? 'green' : pct >= 50 ? 'yellow' : 'orange';
205
+ return `![${label}](https://img.shields.io/badge/${encodeURIComponent(label)}-${pct}%25%20accuracy-${color})`;
206
+ }
207
+ stats() {
208
+ const verified = this.receipts.filter(r => r.outcomeVerdict && r.outcomeVerdict !== 'unverified').length;
209
+ const averageAccuracy = this.scores.size
210
+ ? Array.from(this.scores.values()).reduce((acc, s) => acc + s.accuracyRate, 0) / this.scores.size
211
+ : 0;
212
+ const top = Array.from(this.scores.values())
213
+ .sort((a, b) => b.accuracyRate - a.accuracyRate)
214
+ .slice(0, 5)
215
+ .map(s => ({ agentTool: s.agentTool, accuracy: s.accuracyRate, decisions: s.totalDecisions }));
216
+ return {
217
+ totalAgents: this.scores.size,
218
+ totalReceipts: this.receipts.length,
219
+ verifiedReceipts: verified,
220
+ averageAccuracy,
221
+ topAgents: top,
222
+ };
223
+ }
224
+ // ── Internals ─────────────────────────────────────────────────────────────
225
+ ensureKeyPair(key) {
226
+ const existing = this.keyPairs.get(key);
227
+ if (existing)
228
+ return existing;
229
+ const { publicKey, privateKey } = crypto.generateKeyPairSync('ed25519');
230
+ const kp = {
231
+ publicKey: publicKey.export({ format: 'pem', type: 'spki' }).toString(),
232
+ privateKey: privateKey.export({ format: 'pem', type: 'pkcs8' }).toString(),
233
+ };
234
+ this.keyPairs.set(key, kp);
235
+ this.persistKeys().catch(() => { });
236
+ return kp;
237
+ }
238
+ keyFor(agentTool, agentVersion) {
239
+ return `${agentTool}::${agentVersion}`;
240
+ }
241
+ blankScore(agentTool, agentVersion) {
242
+ return {
243
+ agentTool,
244
+ agentVersion,
245
+ totalDecisions: 0,
246
+ correct: 0,
247
+ incorrect: 0,
248
+ partial: 0,
249
+ accuracyRate: 0,
250
+ categoryScores: {},
251
+ streakDays: 0,
252
+ lastActive: new Date(),
253
+ publicKey: '',
254
+ ledgerHash: this.ledgerHash,
255
+ };
256
+ }
257
+ updateScoreForReceipt(receipt, verdict) {
258
+ const key = this.keyFor(receipt.agentTool, receipt.agentVersion);
259
+ const kp = this.keyPairs.get(key);
260
+ const score = this.scores.get(key) ?? this.blankScore(receipt.agentTool, receipt.agentVersion);
261
+ score.publicKey = kp?.publicKey ?? score.publicKey;
262
+ score.ledgerHash = this.ledgerHash;
263
+ score.lastActive = new Date();
264
+ if (!verdict) {
265
+ score.totalDecisions++;
266
+ }
267
+ else {
268
+ if (verdict === 'correct')
269
+ score.correct++;
270
+ else if (verdict === 'incorrect')
271
+ score.incorrect++;
272
+ else
273
+ score.partial++;
274
+ const cat = score.categoryScores[receipt.category] ?? { correct: 0, total: 0, accuracy: 0 };
275
+ cat.total++;
276
+ if (verdict === 'correct')
277
+ cat.correct++;
278
+ else if (verdict === 'partial')
279
+ cat.correct += 0.5;
280
+ cat.accuracy = cat.total ? cat.correct / cat.total : 0;
281
+ score.categoryScores[receipt.category] = cat;
282
+ const totalVerified = score.correct + score.incorrect + score.partial;
283
+ score.accuracyRate = totalVerified ? (score.correct + score.partial * 0.5) / totalVerified : 0;
284
+ }
285
+ this.scores.set(key, score);
286
+ }
287
+ async persistScores() {
288
+ try {
289
+ const shape = {
290
+ schemaVersion: 1,
291
+ scores: Object.fromEntries(this.scores.entries()),
292
+ ledgerHash: this.ledgerHash,
293
+ };
294
+ const tmp = SCORES_PATH + '.tmp';
295
+ fs.writeFileSync(tmp, JSON.stringify(shape, null, 2));
296
+ fs.renameSync(tmp, SCORES_PATH);
297
+ }
298
+ catch {
299
+ /* non-fatal */
300
+ }
301
+ }
302
+ async persistKeys() {
303
+ try {
304
+ const shape = {
305
+ schemaVersion: 1,
306
+ keys: Object.fromEntries(this.keyPairs.entries()),
307
+ };
308
+ const tmp = KEYS_PATH + '.tmp';
309
+ fs.writeFileSync(tmp, JSON.stringify(shape, null, 2));
310
+ fs.renameSync(tmp, KEYS_PATH);
311
+ }
312
+ catch {
313
+ /* non-fatal */
314
+ }
315
+ }
316
+ }
317
+ let _instance = null;
318
+ export function getReputationLedger() {
319
+ if (!_instance)
320
+ _instance = new ReputationLedger();
321
+ return _instance;
322
+ }
323
+ export function resetReputationLedgerForTests() {
324
+ _instance = null;
325
+ }
326
+ //# sourceMappingURL=reputation-ledger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reputation-ledger.js","sourceRoot":"","sources":["../../src/brain/reputation-ledger.ts"],"names":[],"mappings":"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"}
@@ -4,6 +4,10 @@ export declare class SessionHookInstaller {
4
4
  detectInstalled(projectDir: string): Promise<AgentTool[]>;
5
5
  /** Install hooks for ALL detected agents in one shot */
6
6
  attachAll(projectDir: string): Promise<AttachReport>;
7
+ /** Best-effort non-mutating audit of Shadow Brain hook artifacts. */
8
+ audit(projectDir: string): Promise<SessionHook[]>;
9
+ /** Detach Shadow Brain from every detected agent without creating new hooks. */
10
+ detachAll(projectDir: string): Promise<AttachReport>;
7
11
  /** Install hooks for a single agent. Returns list of installed hooks. */
8
12
  attach(agent: AgentTool, projectDir: string): Promise<SessionHook[]>;
9
13
  /** Detach Shadow Brain from a specific agent */
@@ -20,6 +24,21 @@ export declare class SessionHookInstaller {
20
24
  private attachCopilot;
21
25
  /** Add Shadow Brain to an MCP-server-style JSON config without clobbering existing servers */
22
26
  private upsertMcpJson;
27
+ private findInstalledHooks;
28
+ private containsShadowBrain;
29
+ private removeShadowBrainBlock;
30
+ private removeFromJsonConfig;
31
+ /**
32
+ * Claude Code schema requires each SessionStart entry to have shape:
33
+ * { matcher: string, hooks: [{ type: 'command', command: '...' }] }
34
+ * Older Shadow Brain versions mistakenly wrote flat { name, command, timeout }
35
+ * entries directly, which broke Claude Code's settings loader. This function:
36
+ * - drops null/undefined/non-object entries
37
+ * - rewraps flat "legacy" entries into a valid { matcher, hooks } block
38
+ * - ensures every block.hooks is a valid array of { type:'command', command }
39
+ * - strips any nested malformed entries
40
+ */
41
+ private repairClaudeHookBlocks;
23
42
  private cursorRuleTemplate;
24
43
  private genericRuleTemplate;
25
44
  private copilotInstructionsTemplate;
@@ -1 +1 @@
1
- {"version":3,"file":"session-hooks.d.ts","sourceRoot":"","sources":["../../src/brain/session-hooks.ts"],"names":[],"mappings":"AAuBA,OAAO,EACL,SAAS,EACT,WAAW,EACX,YAAY,EACb,MAAM,aAAa,CAAC;AASrB,qBAAa,oBAAoB;IAC/B,wDAAwD;IAClD,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IA0B/D,wDAAwD;IAClD,SAAS,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IA+B1D,yEAAyE;IACnE,MAAM,CAAC,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAgB1E,gDAAgD;IAC1C,MAAM,CAAC,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAmBpE,OAAO,CAAC,gBAAgB;IA4CxB,OAAO,CAAC,YAAY;IAsCpB,OAAO,CAAC,WAAW;IAiDnB,OAAO,CAAC,cAAc;IAkCtB,OAAO,CAAC,WAAW;IA2BnB,OAAO,CAAC,cAAc;IA2BtB,OAAO,CAAC,cAAc;IA0BtB,OAAO,CAAC,aAAa;IA2BrB,OAAO,CAAC,WAAW;IA6BnB,OAAO,CAAC,aAAa;IA6BrB,8FAA8F;IAC9F,OAAO,CAAC,aAAa;IAWrB,OAAO,CAAC,kBAAkB;IAgB1B,OAAO,CAAC,mBAAmB;IAU3B,OAAO,CAAC,2BAA2B;CASpC;AAID,wBAAgB,gBAAgB,IAAI,oBAAoB,CAGvD"}
1
+ {"version":3,"file":"session-hooks.d.ts","sourceRoot":"","sources":["../../src/brain/session-hooks.ts"],"names":[],"mappings":"AAuBA,OAAO,EACL,SAAS,EACT,WAAW,EACX,YAAY,EACb,MAAM,aAAa,CAAC;AASrB,qBAAa,oBAAoB;IAC/B,wDAAwD;IAClD,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IA0B/D,wDAAwD;IAClD,SAAS,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IA+B1D,qEAAqE;IAC/D,KAAK,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IASvD,gFAAgF;IAC1E,SAAS,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAgC1D,yEAAyE;IACnE,MAAM,CAAC,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAgB1E,gDAAgD;IAC1C,MAAM,CAAC,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAuBpE,OAAO,CAAC,gBAAgB;IAmExB,OAAO,CAAC,YAAY;IAsCpB,OAAO,CAAC,WAAW;IAiDnB,OAAO,CAAC,cAAc;IAkCtB,OAAO,CAAC,WAAW;IA2BnB,OAAO,CAAC,cAAc;IA2BtB,OAAO,CAAC,cAAc;IA0BtB,OAAO,CAAC,aAAa;IA2BrB,OAAO,CAAC,WAAW;IA6BnB,OAAO,CAAC,aAAa;IA6BrB,8FAA8F;IAC9F,OAAO,CAAC,aAAa;IAWrB,OAAO,CAAC,kBAAkB;IAkE1B,OAAO,CAAC,mBAAmB;IAQ3B,OAAO,CAAC,sBAAsB;IAa9B,OAAO,CAAC,oBAAoB;IAwC5B;;;;;;;;;OASG;IACH,OAAO,CAAC,sBAAsB;IA2B9B,OAAO,CAAC,kBAAkB;IAgB1B,OAAO,CAAC,mBAAmB;IAU3B,OAAO,CAAC,2BAA2B;CASpC;AAID,wBAAgB,gBAAgB,IAAI,oBAAoB,CAGvD"}