@theihtisham/agent-shadow-brain 5.1.1 → 5.2.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 (42) hide show
  1. package/README.md +1159 -1095
  2. package/dist/adapters/copilot.d.ts +14 -0
  3. package/dist/adapters/copilot.d.ts.map +1 -0
  4. package/dist/adapters/copilot.js +93 -0
  5. package/dist/adapters/copilot.js.map +1 -0
  6. package/dist/adapters/cursor.d.ts +13 -0
  7. package/dist/adapters/cursor.d.ts.map +1 -0
  8. package/dist/adapters/cursor.js +96 -0
  9. package/dist/adapters/cursor.js.map +1 -0
  10. package/dist/adapters/index.d.ts +4 -1
  11. package/dist/adapters/index.d.ts.map +1 -1
  12. package/dist/adapters/index.js +7 -3
  13. package/dist/adapters/index.js.map +1 -1
  14. package/dist/adapters/windsurf.d.ts +14 -0
  15. package/dist/adapters/windsurf.d.ts.map +1 -0
  16. package/dist/adapters/windsurf.js +107 -0
  17. package/dist/adapters/windsurf.js.map +1 -0
  18. package/dist/brain/global-brain.d.ts +56 -0
  19. package/dist/brain/global-brain.d.ts.map +1 -0
  20. package/dist/brain/global-brain.js +324 -0
  21. package/dist/brain/global-brain.js.map +1 -0
  22. package/dist/brain/l0-cache.d.ts +40 -0
  23. package/dist/brain/l0-cache.d.ts.map +1 -0
  24. package/dist/brain/l0-cache.js +176 -0
  25. package/dist/brain/l0-cache.js.map +1 -0
  26. package/dist/brain/mcp-server.d.ts +4 -0
  27. package/dist/brain/mcp-server.d.ts.map +1 -1
  28. package/dist/brain/mcp-server.js +91 -0
  29. package/dist/brain/mcp-server.js.map +1 -1
  30. package/dist/brain/session-hooks.d.ts +28 -0
  31. package/dist/brain/session-hooks.d.ts.map +1 -0
  32. package/dist/brain/session-hooks.js +475 -0
  33. package/dist/brain/session-hooks.js.map +1 -0
  34. package/dist/brain/subconscious.d.ts +34 -0
  35. package/dist/brain/subconscious.d.ts.map +1 -0
  36. package/dist/brain/subconscious.js +275 -0
  37. package/dist/brain/subconscious.js.map +1 -0
  38. package/dist/cli.js +167 -2
  39. package/dist/cli.js.map +1 -1
  40. package/dist/types.d.ts +128 -1
  41. package/dist/types.d.ts.map +1 -1
  42. package/package.json +46 -10
@@ -0,0 +1,14 @@
1
+ import { BaseAdapter } from './base-adapter.js';
2
+ import { AgentTool, AgentPaths, AgentActivity, BrainInsight } from '../types.js';
3
+ export declare class CopilotAdapter extends BaseAdapter {
4
+ name: AgentTool;
5
+ displayName: string;
6
+ private getInstructionsPath;
7
+ private getUserConfigDir;
8
+ detect(): Promise<boolean>;
9
+ getConfigPaths(): AgentPaths;
10
+ readActivity(): Promise<AgentActivity[]>;
11
+ injectContext(insight: BrainInsight): Promise<boolean>;
12
+ private formatShadowSection;
13
+ }
14
+ //# sourceMappingURL=copilot.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"copilot.d.ts","sourceRoot":"","sources":["../../src/adapters/copilot.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAKjF,qBAAa,cAAe,SAAQ,WAAW;IAC7C,IAAI,EAAE,SAAS,CAAa;IAC5B,WAAW,SAAoB;IAE/B,OAAO,CAAC,mBAAmB;IAI3B,OAAO,CAAC,gBAAgB;IAOlB,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC;IAoBhC,cAAc,IAAI,UAAU;IAQtB,YAAY,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;IAMxC,aAAa,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC;IAqB5D,OAAO,CAAC,mBAAmB;CAY5B"}
@@ -0,0 +1,93 @@
1
+ // src/adapters/copilot.ts — Adapter for GitHub Copilot
2
+ //
3
+ // Copilot's official workspace context mechanism is .github/copilot-instructions.md.
4
+ // This adapter writes brain insights there so Copilot picks them up automatically.
5
+ //
6
+ // User-level config: ~/.config/copilot (Linux/macOS) or %APPDATA%\\GitHub Copilot (Windows).
7
+ import * as fs from 'fs';
8
+ import * as path from 'path';
9
+ import * as os from 'os';
10
+ import { BaseAdapter } from './base-adapter.js';
11
+ const SHADOW_MARKER_START = '<!-- SHADOW_BRAIN_START -->';
12
+ const SHADOW_MARKER_END = '<!-- SHADOW_BRAIN_END -->';
13
+ export class CopilotAdapter extends BaseAdapter {
14
+ constructor() {
15
+ super(...arguments);
16
+ this.name = 'copilot';
17
+ this.displayName = 'GitHub Copilot';
18
+ }
19
+ getInstructionsPath() {
20
+ return path.join(this.projectDir, '.github', 'copilot-instructions.md');
21
+ }
22
+ getUserConfigDir() {
23
+ if (process.platform === 'win32') {
24
+ return path.join(process.env.APPDATA || os.homedir(), 'GitHub Copilot');
25
+ }
26
+ return path.join(os.homedir(), '.config', 'github-copilot');
27
+ }
28
+ async detect() {
29
+ if (fs.existsSync(this.getInstructionsPath()))
30
+ return true;
31
+ if (fs.existsSync(this.getUserConfigDir()))
32
+ return true;
33
+ // Workspace marker — VS Code extensions registry
34
+ const candidates = [
35
+ path.join(this.projectDir, '.vscode', 'extensions.json'),
36
+ path.join(this.projectDir, '.vscode', 'settings.json'),
37
+ ];
38
+ for (const file of candidates) {
39
+ if (!fs.existsSync(file))
40
+ continue;
41
+ try {
42
+ const content = fs.readFileSync(file, 'utf-8');
43
+ if (/copilot/i.test(content))
44
+ return true;
45
+ }
46
+ catch { /* skip */ }
47
+ }
48
+ return false;
49
+ }
50
+ getConfigPaths() {
51
+ return {
52
+ memoryDir: path.join(this.projectDir, '.github'),
53
+ rulesDir: path.join(this.projectDir, '.github'),
54
+ configFile: path.join(this.projectDir, '.vscode', 'settings.json'),
55
+ };
56
+ }
57
+ async readActivity() {
58
+ // Copilot doesn't expose conversation logs the way other agents do.
59
+ // We approximate from recent file mtimes in the project (Copilot edits leave fingerprints).
60
+ return [];
61
+ }
62
+ async injectContext(insight) {
63
+ const instrPath = this.getInstructionsPath();
64
+ fs.mkdirSync(path.dirname(instrPath), { recursive: true });
65
+ const existing = this.readFile(instrPath) || '';
66
+ const block = this.formatShadowSection(insight);
67
+ let updated;
68
+ if (existing.includes(SHADOW_MARKER_START) && existing.includes(SHADOW_MARKER_END)) {
69
+ // Replace existing shadow section
70
+ const before = existing.split(SHADOW_MARKER_START)[0];
71
+ const after = existing.split(SHADOW_MARKER_END)[1] ?? '';
72
+ updated = `${before}${SHADOW_MARKER_START}\n${block}\n${SHADOW_MARKER_END}${after}`;
73
+ }
74
+ else {
75
+ updated = existing + `\n\n${SHADOW_MARKER_START}\n${block}\n${SHADOW_MARKER_END}\n`;
76
+ }
77
+ fs.writeFileSync(instrPath, updated, 'utf-8');
78
+ return true;
79
+ }
80
+ formatShadowSection(insight) {
81
+ return `## Shadow Brain — Latest Insight
82
+
83
+ **${insight.title}** (${insight.priority})
84
+
85
+ ${insight.content}
86
+
87
+ ${insight.files?.length ? `Affected files: ${insight.files.join(', ')}` : ''}
88
+
89
+ _Auto-updated by Shadow Brain — see https://github.com/theihtisham/agent-shadow-brain_
90
+ `;
91
+ }
92
+ }
93
+ //# sourceMappingURL=copilot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"copilot.js","sourceRoot":"","sources":["../../src/adapters/copilot.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import { BaseAdapter } from './base-adapter.js';
2
+ import { AgentTool, AgentPaths, AgentActivity, BrainInsight } from '../types.js';
3
+ export declare class CursorAdapter extends BaseAdapter {
4
+ name: AgentTool;
5
+ displayName: string;
6
+ private getGlobalDir;
7
+ private getProjectCursorDir;
8
+ detect(): Promise<boolean>;
9
+ getConfigPaths(): AgentPaths;
10
+ readActivity(): Promise<AgentActivity[]>;
11
+ injectContext(insight: BrainInsight): Promise<boolean>;
12
+ }
13
+ //# sourceMappingURL=cursor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cursor.d.ts","sourceRoot":"","sources":["../../src/adapters/cursor.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEjF,qBAAa,aAAc,SAAQ,WAAW;IAC5C,IAAI,EAAE,SAAS,CAAY;IAC3B,WAAW,SAAY;IAEvB,OAAO,CAAC,YAAY;IAIpB,OAAO,CAAC,mBAAmB;IAIrB,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC;IAUhC,cAAc,IAAI,UAAU;IAUtB,YAAY,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;IAwCxC,aAAa,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC;CAsB7D"}
@@ -0,0 +1,96 @@
1
+ // src/adapters/cursor.ts — Adapter for Cursor (anysphere)
2
+ import * as fs from 'fs';
3
+ import * as path from 'path';
4
+ import * as os from 'os';
5
+ import { BaseAdapter } from './base-adapter.js';
6
+ export class CursorAdapter extends BaseAdapter {
7
+ constructor() {
8
+ super(...arguments);
9
+ this.name = 'cursor';
10
+ this.displayName = 'Cursor';
11
+ }
12
+ getGlobalDir() {
13
+ return path.join(os.homedir(), '.cursor');
14
+ }
15
+ getProjectCursorDir() {
16
+ return path.join(this.projectDir, '.cursor');
17
+ }
18
+ async detect() {
19
+ const projectMarkers = [
20
+ path.join(this.projectDir, '.cursorrules'),
21
+ path.join(this.projectDir, '.cursorignore'),
22
+ this.getProjectCursorDir(),
23
+ ];
24
+ if (projectMarkers.some(p => fs.existsSync(p)))
25
+ return true;
26
+ return fs.existsSync(this.getGlobalDir());
27
+ }
28
+ getConfigPaths() {
29
+ const projectDir = this.getProjectCursorDir();
30
+ return {
31
+ memoryDir: path.join(projectDir, 'memory'),
32
+ rulesDir: path.join(projectDir, 'rules'),
33
+ conversationDir: path.join(this.getGlobalDir(), 'conversations'),
34
+ configFile: path.join(projectDir, 'mcp.json'),
35
+ };
36
+ }
37
+ async readActivity() {
38
+ const activities = [];
39
+ const conversationsDir = path.join(this.getGlobalDir(), 'conversations');
40
+ if (!fs.existsSync(conversationsDir))
41
+ return activities;
42
+ try {
43
+ const files = fs.readdirSync(conversationsDir)
44
+ .filter(f => f.endsWith('.json') || f.endsWith('.jsonl'))
45
+ .map(f => ({
46
+ path: path.join(conversationsDir, f),
47
+ mtime: fs.statSync(path.join(conversationsDir, f)).mtimeMs,
48
+ }))
49
+ .sort((a, b) => b.mtime - a.mtime)
50
+ .slice(0, 3);
51
+ for (const file of files) {
52
+ try {
53
+ const content = fs.readFileSync(file.path, 'utf-8');
54
+ const lines = content.trim().split('\n').slice(-30);
55
+ for (const line of lines) {
56
+ try {
57
+ const entry = JSON.parse(line);
58
+ if (entry.role === 'assistant' || entry.type === 'message') {
59
+ activities.push({
60
+ timestamp: new Date(entry.timestamp || file.mtime),
61
+ type: 'conversation',
62
+ detail: (entry.content || entry.text || '').slice(0, 200),
63
+ file: entry.file || entry.path,
64
+ });
65
+ }
66
+ }
67
+ catch { /* skip */ }
68
+ }
69
+ }
70
+ catch { /* skip */ }
71
+ }
72
+ }
73
+ catch { /* skip */ }
74
+ return activities;
75
+ }
76
+ async injectContext(insight) {
77
+ // Cursor reads project-level .cursor/rules/*.md AND .cursorrules
78
+ const rulesDir = path.join(this.getProjectCursorDir(), 'rules');
79
+ fs.mkdirSync(rulesDir, { recursive: true });
80
+ const brainFile = path.join(rulesDir, 'shadow-brain-insights.md');
81
+ const existing = this.readFile(brainFile) || '';
82
+ const updated = this.appendToBrainFile(existing, insight);
83
+ fs.writeFileSync(brainFile, updated, 'utf-8');
84
+ if (insight.priority === 'critical') {
85
+ const cursorRulesPath = path.join(this.projectDir, '.cursorrules');
86
+ const existingRules = this.readFile(cursorRulesPath) || '';
87
+ const marker = '# === Shadow Brain Critical Alerts ===';
88
+ if (!existingRules.includes(marker)) {
89
+ const newRules = existingRules + `\n\n${marker}\n${insight.content}\n`;
90
+ fs.writeFileSync(cursorRulesPath, newRules, 'utf-8');
91
+ }
92
+ }
93
+ return true;
94
+ }
95
+ }
96
+ //# sourceMappingURL=cursor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cursor.js","sourceRoot":"","sources":["../../src/adapters/cursor.ts"],"names":[],"mappings":"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"}
@@ -6,8 +6,11 @@ import { OpenCodeAdapter } from './opencode.js';
6
6
  import { CodexAdapter } from './codex.js';
7
7
  import { RooCodeAdapter } from './roo-code.js';
8
8
  import { AiderAdapter } from './aider.js';
9
+ import { CursorAdapter } from './cursor.js';
10
+ import { WindsurfAdapter } from './windsurf.js';
11
+ import { CopilotAdapter } from './copilot.js';
9
12
  export declare const ALL_ADAPTERS: Record<AgentTool, () => AgentAdapter>;
10
13
  export declare function createAdapter(tool: AgentTool): AgentAdapter;
11
14
  export declare function detectRunningAgents(projectDir: string): Promise<AgentAdapter[]>;
12
- export { ClaudeCodeAdapter, KiloCodeAdapter, ClineAdapter, OpenCodeAdapter, CodexAdapter, RooCodeAdapter, AiderAdapter };
15
+ export { ClaudeCodeAdapter, KiloCodeAdapter, ClineAdapter, OpenCodeAdapter, CodexAdapter, RooCodeAdapter, AiderAdapter, CursorAdapter, WindsurfAdapter, CopilotAdapter, };
13
16
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/adapters/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE1C,eAAO,MAAM,YAAY,EAAE,MAAM,CAAC,SAAS,EAAE,MAAM,YAAY,CAU9D,CAAC;AAEF,wBAAgB,aAAa,CAAC,IAAI,EAAE,SAAS,GAAG,YAAY,CAI3D;AAED,wBAAsB,mBAAmB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAcrF;AAED,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,YAAY,EAAE,eAAe,EAAE,YAAY,EAAE,cAAc,EAAE,YAAY,EAAE,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/adapters/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAE9C,eAAO,MAAM,YAAY,EAAE,MAAM,CAAC,SAAS,EAAE,MAAM,YAAY,CAW9D,CAAC;AAEF,wBAAgB,aAAa,CAAC,IAAI,EAAE,SAAS,GAAG,YAAY,CAI3D;AAED,wBAAsB,mBAAmB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAcrF;AAED,OAAO,EACL,iBAAiB,EACjB,eAAe,EACf,YAAY,EACZ,eAAe,EACf,YAAY,EACZ,cAAc,EACd,YAAY,EACZ,aAAa,EACb,eAAe,EACf,cAAc,GACf,CAAC"}
@@ -6,6 +6,9 @@ import { OpenCodeAdapter } from './opencode.js';
6
6
  import { CodexAdapter } from './codex.js';
7
7
  import { RooCodeAdapter } from './roo-code.js';
8
8
  import { AiderAdapter } from './aider.js';
9
+ import { CursorAdapter } from './cursor.js';
10
+ import { WindsurfAdapter } from './windsurf.js';
11
+ import { CopilotAdapter } from './copilot.js';
9
12
  export const ALL_ADAPTERS = {
10
13
  'claude-code': () => new ClaudeCodeAdapter(),
11
14
  'kilo-code': () => new KiloCodeAdapter(),
@@ -14,8 +17,9 @@ export const ALL_ADAPTERS = {
14
17
  'codex': () => new CodexAdapter(),
15
18
  'roo-code': () => new RooCodeAdapter(),
16
19
  'aider': () => new AiderAdapter(),
17
- 'cursor': () => new ClineAdapter(), // Similar VS Code pattern
18
- 'windsurf': () => new ClineAdapter(), // Similar VS Code pattern
20
+ 'cursor': () => new CursorAdapter(),
21
+ 'windsurf': () => new WindsurfAdapter(),
22
+ 'copilot': () => new CopilotAdapter(),
19
23
  };
20
24
  export function createAdapter(tool) {
21
25
  const factory = ALL_ADAPTERS[tool];
@@ -37,5 +41,5 @@ export async function detectRunningAgents(projectDir) {
37
41
  }
38
42
  return detected;
39
43
  }
40
- export { ClaudeCodeAdapter, KiloCodeAdapter, ClineAdapter, OpenCodeAdapter, CodexAdapter, RooCodeAdapter, AiderAdapter };
44
+ export { ClaudeCodeAdapter, KiloCodeAdapter, ClineAdapter, OpenCodeAdapter, CodexAdapter, RooCodeAdapter, AiderAdapter, CursorAdapter, WindsurfAdapter, CopilotAdapter, };
41
45
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/adapters/index.ts"],"names":[],"mappings":"AAAA,wDAAwD;AAGxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE1C,MAAM,CAAC,MAAM,YAAY,GAA0C;IACjE,aAAa,EAAE,GAAG,EAAE,CAAC,IAAI,iBAAiB,EAAE;IAC5C,WAAW,EAAE,GAAG,EAAE,CAAC,IAAI,eAAe,EAAE;IACxC,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,YAAY,EAAE;IACjC,UAAU,EAAE,GAAG,EAAE,CAAC,IAAI,eAAe,EAAE;IACvC,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,YAAY,EAAE;IACjC,UAAU,EAAE,GAAG,EAAE,CAAC,IAAI,cAAc,EAAE;IACtC,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,YAAY,EAAE;IACjC,QAAQ,EAAE,GAAG,EAAE,CAAC,IAAI,YAAY,EAAE,EAAO,0BAA0B;IACnE,UAAU,EAAE,GAAG,EAAE,CAAC,IAAI,YAAY,EAAE,EAAK,0BAA0B;CACpE,CAAC;AAEF,MAAM,UAAU,aAAa,CAAC,IAAe;IAC3C,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IACnC,IAAI,CAAC,OAAO;QAAE,MAAM,IAAI,KAAK,CAAC,uBAAuB,IAAI,EAAE,CAAC,CAAC;IAC7D,OAAO,OAAO,EAAE,CAAC;AACnB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,UAAkB;IAC1D,MAAM,QAAQ,GAAmB,EAAE,CAAC;IAEpC,KAAK,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,CAAC;QAC3D,MAAM,OAAO,GAAG,OAAO,EAAE,CAAC;QACzB,OAAe,CAAC,UAAU,GAAG,UAAU,CAAC;QACzC,IAAI,CAAC;YACH,IAAI,MAAM,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;gBAC3B,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACzB,CAAC;QACH,CAAC;QAAC,MAAM,CAAC,CAAC,mBAAmB,CAAC,CAAC;IACjC,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,YAAY,EAAE,eAAe,EAAE,YAAY,EAAE,cAAc,EAAE,YAAY,EAAE,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/adapters/index.ts"],"names":[],"mappings":"AAAA,wDAAwD;AAGxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAE9C,MAAM,CAAC,MAAM,YAAY,GAA0C;IACjE,aAAa,EAAE,GAAG,EAAE,CAAC,IAAI,iBAAiB,EAAE;IAC5C,WAAW,EAAE,GAAG,EAAE,CAAC,IAAI,eAAe,EAAE;IACxC,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,YAAY,EAAE;IACjC,UAAU,EAAE,GAAG,EAAE,CAAC,IAAI,eAAe,EAAE;IACvC,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,YAAY,EAAE;IACjC,UAAU,EAAE,GAAG,EAAE,CAAC,IAAI,cAAc,EAAE;IACtC,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,YAAY,EAAE;IACjC,QAAQ,EAAE,GAAG,EAAE,CAAC,IAAI,aAAa,EAAE;IACnC,UAAU,EAAE,GAAG,EAAE,CAAC,IAAI,eAAe,EAAE;IACvC,SAAS,EAAE,GAAG,EAAE,CAAC,IAAI,cAAc,EAAE;CACtC,CAAC;AAEF,MAAM,UAAU,aAAa,CAAC,IAAe;IAC3C,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IACnC,IAAI,CAAC,OAAO;QAAE,MAAM,IAAI,KAAK,CAAC,uBAAuB,IAAI,EAAE,CAAC,CAAC;IAC7D,OAAO,OAAO,EAAE,CAAC;AACnB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,UAAkB;IAC1D,MAAM,QAAQ,GAAmB,EAAE,CAAC;IAEpC,KAAK,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,CAAC;QAC3D,MAAM,OAAO,GAAG,OAAO,EAAE,CAAC;QACzB,OAAe,CAAC,UAAU,GAAG,UAAU,CAAC;QACzC,IAAI,CAAC;YACH,IAAI,MAAM,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;gBAC3B,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACzB,CAAC;QACH,CAAC;QAAC,MAAM,CAAC,CAAC,mBAAmB,CAAC,CAAC;IACjC,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,OAAO,EACL,iBAAiB,EACjB,eAAe,EACf,YAAY,EACZ,eAAe,EACf,YAAY,EACZ,cAAc,EACd,YAAY,EACZ,aAAa,EACb,eAAe,EACf,cAAc,GACf,CAAC"}
@@ -0,0 +1,14 @@
1
+ import { BaseAdapter } from './base-adapter.js';
2
+ import { AgentTool, AgentPaths, AgentActivity, BrainInsight } from '../types.js';
3
+ export declare class WindsurfAdapter extends BaseAdapter {
4
+ name: AgentTool;
5
+ displayName: string;
6
+ private getGlobalDir;
7
+ private getWindsurfDir;
8
+ detect(): Promise<boolean>;
9
+ getConfigPaths(): AgentPaths;
10
+ readActivity(): Promise<AgentActivity[]>;
11
+ injectContext(insight: BrainInsight): Promise<boolean>;
12
+ private formatInsightForWindsurf;
13
+ }
14
+ //# sourceMappingURL=windsurf.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"windsurf.d.ts","sourceRoot":"","sources":["../../src/adapters/windsurf.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEjF,qBAAa,eAAgB,SAAQ,WAAW;IAC9C,IAAI,EAAE,SAAS,CAAc;IAC7B,WAAW,SAAc;IAEzB,OAAO,CAAC,YAAY;IAIpB,OAAO,CAAC,cAAc;IAIhB,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC;IAShC,cAAc,IAAI,UAAU;IAUtB,YAAY,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;IA4CxC,aAAa,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC;IA4B5D,OAAO,CAAC,wBAAwB;CAGjC"}
@@ -0,0 +1,107 @@
1
+ // src/adapters/windsurf.ts — Adapter for Windsurf (Codeium)
2
+ import * as fs from 'fs';
3
+ import * as path from 'path';
4
+ import * as os from 'os';
5
+ import { BaseAdapter } from './base-adapter.js';
6
+ export class WindsurfAdapter extends BaseAdapter {
7
+ constructor() {
8
+ super(...arguments);
9
+ this.name = 'windsurf';
10
+ this.displayName = 'Windsurf';
11
+ }
12
+ getGlobalDir() {
13
+ return path.join(os.homedir(), '.windsurf');
14
+ }
15
+ getWindsurfDir() {
16
+ return path.join(this.projectDir, '.windsurf');
17
+ }
18
+ async detect() {
19
+ const projectMarkers = [
20
+ path.join(this.projectDir, '.windsurfrules'),
21
+ this.getWindsurfDir(),
22
+ ];
23
+ if (projectMarkers.some(p => fs.existsSync(p)))
24
+ return true;
25
+ return fs.existsSync(this.getGlobalDir());
26
+ }
27
+ getConfigPaths() {
28
+ const projectDir = this.getWindsurfDir();
29
+ return {
30
+ memoryDir: path.join(projectDir, 'memory'),
31
+ rulesDir: projectDir,
32
+ conversationDir: path.join(this.getGlobalDir(), 'conversations'),
33
+ configFile: path.join(this.getGlobalDir(), 'mcp.json'),
34
+ };
35
+ }
36
+ async readActivity() {
37
+ const activities = [];
38
+ const candidates = [
39
+ path.join(this.getGlobalDir(), 'conversations'),
40
+ path.join(this.getGlobalDir(), 'logs'),
41
+ ];
42
+ for (const dir of candidates) {
43
+ if (!fs.existsSync(dir))
44
+ continue;
45
+ try {
46
+ const files = fs.readdirSync(dir)
47
+ .filter(f => f.endsWith('.json') || f.endsWith('.jsonl') || f.endsWith('.log'))
48
+ .map(f => ({
49
+ path: path.join(dir, f),
50
+ mtime: fs.statSync(path.join(dir, f)).mtimeMs,
51
+ }))
52
+ .sort((a, b) => b.mtime - a.mtime)
53
+ .slice(0, 3);
54
+ for (const file of files) {
55
+ try {
56
+ const content = fs.readFileSync(file.path, 'utf-8');
57
+ const lines = content.trim().split('\n').slice(-30);
58
+ for (const line of lines) {
59
+ try {
60
+ const entry = JSON.parse(line);
61
+ if (entry.role === 'assistant' || entry.type === 'response') {
62
+ activities.push({
63
+ timestamp: new Date(entry.timestamp || file.mtime),
64
+ type: 'conversation',
65
+ detail: (entry.content || entry.text || '').slice(0, 200),
66
+ file: entry.file,
67
+ });
68
+ }
69
+ }
70
+ catch { /* skip */ }
71
+ }
72
+ }
73
+ catch { /* skip */ }
74
+ }
75
+ }
76
+ catch { /* skip */ }
77
+ }
78
+ return activities;
79
+ }
80
+ async injectContext(insight) {
81
+ // Windsurf reads .windsurfrules (similar to .cursorrules)
82
+ const rulesPath = path.join(this.projectDir, '.windsurfrules');
83
+ const existing = this.readFile(rulesPath) || '';
84
+ const marker = '# === Shadow Brain Insights ===';
85
+ let updated;
86
+ if (existing.includes(marker)) {
87
+ // Replace the section
88
+ const before = existing.split(marker)[0];
89
+ updated = before + marker + '\n' + this.formatInsightForWindsurf(insight);
90
+ }
91
+ else {
92
+ updated = existing + '\n\n' + marker + '\n' + this.formatInsightForWindsurf(insight);
93
+ }
94
+ fs.writeFileSync(rulesPath, updated, 'utf-8');
95
+ // Also write to dedicated brain file in memory dir
96
+ const memoryDir = path.join(this.getWindsurfDir(), 'memory');
97
+ fs.mkdirSync(memoryDir, { recursive: true });
98
+ const brainFile = path.join(memoryDir, 'SHADOW_BRAIN.md');
99
+ const existingBrain = this.readFile(brainFile) || '';
100
+ fs.writeFileSync(brainFile, this.appendToBrainFile(existingBrain, insight), 'utf-8');
101
+ return true;
102
+ }
103
+ formatInsightForWindsurf(insight) {
104
+ return `## ${insight.title}\n_${insight.priority}_ — ${insight.content}\n`;
105
+ }
106
+ }
107
+ //# sourceMappingURL=windsurf.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"windsurf.js","sourceRoot":"","sources":["../../src/adapters/windsurf.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,56 @@
1
+ import { AgentTool, GlobalBrainConfig, GlobalBrainStats, GlobalEntry } from '../types.js';
2
+ /**
3
+ * Singleton Global Brain — the source of truth for all projects + agents.
4
+ *
5
+ * Storage: JSON file at ~/.shadow-brain/global.json (zero new deps).
6
+ * In-memory Map keyed by entry.id for O(1) ID lookups.
7
+ */
8
+ export declare class GlobalBrain {
9
+ private static instance;
10
+ private config;
11
+ private entries;
12
+ private projects;
13
+ private agents;
14
+ private writeQueue;
15
+ private syncTimer;
16
+ private stats;
17
+ private startedAt;
18
+ private initialized;
19
+ private dirty;
20
+ private constructor();
21
+ static getInstance(config?: Partial<GlobalBrainConfig>): GlobalBrain;
22
+ init(): Promise<void>;
23
+ /** Generate a stable project ID from absolute path */
24
+ static projectIdFor(rootDir: string): string;
25
+ registerProject(rootDir: string, name?: string): string;
26
+ registerAgent(agent: AgentTool): void;
27
+ /** Queue a write — resolves true on success */
28
+ write(entry: Omit<GlobalEntry, 'id' | 'createdAt' | 'lastAccessed' | 'accessCount'>): Promise<boolean>;
29
+ /** Direct synchronous write — bypasses queue */
30
+ writeSync(entry: Omit<GlobalEntry, 'id' | 'createdAt' | 'lastAccessed' | 'accessCount'>): string;
31
+ /** Recall entries — cross-project + cross-agent */
32
+ recall(opts?: {
33
+ projectId?: string;
34
+ agentTool?: AgentTool;
35
+ category?: string;
36
+ keywords?: string[];
37
+ limit?: number;
38
+ minImportance?: number;
39
+ }): GlobalEntry[];
40
+ /** Bump access count for an entry */
41
+ touch(id: string): void;
42
+ recallByIds(ids: string[]): GlobalEntry[];
43
+ getStats(): GlobalBrainStats;
44
+ /** Force a sync of pending writes to disk */
45
+ sync(): Promise<void>;
46
+ private maybeAutoMaintenance;
47
+ /** Auto-prune: drop low-importance, rarely-accessed entries when over threshold */
48
+ private prune;
49
+ private persist;
50
+ private startSyncLoop;
51
+ private refreshStats;
52
+ private estimateSizeMB;
53
+ shutdown(): Promise<void>;
54
+ }
55
+ export declare function getGlobalBrain(config?: Partial<GlobalBrainConfig>): GlobalBrain;
56
+ //# sourceMappingURL=global-brain.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"global-brain.d.ts","sourceRoot":"","sources":["../../src/brain/global-brain.ts"],"names":[],"mappings":"AAkBA,OAAO,EACL,SAAS,EACT,iBAAiB,EACjB,gBAAgB,EAChB,WAAW,EACZ,MAAM,aAAa,CAAC;AAyBrB;;;;;GAKG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAA4B;IACnD,OAAO,CAAC,MAAM,CAAoB;IAClC,OAAO,CAAC,OAAO,CAAuC;IACtD,OAAO,CAAC,QAAQ,CAA8G;IAC9H,OAAO,CAAC,MAAM,CAA6G;IAC3H,OAAO,CAAC,UAAU,CAAsB;IACxC,OAAO,CAAC,SAAS,CAA+B;IAChD,OAAO,CAAC,KAAK,CAAmB;IAChC,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,KAAK,CAAS;IAEtB,OAAO;IAmBP,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,iBAAiB,CAAC,GAAG,WAAW;IAO9D,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAgC3B,sDAAsD;IACtD,MAAM,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;IAK5C,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM;IAoBvD,aAAa,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI;IAarC,+CAA+C;IACzC,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,GAAG,WAAW,GAAG,cAAc,GAAG,aAAa,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;IAoB5G,gDAAgD;IAChD,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,GAAG,WAAW,GAAG,cAAc,GAAG,aAAa,CAAC,GAAG,MAAM;IAkBhG,mDAAmD;IACnD,MAAM,CAAC,IAAI,GAAE;QACX,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,SAAS,CAAC,EAAE,SAAS,CAAC;QACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;QACpB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,aAAa,CAAC,EAAE,MAAM,CAAC;KACnB,GAAG,WAAW,EAAE;IA+BtB,qCAAqC;IACrC,KAAK,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAQvB,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,WAAW,EAAE;IASzC,QAAQ,IAAI,gBAAgB;IAK5B,6CAA6C;IACvC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAyB3B,OAAO,CAAC,oBAAoB;IAO5B,mFAAmF;IACnF,OAAO,CAAC,KAAK;IAeb,OAAO,CAAC,OAAO;IAcf,OAAO,CAAC,aAAa;IAOrB,OAAO,CAAC,YAAY;IAWpB,OAAO,CAAC,cAAc;IAShB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;CAMhC;AAED,wBAAgB,cAAc,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,iBAAiB,CAAC,GAAG,WAAW,CAE/E"}