@theihtisham/agent-shadow-brain 6.0.0 → 6.0.3

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 (191) hide show
  1. package/CHANGELOG.md +372 -0
  2. package/README.md +366 -355
  3. package/dist/brain/auto-update.js +1 -1
  4. package/dist/brain/brain-3d.d.ts +79 -0
  5. package/dist/brain/brain-3d.d.ts.map +1 -0
  6. package/dist/brain/brain-3d.js +468 -0
  7. package/dist/brain/brain-3d.js.map +1 -0
  8. package/dist/brain/brain-active-learner.d.ts +74 -0
  9. package/dist/brain/brain-active-learner.d.ts.map +1 -0
  10. package/dist/brain/brain-active-learner.js +425 -0
  11. package/dist/brain/brain-active-learner.js.map +1 -0
  12. package/dist/brain/brain-ascii.d.ts +32 -0
  13. package/dist/brain/brain-ascii.d.ts.map +1 -0
  14. package/dist/brain/brain-ascii.js +402 -0
  15. package/dist/brain/brain-ascii.js.map +1 -0
  16. package/dist/brain/brain-cinema.d.ts +45 -0
  17. package/dist/brain/brain-cinema.d.ts.map +1 -0
  18. package/dist/brain/brain-cinema.js +393 -0
  19. package/dist/brain/brain-cinema.js.map +1 -0
  20. package/dist/brain/brain-coach.d.ts +45 -0
  21. package/dist/brain/brain-coach.d.ts.map +1 -0
  22. package/dist/brain/brain-coach.js +383 -0
  23. package/dist/brain/brain-coach.js.map +1 -0
  24. package/dist/brain/brain-consolidator.d.ts +56 -0
  25. package/dist/brain/brain-consolidator.d.ts.map +1 -0
  26. package/dist/brain/brain-consolidator.js +386 -0
  27. package/dist/brain/brain-consolidator.js.map +1 -0
  28. package/dist/brain/brain-contradictions.d.ts +57 -0
  29. package/dist/brain/brain-contradictions.d.ts.map +1 -0
  30. package/dist/brain/brain-contradictions.js +443 -0
  31. package/dist/brain/brain-contradictions.js.map +1 -0
  32. package/dist/brain/brain-diff.d.ts +61 -0
  33. package/dist/brain/brain-diff.d.ts.map +1 -0
  34. package/dist/brain/brain-diff.js +439 -0
  35. package/dist/brain/brain-diff.js.map +1 -0
  36. package/dist/brain/brain-dna.d.ts +59 -0
  37. package/dist/brain/brain-dna.d.ts.map +1 -0
  38. package/dist/brain/brain-dna.js +336 -0
  39. package/dist/brain/brain-dna.js.map +1 -0
  40. package/dist/brain/brain-doppelganger.d.ts +32 -0
  41. package/dist/brain/brain-doppelganger.d.ts.map +1 -0
  42. package/dist/brain/brain-doppelganger.js +417 -0
  43. package/dist/brain/brain-doppelganger.js.map +1 -0
  44. package/dist/brain/brain-graph-walker.d.ts +54 -0
  45. package/dist/brain/brain-graph-walker.d.ts.map +1 -0
  46. package/dist/brain/brain-graph-walker.js +412 -0
  47. package/dist/brain/brain-graph-walker.js.map +1 -0
  48. package/dist/brain/brain-holiday-card.d.ts +50 -0
  49. package/dist/brain/brain-holiday-card.d.ts.map +1 -0
  50. package/dist/brain/brain-holiday-card.js +432 -0
  51. package/dist/brain/brain-holiday-card.js.map +1 -0
  52. package/dist/brain/brain-memes.d.ts +44 -0
  53. package/dist/brain/brain-memes.d.ts.map +1 -0
  54. package/dist/brain/brain-memes.js +438 -0
  55. package/dist/brain/brain-memes.js.map +1 -0
  56. package/dist/brain/brain-memory-tiers.d.ts +67 -0
  57. package/dist/brain/brain-memory-tiers.d.ts.map +1 -0
  58. package/dist/brain/brain-memory-tiers.js +292 -0
  59. package/dist/brain/brain-memory-tiers.js.map +1 -0
  60. package/dist/brain/brain-notebook.d.ts +68 -0
  61. package/dist/brain/brain-notebook.d.ts.map +1 -0
  62. package/dist/brain/brain-notebook.js +379 -0
  63. package/dist/brain/brain-notebook.js.map +1 -0
  64. package/dist/brain/brain-portability.js +3 -3
  65. package/dist/brain/brain-portability.js.map +1 -1
  66. package/dist/brain/brain-quantize.d.ts +62 -0
  67. package/dist/brain/brain-quantize.d.ts.map +1 -0
  68. package/dist/brain/brain-quantize.js +346 -0
  69. package/dist/brain/brain-quantize.js.map +1 -0
  70. package/dist/brain/brain-query-expander.d.ts +31 -0
  71. package/dist/brain/brain-query-expander.d.ts.map +1 -0
  72. package/dist/brain/brain-query-expander.js +417 -0
  73. package/dist/brain/brain-query-expander.js.map +1 -0
  74. package/dist/brain/brain-quest.d.ts +58 -0
  75. package/dist/brain/brain-quest.d.ts.map +1 -0
  76. package/dist/brain/brain-quest.js +541 -0
  77. package/dist/brain/brain-quest.js.map +1 -0
  78. package/dist/brain/brain-recall-cache.d.ts +73 -0
  79. package/dist/brain/brain-recall-cache.d.ts.map +1 -0
  80. package/dist/brain/brain-recall-cache.js +444 -0
  81. package/dist/brain/brain-recall-cache.js.map +1 -0
  82. package/dist/brain/brain-reflex.d.ts +55 -0
  83. package/dist/brain/brain-reflex.d.ts.map +1 -0
  84. package/dist/brain/brain-reflex.js +364 -0
  85. package/dist/brain/brain-reflex.js.map +1 -0
  86. package/dist/brain/brain-replay.d.ts +74 -0
  87. package/dist/brain/brain-replay.d.ts.map +1 -0
  88. package/dist/brain/brain-replay.js +336 -0
  89. package/dist/brain/brain-replay.js.map +1 -0
  90. package/dist/brain/brain-rerank.d.ts +39 -0
  91. package/dist/brain/brain-rerank.d.ts.map +1 -0
  92. package/dist/brain/brain-rerank.js +216 -0
  93. package/dist/brain/brain-rerank.js.map +1 -0
  94. package/dist/brain/brain-roast.d.ts +44 -0
  95. package/dist/brain/brain-roast.d.ts.map +1 -0
  96. package/dist/brain/brain-roast.js +566 -0
  97. package/dist/brain/brain-roast.js.map +1 -0
  98. package/dist/brain/brain-sonification.d.ts +57 -0
  99. package/dist/brain/brain-sonification.d.ts.map +1 -0
  100. package/dist/brain/brain-sonification.js +286 -0
  101. package/dist/brain/brain-sonification.js.map +1 -0
  102. package/dist/brain/brain-tarot.d.ts +49 -0
  103. package/dist/brain/brain-tarot.d.ts.map +1 -0
  104. package/dist/brain/brain-tarot.js +634 -0
  105. package/dist/brain/brain-tarot.js.map +1 -0
  106. package/dist/brain/brain-time-capsule.d.ts +80 -0
  107. package/dist/brain/brain-time-capsule.d.ts.map +1 -0
  108. package/dist/brain/brain-time-capsule.js +289 -0
  109. package/dist/brain/brain-time-capsule.js.map +1 -0
  110. package/dist/brain/brain-trophies.d.ts +60 -0
  111. package/dist/brain/brain-trophies.d.ts.map +1 -0
  112. package/dist/brain/brain-trophies.js +431 -0
  113. package/dist/brain/brain-trophies.js.map +1 -0
  114. package/dist/brain/brain-working-memory.d.ts +78 -0
  115. package/dist/brain/brain-working-memory.d.ts.map +1 -0
  116. package/dist/brain/brain-working-memory.js +367 -0
  117. package/dist/brain/brain-working-memory.js.map +1 -0
  118. package/dist/brain/confidence-gate.d.ts +69 -0
  119. package/dist/brain/confidence-gate.d.ts.map +1 -0
  120. package/dist/brain/confidence-gate.js +244 -0
  121. package/dist/brain/confidence-gate.js.map +1 -0
  122. package/dist/brain/constitution.d.ts +59 -0
  123. package/dist/brain/constitution.d.ts.map +1 -0
  124. package/dist/brain/constitution.js +315 -0
  125. package/dist/brain/constitution.js.map +1 -0
  126. package/dist/brain/context-continuity.d.ts +78 -0
  127. package/dist/brain/context-continuity.d.ts.map +1 -0
  128. package/dist/brain/context-continuity.js +341 -0
  129. package/dist/brain/context-continuity.js.map +1 -0
  130. package/dist/brain/embeddings-v2.d.ts +58 -0
  131. package/dist/brain/embeddings-v2.d.ts.map +1 -0
  132. package/dist/brain/embeddings-v2.js +344 -0
  133. package/dist/brain/embeddings-v2.js.map +1 -0
  134. package/dist/brain/global-brain.d.ts.map +1 -1
  135. package/dist/brain/global-brain.js +35 -9
  136. package/dist/brain/global-brain.js.map +1 -1
  137. package/dist/brain/hive-voice.d.ts +71 -0
  138. package/dist/brain/hive-voice.d.ts.map +1 -0
  139. package/dist/brain/hive-voice.js +352 -0
  140. package/dist/brain/hive-voice.js.map +1 -0
  141. package/dist/brain/live-brain.d.ts +119 -0
  142. package/dist/brain/live-brain.d.ts.map +1 -0
  143. package/dist/brain/live-brain.js +405 -0
  144. package/dist/brain/live-brain.js.map +1 -0
  145. package/dist/brain/markdown-export.d.ts +48 -0
  146. package/dist/brain/markdown-export.d.ts.map +1 -0
  147. package/dist/brain/markdown-export.js +382 -0
  148. package/dist/brain/markdown-export.js.map +1 -0
  149. package/dist/brain/mcp-server.d.ts +4 -0
  150. package/dist/brain/mcp-server.d.ts.map +1 -1
  151. package/dist/brain/mcp-server.js +81 -5
  152. package/dist/brain/mcp-server.js.map +1 -1
  153. package/dist/brain/memory-seeder.d.ts +78 -0
  154. package/dist/brain/memory-seeder.d.ts.map +1 -0
  155. package/dist/brain/memory-seeder.js +326 -0
  156. package/dist/brain/memory-seeder.js.map +1 -0
  157. package/dist/brain/multimodal-vision.d.ts +38 -0
  158. package/dist/brain/multimodal-vision.d.ts.map +1 -0
  159. package/dist/brain/multimodal-vision.js +257 -0
  160. package/dist/brain/multimodal-vision.js.map +1 -0
  161. package/dist/brain/orchestrator.js +1 -1
  162. package/dist/brain/otel-lite.d.ts +71 -0
  163. package/dist/brain/otel-lite.d.ts.map +1 -0
  164. package/dist/brain/otel-lite.js +232 -0
  165. package/dist/brain/otel-lite.js.map +1 -0
  166. package/dist/brain/token-economy.d.ts +2 -0
  167. package/dist/brain/token-economy.d.ts.map +1 -1
  168. package/dist/brain/token-economy.js +80 -24
  169. package/dist/brain/token-economy.js.map +1 -1
  170. package/dist/cli.js +1120 -32
  171. package/dist/cli.js.map +1 -1
  172. package/dist/dashboard/server.d.ts +5 -0
  173. package/dist/dashboard/server.d.ts.map +1 -1
  174. package/dist/dashboard/server.js +355 -2
  175. package/dist/dashboard/server.js.map +1 -1
  176. package/dist/dashboard/v6-dashboard-html.d.ts +1 -1
  177. package/dist/dashboard/v6-dashboard-html.d.ts.map +1 -1
  178. package/dist/dashboard/v6-dashboard-html.js +755 -85
  179. package/dist/dashboard/v6-dashboard-html.js.map +1 -1
  180. package/dist/index.d.ts +4 -0
  181. package/dist/index.d.ts.map +1 -1
  182. package/dist/index.js +4 -0
  183. package/dist/index.js.map +1 -1
  184. package/dist/types.d.ts +17 -12
  185. package/dist/types.d.ts.map +1 -1
  186. package/docs/launch/README.md +61 -0
  187. package/docs/launch/RELEASE_CHECKLIST_v6.0.3.md +102 -0
  188. package/docs/launch/RELEASE_NOTES_v6.0.3.md +111 -0
  189. package/package.json +25 -13
  190. package/tools/export-resume-pack.mjs +56 -0
  191. package/tools/record-global-memory.mjs +72 -0
@@ -0,0 +1,244 @@
1
+ // src/brain/confidence-gate.ts — Active output filter for confidence-tagged results
2
+ // v6.0.2 — Hive Mind Edition
3
+ //
4
+ // CalibrationMonitor is passive: it watches claims roll past and scores them.
5
+ // This module is the active half: given a `{text, confidence}` result, it
6
+ // can block it, downgrade its tone, or flag it with a warning — depending on
7
+ // the gate mode chosen by the caller.
8
+ //
9
+ // Why three modes? Different callers want different ergonomics:
10
+ // - block: hard gate for tool calls / autonomous agents that must not
11
+ // act on shaky info.
12
+ // - downgrade: chat surfaces, where we still want to say something but
13
+ // visibly hedge so the user doesn't trust it blindly.
14
+ // - flag: observability layer that lets downstream logic decide.
15
+ //
16
+ // Calibration history (predicted → outcome) is logged as JSONL so the
17
+ // reliability of `confidence` itself is auditable. Brier score + ECE on
18
+ // .stats() lets us tell whether the gate threshold is well-chosen.
19
+ //
20
+ // Exposed: ConfidenceGate, getConfidenceGate(), resetConfidenceGateForTests().
21
+ // .gate(result, opts)
22
+ // .recordOutcome(predicted, wasCorrect, meta?)
23
+ // .stats()
24
+ // .setThreshold(t), .getThreshold()
25
+ import * as fs from 'fs';
26
+ import * as path from 'path';
27
+ import * as os from 'os';
28
+ const HOME_DIR = path.join(os.homedir(), '.shadow-brain');
29
+ const HISTORY_PATH = path.join(HOME_DIR, 'calibration-history.jsonl');
30
+ const CONFIG_PATH = path.join(HOME_DIR, 'config.json');
31
+ const DEFAULT_THRESHOLD = 0.6;
32
+ const ECE_BUCKETS = 10;
33
+ export class ConfidenceGate {
34
+ constructor() {
35
+ this.threshold = DEFAULT_THRESHOLD;
36
+ this.historyCache = null;
37
+ this.initialized = false;
38
+ }
39
+ async init() {
40
+ if (this.initialized)
41
+ return;
42
+ fs.mkdirSync(HOME_DIR, { recursive: true });
43
+ this.threshold = this.readConfiguredThreshold();
44
+ this.initialized = true;
45
+ }
46
+ /** Apply the gate. Synchronous because the threshold is already loaded. */
47
+ gate(result, opts) {
48
+ if (!this.initialized)
49
+ this.threshold = this.readConfiguredThreshold();
50
+ const threshold = opts.threshold ?? this.threshold;
51
+ const predicted = clamp(result.confidence, 0, 1);
52
+ if (predicted >= threshold) {
53
+ return {
54
+ blocked: false,
55
+ result,
56
+ mode: opts.mode,
57
+ predicted,
58
+ threshold,
59
+ downgraded: false,
60
+ };
61
+ }
62
+ switch (opts.mode) {
63
+ case 'block':
64
+ return {
65
+ blocked: true,
66
+ reason: `Confidence ${(predicted * 100).toFixed(0)}% below threshold ${(threshold * 100).toFixed(0)}%`,
67
+ predicted,
68
+ threshold,
69
+ };
70
+ case 'downgrade': {
71
+ const hedged = {
72
+ ...result,
73
+ text: hedge(result.text, predicted, opts.hedgeHint),
74
+ _warning: `low-confidence (${(predicted * 100).toFixed(0)}%)`,
75
+ };
76
+ return { blocked: false, result: hedged, mode: 'downgrade', predicted, threshold, downgraded: true };
77
+ }
78
+ case 'flag':
79
+ default:
80
+ return {
81
+ blocked: false,
82
+ result: { ...result, _warning: `low-confidence (${(predicted * 100).toFixed(0)}%)` },
83
+ mode: 'flag',
84
+ predicted,
85
+ threshold,
86
+ downgraded: false,
87
+ };
88
+ }
89
+ }
90
+ /** Record what actually happened so we can compute calibration stats later. */
91
+ async recordOutcome(predicted, wasCorrect, meta) {
92
+ await this.init();
93
+ const entry = {
94
+ ts: new Date().toISOString(),
95
+ predicted: clamp(predicted, 0, 1),
96
+ wasCorrect: wasCorrect === 'partial' ? 0.5 : wasCorrect ? 1 : 0,
97
+ meta,
98
+ };
99
+ try {
100
+ fs.appendFileSync(HISTORY_PATH, JSON.stringify(entry) + '\n');
101
+ }
102
+ catch { /* non-fatal */ }
103
+ if (this.historyCache)
104
+ this.historyCache.push(entry);
105
+ }
106
+ /** Brier + ECE over all recorded outcomes. */
107
+ async stats() {
108
+ await this.init();
109
+ const entries = this.loadHistory();
110
+ if (!entries.length) {
111
+ return {
112
+ sampleSize: 0,
113
+ brierScore: 0,
114
+ expectedCalibrationError: 0,
115
+ bucketBreakdown: [],
116
+ threshold: this.threshold,
117
+ };
118
+ }
119
+ let brierSum = 0;
120
+ for (const e of entries) {
121
+ const d = e.predicted - e.wasCorrect;
122
+ brierSum += d * d;
123
+ }
124
+ const brier = brierSum / entries.length;
125
+ const buckets = [];
126
+ for (let i = 0; i < ECE_BUCKETS; i++) {
127
+ const lo = i / ECE_BUCKETS;
128
+ const hi = (i + 1) / ECE_BUCKETS;
129
+ const inBucket = entries.filter(e => e.predicted >= lo && (i === ECE_BUCKETS - 1 ? e.predicted <= hi : e.predicted < hi));
130
+ if (!inBucket.length)
131
+ continue;
132
+ const meanPredicted = avg(inBucket.map(e => e.predicted));
133
+ const meanOutcome = avg(inBucket.map(e => e.wasCorrect));
134
+ buckets.push({
135
+ bucket: `${lo.toFixed(1)}-${hi.toFixed(1)}`,
136
+ samples: inBucket.length,
137
+ meanPredicted: +meanPredicted.toFixed(3),
138
+ meanOutcome: +meanOutcome.toFixed(3),
139
+ gap: +Math.abs(meanPredicted - meanOutcome).toFixed(3),
140
+ });
141
+ }
142
+ const ece = buckets.reduce((s, b) => s + (b.samples / entries.length) * b.gap, 0);
143
+ return {
144
+ sampleSize: entries.length,
145
+ brierScore: +brier.toFixed(4),
146
+ expectedCalibrationError: +ece.toFixed(4),
147
+ bucketBreakdown: buckets,
148
+ threshold: this.threshold,
149
+ };
150
+ }
151
+ setThreshold(t) {
152
+ this.threshold = clamp(t, 0, 1);
153
+ this.writeConfiguredThreshold(this.threshold);
154
+ }
155
+ getThreshold() { return this.threshold; }
156
+ /** Convenience wrapper for promise-returning functions. */
157
+ async wrap(fn, opts) {
158
+ await this.init();
159
+ const result = await fn();
160
+ return this.gate(result, opts);
161
+ }
162
+ // -- Internals -----------------------------------------------------------
163
+ loadHistory() {
164
+ if (this.historyCache)
165
+ return this.historyCache;
166
+ if (!fs.existsSync(HISTORY_PATH)) {
167
+ this.historyCache = [];
168
+ return this.historyCache;
169
+ }
170
+ const out = [];
171
+ try {
172
+ const lines = fs.readFileSync(HISTORY_PATH, 'utf-8').split('\n');
173
+ for (const line of lines) {
174
+ if (!line.trim())
175
+ continue;
176
+ try {
177
+ out.push(JSON.parse(line));
178
+ }
179
+ catch { /* skip malformed */ }
180
+ }
181
+ }
182
+ catch { /* fall through with empty cache */ }
183
+ this.historyCache = out;
184
+ return out;
185
+ }
186
+ readConfiguredThreshold() {
187
+ try {
188
+ if (!fs.existsSync(CONFIG_PATH))
189
+ return DEFAULT_THRESHOLD;
190
+ const cfg = JSON.parse(fs.readFileSync(CONFIG_PATH, 'utf-8'));
191
+ const raw = cfg.confidenceGate;
192
+ if (typeof raw === 'number')
193
+ return clamp(raw, 0, 1);
194
+ if (raw && typeof raw === 'object' && typeof raw.threshold === 'number')
195
+ return clamp(raw.threshold, 0, 1);
196
+ return DEFAULT_THRESHOLD;
197
+ }
198
+ catch {
199
+ return DEFAULT_THRESHOLD;
200
+ }
201
+ }
202
+ writeConfiguredThreshold(t) {
203
+ try {
204
+ let cfg = {};
205
+ if (fs.existsSync(CONFIG_PATH)) {
206
+ try {
207
+ cfg = JSON.parse(fs.readFileSync(CONFIG_PATH, 'utf-8'));
208
+ }
209
+ catch {
210
+ cfg = {};
211
+ }
212
+ }
213
+ cfg.confidenceGate = t;
214
+ fs.writeFileSync(CONFIG_PATH, JSON.stringify(cfg, null, 2));
215
+ }
216
+ catch { /* non-fatal */ }
217
+ }
218
+ }
219
+ function hedge(text, confidence, hint) {
220
+ const pct = Math.round(confidence * 100);
221
+ const verifyTarget = hint || 'the key claims';
222
+ return `I'm only ${pct}% confident — verify ${verifyTarget} first:\n\n${text}`;
223
+ }
224
+ function clamp(x, lo, hi) {
225
+ if (Number.isNaN(x))
226
+ return lo;
227
+ return x < lo ? lo : x > hi ? hi : x;
228
+ }
229
+ function avg(xs) {
230
+ if (!xs.length)
231
+ return 0;
232
+ let s = 0;
233
+ for (const x of xs)
234
+ s += x;
235
+ return s / xs.length;
236
+ }
237
+ let _instance = null;
238
+ export function getConfidenceGate() {
239
+ if (!_instance)
240
+ _instance = new ConfidenceGate();
241
+ return _instance;
242
+ }
243
+ export function resetConfidenceGateForTests() { _instance = null; }
244
+ //# sourceMappingURL=confidence-gate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"confidence-gate.js","sourceRoot":"","sources":["../../src/brain/confidence-gate.ts"],"names":[],"mappings":"AAAA,oFAAoF;AACpF,6BAA6B;AAC7B,EAAE;AACF,8EAA8E;AAC9E,0EAA0E;AAC1E,6EAA6E;AAC7E,sCAAsC;AACtC,EAAE;AACF,gEAAgE;AAChE,4EAA4E;AAC5E,oCAAoC;AACpC,yEAAyE;AACzE,qEAAqE;AACrE,uEAAuE;AACvE,EAAE;AACF,sEAAsE;AACtE,wEAAwE;AACxE,mEAAmE;AACnE,EAAE;AACF,+EAA+E;AAC/E,wBAAwB;AACxB,iDAAiD;AACjD,aAAa;AACb,sCAAsC;AAEtC,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AAiDzB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,eAAe,CAAC,CAAC;AAC1D,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,2BAA2B,CAAC,CAAC;AACtE,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;AACvD,MAAM,iBAAiB,GAAG,GAAG,CAAC;AAC9B,MAAM,WAAW,GAAG,EAAE,CAAC;AAEvB,MAAM,OAAO,cAAc;IAA3B;QACU,cAAS,GAAW,iBAAiB,CAAC;QACtC,iBAAY,GAA8B,IAAI,CAAC;QAC/C,gBAAW,GAAG,KAAK,CAAC;IA6K9B,CAAC;IA3KC,KAAK,CAAC,IAAI;QACR,IAAI,IAAI,CAAC,WAAW;YAAE,OAAO;QAC7B,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC5C,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,uBAAuB,EAAE,CAAC;QAChD,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;IAC1B,CAAC;IAED,2EAA2E;IAC3E,IAAI,CAAuB,MAAS,EAAE,IAAc;QAClD,IAAI,CAAC,IAAI,CAAC,WAAW;YAAE,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,uBAAuB,EAAE,CAAC;QACvE,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,SAAS,CAAC;QACnD,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAEjD,IAAI,SAAS,IAAI,SAAS,EAAE,CAAC;YAC3B,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,MAAM;gBACN,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,SAAS;gBACT,SAAS;gBACT,UAAU,EAAE,KAAK;aAClB,CAAC;QACJ,CAAC;QAED,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;YAClB,KAAK,OAAO;gBACV,OAAO;oBACL,OAAO,EAAE,IAAI;oBACb,MAAM,EAAE,cAAc,CAAC,SAAS,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,qBAAqB,CAAC,SAAS,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG;oBACtG,SAAS;oBACT,SAAS;iBACV,CAAC;YACJ,KAAK,WAAW,CAAC,CAAC,CAAC;gBACjB,MAAM,MAAM,GAA8B;oBACxC,GAAG,MAAM;oBACT,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC;oBACnD,QAAQ,EAAE,mBAAmB,CAAC,SAAS,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI;iBAC9D,CAAC;gBACF,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;YACvG,CAAC;YACD,KAAK,MAAM,CAAC;YACZ;gBACE,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,MAAM,EAAE,EAAE,GAAG,MAAM,EAAE,QAAQ,EAAE,mBAAmB,CAAC,SAAS,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE;oBACpF,IAAI,EAAE,MAAM;oBACZ,SAAS;oBACT,SAAS;oBACT,UAAU,EAAE,KAAK;iBAClB,CAAC;QACN,CAAC;IACH,CAAC;IAED,+EAA+E;IAC/E,KAAK,CAAC,aAAa,CAAC,SAAiB,EAAE,UAA+B,EAAE,IAA8B;QACpG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAClB,MAAM,KAAK,GAAqB;YAC9B,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YAC5B,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,CAAC,EAAE,CAAC,CAAC;YACjC,UAAU,EAAE,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC/D,IAAI;SACL,CAAC;QACF,IAAI,CAAC;YAAC,EAAE,CAAC,cAAc,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC;QAAC,CAAC;QACtE,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC;QACzB,IAAI,IAAI,CAAC,YAAY;YAAE,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACvD,CAAC;IAED,8CAA8C;IAC9C,KAAK,CAAC,KAAK;QACT,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAClB,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QACnC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;YACpB,OAAO;gBACL,UAAU,EAAE,CAAC;gBACb,UAAU,EAAE,CAAC;gBACb,wBAAwB,EAAE,CAAC;gBAC3B,eAAe,EAAE,EAAE;gBACnB,SAAS,EAAE,IAAI,CAAC,SAAS;aAC1B,CAAC;QACJ,CAAC;QAED,IAAI,QAAQ,GAAG,CAAC,CAAC;QACjB,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;YACxB,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,UAAU,CAAC;YACrC,QAAQ,IAAI,CAAC,GAAG,CAAC,CAAC;QACpB,CAAC;QACD,MAAM,KAAK,GAAG,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC;QAExC,MAAM,OAAO,GAAwG,EAAE,CAAC;QACxH,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,EAAE,CAAC,EAAE,EAAE,CAAC;YACrC,MAAM,EAAE,GAAG,CAAC,GAAG,WAAW,CAAC;YAC3B,MAAM,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,WAAW,CAAC;YACjC,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,IAAI,EAAE,IAAI,CAAC,CAAC,KAAK,WAAW,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,GAAG,EAAE,CAAC,CAAC,CAAC;YAC1H,IAAI,CAAC,QAAQ,CAAC,MAAM;gBAAE,SAAS;YAC/B,MAAM,aAAa,GAAG,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;YAC1D,MAAM,WAAW,GAAG,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC;YACzD,OAAO,CAAC,IAAI,CAAC;gBACX,MAAM,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;gBAC3C,OAAO,EAAE,QAAQ,CAAC,MAAM;gBACxB,aAAa,EAAE,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC;gBACxC,WAAW,EAAE,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC;gBACpC,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,aAAa,GAAG,WAAW,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;aACvD,CAAC,CAAC;QACL,CAAC;QACD,MAAM,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QAElF,OAAO;YACL,UAAU,EAAE,OAAO,CAAC,MAAM;YAC1B,UAAU,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;YAC7B,wBAAwB,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;YACzC,eAAe,EAAE,OAAO;YACxB,SAAS,EAAE,IAAI,CAAC,SAAS;SAC1B,CAAC;IACJ,CAAC;IAED,YAAY,CAAC,CAAS;QACpB,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAChC,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAChD,CAAC;IAED,YAAY,KAAa,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;IAEjD,2DAA2D;IAC3D,KAAK,CAAC,IAAI,CACR,EAAoB,EACpB,IAAc;QAEd,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAClB,MAAM,MAAM,GAAG,MAAM,EAAE,EAAE,CAAC;QAC1B,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IACjC,CAAC;IAED,2EAA2E;IAEnE,WAAW;QACjB,IAAI,IAAI,CAAC,YAAY;YAAE,OAAO,IAAI,CAAC,YAAY,CAAC;QAChD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;YAAC,IAAI,CAAC,YAAY,GAAG,EAAE,CAAC;YAAC,OAAO,IAAI,CAAC,YAAY,CAAC;QAAC,CAAC;QACvF,MAAM,GAAG,GAAuB,EAAE,CAAC;QACnC,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,EAAE,CAAC,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACjE,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;oBAAE,SAAS;gBAC3B,IAAI,CAAC;oBAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAqB,CAAC,CAAC;gBAAC,CAAC;gBAAC,MAAM,CAAC,CAAC,oBAAoB,CAAC,CAAC;YACxF,CAAC;QACH,CAAC;QAAC,MAAM,CAAC,CAAC,mCAAmC,CAAC,CAAC;QAC/C,IAAI,CAAC,YAAY,GAAG,GAAG,CAAC;QACxB,OAAO,GAAG,CAAC;IACb,CAAC;IAEO,uBAAuB;QAC7B,IAAI,CAAC;YACH,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC;gBAAE,OAAO,iBAAiB,CAAC;YAC1D,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAyD,CAAC;YACtH,MAAM,GAAG,GAAG,GAAG,CAAC,cAAc,CAAC;YAC/B,IAAI,OAAO,GAAG,KAAK,QAAQ;gBAAE,OAAO,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;YACrD,IAAI,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,OAAO,GAAG,CAAC,SAAS,KAAK,QAAQ;gBAAE,OAAO,KAAK,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;YAC3G,OAAO,iBAAiB,CAAC;QAC3B,CAAC;QAAC,MAAM,CAAC;YAAC,OAAO,iBAAiB,CAAC;QAAC,CAAC;IACvC,CAAC;IAEO,wBAAwB,CAAC,CAAS;QACxC,IAAI,CAAC;YACH,IAAI,GAAG,GAA4B,EAAE,CAAC;YACtC,IAAI,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;gBAC/B,IAAI,CAAC;oBAAC,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAA4B,CAAC;gBAAC,CAAC;gBAC3F,MAAM,CAAC;oBAAC,GAAG,GAAG,EAAE,CAAC;gBAAC,CAAC;YACrB,CAAC;YACD,GAAG,CAAC,cAAc,GAAG,CAAC,CAAC;YACvB,EAAE,CAAC,aAAa,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC9D,CAAC;QAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC;IAC7B,CAAC;CACF;AAED,SAAS,KAAK,CAAC,IAAY,EAAE,UAAkB,EAAE,IAAa;IAC5D,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG,GAAG,CAAC,CAAC;IACzC,MAAM,YAAY,GAAG,IAAI,IAAI,gBAAgB,CAAC;IAC9C,OAAO,YAAY,GAAG,wBAAwB,YAAY,cAAc,IAAI,EAAE,CAAC;AACjF,CAAC;AAED,SAAS,KAAK,CAAC,CAAS,EAAE,EAAU,EAAE,EAAU;IAC9C,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QAAE,OAAO,EAAE,CAAC;IAC/B,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;AACvC,CAAC;AAED,SAAS,GAAG,CAAC,EAAY;IACvB,IAAI,CAAC,EAAE,CAAC,MAAM;QAAE,OAAO,CAAC,CAAC;IACzB,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,KAAK,MAAM,CAAC,IAAI,EAAE;QAAE,CAAC,IAAI,CAAC,CAAC;IAC3B,OAAO,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC;AACvB,CAAC;AAED,IAAI,SAAS,GAA0B,IAAI,CAAC;AAC5C,MAAM,UAAU,iBAAiB;IAC/B,IAAI,CAAC,SAAS;QAAE,SAAS,GAAG,IAAI,cAAc,EAAE,CAAC;IACjD,OAAO,SAAS,CAAC;AACnB,CAAC;AACD,MAAM,UAAU,2BAA2B,KAAW,SAAS,GAAG,IAAI,CAAC,CAAC,CAAC"}
@@ -0,0 +1,59 @@
1
+ export type RuleSeverity = 'must' | 'should' | 'never';
2
+ export type RuleScope = 'all' | 'code' | 'commits' | 'tests';
3
+ export interface ConstitutionRule {
4
+ id: string;
5
+ severity: RuleSeverity;
6
+ scope: RuleScope;
7
+ title: string;
8
+ text: string;
9
+ keywords: string[];
10
+ source: 'file' | 'proposed' | 'approved';
11
+ }
12
+ export interface Violation {
13
+ rule: ConstitutionRule;
14
+ confidence: number;
15
+ evidence: string;
16
+ }
17
+ export interface ValidateResult {
18
+ violations: Violation[];
19
+ passed: ConstitutionRule[];
20
+ }
21
+ interface InjectOpts {
22
+ scope?: RuleScope;
23
+ maxRules?: number;
24
+ }
25
+ export declare class Constitution {
26
+ private rules;
27
+ private approved;
28
+ private projectRoot;
29
+ private watcher;
30
+ private initialized;
31
+ private embeddings;
32
+ private vectorCache;
33
+ constructor(projectRoot?: string);
34
+ init(): Promise<void>;
35
+ /** Prepend the most relevant constitution rules to a prompt as a preamble. */
36
+ injectInto(prompt: string, opts?: InjectOpts): string;
37
+ /**
38
+ * Score `text` against every rule. Uses both keyword matching (fast, precise)
39
+ * and semantic similarity (slower, fuzzy). Reports a confidence in [0,1].
40
+ */
41
+ validate(text: string): Promise<ValidateResult>;
42
+ /** Build a candidate rule from an observed pattern. Template-only, no LLM. */
43
+ proposeRule(observation: string): ConstitutionRule;
44
+ /** Persist a user-approved rule to constitution-approved.json. */
45
+ approve(rule: ConstitutionRule): Promise<ConstitutionRule>;
46
+ listRules(): ConstitutionRule[];
47
+ dispose(): void;
48
+ private allRules;
49
+ private loadFromDisk;
50
+ private startWatcher;
51
+ private cachedEmbed;
52
+ private extractEvidence;
53
+ private logViolation;
54
+ }
55
+ export declare function parseConstitutionMarkdown(md: string): ConstitutionRule[];
56
+ export declare function getConstitution(projectRoot?: string): Constitution;
57
+ export declare function resetConstitutionForTests(): void;
58
+ export {};
59
+ //# sourceMappingURL=constitution.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constitution.d.ts","sourceRoot":"","sources":["../../src/brain/constitution.ts"],"names":[],"mappings":"AAkCA,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,QAAQ,GAAG,OAAO,CAAC;AACvD,MAAM,MAAM,SAAS,GAAG,KAAK,GAAG,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC;AAE7D,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,YAAY,CAAC;IACvB,KAAK,EAAE,SAAS,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,MAAM,EAAE,MAAM,GAAG,UAAU,GAAG,UAAU,CAAC;CAC1C;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,gBAAgB,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,SAAS,EAAE,CAAC;IACxB,MAAM,EAAE,gBAAgB,EAAE,CAAC;CAC5B;AAED,UAAU,UAAU;IAClB,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAQD,qBAAa,YAAY;IACvB,OAAO,CAAC,KAAK,CAA0B;IACvC,OAAO,CAAC,QAAQ,CAA0B;IAC1C,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,OAAO,CAA6B;IAC5C,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,UAAU,CAAmB;IACrC,OAAO,CAAC,WAAW,CAAoC;gBAE3C,WAAW,GAAE,MAAsB;IAIzC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAQ3B,8EAA8E;IAC9E,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,GAAE,UAAe,GAAG,MAAM;IAgBzD;;;OAGG;IACG,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAgCrD,8EAA8E;IAC9E,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,gBAAgB;IAgBlD,kEAAkE;IAC5D,OAAO,CAAC,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAUhE,SAAS,IAAI,gBAAgB,EAAE;IAE/B,OAAO,IAAI,IAAI;IAMf,OAAO,CAAC,QAAQ;IAEhB,OAAO,CAAC,YAAY;IAkBpB,OAAO,CAAC,YAAY;YAcN,WAAW;IAQzB,OAAO,CAAC,eAAe;IAavB,OAAO,CAAC,YAAY;CAarB;AAID,wBAAgB,yBAAyB,CAAC,EAAE,EAAE,MAAM,GAAG,gBAAgB,EAAE,CAkCxE;AA2CD,wBAAgB,eAAe,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,YAAY,CAGlE;AACD,wBAAgB,yBAAyB,IAAI,IAAI,CAGhD"}
@@ -0,0 +1,315 @@
1
+ // src/brain/constitution.ts — Project invariants ("constitution") layer
2
+ // v6.0.2 — Hive Mind Edition
3
+ //
4
+ // Reads <project_root>/.shadow-brain/constitution.md, parses Markdown rules
5
+ // under `## Rule N` headings, and exposes them to other parts of the brain
6
+ // for prompt injection and post-hoc validation.
7
+ //
8
+ // Each rule is one of:
9
+ // - must : hard requirement, violations always flagged
10
+ // - should : strong preference, flagged with lower confidence
11
+ // - never : prohibition, treated like must but inverted
12
+ //
13
+ // Rule format inside constitution.md:
14
+ //
15
+ // ## Rule 1: short title
16
+ // severity: must|should|never
17
+ // scope: all|code|commits|tests
18
+ // No secrets in commits. Use env vars only.
19
+ //
20
+ // Why no LLM call in proposeRule? The point is to draft a rule the user can
21
+ // review and edit; an LLM round-trip would slow that loop. The template-based
22
+ // proposer is "good enough" — humans confirm before persisting.
23
+ //
24
+ // Exposed: Constitution, getConstitution(), resetConstitutionForTests().
25
+ // .injectInto(prompt, opts)
26
+ // .validate(text)
27
+ // .proposeRule(observation)
28
+ // .approve(rule), .listRules()
29
+ import * as fs from 'fs';
30
+ import * as path from 'path';
31
+ import * as os from 'os';
32
+ import { getEmbeddings } from './embeddings.js';
33
+ const HOME_DIR = path.join(os.homedir(), '.shadow-brain');
34
+ const VIOLATIONS_LOG = path.join(HOME_DIR, 'constitution-violations.jsonl');
35
+ const PROJECT_REL_PATH = path.join('.shadow-brain', 'constitution.md');
36
+ const APPROVED_REL_PATH = path.join('.shadow-brain', 'constitution-approved.json');
37
+ const DEFAULT_MAX_RULES = 6;
38
+ export class Constitution {
39
+ constructor(projectRoot = process.cwd()) {
40
+ this.rules = [];
41
+ this.approved = [];
42
+ this.watcher = null;
43
+ this.initialized = false;
44
+ this.embeddings = getEmbeddings();
45
+ this.vectorCache = new Map();
46
+ this.projectRoot = projectRoot;
47
+ }
48
+ async init() {
49
+ if (this.initialized)
50
+ return;
51
+ fs.mkdirSync(HOME_DIR, { recursive: true });
52
+ this.loadFromDisk();
53
+ this.startWatcher();
54
+ this.initialized = true;
55
+ }
56
+ /** Prepend the most relevant constitution rules to a prompt as a preamble. */
57
+ injectInto(prompt, opts = {}) {
58
+ const scope = opts.scope ?? 'all';
59
+ const max = opts.maxRules ?? DEFAULT_MAX_RULES;
60
+ const relevant = this.allRules()
61
+ .filter(r => r.scope === 'all' || r.scope === scope)
62
+ .slice(0, max);
63
+ if (!relevant.length)
64
+ return prompt;
65
+ const preamble = [
66
+ '## Project Constitution (binding rules)',
67
+ ...relevant.map((r, i) => `${i + 1}. [${r.severity.toUpperCase()}] ${r.title} — ${r.text}`),
68
+ '',
69
+ '## Task',
70
+ ].join('\n');
71
+ return `${preamble}\n${prompt}`;
72
+ }
73
+ /**
74
+ * Score `text` against every rule. Uses both keyword matching (fast, precise)
75
+ * and semantic similarity (slower, fuzzy). Reports a confidence in [0,1].
76
+ */
77
+ async validate(text) {
78
+ await this.init();
79
+ const violations = [];
80
+ const passed = [];
81
+ const haystack = text.toLowerCase();
82
+ for (const rule of this.allRules()) {
83
+ const keywordHit = rule.keywords.some(k => haystack.includes(k));
84
+ let semanticScore = 0;
85
+ try {
86
+ const q = await this.embeddings.embed(text.slice(0, 4000));
87
+ const r = await this.cachedEmbed(rule.text);
88
+ semanticScore = cosine(q, r);
89
+ }
90
+ catch { /* embeddings optional */ }
91
+ const triggers = rule.severity === 'never'
92
+ ? keywordHit || semanticScore > 0.55
93
+ : keywordHit && semanticScore > 0.35;
94
+ if (triggers) {
95
+ const confidence = clamp(0.4 * (keywordHit ? 1 : 0) + 0.6 * semanticScore, 0, 1);
96
+ const evidence = this.extractEvidence(text, rule.keywords);
97
+ violations.push({ rule, confidence: +confidence.toFixed(3), evidence });
98
+ this.logViolation(rule, confidence, evidence);
99
+ }
100
+ else {
101
+ passed.push(rule);
102
+ }
103
+ }
104
+ return { violations, passed };
105
+ }
106
+ /** Build a candidate rule from an observed pattern. Template-only, no LLM. */
107
+ proposeRule(observation) {
108
+ const trimmed = observation.trim().slice(0, 600);
109
+ const severity = guessSeverity(trimmed);
110
+ const scope = guessScope(trimmed);
111
+ const title = trimmed.split(/[.\n]/)[0].slice(0, 80) || 'Untitled rule';
112
+ return {
113
+ id: `proposed-${Date.now().toString(36)}`,
114
+ severity,
115
+ scope,
116
+ title,
117
+ text: trimmed,
118
+ keywords: extractKeywords(trimmed),
119
+ source: 'proposed',
120
+ };
121
+ }
122
+ /** Persist a user-approved rule to constitution-approved.json. */
123
+ async approve(rule) {
124
+ const approved = { ...rule, source: 'approved' };
125
+ this.approved.push(approved);
126
+ const dir = path.join(this.projectRoot, '.shadow-brain');
127
+ fs.mkdirSync(dir, { recursive: true });
128
+ const file = path.join(this.projectRoot, APPROVED_REL_PATH);
129
+ fs.writeFileSync(file, JSON.stringify(this.approved, null, 2));
130
+ return approved;
131
+ }
132
+ listRules() { return this.allRules(); }
133
+ dispose() {
134
+ if (this.watcher) {
135
+ this.watcher.close();
136
+ this.watcher = null;
137
+ }
138
+ }
139
+ // -- Internals -----------------------------------------------------------
140
+ allRules() { return [...this.rules, ...this.approved]; }
141
+ loadFromDisk() {
142
+ const file = path.join(this.projectRoot, PROJECT_REL_PATH);
143
+ if (fs.existsSync(file)) {
144
+ try {
145
+ this.rules = parseConstitutionMarkdown(fs.readFileSync(file, 'utf-8'));
146
+ }
147
+ catch {
148
+ this.rules = [];
149
+ }
150
+ }
151
+ else {
152
+ this.rules = [];
153
+ }
154
+ const approvedFile = path.join(this.projectRoot, APPROVED_REL_PATH);
155
+ if (fs.existsSync(approvedFile)) {
156
+ try {
157
+ this.approved = JSON.parse(fs.readFileSync(approvedFile, 'utf-8'));
158
+ }
159
+ catch {
160
+ this.approved = [];
161
+ }
162
+ }
163
+ else {
164
+ this.approved = [];
165
+ }
166
+ this.vectorCache.clear();
167
+ }
168
+ startWatcher() {
169
+ const dir = path.join(this.projectRoot, '.shadow-brain');
170
+ if (!fs.existsSync(dir))
171
+ return;
172
+ try {
173
+ this.watcher = fs.watch(dir, { persistent: false }, (_event, filename) => {
174
+ if (!filename)
175
+ return;
176
+ if (filename.toString().endsWith('constitution.md') ||
177
+ filename.toString().endsWith('constitution-approved.json')) {
178
+ this.loadFromDisk();
179
+ }
180
+ });
181
+ }
182
+ catch { /* watcher not critical */ }
183
+ }
184
+ async cachedEmbed(text) {
185
+ const cached = this.vectorCache.get(text);
186
+ if (cached)
187
+ return cached;
188
+ const v = await this.embeddings.embed(text);
189
+ this.vectorCache.set(text, v);
190
+ return v;
191
+ }
192
+ extractEvidence(text, keywords) {
193
+ const lower = text.toLowerCase();
194
+ for (const k of keywords) {
195
+ const idx = lower.indexOf(k);
196
+ if (idx >= 0) {
197
+ const start = Math.max(0, idx - 40);
198
+ const end = Math.min(text.length, idx + k.length + 40);
199
+ return text.slice(start, end).replace(/\s+/g, ' ');
200
+ }
201
+ }
202
+ return text.slice(0, 120).replace(/\s+/g, ' ');
203
+ }
204
+ logViolation(rule, confidence, evidence) {
205
+ try {
206
+ const entry = {
207
+ ts: new Date().toISOString(),
208
+ projectRoot: this.projectRoot,
209
+ ruleId: rule.id,
210
+ severity: rule.severity,
211
+ confidence,
212
+ evidence,
213
+ };
214
+ fs.appendFileSync(VIOLATIONS_LOG, JSON.stringify(entry) + '\n');
215
+ }
216
+ catch { /* non-fatal */ }
217
+ }
218
+ }
219
+ // -- Markdown parser ------------------------------------------------------
220
+ export function parseConstitutionMarkdown(md) {
221
+ const out = [];
222
+ // Split on H2 headings that start with "Rule".
223
+ const blocks = md.split(/^##\s+Rule\s+/im).slice(1);
224
+ for (const block of blocks) {
225
+ const lines = block.split(/\r?\n/);
226
+ const headLine = lines.shift() ?? '';
227
+ const m = headLine.match(/^(\S+)\s*[:\-—]?\s*(.*)$/);
228
+ const id = `rule-${(m?.[1] ?? out.length + 1).toString().replace(/[^\w-]/g, '')}`;
229
+ const title = (m?.[2] ?? '').trim() || `Rule ${out.length + 1}`;
230
+ let severity = 'must';
231
+ let scope = 'all';
232
+ const bodyLines = [];
233
+ for (const line of lines) {
234
+ const sev = line.match(/^severity\s*:\s*(must|should|never)/i);
235
+ const sco = line.match(/^scope\s*:\s*(all|code|commits|tests)/i);
236
+ if (sev) {
237
+ severity = sev[1].toLowerCase();
238
+ continue;
239
+ }
240
+ if (sco) {
241
+ scope = sco[1].toLowerCase();
242
+ continue;
243
+ }
244
+ bodyLines.push(line);
245
+ }
246
+ const text = bodyLines.join('\n').trim();
247
+ if (!text)
248
+ continue;
249
+ out.push({
250
+ id,
251
+ severity,
252
+ scope,
253
+ title,
254
+ text,
255
+ keywords: extractKeywords(`${title} ${text}`),
256
+ source: 'file',
257
+ });
258
+ }
259
+ return out;
260
+ }
261
+ function extractKeywords(text) {
262
+ const stop = new Set(['the', 'a', 'an', 'and', 'or', 'of', 'to', 'for', 'in', 'on', 'is', 'it', 'this', 'that', 'as', 'by', 'be', 'do', 'not', 'no', 'use', 'with', 'must', 'should', 'never', 'only']);
263
+ const seen = new Set();
264
+ const out = [];
265
+ const norm = text.toLowerCase().replace(/[^a-z0-9\s]/g, ' ');
266
+ for (const tok of norm.split(/\s+/)) {
267
+ if (tok.length < 4 || stop.has(tok) || seen.has(tok))
268
+ continue;
269
+ seen.add(tok);
270
+ out.push(tok);
271
+ if (out.length >= 8)
272
+ break;
273
+ }
274
+ return out;
275
+ }
276
+ function guessSeverity(text) {
277
+ const lower = text.toLowerCase();
278
+ if (/\b(never|don'?t|prohibit|forbid|disallow|do not)\b/.test(lower))
279
+ return 'never';
280
+ if (/\b(should|prefer|avoid|try to)\b/.test(lower))
281
+ return 'should';
282
+ return 'must';
283
+ }
284
+ function guessScope(text) {
285
+ const lower = text.toLowerCase();
286
+ if (/\b(commit|git|push|branch|merge)\b/.test(lower))
287
+ return 'commits';
288
+ if (/\b(test|spec|coverage|assert)\b/.test(lower))
289
+ return 'tests';
290
+ if (/\b(code|function|class|import|api)\b/.test(lower))
291
+ return 'code';
292
+ return 'all';
293
+ }
294
+ function cosine(a, b) {
295
+ let d = 0;
296
+ const n = Math.min(a.length, b.length);
297
+ for (let i = 0; i < n; i++)
298
+ d += a[i] * b[i];
299
+ return d;
300
+ }
301
+ function clamp(x, lo, hi) {
302
+ return x < lo ? lo : x > hi ? hi : x;
303
+ }
304
+ let _instance = null;
305
+ export function getConstitution(projectRoot) {
306
+ if (!_instance)
307
+ _instance = new Constitution(projectRoot);
308
+ return _instance;
309
+ }
310
+ export function resetConstitutionForTests() {
311
+ if (_instance)
312
+ _instance.dispose();
313
+ _instance = null;
314
+ }
315
+ //# sourceMappingURL=constitution.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constitution.js","sourceRoot":"","sources":["../../src/brain/constitution.ts"],"names":[],"mappings":"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"}