@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,17 @@
1
+ import { PRReviewComment } from '../types.js';
2
+ export interface PRReviewInput {
3
+ repo: string;
4
+ prNumber: number;
5
+ projectDir: string;
6
+ diffSummary: string;
7
+ changedFiles: string[];
8
+ }
9
+ export declare class PRAutoReview {
10
+ private brain;
11
+ constructor();
12
+ generate(input: PRReviewInput): Promise<PRReviewComment>;
13
+ private extractTerms;
14
+ }
15
+ export declare function getPRAutoReview(): PRAutoReview;
16
+ export declare function resetPRAutoReviewForTests(): void;
17
+ //# sourceMappingURL=pr-auto-review.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pr-auto-review.d.ts","sourceRoot":"","sources":["../../src/brain/pr-auto-review.ts"],"names":[],"mappings":"AAMA,OAAO,EACL,eAAe,EAEhB,MAAM,aAAa,CAAC;AAGrB,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,KAAK,CAAc;;IAMrB,QAAQ,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,eAAe,CAAC;IAiD9D,OAAO,CAAC,YAAY;CAQrB;AAID,wBAAgB,eAAe,IAAI,YAAY,CAG9C;AAED,wBAAgB,yBAAyB,IAAI,IAAI,CAEhD"}
@@ -0,0 +1,73 @@
1
+ // src/brain/pr-auto-review.ts — PR review with brain context
2
+ // v6.0.0 — Hive Mind Edition
3
+ //
4
+ // Generates a Markdown review comment for a PR that cites brain memories.
5
+ // Does NOT post — returns a string you can post via gh CLI or github API.
6
+ import { getGlobalBrain, GlobalBrain } from './global-brain.js';
7
+ export class PRAutoReview {
8
+ constructor() {
9
+ this.brain = getGlobalBrain();
10
+ }
11
+ async generate(input) {
12
+ await this.brain.init();
13
+ const projectId = GlobalBrain.projectIdFor(input.projectDir);
14
+ const terms = this.extractTerms(`${input.diffSummary} ${input.changedFiles.join(' ')}`);
15
+ const relevant = this.brain.recall({ projectId, keywords: terms, limit: 30 });
16
+ const matches = [];
17
+ const contradictions = [];
18
+ const suggestions = [];
19
+ const citations = [];
20
+ for (const entry of relevant.slice(0, 12)) {
21
+ const snippet = entry.content.slice(0, 160);
22
+ citations.push({ memoryId: entry.id, snippet });
23
+ const category = entry.category.toLowerCase();
24
+ if (category.includes('warning') || category.includes('pitfall') || category.includes('failure')) {
25
+ contradictions.push(`⚠️ Prior issue: ${snippet}`);
26
+ }
27
+ else if (category.includes('pattern') || category.includes('decision')) {
28
+ matches.push(`✅ Matches pattern: ${snippet}`);
29
+ }
30
+ else {
31
+ suggestions.push(`💡 Related memory: ${snippet}`);
32
+ }
33
+ }
34
+ if (!matches.length && !contradictions.length && !suggestions.length) {
35
+ suggestions.push('No directly related project memories found. Brain is still learning.');
36
+ }
37
+ const body = [
38
+ `## Shadow Brain Review (${relevant.length} memories considered)`,
39
+ ``,
40
+ `**Changed files:** ${input.changedFiles.slice(0, 10).join(', ')}`,
41
+ ``,
42
+ matches.length ? `### Pattern matches\n${matches.join('\n')}` : '',
43
+ contradictions.length ? `\n### Past issues to re-check\n${contradictions.join('\n')}` : '',
44
+ suggestions.length ? `\n### Suggestions\n${suggestions.join('\n')}` : '',
45
+ `\n---\n<sub>_Shadow Brain v6.0 · Hive Mind — https://github.com/theihtisham/agent-shadow-brain_</sub>`,
46
+ ].filter(Boolean).join('\n');
47
+ return {
48
+ prNumber: input.prNumber,
49
+ repo: input.repo,
50
+ body,
51
+ sections: { matches, contradictions, suggestions, citations },
52
+ generatedAt: new Date(),
53
+ };
54
+ }
55
+ extractTerms(text) {
56
+ return text
57
+ .toLowerCase()
58
+ .replace(/[^a-z0-9\s-_./]/g, ' ')
59
+ .split(/\s+/)
60
+ .filter(w => w.length > 3 && !['file', 'files', 'diff', 'added', 'removed', 'changed', 'modified'].includes(w))
61
+ .slice(0, 15);
62
+ }
63
+ }
64
+ let _instance = null;
65
+ export function getPRAutoReview() {
66
+ if (!_instance)
67
+ _instance = new PRAutoReview();
68
+ return _instance;
69
+ }
70
+ export function resetPRAutoReviewForTests() {
71
+ _instance = null;
72
+ }
73
+ //# sourceMappingURL=pr-auto-review.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pr-auto-review.js","sourceRoot":"","sources":["../../src/brain/pr-auto-review.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import { PreMortemReport } from '../types.js';
2
+ export declare class PreMortem {
3
+ private brain;
4
+ private llm;
5
+ constructor();
6
+ /** Run a pre-mortem on an upcoming task. */
7
+ run(taskDescription: string, projectDir: string, opts?: {
8
+ limit?: number;
9
+ }): Promise<PreMortemReport>;
10
+ private semanticRerank;
11
+ private extractTerms;
12
+ private estimateProbability;
13
+ private mapImportanceToSeverity;
14
+ private deriveMitigation;
15
+ private scoreRisk;
16
+ private summarize;
17
+ private llmPredictions;
18
+ }
19
+ export declare function getPreMortem(): PreMortem;
20
+ export declare function resetPreMortemForTests(): void;
21
+ //# sourceMappingURL=pre-mortem.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pre-mortem.d.ts","sourceRoot":"","sources":["../../src/brain/pre-mortem.ts"],"names":[],"mappings":"AAYA,OAAO,EAEL,eAAe,EAEhB,MAAM,aAAa,CAAC;AAWrB,qBAAa,SAAS;IACpB,OAAO,CAAC,KAAK,CAAc;IAC3B,OAAO,CAAC,GAAG,CAAW;;IAOtB,4CAA4C;IACtC,GAAG,CAAC,eAAe,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,GAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAA;KAAO,GAAG,OAAO,CAAC,eAAe,CAAC;YA6DjG,cAAc;IAkB5B,OAAO,CAAC,YAAY;IASpB,OAAO,CAAC,mBAAmB;IAQ3B,OAAO,CAAC,uBAAuB;IAO/B,OAAO,CAAC,gBAAgB;IAQxB,OAAO,CAAC,SAAS;IAUjB,OAAO,CAAC,SAAS;YAQH,cAAc;CA2D7B;AAID,wBAAgB,YAAY,IAAI,SAAS,CAGxC;AAED,wBAAgB,sBAAsB,IAAI,IAAI,CAE7C"}
@@ -0,0 +1,210 @@
1
+ // src/brain/pre-mortem.ts — Pre-Mortem Assistant
2
+ // v6.0.0 — Hive Mind Edition
3
+ //
4
+ // Before any significant task, surface past failures from THIS project as a
5
+ // pre-flight checklist. Inspired by Karpathy's red-team pillar — codified as
6
+ // brain infrastructure.
7
+ //
8
+ // Query: "Adding payment processing"
9
+ // Answer: "Here are 3 ways this could fail, each with a memory citation."
10
+ import * as crypto from 'crypto';
11
+ import { getGlobalBrain, GlobalBrain } from './global-brain.js';
12
+ import { getLocalLLM } from './local-llm.js';
13
+ import { getEmbeddings } from './embeddings.js';
14
+ import { generateJson, z } from './json-output.js';
15
+ const FAILURE_CATEGORIES = new Set([
16
+ 'incident', 'bug', 'failure', 'regression', 'rollback',
17
+ 'outage', 'pitfall', 'warning', 'security',
18
+ ]);
19
+ export class PreMortem {
20
+ constructor() {
21
+ this.brain = getGlobalBrain();
22
+ this.llm = getLocalLLM();
23
+ }
24
+ /** Run a pre-mortem on an upcoming task. */
25
+ async run(taskDescription, projectDir, opts = {}) {
26
+ await this.brain.init();
27
+ const projectId = GlobalBrain.projectIdFor(projectDir);
28
+ const terms = this.extractTerms(taskDescription);
29
+ // Broad initial recall — we re-rank semantically next
30
+ const projectPool = this.brain.recall({ projectId, limit: 120 })
31
+ .filter(e => FAILURE_CATEGORIES.has(e.category.toLowerCase()));
32
+ const crossPool = this.brain.recall({ limit: 120, minImportance: 0.5 })
33
+ .filter(e => FAILURE_CATEGORIES.has(e.category.toLowerCase()) && e.projectId !== projectId);
34
+ // Semantic re-rank using embeddings for sharper failure retrieval
35
+ const pastFailures = await this.semanticRerank(taskDescription, projectPool, 10);
36
+ const crossProject = await this.semanticRerank(taskDescription, crossPool, 6);
37
+ void terms; // retained for future keyword fallback
38
+ const failures = [];
39
+ for (const entry of pastFailures.slice(0, opts.limit ?? 5)) {
40
+ failures.push({
41
+ id: `pm-${crypto.randomBytes(4).toString('hex')}`,
42
+ description: entry.content.slice(0, 220),
43
+ source: 'past-incident',
44
+ probability: this.estimateProbability(entry),
45
+ severity: this.mapImportanceToSeverity(entry.importance),
46
+ mitigation: this.deriveMitigation(entry),
47
+ relatedMemoryIds: [entry.id],
48
+ });
49
+ }
50
+ for (const entry of crossProject.slice(0, 3)) {
51
+ failures.push({
52
+ id: `pm-${crypto.randomBytes(4).toString('hex')}`,
53
+ description: `(similar project ${entry.projectName}) ${entry.content.slice(0, 180)}`,
54
+ source: 'similar-project',
55
+ probability: 0.35,
56
+ severity: this.mapImportanceToSeverity(entry.importance),
57
+ mitigation: this.deriveMitigation(entry),
58
+ relatedMemoryIds: [entry.id],
59
+ });
60
+ }
61
+ // LLM-predicted failures (best-effort, local-first)
62
+ if (failures.length < 3) {
63
+ const predicted = await this.llmPredictions(taskDescription, 3 - failures.length);
64
+ failures.push(...predicted);
65
+ }
66
+ const riskScore = this.scoreRisk(failures);
67
+ return {
68
+ taskDescription,
69
+ generatedAt: new Date(),
70
+ failures,
71
+ riskScore,
72
+ summary: this.summarize(taskDescription, failures, riskScore),
73
+ };
74
+ }
75
+ // ── Internals ─────────────────────────────────────────────────────────────
76
+ async semanticRerank(query, candidates, topK) {
77
+ if (!candidates.length)
78
+ return [];
79
+ try {
80
+ const emb = getEmbeddings();
81
+ await emb.init();
82
+ const ranked = await emb.semanticSearch(query, candidates.map(c => ({ id: c.id, text: `${c.category}: ${c.content}` })), topK);
83
+ const byId = new Map(candidates.map(c => [c.id, c]));
84
+ return ranked.map(r => byId.get(r.id)).filter((c) => !!c);
85
+ }
86
+ catch {
87
+ // Fall back to naive importance ordering
88
+ return candidates.slice(0, topK);
89
+ }
90
+ }
91
+ extractTerms(task) {
92
+ return task
93
+ .toLowerCase()
94
+ .replace(/[^a-z0-9\s-]/g, ' ')
95
+ .split(/\s+/)
96
+ .filter(w => w.length > 3)
97
+ .slice(0, 10);
98
+ }
99
+ estimateProbability(entry) {
100
+ // Heuristic: recent + high-access failures are more likely to recur
101
+ const ageDays = (Date.now() - new Date(entry.createdAt).getTime()) / (1000 * 60 * 60 * 24);
102
+ const recencyBoost = Math.max(0.2, 1 - ageDays / 180);
103
+ const accessBoost = Math.min(0.6, entry.accessCount * 0.05);
104
+ return Math.min(0.9, 0.2 + recencyBoost * 0.5 + accessBoost);
105
+ }
106
+ mapImportanceToSeverity(imp) {
107
+ if (imp >= 0.85)
108
+ return 'critical';
109
+ if (imp >= 0.7)
110
+ return 'high';
111
+ if (imp >= 0.4)
112
+ return 'medium';
113
+ return 'low';
114
+ }
115
+ deriveMitigation(entry) {
116
+ const mitigationHint = entry.metadata?.mitigation
117
+ ?? entry.metadata?.fix
118
+ ?? null;
119
+ if (mitigationHint)
120
+ return mitigationHint.slice(0, 200);
121
+ return `Review "${entry.content.slice(0, 80)}" before this task; the same pitfall happened on ${new Date(entry.createdAt).toDateString()}.`;
122
+ }
123
+ scoreRisk(failures) {
124
+ if (!failures.length)
125
+ return 0.05;
126
+ const severityWeights = { critical: 1, high: 0.7, medium: 0.4, low: 0.15 };
127
+ let score = 0;
128
+ for (const f of failures) {
129
+ score = Math.max(score, f.probability * severityWeights[f.severity]);
130
+ }
131
+ return Math.min(1, score);
132
+ }
133
+ summarize(task, failures, risk) {
134
+ if (!failures.length) {
135
+ return `No relevant past failures found for "${task.slice(0, 60)}". Proceed with standard best-practices.`;
136
+ }
137
+ const pct = Math.round(risk * 100);
138
+ return `${failures.length} failure modes surfaced (risk ${pct}%). Top: "${failures[0].description.slice(0, 120)}".`;
139
+ }
140
+ async llmPredictions(task, n) {
141
+ if (n <= 0)
142
+ return [];
143
+ // Use structured JSON output via ModelRegistry for reliability
144
+ const FailureSchema = z.object({
145
+ failures: z.array(z.object({
146
+ description: z.string().min(4).max(280),
147
+ probability: z.number().min(0).max(1),
148
+ severity: z.enum(['low', 'medium', 'high', 'critical']),
149
+ mitigation: z.string().min(4).max(260),
150
+ })).max(6),
151
+ });
152
+ try {
153
+ const result = await generateJson(`Task to pre-mortem: "${task}"\n\nList up to ${n} realistic ways this task could fail, each with severity, probability, and a one-sentence mitigation. Return JSON: {"failures": [{"description": "...", "probability": 0.0-1.0, "severity": "low|medium|high|critical", "mitigation": "..."}]}`, FailureSchema, {
154
+ system: 'You are a skeptical senior engineer running a pre-mortem. Be concrete, never generic. Output JSON only.',
155
+ featureName: 'pre-mortem',
156
+ maxTokens: 500,
157
+ fallback: { failures: [] },
158
+ });
159
+ return result.value.failures.slice(0, n).map(f => ({
160
+ id: `pm-${crypto.randomBytes(4).toString('hex')}`,
161
+ description: f.description,
162
+ source: 'llm-predicted',
163
+ probability: f.probability,
164
+ severity: f.severity,
165
+ mitigation: f.mitigation,
166
+ relatedMemoryIds: [],
167
+ }));
168
+ }
169
+ catch {
170
+ // Fall back to LocalLLM free-text parsing
171
+ try {
172
+ const prompt = `Task: ${task}\n\nList up to ${n} ways this task could realistically fail. For each give: 1) failure 2) mitigation.`;
173
+ const res = await this.llm.generate(prompt, 'You are a skeptical engineer.');
174
+ const text = res.text.trim();
175
+ if (!text)
176
+ return [];
177
+ const failures = [];
178
+ const blocks = text.split(/\n(?=\d+\.)/).slice(0, n);
179
+ for (const block of blocks) {
180
+ const clean = block.replace(/^\d+\.\s*/, '').trim();
181
+ if (!clean)
182
+ continue;
183
+ const [fail, mit = ''] = clean.split(/Mitigation[:\-]\s*|mitigation[:\-]\s*|\n/).filter(Boolean);
184
+ failures.push({
185
+ id: `pm-${crypto.randomBytes(4).toString('hex')}`,
186
+ description: (fail ?? '').slice(0, 220),
187
+ source: 'llm-predicted',
188
+ probability: 0.3, severity: 'medium',
189
+ mitigation: (mit || 'Add validation/defensive logging.').slice(0, 200),
190
+ relatedMemoryIds: [],
191
+ });
192
+ }
193
+ return failures;
194
+ }
195
+ catch {
196
+ return [];
197
+ }
198
+ }
199
+ }
200
+ }
201
+ let _instance = null;
202
+ export function getPreMortem() {
203
+ if (!_instance)
204
+ _instance = new PreMortem();
205
+ return _instance;
206
+ }
207
+ export function resetPreMortemForTests() {
208
+ _instance = null;
209
+ }
210
+ //# sourceMappingURL=pre-mortem.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pre-mortem.js","sourceRoot":"","sources":["../../src/brain/pre-mortem.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,54 @@
1
+ export interface PromptCacheEntry {
2
+ key: string;
3
+ response: any;
4
+ storedAt: number;
5
+ hits: number;
6
+ lastAccessed: number;
7
+ bytes: number;
8
+ }
9
+ export interface PromptCacheStats {
10
+ entries: number;
11
+ bytes: number;
12
+ hits: number;
13
+ misses: number;
14
+ hitRate: number;
15
+ savings: {
16
+ estimatedTokensSaved: number;
17
+ estimatedUsdSaved: number;
18
+ };
19
+ }
20
+ export declare class PromptCache {
21
+ private maxEntries;
22
+ private byteBudget;
23
+ private ttlMs;
24
+ private map;
25
+ private bytes;
26
+ private hits;
27
+ private misses;
28
+ private tokensSaved;
29
+ private usdSaved;
30
+ constructor(maxEntries?: number, byteBudget?: number, ttlMs?: number);
31
+ private keyFor;
32
+ /** Wrap a call. If cached and fresh, return cached. Otherwise call fn, store, return. */
33
+ wrap<T>(inputs: {
34
+ prompt: string;
35
+ system?: string;
36
+ model?: string;
37
+ provider?: string;
38
+ estimatedTokens?: number;
39
+ estimatedCostUsd?: number;
40
+ }, fn: () => Promise<T>): Promise<T>;
41
+ invalidate(inputs: {
42
+ prompt: string;
43
+ system?: string;
44
+ model?: string;
45
+ provider?: string;
46
+ }): boolean;
47
+ stats(): PromptCacheStats;
48
+ clear(): void;
49
+ private store;
50
+ private evictLRU;
51
+ }
52
+ export declare function getPromptCache(): PromptCache;
53
+ export declare function resetPromptCacheForTests(): void;
54
+ //# sourceMappingURL=prompt-cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt-cache.d.ts","sourceRoot":"","sources":["../../src/brain/prompt-cache.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,gBAAgB;IAC/B,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,GAAG,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE;QACP,oBAAoB,EAAE,MAAM,CAAC;QAC7B,iBAAiB,EAAE,MAAM,CAAC;KAC3B,CAAC;CACH;AAMD,qBAAa,WAAW;IASpB,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,KAAK;IAVf,OAAO,CAAC,GAAG,CAA4C;IACvD,OAAO,CAAC,KAAK,CAAK;IAClB,OAAO,CAAC,IAAI,CAAK;IACjB,OAAO,CAAC,MAAM,CAAK;IACnB,OAAO,CAAC,WAAW,CAAK;IACxB,OAAO,CAAC,QAAQ,CAAK;gBAGX,UAAU,SAAsB,EAChC,UAAU,SAAuB,EACjC,KAAK,SAAiB;IAGhC,OAAO,CAAC,MAAM;IAId,yFAAyF;IACnF,IAAI,CAAC,CAAC,EACV,MAAM,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,eAAe,CAAC,EAAE,MAAM,CAAC;QAAC,gBAAgB,CAAC,EAAE,MAAM,CAAA;KAAE,EACnI,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GACnB,OAAO,CAAC,CAAC,CAAC;IAkBb,UAAU,CAAC,MAAM,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO;IASnG,KAAK,IAAI,gBAAgB;IAYzB,KAAK,IAAI,IAAI;IAQb,OAAO,CAAC,KAAK;IAWb,OAAO,CAAC,QAAQ;CAUjB;AAGD,wBAAgB,cAAc,IAAI,WAAW,CAG5C;AACD,wBAAgB,wBAAwB,IAAI,IAAI,CAAsB"}
@@ -0,0 +1,105 @@
1
+ // src/brain/prompt-cache.ts — LRU cache for LLM responses
2
+ // v6.0.0 — Hive Mind Edition
3
+ //
4
+ // Wraps any async generate function with deterministic response caching.
5
+ // SHA-256 of (prompt + system + model) → response. Hit rate tracked for
6
+ // observability in the dashboard.
7
+ import * as crypto from 'crypto';
8
+ const DEFAULT_MAX_ENTRIES = 500;
9
+ const DEFAULT_BYTES_BUDGET = 32 * 1024 * 1024; // 32MB
10
+ const DEFAULT_TTL_MS = 60 * 60 * 1000; // 1h
11
+ export class PromptCache {
12
+ constructor(maxEntries = DEFAULT_MAX_ENTRIES, byteBudget = DEFAULT_BYTES_BUDGET, ttlMs = DEFAULT_TTL_MS) {
13
+ this.maxEntries = maxEntries;
14
+ this.byteBudget = byteBudget;
15
+ this.ttlMs = ttlMs;
16
+ this.map = new Map();
17
+ this.bytes = 0;
18
+ this.hits = 0;
19
+ this.misses = 0;
20
+ this.tokensSaved = 0;
21
+ this.usdSaved = 0;
22
+ }
23
+ keyFor(inputs) {
24
+ return crypto.createHash('sha256').update(JSON.stringify({ p: inputs.prompt, s: inputs.system ?? '', m: inputs.model ?? '', v: inputs.provider ?? '' })).digest('hex');
25
+ }
26
+ /** Wrap a call. If cached and fresh, return cached. Otherwise call fn, store, return. */
27
+ async wrap(inputs, fn) {
28
+ const key = this.keyFor(inputs);
29
+ const now = Date.now();
30
+ const hit = this.map.get(key);
31
+ if (hit && now - hit.storedAt < this.ttlMs) {
32
+ hit.hits++;
33
+ hit.lastAccessed = now;
34
+ this.hits++;
35
+ this.tokensSaved += inputs.estimatedTokens ?? 0;
36
+ this.usdSaved += inputs.estimatedCostUsd ?? 0;
37
+ return hit.response;
38
+ }
39
+ this.misses++;
40
+ const response = await fn();
41
+ this.store(key, response, now);
42
+ return response;
43
+ }
44
+ invalidate(inputs) {
45
+ const key = this.keyFor(inputs);
46
+ const hit = this.map.get(key);
47
+ if (!hit)
48
+ return false;
49
+ this.bytes -= hit.bytes;
50
+ this.map.delete(key);
51
+ return true;
52
+ }
53
+ stats() {
54
+ const total = this.hits + this.misses;
55
+ return {
56
+ entries: this.map.size,
57
+ bytes: this.bytes,
58
+ hits: this.hits,
59
+ misses: this.misses,
60
+ hitRate: total ? this.hits / total : 0,
61
+ savings: { estimatedTokensSaved: this.tokensSaved, estimatedUsdSaved: +this.usdSaved.toFixed(4) },
62
+ };
63
+ }
64
+ clear() {
65
+ this.map.clear();
66
+ this.bytes = 0;
67
+ this.hits = 0;
68
+ this.misses = 0;
69
+ this.tokensSaved = 0;
70
+ this.usdSaved = 0;
71
+ }
72
+ // ── internals ────────────────────────────────────────────────────────
73
+ store(key, value, now) {
74
+ const serialized = JSON.stringify(value);
75
+ const size = serialized.length * 2;
76
+ while ((this.map.size >= this.maxEntries || this.bytes + size > this.byteBudget) && this.map.size > 0) {
77
+ this.evictLRU();
78
+ }
79
+ const entry = { key, response: value, storedAt: now, hits: 0, lastAccessed: now, bytes: size };
80
+ this.map.set(key, entry);
81
+ this.bytes += size;
82
+ }
83
+ evictLRU() {
84
+ let oldestKey = null;
85
+ let oldestTime = Infinity;
86
+ for (const [k, v] of this.map)
87
+ if (v.lastAccessed < oldestTime) {
88
+ oldestTime = v.lastAccessed;
89
+ oldestKey = k;
90
+ }
91
+ if (oldestKey) {
92
+ const v = this.map.get(oldestKey);
93
+ this.bytes -= v.bytes;
94
+ this.map.delete(oldestKey);
95
+ }
96
+ }
97
+ }
98
+ let _instance = null;
99
+ export function getPromptCache() {
100
+ if (!_instance)
101
+ _instance = new PromptCache();
102
+ return _instance;
103
+ }
104
+ export function resetPromptCacheForTests() { _instance = null; }
105
+ //# sourceMappingURL=prompt-cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt-cache.js","sourceRoot":"","sources":["../../src/brain/prompt-cache.ts"],"names":[],"mappings":"AAAA,0DAA0D;AAC1D,6BAA6B;AAC7B,EAAE;AACF,yEAAyE;AACzE,wEAAwE;AACxE,kCAAkC;AAElC,OAAO,KAAK,MAAM,MAAM,QAAQ,CAAC;AAuBjC,MAAM,mBAAmB,GAAG,GAAG,CAAC;AAChC,MAAM,oBAAoB,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,OAAO;AACtD,MAAM,cAAc,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,KAAK;AAE5C,MAAM,OAAO,WAAW;IAQtB,YACU,aAAa,mBAAmB,EAChC,aAAa,oBAAoB,EACjC,QAAQ,cAAc;QAFtB,eAAU,GAAV,UAAU,CAAsB;QAChC,eAAU,GAAV,UAAU,CAAuB;QACjC,UAAK,GAAL,KAAK,CAAiB;QAVxB,QAAG,GAAkC,IAAI,GAAG,EAAE,CAAC;QAC/C,UAAK,GAAG,CAAC,CAAC;QACV,SAAI,GAAG,CAAC,CAAC;QACT,WAAM,GAAG,CAAC,CAAC;QACX,gBAAW,GAAG,CAAC,CAAC;QAChB,aAAQ,GAAG,CAAC,CAAC;IAMlB,CAAC;IAEI,MAAM,CAAC,MAA8E;QAC3F,OAAO,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,MAAM,CAAC,MAAM,IAAI,EAAE,EAAE,CAAC,EAAE,MAAM,CAAC,KAAK,IAAI,EAAE,EAAE,CAAC,EAAE,MAAM,CAAC,QAAQ,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACzK,CAAC;IAED,yFAAyF;IACzF,KAAK,CAAC,IAAI,CACR,MAAmI,EACnI,EAAoB;QAEpB,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAChC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC9B,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,CAAC,QAAQ,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;YAC3C,GAAG,CAAC,IAAI,EAAE,CAAC;YACX,GAAG,CAAC,YAAY,GAAG,GAAG,CAAC;YACvB,IAAI,CAAC,IAAI,EAAE,CAAC;YACZ,IAAI,CAAC,WAAW,IAAI,MAAM,CAAC,eAAe,IAAI,CAAC,CAAC;YAChD,IAAI,CAAC,QAAQ,IAAI,MAAM,CAAC,gBAAgB,IAAI,CAAC,CAAC;YAC9C,OAAO,GAAG,CAAC,QAAa,CAAC;QAC3B,CAAC;QACD,IAAI,CAAC,MAAM,EAAE,CAAC;QACd,MAAM,QAAQ,GAAG,MAAM,EAAE,EAAE,CAAC;QAC5B,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC;QAC/B,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,UAAU,CAAC,MAA8E;QACvF,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAChC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC9B,IAAI,CAAC,GAAG;YAAE,OAAO,KAAK,CAAC;QACvB,IAAI,CAAC,KAAK,IAAI,GAAG,CAAC,KAAK,CAAC;QACxB,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACrB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK;QACH,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC;QACtC,OAAO;YACL,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI;YACtB,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YACtC,OAAO,EAAE,EAAE,oBAAoB,EAAE,IAAI,CAAC,WAAW,EAAE,iBAAiB,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;SAClG,CAAC;IACJ,CAAC;IAED,KAAK;QACH,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC;QAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;QACjC,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC;QAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;QAC/B,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC;QAAC,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC;IAC1C,CAAC;IAED,wEAAwE;IAEhE,KAAK,CAAC,GAAW,EAAE,KAAU,EAAE,GAAW;QAChD,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QACzC,MAAM,IAAI,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC;QACnC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,KAAK,GAAG,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;YACtG,IAAI,CAAC,QAAQ,EAAE,CAAC;QAClB,CAAC;QACD,MAAM,KAAK,GAAqB,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,EAAE,YAAY,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;QACjH,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QACzB,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC;IACrB,CAAC;IAEO,QAAQ;QACd,IAAI,SAAS,GAAkB,IAAI,CAAC;QACpC,IAAI,UAAU,GAAG,QAAQ,CAAC;QAC1B,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG;YAAE,IAAI,CAAC,CAAC,YAAY,GAAG,UAAU,EAAE,CAAC;gBAAC,UAAU,GAAG,CAAC,CAAC,YAAY,CAAC;gBAAC,SAAS,GAAG,CAAC,CAAC;YAAC,CAAC;QAC/G,IAAI,SAAS,EAAE,CAAC;YACd,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,SAAS,CAAE,CAAC;YACnC,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC,KAAK,CAAC;YACtB,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC;CACF;AAED,IAAI,SAAS,GAAuB,IAAI,CAAC;AACzC,MAAM,UAAU,cAAc;IAC5B,IAAI,CAAC,SAAS;QAAE,SAAS,GAAG,IAAI,WAAW,EAAE,CAAC;IAC9C,OAAO,SAAS,CAAC;AACnB,CAAC;AACD,MAAM,UAAU,wBAAwB,KAAW,SAAS,GAAG,IAAI,CAAC,CAAC,CAAC"}
@@ -0,0 +1,42 @@
1
+ import { AgentDecisionReceipt, AgentTool, ReputationLedgerStats, ReputationScore } from '../types.js';
2
+ export declare class ReputationLedger {
3
+ private receipts;
4
+ private scores;
5
+ private keyPairs;
6
+ private ledgerHash;
7
+ private initialized;
8
+ init(): Promise<void>;
9
+ /** Sign and record a decision. Returns receipt with signature. */
10
+ sign(input: {
11
+ agentTool: AgentTool;
12
+ agentVersion: string;
13
+ projectId: string;
14
+ decision: string;
15
+ category: string;
16
+ confidence: number;
17
+ }): Promise<AgentDecisionReceipt>;
18
+ /** Record the outcome for a prior decision (correctness verdict). */
19
+ recordOutcome(receiptId: string, verdict: 'correct' | 'incorrect' | 'partial'): Promise<boolean>;
20
+ /** Verify a receipt's signature against its stored public key. */
21
+ verify(receipt: AgentDecisionReceipt): Promise<boolean>;
22
+ /** Get reputation for an agent (across all versions) or specific agent+version. */
23
+ getScore(agentTool: AgentTool, agentVersion?: string): ReputationScore | null;
24
+ /** Export reputation as a portable JSON suitable for sharing. */
25
+ exportPortable(): {
26
+ agents: ReputationScore[];
27
+ ledgerHash: string;
28
+ generatedAt: string;
29
+ };
30
+ /** Generate a shields.io-compatible badge line for a README. */
31
+ badge(agentTool: AgentTool, agentVersion?: string): string | null;
32
+ stats(): ReputationLedgerStats;
33
+ private ensureKeyPair;
34
+ private keyFor;
35
+ private blankScore;
36
+ private updateScoreForReceipt;
37
+ private persistScores;
38
+ private persistKeys;
39
+ }
40
+ export declare function getReputationLedger(): ReputationLedger;
41
+ export declare function resetReputationLedgerForTests(): void;
42
+ //# sourceMappingURL=reputation-ledger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reputation-ledger.d.ts","sourceRoot":"","sources":["../../src/brain/reputation-ledger.ts"],"names":[],"mappings":"AAcA,OAAO,EACL,oBAAoB,EACpB,SAAS,EACT,qBAAqB,EACrB,eAAe,EAChB,MAAM,aAAa,CAAC;AAkBrB,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAA8B;IAC9C,OAAO,CAAC,MAAM,CAA2C;IACzD,OAAO,CAAC,QAAQ,CAAqE;IACrF,OAAO,CAAC,UAAU,CAAuF;IACzG,OAAO,CAAC,WAAW,CAAS;IAEtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAkD3B,kEAAkE;IAC5D,IAAI,CAAC,KAAK,EAAE;QAChB,SAAS,EAAE,SAAS,CAAC;QACrB,YAAY,EAAE,MAAM,CAAC;QACrB,SAAS,EAAE,MAAM,CAAC;QAClB,QAAQ,EAAE,MAAM,CAAC;QACjB,QAAQ,EAAE,MAAM,CAAC;QACjB,UAAU,EAAE,MAAM,CAAC;KACpB,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAyDjC,qEAAqE;IAC/D,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,GAAG,WAAW,GAAG,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC;IAWtG,kEAAkE;IAC5D,MAAM,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,OAAO,CAAC;IA0B7D,mFAAmF;IACnF,QAAQ,CAAC,SAAS,EAAE,SAAS,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI;IA4B7E,iEAAiE;IACjE,cAAc,IAAI;QAAE,MAAM,EAAE,eAAe,EAAE,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE;IAQxF,gEAAgE;IAChE,KAAK,CAAC,SAAS,EAAE,SAAS,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IASjE,KAAK,IAAI,qBAAqB;IAoB9B,OAAO,CAAC,aAAa;IAarB,OAAO,CAAC,MAAM;IAId,OAAO,CAAC,UAAU;IAiBlB,OAAO,CAAC,qBAAqB;YA6Bf,aAAa;YAeb,WAAW;CAa1B;AAID,wBAAgB,mBAAmB,IAAI,gBAAgB,CAGtD;AAED,wBAAgB,6BAA6B,IAAI,IAAI,CAEpD"}