@timmeck/brain-core 1.1.0 → 1.5.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 (112) hide show
  1. package/README.md +66 -14
  2. package/brain.log +6 -0
  3. package/dist/config/__tests__/loader.test.d.ts +1 -0
  4. package/dist/config/__tests__/loader.test.js +85 -0
  5. package/dist/config/__tests__/loader.test.js.map +1 -0
  6. package/dist/config/loader.d.ts +15 -0
  7. package/dist/config/loader.js +39 -0
  8. package/dist/config/loader.js.map +1 -0
  9. package/dist/cross-brain/__tests__/client.test.d.ts +1 -0
  10. package/dist/cross-brain/__tests__/client.test.js +31 -0
  11. package/dist/cross-brain/__tests__/client.test.js.map +1 -0
  12. package/dist/cross-brain/__tests__/notifications.test.d.ts +1 -0
  13. package/dist/cross-brain/__tests__/notifications.test.js +52 -0
  14. package/dist/cross-brain/__tests__/notifications.test.js.map +1 -0
  15. package/dist/cross-brain/notifications.d.ts +25 -0
  16. package/dist/cross-brain/notifications.js +51 -0
  17. package/dist/cross-brain/notifications.js.map +1 -0
  18. package/dist/index.d.ts +16 -0
  19. package/dist/index.js +14 -0
  20. package/dist/index.js.map +1 -1
  21. package/dist/ipc/__tests__/protocol.test.d.ts +1 -0
  22. package/dist/ipc/__tests__/protocol.test.js +69 -0
  23. package/dist/ipc/__tests__/protocol.test.js.map +1 -0
  24. package/dist/learning/__tests__/base-engine.test.d.ts +1 -0
  25. package/dist/learning/__tests__/base-engine.test.js +49 -0
  26. package/dist/learning/__tests__/base-engine.test.js.map +1 -0
  27. package/dist/learning/base-engine.d.ts +16 -0
  28. package/dist/learning/base-engine.js +30 -0
  29. package/dist/learning/base-engine.js.map +1 -0
  30. package/dist/math/__tests__/time-decay.test.d.ts +1 -0
  31. package/dist/math/__tests__/time-decay.test.js +37 -0
  32. package/dist/math/__tests__/time-decay.test.js.map +1 -0
  33. package/dist/math/__tests__/wilson-score.test.d.ts +1 -0
  34. package/dist/math/__tests__/wilson-score.test.js +43 -0
  35. package/dist/math/__tests__/wilson-score.test.js.map +1 -0
  36. package/dist/math/time-decay.d.ts +10 -0
  37. package/dist/math/time-decay.js +16 -0
  38. package/dist/math/time-decay.js.map +1 -0
  39. package/dist/math/wilson-score.d.ts +10 -0
  40. package/dist/math/wilson-score.js +21 -0
  41. package/dist/math/wilson-score.js.map +1 -0
  42. package/dist/research/__tests__/base-engine.test.d.ts +1 -0
  43. package/dist/research/__tests__/base-engine.test.js +56 -0
  44. package/dist/research/__tests__/base-engine.test.js.map +1 -0
  45. package/dist/research/base-engine.d.ts +20 -0
  46. package/dist/research/base-engine.js +46 -0
  47. package/dist/research/base-engine.js.map +1 -0
  48. package/dist/synapses/__tests__/activation.test.d.ts +1 -0
  49. package/dist/synapses/__tests__/activation.test.js +87 -0
  50. package/dist/synapses/__tests__/activation.test.js.map +1 -0
  51. package/dist/synapses/__tests__/decay.test.d.ts +1 -0
  52. package/dist/synapses/__tests__/decay.test.js +73 -0
  53. package/dist/synapses/__tests__/decay.test.js.map +1 -0
  54. package/dist/synapses/__tests__/hebbian.test.d.ts +1 -0
  55. package/dist/synapses/__tests__/hebbian.test.js +95 -0
  56. package/dist/synapses/__tests__/hebbian.test.js.map +1 -0
  57. package/dist/synapses/__tests__/pathfinder.test.d.ts +1 -0
  58. package/dist/synapses/__tests__/pathfinder.test.js +74 -0
  59. package/dist/synapses/__tests__/pathfinder.test.js.map +1 -0
  60. package/dist/synapses/__tests__/synapse-manager.test.d.ts +1 -0
  61. package/dist/synapses/__tests__/synapse-manager.test.js +94 -0
  62. package/dist/synapses/__tests__/synapse-manager.test.js.map +1 -0
  63. package/dist/synapses/activation.d.ts +6 -0
  64. package/dist/synapses/activation.js +54 -0
  65. package/dist/synapses/activation.js.map +1 -0
  66. package/dist/synapses/decay.d.ts +9 -0
  67. package/dist/synapses/decay.js +26 -0
  68. package/dist/synapses/decay.js.map +1 -0
  69. package/dist/synapses/hebbian.d.ts +12 -0
  70. package/dist/synapses/hebbian.js +45 -0
  71. package/dist/synapses/hebbian.js.map +1 -0
  72. package/dist/synapses/pathfinder.d.ts +6 -0
  73. package/dist/synapses/pathfinder.js +54 -0
  74. package/dist/synapses/pathfinder.js.map +1 -0
  75. package/dist/synapses/synapse-manager.d.ts +35 -0
  76. package/dist/synapses/synapse-manager.js +72 -0
  77. package/dist/synapses/synapse-manager.js.map +1 -0
  78. package/dist/synapses/types.d.ts +85 -0
  79. package/dist/synapses/types.js +7 -0
  80. package/dist/synapses/types.js.map +1 -0
  81. package/dist/utils/__tests__/events.test.d.ts +1 -0
  82. package/dist/utils/__tests__/events.test.js +38 -0
  83. package/dist/utils/__tests__/events.test.js.map +1 -0
  84. package/dist/utils/__tests__/hash.test.d.ts +1 -0
  85. package/dist/utils/__tests__/hash.test.js +25 -0
  86. package/dist/utils/__tests__/hash.test.js.map +1 -0
  87. package/dist/utils/__tests__/logger.test.d.ts +1 -0
  88. package/dist/utils/__tests__/logger.test.js +29 -0
  89. package/dist/utils/__tests__/logger.test.js.map +1 -0
  90. package/dist/utils/__tests__/paths.test.d.ts +1 -0
  91. package/dist/utils/__tests__/paths.test.js +50 -0
  92. package/dist/utils/__tests__/paths.test.js.map +1 -0
  93. package/eslint.config.js +14 -0
  94. package/package.json +17 -2
  95. package/.github/FUNDING.yml +0 -1
  96. package/.github/workflows/ci.yml +0 -21
  97. package/src/api/server.ts +0 -210
  98. package/src/cli/colors.ts +0 -105
  99. package/src/cross-brain/client.ts +0 -94
  100. package/src/db/connection.ts +0 -22
  101. package/src/index.ts +0 -35
  102. package/src/ipc/client.ts +0 -117
  103. package/src/ipc/protocol.ts +0 -35
  104. package/src/ipc/server.ts +0 -170
  105. package/src/mcp/http-server.ts +0 -148
  106. package/src/mcp/server.ts +0 -84
  107. package/src/types/ipc.types.ts +0 -8
  108. package/src/utils/events.ts +0 -30
  109. package/src/utils/hash.ts +0 -5
  110. package/src/utils/logger.ts +0 -67
  111. package/src/utils/paths.ts +0 -24
  112. package/tsconfig.json +0 -18
@@ -0,0 +1,95 @@
1
+ import { describe, it, expect, vi } from 'vitest';
2
+ import { strengthen, weaken } from '../hebbian.js';
3
+ function makeSynapse(overrides = {}) {
4
+ return {
5
+ id: 1,
6
+ source_type: 'error', source_id: 1,
7
+ target_type: 'solution', target_id: 1,
8
+ synapse_type: 'solves',
9
+ weight: 0.5,
10
+ activation_count: 3,
11
+ last_activated_at: new Date().toISOString(),
12
+ metadata: null,
13
+ created_at: new Date().toISOString(),
14
+ updated_at: new Date().toISOString(),
15
+ ...overrides,
16
+ };
17
+ }
18
+ function mockRepo(existing) {
19
+ return {
20
+ findBySourceTarget: vi.fn().mockReturnValue(existing),
21
+ create: vi.fn().mockReturnValue(42),
22
+ getById: vi.fn().mockReturnValue(existing ?? makeSynapse({ id: 42, weight: 0.1, activation_count: 1 })),
23
+ update: vi.fn(),
24
+ delete: vi.fn(),
25
+ getOutgoing: vi.fn().mockReturnValue([]),
26
+ getIncoming: vi.fn().mockReturnValue([]),
27
+ findInactiveSince: vi.fn().mockReturnValue([]),
28
+ topByWeight: vi.fn().mockReturnValue([]),
29
+ topDiverse: vi.fn().mockReturnValue([]),
30
+ countNodes: vi.fn().mockReturnValue(0),
31
+ totalCount: vi.fn().mockReturnValue(0),
32
+ avgWeight: vi.fn().mockReturnValue(0),
33
+ countByType: vi.fn().mockReturnValue({}),
34
+ };
35
+ }
36
+ const config = { initialWeight: 0.1, learningRate: 0.15, pruneThreshold: 0.05 };
37
+ describe('strengthen', () => {
38
+ it('creates a new synapse when none exists', () => {
39
+ const repo = mockRepo(undefined);
40
+ strengthen(repo, { type: 'error', id: 1 }, { type: 'solution', id: 2 }, 'solves', config);
41
+ expect(repo.create).toHaveBeenCalledWith(expect.objectContaining({
42
+ weight: 0.1,
43
+ source_type: 'error',
44
+ target_type: 'solution',
45
+ }));
46
+ });
47
+ it('strengthens existing synapse asymptotically', () => {
48
+ const existing = makeSynapse({ weight: 0.5 });
49
+ const repo = mockRepo(existing);
50
+ const result = strengthen(repo, { type: 'error', id: 1 }, { type: 'solution', id: 1 }, 'solves', config);
51
+ expect(result.weight).toBeCloseTo(0.5 + (1.0 - 0.5) * 0.15);
52
+ expect(repo.update).toHaveBeenCalled();
53
+ });
54
+ it('never exceeds 1.0', () => {
55
+ const existing = makeSynapse({ weight: 0.99 });
56
+ const repo = mockRepo(existing);
57
+ const result = strengthen(repo, { type: 'error', id: 1 }, { type: 'solution', id: 1 }, 'solves', config);
58
+ expect(result.weight).toBeLessThanOrEqual(1.0);
59
+ });
60
+ it('increments activation count', () => {
61
+ const existing = makeSynapse({ activation_count: 5 });
62
+ const repo = mockRepo(existing);
63
+ const result = strengthen(repo, { type: 'error', id: 1 }, { type: 'solution', id: 1 }, 'solves', config);
64
+ expect(result.activation_count).toBe(6);
65
+ });
66
+ it('stores context as JSON metadata', () => {
67
+ const repo = mockRepo(undefined);
68
+ strengthen(repo, { type: 'error', id: 1 }, { type: 'solution', id: 2 }, 'solves', config, { reason: 'test' });
69
+ expect(repo.create).toHaveBeenCalledWith(expect.objectContaining({
70
+ metadata: '{"reason":"test"}',
71
+ }));
72
+ });
73
+ });
74
+ describe('weaken', () => {
75
+ it('reduces weight by factor', () => {
76
+ const existing = makeSynapse({ weight: 0.5 });
77
+ const repo = mockRepo(existing);
78
+ weaken(repo, 1, config, 0.5);
79
+ expect(repo.update).toHaveBeenCalledWith(1, { weight: 0.25 });
80
+ });
81
+ it('prunes when below threshold', () => {
82
+ const existing = makeSynapse({ weight: 0.08 });
83
+ const repo = mockRepo(existing);
84
+ weaken(repo, 1, config, 0.5);
85
+ expect(repo.delete).toHaveBeenCalledWith(1);
86
+ });
87
+ it('does nothing for non-existent synapse', () => {
88
+ const repo = mockRepo(undefined);
89
+ repo.getById.mockReturnValue(undefined);
90
+ weaken(repo, 999, config);
91
+ expect(repo.update).not.toHaveBeenCalled();
92
+ expect(repo.delete).not.toHaveBeenCalled();
93
+ });
94
+ });
95
+ //# sourceMappingURL=hebbian.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hebbian.test.js","sourceRoot":"","sources":["../../../src/synapses/__tests__/hebbian.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,74 @@
1
+ import { describe, it, expect, vi } from 'vitest';
2
+ import { findPath } from '../pathfinder.js';
3
+ function synapse(overrides) {
4
+ return {
5
+ id: 1,
6
+ source_type: 'a', source_id: 1,
7
+ target_type: 'b', target_id: 1,
8
+ synapse_type: 'test',
9
+ weight: 0.8,
10
+ activation_count: 1,
11
+ last_activated_at: new Date().toISOString(),
12
+ metadata: null,
13
+ created_at: new Date().toISOString(),
14
+ updated_at: new Date().toISOString(),
15
+ ...overrides,
16
+ };
17
+ }
18
+ function mockRepo(outgoingMap = {}, incomingMap = {}) {
19
+ return {
20
+ findBySourceTarget: vi.fn(),
21
+ create: vi.fn(),
22
+ getById: vi.fn(),
23
+ update: vi.fn(),
24
+ delete: vi.fn(),
25
+ getOutgoing: vi.fn().mockImplementation((type, id) => outgoingMap[`${type}:${id}`] ?? []),
26
+ getIncoming: vi.fn().mockImplementation((type, id) => incomingMap[`${type}:${id}`] ?? []),
27
+ findInactiveSince: vi.fn().mockReturnValue([]),
28
+ topByWeight: vi.fn().mockReturnValue([]),
29
+ topDiverse: vi.fn().mockReturnValue([]),
30
+ countNodes: vi.fn().mockReturnValue(0),
31
+ totalCount: vi.fn().mockReturnValue(0),
32
+ avgWeight: vi.fn().mockReturnValue(0),
33
+ countByType: vi.fn().mockReturnValue({}),
34
+ };
35
+ }
36
+ describe('findPath', () => {
37
+ it('returns null when no path exists', () => {
38
+ const repo = mockRepo();
39
+ const result = findPath(repo, { type: 'a', id: 1 }, { type: 'z', id: 99 });
40
+ expect(result).toBeNull();
41
+ });
42
+ it('finds direct path', () => {
43
+ const s = synapse({ target_type: 'b', target_id: 2, weight: 0.8 });
44
+ const repo = mockRepo({ 'a:1': [s] });
45
+ const result = findPath(repo, { type: 'a', id: 1 }, { type: 'b', id: 2 });
46
+ expect(result).not.toBeNull();
47
+ expect(result.hops).toBe(1);
48
+ expect(result.totalWeight).toBeCloseTo(0.8);
49
+ });
50
+ it('finds multi-hop path', () => {
51
+ const s1 = synapse({ target_type: 'b', target_id: 2, weight: 0.8 });
52
+ const s2 = synapse({ target_type: 'c', target_id: 3, weight: 0.5 });
53
+ const repo = mockRepo({ 'a:1': [s1], 'b:2': [s2] });
54
+ const result = findPath(repo, { type: 'a', id: 1 }, { type: 'c', id: 3 });
55
+ expect(result).not.toBeNull();
56
+ expect(result.hops).toBe(2);
57
+ expect(result.totalWeight).toBeCloseTo(0.4);
58
+ });
59
+ it('respects maxDepth', () => {
60
+ const s1 = synapse({ target_type: 'b', target_id: 2, weight: 0.9 });
61
+ const s2 = synapse({ target_type: 'c', target_id: 3, weight: 0.9 });
62
+ const repo = mockRepo({ 'a:1': [s1], 'b:2': [s2] });
63
+ const result = findPath(repo, { type: 'a', id: 1 }, { type: 'c', id: 3 }, 1);
64
+ expect(result).toBeNull();
65
+ });
66
+ it('follows incoming synapses', () => {
67
+ const s = synapse({ source_type: 'b', source_id: 2, weight: 0.7 });
68
+ const repo = mockRepo({}, { 'a:1': [s] });
69
+ const result = findPath(repo, { type: 'a', id: 1 }, { type: 'b', id: 2 });
70
+ expect(result).not.toBeNull();
71
+ expect(result.hops).toBe(1);
72
+ });
73
+ });
74
+ //# sourceMappingURL=pathfinder.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pathfinder.test.js","sourceRoot":"","sources":["../../../src/synapses/__tests__/pathfinder.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,94 @@
1
+ import { describe, it, expect, vi, beforeEach } from 'vitest';
2
+ // Mock logger before importing BaseSynapseManager
3
+ vi.mock('../../utils/logger.js', () => ({
4
+ getLogger: () => ({
5
+ debug: vi.fn(),
6
+ info: vi.fn(),
7
+ warn: vi.fn(),
8
+ error: vi.fn(),
9
+ }),
10
+ }));
11
+ import { BaseSynapseManager } from '../synapse-manager.js';
12
+ function synapse(overrides = {}) {
13
+ return {
14
+ id: 1,
15
+ source_type: 'a', source_id: 1,
16
+ target_type: 'b', target_id: 1,
17
+ synapse_type: 'test',
18
+ weight: 0.5,
19
+ activation_count: 1,
20
+ last_activated_at: new Date().toISOString(),
21
+ metadata: null,
22
+ created_at: new Date().toISOString(),
23
+ updated_at: new Date().toISOString(),
24
+ ...overrides,
25
+ };
26
+ }
27
+ function mockRepo() {
28
+ return {
29
+ findBySourceTarget: vi.fn().mockReturnValue(synapse()),
30
+ create: vi.fn().mockReturnValue(1),
31
+ getById: vi.fn().mockReturnValue(synapse()),
32
+ update: vi.fn(),
33
+ delete: vi.fn(),
34
+ getOutgoing: vi.fn().mockReturnValue([]),
35
+ getIncoming: vi.fn().mockReturnValue([]),
36
+ findInactiveSince: vi.fn().mockReturnValue([]),
37
+ topByWeight: vi.fn().mockReturnValue([synapse()]),
38
+ topDiverse: vi.fn().mockReturnValue([synapse()]),
39
+ countNodes: vi.fn().mockReturnValue(10),
40
+ totalCount: vi.fn().mockReturnValue(25),
41
+ avgWeight: vi.fn().mockReturnValue(0.5),
42
+ countByType: vi.fn().mockReturnValue({ test: 25 }),
43
+ };
44
+ }
45
+ const config = {
46
+ initialWeight: 0.1,
47
+ learningRate: 0.15,
48
+ pruneThreshold: 0.05,
49
+ decayHalfLifeDays: 45,
50
+ decayAfterDays: 14,
51
+ maxDepth: 3,
52
+ minActivationWeight: 0.2,
53
+ };
54
+ describe('BaseSynapseManager', () => {
55
+ let repo;
56
+ let manager;
57
+ beforeEach(() => {
58
+ repo = mockRepo();
59
+ manager = new BaseSynapseManager(repo, config);
60
+ });
61
+ it('strengthen delegates to hebbian', () => {
62
+ const result = manager.strengthen({ type: 'a', id: 1 }, { type: 'b', id: 2 }, 'test');
63
+ expect(result).toBeDefined();
64
+ expect(repo.update).toHaveBeenCalled();
65
+ });
66
+ it('weaken delegates to hebbian', () => {
67
+ manager.weaken(1, 0.5);
68
+ expect(repo.getById).toHaveBeenCalledWith(1);
69
+ });
70
+ it('find delegates to repo', () => {
71
+ manager.find({ type: 'a', id: 1 }, { type: 'b', id: 1 }, 'test');
72
+ expect(repo.findBySourceTarget).toHaveBeenCalled();
73
+ });
74
+ it('activate uses config defaults', () => {
75
+ manager.activate({ type: 'a', id: 1 });
76
+ expect(repo.getOutgoing).toHaveBeenCalled();
77
+ });
78
+ it('runDecay returns results', () => {
79
+ const result = manager.runDecay();
80
+ expect(result).toEqual({ decayed: 0, pruned: 0 });
81
+ });
82
+ it('getNetworkStats returns stats', () => {
83
+ const stats = manager.getNetworkStats();
84
+ expect(stats.totalNodes).toBe(10);
85
+ expect(stats.totalSynapses).toBe(25);
86
+ expect(stats.avgWeight).toBe(0.5);
87
+ });
88
+ it('getStrongestSynapses delegates to repo', () => {
89
+ const result = manager.getStrongestSynapses(10);
90
+ expect(result).toHaveLength(1);
91
+ expect(repo.topByWeight).toHaveBeenCalledWith(10);
92
+ });
93
+ });
94
+ //# sourceMappingURL=synapse-manager.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"synapse-manager.test.js","sourceRoot":"","sources":["../../../src/synapses/__tests__/synapse-manager.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { NodeRef, ActivationResult, SynapseRepoInterface } from './types.js';
2
+ /**
3
+ * Spreading activation through the synapse network.
4
+ * BFS traversal that propagates energy through weighted connections.
5
+ */
6
+ export declare function spreadingActivation(repo: SynapseRepoInterface, startNode: NodeRef, maxDepth?: number, minWeight?: number): ActivationResult[];
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Spreading activation through the synapse network.
3
+ * BFS traversal that propagates energy through weighted connections.
4
+ */
5
+ export function spreadingActivation(repo, startNode, maxDepth = 3, minWeight = 0.2) {
6
+ const visited = new Set();
7
+ const results = [];
8
+ const queue = [{ node: startNode, depth: 0, pathWeight: 1.0, path: [] }];
9
+ while (queue.length > 0) {
10
+ const current = queue.shift();
11
+ const key = `${current.node.type}:${current.node.id}`;
12
+ if (visited.has(key))
13
+ continue;
14
+ if (current.depth > maxDepth)
15
+ continue;
16
+ if (current.pathWeight < minWeight)
17
+ continue;
18
+ visited.add(key);
19
+ if (current.depth > 0) {
20
+ results.push({
21
+ node: current.node,
22
+ activation: current.pathWeight,
23
+ depth: current.depth,
24
+ path: current.path,
25
+ });
26
+ }
27
+ const outgoing = repo.getOutgoing(current.node.type, current.node.id);
28
+ const incoming = repo.getIncoming(current.node.type, current.node.id);
29
+ for (const synapse of outgoing) {
30
+ const nextWeight = current.pathWeight * synapse.weight;
31
+ if (nextWeight >= minWeight) {
32
+ queue.push({
33
+ node: { type: synapse.target_type, id: synapse.target_id },
34
+ depth: current.depth + 1,
35
+ pathWeight: nextWeight,
36
+ path: [...current.path, `--${synapse.synapse_type}-->`],
37
+ });
38
+ }
39
+ }
40
+ for (const synapse of incoming) {
41
+ const nextWeight = current.pathWeight * synapse.weight;
42
+ if (nextWeight >= minWeight) {
43
+ queue.push({
44
+ node: { type: synapse.source_type, id: synapse.source_id },
45
+ depth: current.depth + 1,
46
+ pathWeight: nextWeight,
47
+ path: [...current.path, `<--${synapse.synapse_type}--`],
48
+ });
49
+ }
50
+ }
51
+ }
52
+ return results.sort((a, b) => b.activation - a.activation);
53
+ }
54
+ //# sourceMappingURL=activation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"activation.js","sourceRoot":"","sources":["../../src/synapses/activation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { DecayConfig, SynapseRepoInterface } from './types.js';
2
+ /**
3
+ * Apply time-based decay to all stale synapses.
4
+ * Prunes synapses that decay below the threshold.
5
+ */
6
+ export declare function decayAll(repo: SynapseRepoInterface, config: DecayConfig): {
7
+ decayed: number;
8
+ pruned: number;
9
+ };
@@ -0,0 +1,26 @@
1
+ import { timeDecayFactor } from '../math/time-decay.js';
2
+ /**
3
+ * Apply time-based decay to all stale synapses.
4
+ * Prunes synapses that decay below the threshold.
5
+ */
6
+ export function decayAll(repo, config) {
7
+ const cutoff = new Date();
8
+ cutoff.setDate(cutoff.getDate() - config.decayAfterDays);
9
+ const stale = repo.findInactiveSince(cutoff.toISOString());
10
+ let pruned = 0;
11
+ let decayed = 0;
12
+ for (const synapse of stale) {
13
+ const factor = timeDecayFactor(synapse.last_activated_at, config.decayHalfLifeDays);
14
+ const newWeight = synapse.weight * factor;
15
+ if (newWeight < config.pruneThreshold) {
16
+ repo.delete(synapse.id);
17
+ pruned++;
18
+ }
19
+ else {
20
+ repo.update(synapse.id, { weight: newWeight });
21
+ decayed++;
22
+ }
23
+ }
24
+ return { decayed, pruned };
25
+ }
26
+ //# sourceMappingURL=decay.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decay.js","sourceRoot":"","sources":["../../src/synapses/decay.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAExD;;;GAGG;AACH,MAAM,UAAU,QAAQ,CACtB,IAA0B,EAC1B,MAAmB;IAEnB,MAAM,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;IAC1B,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,GAAG,MAAM,CAAC,cAAc,CAAC,CAAC;IAEzD,MAAM,KAAK,GAAG,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC;IAC3D,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,IAAI,OAAO,GAAG,CAAC,CAAC;IAEhB,KAAK,MAAM,OAAO,IAAI,KAAK,EAAE,CAAC;QAC5B,MAAM,MAAM,GAAG,eAAe,CAAC,OAAO,CAAC,iBAAiB,EAAE,MAAM,CAAC,iBAAiB,CAAC,CAAC;QACpF,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,GAAG,MAAM,CAAC;QAE1C,IAAI,SAAS,GAAG,MAAM,CAAC,cAAc,EAAE,CAAC;YACtC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YACxB,MAAM,EAAE,CAAC;QACX,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;YAC/C,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;AAC7B,CAAC"}
@@ -0,0 +1,12 @@
1
+ import type { NodeRef, SynapseRecord, HebbianConfig, SynapseRepoInterface } from './types.js';
2
+ /**
3
+ * Hebbian learning: strengthen a synapse between two nodes.
4
+ * If the synapse exists, weight grows asymptotically toward 1.0.
5
+ * If new, creates with initialWeight.
6
+ */
7
+ export declare function strengthen(repo: SynapseRepoInterface, source: NodeRef, target: NodeRef, synapseType: string, config: HebbianConfig, context?: Record<string, unknown>): SynapseRecord;
8
+ /**
9
+ * Weaken a synapse by a multiplicative factor.
10
+ * Prunes if weight drops below threshold.
11
+ */
12
+ export declare function weaken(repo: SynapseRepoInterface, synapseId: number, config: HebbianConfig, factor?: number): void;
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Hebbian learning: strengthen a synapse between two nodes.
3
+ * If the synapse exists, weight grows asymptotically toward 1.0.
4
+ * If new, creates with initialWeight.
5
+ */
6
+ export function strengthen(repo, source, target, synapseType, config, context) {
7
+ const existing = repo.findBySourceTarget(source.type, source.id, target.type, target.id, synapseType);
8
+ if (existing) {
9
+ // Hebbian: weight grows logarithmically, saturates at 1.0
10
+ const newWeight = Math.min(1.0, existing.weight + (1.0 - existing.weight) * config.learningRate);
11
+ repo.update(existing.id, {
12
+ weight: newWeight,
13
+ activation_count: existing.activation_count + 1,
14
+ last_activated_at: new Date().toISOString(),
15
+ });
16
+ return { ...existing, weight: newWeight, activation_count: existing.activation_count + 1 };
17
+ }
18
+ const id = repo.create({
19
+ source_type: source.type,
20
+ source_id: source.id,
21
+ target_type: target.type,
22
+ target_id: target.id,
23
+ synapse_type: synapseType,
24
+ weight: config.initialWeight,
25
+ metadata: context ? JSON.stringify(context) : null,
26
+ });
27
+ return repo.getById(id);
28
+ }
29
+ /**
30
+ * Weaken a synapse by a multiplicative factor.
31
+ * Prunes if weight drops below threshold.
32
+ */
33
+ export function weaken(repo, synapseId, config, factor = 0.5) {
34
+ const synapse = repo.getById(synapseId);
35
+ if (!synapse)
36
+ return;
37
+ const newWeight = synapse.weight * factor;
38
+ if (newWeight < config.pruneThreshold) {
39
+ repo.delete(synapseId);
40
+ }
41
+ else {
42
+ repo.update(synapseId, { weight: newWeight });
43
+ }
44
+ }
45
+ //# sourceMappingURL=hebbian.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hebbian.js","sourceRoot":"","sources":["../../src/synapses/hebbian.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,MAAM,UAAU,UAAU,CACxB,IAA0B,EAC1B,MAAe,EACf,MAAe,EACf,WAAmB,EACnB,MAAqB,EACrB,OAAiC;IAEjC,MAAM,QAAQ,GAAG,IAAI,CAAC,kBAAkB,CACtC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,EAAE,WAAW,CAC5D,CAAC;IAEF,IAAI,QAAQ,EAAE,CAAC;QACb,0DAA0D;QAC1D,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CACxB,GAAG,EACH,QAAQ,CAAC,MAAM,GAAG,CAAC,GAAG,GAAG,QAAQ,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,YAAY,CAChE,CAAC;QACF,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,EAAE;YACvB,MAAM,EAAE,SAAS;YACjB,gBAAgB,EAAE,QAAQ,CAAC,gBAAgB,GAAG,CAAC;YAC/C,iBAAiB,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SAC5C,CAAC,CAAC;QACH,OAAO,EAAE,GAAG,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,gBAAgB,EAAE,QAAQ,CAAC,gBAAgB,GAAG,CAAC,EAAE,CAAC;IAC7F,CAAC;IAED,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC;QACrB,WAAW,EAAE,MAAM,CAAC,IAAI;QACxB,SAAS,EAAE,MAAM,CAAC,EAAE;QACpB,WAAW,EAAE,MAAM,CAAC,IAAI;QACxB,SAAS,EAAE,MAAM,CAAC,EAAE;QACpB,YAAY,EAAE,WAAW;QACzB,MAAM,EAAE,MAAM,CAAC,aAAa;QAC5B,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI;KACnD,CAAC,CAAC;IAEH,OAAO,IAAI,CAAC,OAAO,CAAC,EAAE,CAAE,CAAC;AAC3B,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,MAAM,CACpB,IAA0B,EAC1B,SAAiB,EACjB,MAAqB,EACrB,SAAiB,GAAG;IAEpB,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IACxC,IAAI,CAAC,OAAO;QAAE,OAAO;IAErB,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,GAAG,MAAM,CAAC;IAC1C,IAAI,SAAS,GAAG,MAAM,CAAC,cAAc,EAAE,CAAC;QACtC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACzB,CAAC;SAAM,CAAC;QACN,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;IAChD,CAAC;AACH,CAAC"}
@@ -0,0 +1,6 @@
1
+ import type { PathNode, SynapsePath, SynapseRepoInterface } from './types.js';
2
+ /**
3
+ * Find the highest-weight path between two nodes in the synapse network.
4
+ * Uses BFS with bidirectional traversal (outgoing + incoming).
5
+ */
6
+ export declare function findPath(repo: SynapseRepoInterface, from: PathNode, to: PathNode, maxDepth?: number): SynapsePath | null;
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Find the highest-weight path between two nodes in the synapse network.
3
+ * Uses BFS with bidirectional traversal (outgoing + incoming).
4
+ */
5
+ export function findPath(repo, from, to, maxDepth = 5) {
6
+ const visited = new Set();
7
+ const queue = [{ node: from, path: [], totalWeight: 1.0 }];
8
+ let bestPath = null;
9
+ while (queue.length > 0) {
10
+ const current = queue.shift();
11
+ const key = `${current.node.type}:${current.node.id}`;
12
+ if (visited.has(key))
13
+ continue;
14
+ visited.add(key);
15
+ if (current.node.type === to.type && current.node.id === to.id) {
16
+ if (!bestPath || current.totalWeight > bestPath.totalWeight) {
17
+ bestPath = {
18
+ from,
19
+ to,
20
+ synapses: current.path,
21
+ totalWeight: current.totalWeight,
22
+ hops: current.path.length,
23
+ };
24
+ }
25
+ continue;
26
+ }
27
+ if (current.path.length >= maxDepth)
28
+ continue;
29
+ const outgoing = repo.getOutgoing(current.node.type, current.node.id);
30
+ for (const synapse of outgoing) {
31
+ const targetKey = `${synapse.target_type}:${synapse.target_id}`;
32
+ if (!visited.has(targetKey)) {
33
+ queue.push({
34
+ node: { type: synapse.target_type, id: synapse.target_id },
35
+ path: [...current.path, synapse],
36
+ totalWeight: current.totalWeight * synapse.weight,
37
+ });
38
+ }
39
+ }
40
+ const incoming = repo.getIncoming(current.node.type, current.node.id);
41
+ for (const synapse of incoming) {
42
+ const sourceKey = `${synapse.source_type}:${synapse.source_id}`;
43
+ if (!visited.has(sourceKey)) {
44
+ queue.push({
45
+ node: { type: synapse.source_type, id: synapse.source_id },
46
+ path: [...current.path, synapse],
47
+ totalWeight: current.totalWeight * synapse.weight,
48
+ });
49
+ }
50
+ }
51
+ }
52
+ return bestPath;
53
+ }
54
+ //# sourceMappingURL=pathfinder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pathfinder.js","sourceRoot":"","sources":["../../src/synapses/pathfinder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ import type { NodeRef, SynapseRecord, ActivationResult, SynapsePath, NetworkStats, SynapseRepoInterface } from './types.js';
2
+ export interface SynapseManagerConfig {
3
+ initialWeight: number;
4
+ learningRate: number;
5
+ pruneThreshold: number;
6
+ decayHalfLifeDays: number;
7
+ decayAfterDays: number;
8
+ maxDepth: number;
9
+ minActivationWeight: number;
10
+ }
11
+ /**
12
+ * Base synapse manager shared across all brains.
13
+ * Each brain extends this with domain-specific context methods
14
+ * (e.g. getErrorContext, getPostContext, getTradeContext).
15
+ */
16
+ export declare class BaseSynapseManager {
17
+ protected repo: SynapseRepoInterface;
18
+ protected config: SynapseManagerConfig;
19
+ protected logger: import("winston").Logger;
20
+ constructor(repo: SynapseRepoInterface, config: SynapseManagerConfig);
21
+ strengthen(source: NodeRef, target: NodeRef, synapseType: string, context?: Record<string, unknown>): SynapseRecord;
22
+ weaken(synapseId: number, factor?: number): void;
23
+ find(source: NodeRef, target: NodeRef, synapseType: string): SynapseRecord | undefined;
24
+ activate(startNode: NodeRef, maxDepth?: number, minWeight?: number): ActivationResult[];
25
+ findPath(from: NodeRef, to: NodeRef, maxDepth?: number): SynapsePath | null;
26
+ runDecay(): {
27
+ decayed: number;
28
+ pruned: number;
29
+ };
30
+ getStrongestSynapses(limit?: number): SynapseRecord[];
31
+ getDiverseSynapses(perType?: number): SynapseRecord[];
32
+ getNetworkStats(): NetworkStats;
33
+ private hebbianConfig;
34
+ private decayConfig;
35
+ }