@timmeck/brain-core 2.36.23 → 2.36.25

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 (119) hide show
  1. package/command-center.html +259 -153
  2. package/dist/active-learning/__tests__/active-learning.test.d.ts +1 -0
  3. package/dist/active-learning/__tests__/active-learning.test.js +132 -0
  4. package/dist/active-learning/__tests__/active-learning.test.js.map +1 -0
  5. package/dist/active-learning/active-learner.d.ts +79 -0
  6. package/dist/active-learning/active-learner.js +224 -0
  7. package/dist/active-learning/active-learner.js.map +1 -0
  8. package/dist/active-learning/index.d.ts +2 -0
  9. package/dist/active-learning/index.js +2 -0
  10. package/dist/active-learning/index.js.map +1 -0
  11. package/dist/code-health/__tests__/code-health.test.d.ts +1 -0
  12. package/dist/code-health/__tests__/code-health.test.js +123 -0
  13. package/dist/code-health/__tests__/code-health.test.js.map +1 -0
  14. package/dist/code-health/health-monitor.d.ts +55 -0
  15. package/dist/code-health/health-monitor.js +180 -0
  16. package/dist/code-health/health-monitor.js.map +1 -0
  17. package/dist/code-health/index.d.ts +2 -0
  18. package/dist/code-health/index.js +2 -0
  19. package/dist/code-health/index.js.map +1 -0
  20. package/dist/consensus/__tests__/consensus.test.d.ts +1 -0
  21. package/dist/consensus/__tests__/consensus.test.js +159 -0
  22. package/dist/consensus/__tests__/consensus.test.js.map +1 -0
  23. package/dist/consensus/consensus-engine.d.ts +81 -0
  24. package/dist/consensus/consensus-engine.js +237 -0
  25. package/dist/consensus/consensus-engine.js.map +1 -0
  26. package/dist/consensus/index.d.ts +2 -0
  27. package/dist/consensus/index.js +2 -0
  28. package/dist/consensus/index.js.map +1 -0
  29. package/dist/feedback/__tests__/feedback-engine.test.d.ts +1 -0
  30. package/dist/feedback/__tests__/feedback-engine.test.js +156 -0
  31. package/dist/feedback/__tests__/feedback-engine.test.js.map +1 -0
  32. package/dist/feedback/feedback-engine.d.ts +61 -0
  33. package/dist/feedback/feedback-engine.js +203 -0
  34. package/dist/feedback/feedback-engine.js.map +1 -0
  35. package/dist/feedback/index.d.ts +2 -0
  36. package/dist/feedback/index.js +2 -0
  37. package/dist/feedback/index.js.map +1 -0
  38. package/dist/index.d.ts +32 -0
  39. package/dist/index.js +27 -0
  40. package/dist/index.js.map +1 -1
  41. package/dist/knowledge-graph/__tests__/knowledge-graph.test.d.ts +1 -0
  42. package/dist/knowledge-graph/__tests__/knowledge-graph.test.js +215 -0
  43. package/dist/knowledge-graph/__tests__/knowledge-graph.test.js.map +1 -0
  44. package/dist/knowledge-graph/fact-extractor.d.ts +23 -0
  45. package/dist/knowledge-graph/fact-extractor.js +70 -0
  46. package/dist/knowledge-graph/fact-extractor.js.map +1 -0
  47. package/dist/knowledge-graph/graph-engine.d.ts +78 -0
  48. package/dist/knowledge-graph/graph-engine.js +276 -0
  49. package/dist/knowledge-graph/graph-engine.js.map +1 -0
  50. package/dist/knowledge-graph/index.d.ts +4 -0
  51. package/dist/knowledge-graph/index.js +3 -0
  52. package/dist/knowledge-graph/index.js.map +1 -0
  53. package/dist/proactive/__tests__/proactive-engine.test.d.ts +1 -0
  54. package/dist/proactive/__tests__/proactive-engine.test.js +183 -0
  55. package/dist/proactive/__tests__/proactive-engine.test.js.map +1 -0
  56. package/dist/proactive/index.d.ts +2 -0
  57. package/dist/proactive/index.js +2 -0
  58. package/dist/proactive/index.js.map +1 -0
  59. package/dist/proactive/proactive-engine.d.ts +86 -0
  60. package/dist/proactive/proactive-engine.js +252 -0
  61. package/dist/proactive/proactive-engine.js.map +1 -0
  62. package/dist/rag/__tests__/rag-engine.test.d.ts +1 -0
  63. package/dist/rag/__tests__/rag-engine.test.js +235 -0
  64. package/dist/rag/__tests__/rag-engine.test.js.map +1 -0
  65. package/dist/rag/index.d.ts +4 -0
  66. package/dist/rag/index.js +3 -0
  67. package/dist/rag/index.js.map +1 -0
  68. package/dist/rag/rag-engine.d.ts +98 -0
  69. package/dist/rag/rag-engine.js +310 -0
  70. package/dist/rag/rag-engine.js.map +1 -0
  71. package/dist/rag/rag-indexer.d.ts +52 -0
  72. package/dist/rag/rag-indexer.js +144 -0
  73. package/dist/rag/rag-indexer.js.map +1 -0
  74. package/dist/research/__tests__/autonomy-features.test.d.ts +1 -0
  75. package/dist/research/__tests__/autonomy-features.test.js +155 -0
  76. package/dist/research/__tests__/autonomy-features.test.js.map +1 -0
  77. package/dist/research/__tests__/semantic-compressor.test.d.ts +1 -0
  78. package/dist/research/__tests__/semantic-compressor.test.js +153 -0
  79. package/dist/research/__tests__/semantic-compressor.test.js.map +1 -0
  80. package/dist/research/semantic-compressor.d.ts +55 -0
  81. package/dist/research/semantic-compressor.js +227 -0
  82. package/dist/research/semantic-compressor.js.map +1 -0
  83. package/dist/teaching/__tests__/teaching.test.d.ts +1 -0
  84. package/dist/teaching/__tests__/teaching.test.js +151 -0
  85. package/dist/teaching/__tests__/teaching.test.js.map +1 -0
  86. package/dist/teaching/curriculum.d.ts +32 -0
  87. package/dist/teaching/curriculum.js +89 -0
  88. package/dist/teaching/curriculum.js.map +1 -0
  89. package/dist/teaching/index.d.ts +4 -0
  90. package/dist/teaching/index.js +3 -0
  91. package/dist/teaching/index.js.map +1 -0
  92. package/dist/teaching/teaching-protocol.d.ts +74 -0
  93. package/dist/teaching/teaching-protocol.js +164 -0
  94. package/dist/teaching/teaching-protocol.js.map +1 -0
  95. package/dist/tool-learning/__tests__/tool-learning.test.d.ts +1 -0
  96. package/dist/tool-learning/__tests__/tool-learning.test.js +187 -0
  97. package/dist/tool-learning/__tests__/tool-learning.test.js.map +1 -0
  98. package/dist/tool-learning/index.d.ts +4 -0
  99. package/dist/tool-learning/index.js +3 -0
  100. package/dist/tool-learning/index.js.map +1 -0
  101. package/dist/tool-learning/tool-patterns.d.ts +47 -0
  102. package/dist/tool-learning/tool-patterns.js +125 -0
  103. package/dist/tool-learning/tool-patterns.js.map +1 -0
  104. package/dist/tool-learning/tool-tracker.d.ts +58 -0
  105. package/dist/tool-learning/tool-tracker.js +135 -0
  106. package/dist/tool-learning/tool-tracker.js.map +1 -0
  107. package/dist/user-model/__tests__/user-model.test.d.ts +1 -0
  108. package/dist/user-model/__tests__/user-model.test.js +142 -0
  109. package/dist/user-model/__tests__/user-model.test.js.map +1 -0
  110. package/dist/user-model/adaptive-context.d.ts +18 -0
  111. package/dist/user-model/adaptive-context.js +46 -0
  112. package/dist/user-model/adaptive-context.js.map +1 -0
  113. package/dist/user-model/index.d.ts +4 -0
  114. package/dist/user-model/index.js +3 -0
  115. package/dist/user-model/index.js.map +1 -0
  116. package/dist/user-model/user-model.d.ts +53 -0
  117. package/dist/user-model/user-model.js +204 -0
  118. package/dist/user-model/user-model.js.map +1 -0
  119. package/package.json +1 -1
@@ -0,0 +1,151 @@
1
+ import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
2
+ import Database from 'better-sqlite3';
3
+ import { TeachingProtocol, runTeachingMigration } from '../teaching-protocol.js';
4
+ import { Curriculum, runCurriculumMigration } from '../curriculum.js';
5
+ vi.mock('../../utils/logger.js', () => ({
6
+ getLogger: () => ({
7
+ info: vi.fn(),
8
+ warn: vi.fn(),
9
+ error: vi.fn(),
10
+ debug: vi.fn(),
11
+ }),
12
+ }));
13
+ describe('TeachingProtocol', () => {
14
+ let db;
15
+ let protocol;
16
+ beforeEach(() => {
17
+ db = new Database(':memory:');
18
+ protocol = new TeachingProtocol(db, { brainName: 'brain' });
19
+ });
20
+ afterEach(() => {
21
+ db.close();
22
+ });
23
+ it('teach creates a sent lesson', () => {
24
+ const lesson = protocol.teach('trading-brain', {
25
+ domain: 'error-handling',
26
+ principle: 'Always validate input before processing',
27
+ evidence: 'Observed 30% fewer crashes after validation',
28
+ applicability: 0.8,
29
+ });
30
+ expect(lesson.id).toBeDefined();
31
+ expect(lesson.direction).toBe('sent');
32
+ expect(lesson.targetBrain).toBe('trading-brain');
33
+ expect(lesson.sourceBrain).toBe('brain');
34
+ expect(lesson.domain).toBe('error-handling');
35
+ expect(lesson.principle).toBe('Always validate input before processing');
36
+ expect(lesson.applicability).toBe(0.8);
37
+ });
38
+ it('learn accepts relevant lesson', () => {
39
+ const result = protocol.learn({
40
+ sourceBrain: 'trading-brain',
41
+ domain: 'code patterns',
42
+ principle: 'Error handling reduces code bugs significantly',
43
+ evidence: 'Proven in production for 6 months',
44
+ applicability: 0.9,
45
+ });
46
+ // Contains keywords matching 'brain' domain ('error', 'code', 'bug')
47
+ expect(result.relevanceScore).toBeGreaterThan(0);
48
+ expect(result.accepted).toBe(true);
49
+ });
50
+ it('learn rejects irrelevant lesson', () => {
51
+ const result = protocol.learn({
52
+ sourceBrain: 'marketing-brain',
53
+ domain: 'astronomy',
54
+ principle: 'Stars rotate around galactic center',
55
+ applicability: 0.1,
56
+ });
57
+ // No keyword overlap with 'brain' domain
58
+ expect(result.relevanceScore).toBeLessThan(0.3);
59
+ expect(result.accepted).toBe(false);
60
+ });
61
+ it('requestLesson creates a request record', () => {
62
+ const request = protocol.requestLesson('trading-brain', 'market signals');
63
+ expect(request.id).toBeDefined();
64
+ expect(request.direction).toBe('sent');
65
+ expect(request.targetBrain).toBe('trading-brain');
66
+ expect(request.domain).toBe('market signals');
67
+ expect(request.principle).toContain('REQUEST');
68
+ });
69
+ it('getHistory returns lessons in order', () => {
70
+ protocol.teach('trading-brain', { domain: 'a', principle: 'First' });
71
+ protocol.teach('marketing-brain', { domain: 'b', principle: 'Second' });
72
+ protocol.learn({ sourceBrain: 'trading-brain', domain: 'c', principle: 'Third about error code' });
73
+ const all = protocol.getHistory();
74
+ expect(all.length).toBe(3);
75
+ // Most recent first
76
+ expect(all[0].principle).toContain('Third');
77
+ const sent = protocol.getHistory('sent');
78
+ expect(sent.length).toBe(2);
79
+ const received = protocol.getHistory('received');
80
+ expect(received.length).toBe(1);
81
+ });
82
+ it('getStatus returns correct counts', () => {
83
+ protocol.teach('trading-brain', { domain: 'x', principle: 'A' });
84
+ protocol.teach('marketing-brain', { domain: 'y', principle: 'B' });
85
+ protocol.learn({ sourceBrain: 'trading-brain', domain: 'z', principle: 'Error code bug fix', applicability: 0.9 });
86
+ const status = protocol.getStatus();
87
+ expect(status.totalSent).toBe(2);
88
+ expect(status.totalReceived).toBe(1);
89
+ expect(status.acceptedCount).toBeGreaterThanOrEqual(1);
90
+ expect(typeof status.avgRelevance).toBe('number');
91
+ });
92
+ it('migration is idempotent (teaching)', () => {
93
+ runTeachingMigration(db);
94
+ runTeachingMigration(db);
95
+ const tables = db
96
+ .prepare("SELECT name FROM sqlite_master WHERE type='table' AND name='teaching_lessons'")
97
+ .all();
98
+ expect(tables.length).toBe(1);
99
+ });
100
+ });
101
+ describe('Curriculum', () => {
102
+ let db;
103
+ let curriculum;
104
+ beforeEach(() => {
105
+ db = new Database(':memory:');
106
+ curriculum = new Curriculum(db);
107
+ });
108
+ afterEach(() => {
109
+ db.close();
110
+ });
111
+ it('registerPrinciple stores item', () => {
112
+ const item = curriculum.registerPrinciple('brain', 'error-handling', 'Always validate input', 0.8);
113
+ expect(item.id).toBeDefined();
114
+ expect(item.brainName).toBe('brain');
115
+ expect(item.domain).toBe('error-handling');
116
+ expect(item.strength).toBe(0.8);
117
+ expect(item.teachable).toBe(false);
118
+ });
119
+ it('getTeachable returns only teachable items', () => {
120
+ const item1 = curriculum.registerPrinciple('brain', 'd1', 'P1', 0.9);
121
+ curriculum.registerPrinciple('brain', 'd2', 'P2', 0.7);
122
+ // Nothing teachable yet
123
+ expect(curriculum.getTeachable('brain').length).toBe(0);
124
+ // Mark one as teachable
125
+ curriculum.markTeachable(item1.id);
126
+ const teachable = curriculum.getTeachable('brain');
127
+ expect(teachable.length).toBe(1);
128
+ expect(teachable[0].principle).toBe('P1');
129
+ expect(teachable[0].teachable).toBe(true);
130
+ });
131
+ it('getStatus returns summary', () => {
132
+ curriculum.registerPrinciple('brain', 'd1', 'P1', 0.9);
133
+ curriculum.registerPrinciple('trading-brain', 'd2', 'P2', 0.7);
134
+ const item3 = curriculum.registerPrinciple('brain', 'd3', 'P3', 0.6);
135
+ curriculum.markTeachable(item3.id);
136
+ const status = curriculum.getStatus();
137
+ expect(status.totalPrinciples).toBe(3);
138
+ expect(status.teachableCount).toBe(1);
139
+ expect(status.byBrain['brain']).toBe(2);
140
+ expect(status.byBrain['trading-brain']).toBe(1);
141
+ });
142
+ it('migration is idempotent (curriculum)', () => {
143
+ runCurriculumMigration(db);
144
+ runCurriculumMigration(db);
145
+ const tables = db
146
+ .prepare("SELECT name FROM sqlite_master WHERE type='table' AND name='curriculum_items'")
147
+ .all();
148
+ expect(tables.length).toBe(1);
149
+ });
150
+ });
151
+ //# sourceMappingURL=teaching.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"teaching.test.js","sourceRoot":"","sources":["../../../src/teaching/__tests__/teaching.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACzE,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AACtC,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AACjF,OAAO,EAAE,UAAU,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAEtE,EAAE,CAAC,IAAI,CAAC,uBAAuB,EAAE,GAAG,EAAE,CAAC,CAAC;IACtC,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC;QAChB,IAAI,EAAE,EAAE,CAAC,EAAE,EAAE;QACb,IAAI,EAAE,EAAE,CAAC,EAAE,EAAE;QACb,KAAK,EAAE,EAAE,CAAC,EAAE,EAAE;QACd,KAAK,EAAE,EAAE,CAAC,EAAE,EAAE;KACf,CAAC;CACH,CAAC,CAAC,CAAC;AAEJ,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;IAChC,IAAI,EAAqB,CAAC;IAC1B,IAAI,QAA0B,CAAC;IAE/B,UAAU,CAAC,GAAG,EAAE;QACd,EAAE,GAAG,IAAI,QAAQ,CAAC,UAAU,CAAC,CAAC;QAC9B,QAAQ,GAAG,IAAI,gBAAgB,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,CAAC;IAC9D,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,EAAE,CAAC,KAAK,EAAE,CAAC;IACb,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;QACrC,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,eAAe,EAAE;YAC7C,MAAM,EAAE,gBAAgB;YACxB,SAAS,EAAE,yCAAyC;YACpD,QAAQ,EAAE,6CAA6C;YACvD,aAAa,EAAE,GAAG;SACnB,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;QAChC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACtC,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QACjD,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACzC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QAC7C,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,yCAAyC,CAAC,CAAC;QACzE,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;QACvC,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC;YAC5B,WAAW,EAAE,eAAe;YAC5B,MAAM,EAAE,eAAe;YACvB,SAAS,EAAE,gDAAgD;YAC3D,QAAQ,EAAE,mCAAmC;YAC7C,aAAa,EAAE,GAAG;SACnB,CAAC,CAAC;QAEH,qEAAqE;QACrE,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QACjD,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;QACzC,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC;YAC5B,WAAW,EAAE,iBAAiB;YAC9B,MAAM,EAAE,WAAW;YACnB,SAAS,EAAE,qCAAqC;YAChD,aAAa,EAAE,GAAG;SACnB,CAAC,CAAC;QAEH,yCAAyC;QACzC,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;QAChD,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;QAChD,MAAM,OAAO,GAAG,QAAQ,CAAC,aAAa,CAAC,eAAe,EAAE,gBAAgB,CAAC,CAAC;QAE1E,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;QACjC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACvC,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QAClD,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QAC9C,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC7C,QAAQ,CAAC,KAAK,CAAC,eAAe,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,CAAC;QACrE,QAAQ,CAAC,KAAK,CAAC,iBAAiB,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,CAAC;QACxE,QAAQ,CAAC,KAAK,CAAC,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,EAAE,GAAG,EAAE,SAAS,EAAE,wBAAwB,EAAE,CAAC,CAAC;QAEnG,MAAM,GAAG,GAAG,QAAQ,CAAC,UAAU,EAAE,CAAC;QAClC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC3B,oBAAoB;QACpB,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QAE5C,MAAM,IAAI,GAAG,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QACzC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAE5B,MAAM,QAAQ,GAAG,QAAQ,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;QACjD,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;QAC1C,QAAQ,CAAC,KAAK,CAAC,eAAe,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC;QACjE,QAAQ,CAAC,KAAK,CAAC,iBAAiB,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC;QACnE,QAAQ,CAAC,KAAK,CAAC,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,EAAE,GAAG,EAAE,SAAS,EAAE,oBAAoB,EAAE,aAAa,EAAE,GAAG,EAAE,CAAC,CAAC;QAEnH,MAAM,MAAM,GAAG,QAAQ,CAAC,SAAS,EAAE,CAAC;QACpC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACjC,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACrC,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC;QACvD,MAAM,CAAC,OAAO,MAAM,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;QAC5C,oBAAoB,CAAC,EAAE,CAAC,CAAC;QACzB,oBAAoB,CAAC,EAAE,CAAC,CAAC;QAEzB,MAAM,MAAM,GAAG,EAAE;aACd,OAAO,CAAC,+EAA+E,CAAC;aACxF,GAAG,EAAE,CAAC;QACT,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAChC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE;IAC1B,IAAI,EAAqB,CAAC;IAC1B,IAAI,UAAsB,CAAC;IAE3B,UAAU,CAAC,GAAG,EAAE;QACd,EAAE,GAAG,IAAI,QAAQ,CAAC,UAAU,CAAC,CAAC;QAC9B,UAAU,GAAG,IAAI,UAAU,CAAC,EAAE,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,EAAE,CAAC,KAAK,EAAE,CAAC;IACb,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;QACvC,MAAM,IAAI,GAAG,UAAU,CAAC,iBAAiB,CAAC,OAAO,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,GAAG,CAAC,CAAC;QACnG,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;QAC9B,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACrC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QAC3C,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAChC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACnD,MAAM,KAAK,GAAG,UAAU,CAAC,iBAAiB,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;QACrE,UAAU,CAAC,iBAAiB,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;QAEvD,wBAAwB;QACxB,MAAM,CAAC,UAAU,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAExD,wBAAwB;QACxB,UAAU,CAAC,aAAa,CAAC,KAAK,CAAC,EAAG,CAAC,CAAC;QAEpC,MAAM,SAAS,GAAG,UAAU,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;QACnD,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACjC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1C,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2BAA2B,EAAE,GAAG,EAAE;QACnC,UAAU,CAAC,iBAAiB,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;QACvD,UAAU,CAAC,iBAAiB,CAAC,eAAe,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;QAC/D,MAAM,KAAK,GAAG,UAAU,CAAC,iBAAiB,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;QACrE,UAAU,CAAC,aAAa,CAAC,KAAK,CAAC,EAAG,CAAC,CAAC;QAEpC,MAAM,MAAM,GAAG,UAAU,CAAC,SAAS,EAAE,CAAC;QACtC,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACvC,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACtC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACxC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAC9C,sBAAsB,CAAC,EAAE,CAAC,CAAC;QAC3B,sBAAsB,CAAC,EAAE,CAAC,CAAC;QAE3B,MAAM,MAAM,GAAG,EAAE;aACd,OAAO,CAAC,+EAA+E,CAAC;aACxF,GAAG,EAAE,CAAC;QACT,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAChC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,32 @@
1
+ import type Database from 'better-sqlite3';
2
+ export interface CurriculumItem {
3
+ id?: number;
4
+ brainName: string;
5
+ domain: string;
6
+ principle: string;
7
+ strength: number;
8
+ teachable: boolean;
9
+ createdAt?: string;
10
+ }
11
+ export interface CurriculumStatus {
12
+ totalPrinciples: number;
13
+ teachableCount: number;
14
+ byBrain: Record<string, number>;
15
+ }
16
+ export declare function runCurriculumMigration(db: Database.Database): void;
17
+ export declare class Curriculum {
18
+ private readonly db;
19
+ private readonly log;
20
+ private readonly stmtUpsert;
21
+ private readonly stmtGetTeachable;
22
+ private readonly stmtMarkTeachable;
23
+ private readonly stmtTotalPrinciples;
24
+ private readonly stmtTeachableCount;
25
+ private readonly stmtCountByBrain;
26
+ constructor(db: Database.Database);
27
+ registerPrinciple(brainName: string, domain: string, principle: string, strength: number): CurriculumItem;
28
+ getTeachable(brainName: string, limit?: number): CurriculumItem[];
29
+ markTeachable(id: number): boolean;
30
+ getStatus(): CurriculumStatus;
31
+ private toItem;
32
+ }
@@ -0,0 +1,89 @@
1
+ import { getLogger } from '../utils/logger.js';
2
+ // ── Migration ───────────────────────────────────────────
3
+ export function runCurriculumMigration(db) {
4
+ db.exec(`
5
+ CREATE TABLE IF NOT EXISTS curriculum_items (
6
+ id INTEGER PRIMARY KEY,
7
+ brain_name TEXT NOT NULL,
8
+ domain TEXT NOT NULL,
9
+ principle TEXT NOT NULL,
10
+ strength REAL DEFAULT 0.5,
11
+ teachable INTEGER DEFAULT 0,
12
+ created_at TEXT DEFAULT (datetime('now'))
13
+ );
14
+ CREATE INDEX IF NOT EXISTS idx_curriculum_brain ON curriculum_items(brain_name);
15
+ CREATE INDEX IF NOT EXISTS idx_curriculum_teachable ON curriculum_items(teachable);
16
+ `);
17
+ }
18
+ // ── Engine ──────────────────────────────────────────────
19
+ export class Curriculum {
20
+ db;
21
+ log = getLogger();
22
+ // Prepared statements
23
+ stmtUpsert;
24
+ stmtGetTeachable;
25
+ stmtMarkTeachable;
26
+ stmtTotalPrinciples;
27
+ stmtTeachableCount;
28
+ stmtCountByBrain;
29
+ constructor(db) {
30
+ runCurriculumMigration(db);
31
+ this.db = db;
32
+ this.stmtUpsert = db.prepare(`INSERT INTO curriculum_items (brain_name, domain, principle, strength)
33
+ VALUES (?, ?, ?, ?)
34
+ ON CONFLICT(id) DO UPDATE SET strength = excluded.strength`);
35
+ this.stmtGetTeachable = db.prepare('SELECT * FROM curriculum_items WHERE brain_name = ? AND teachable = 1 ORDER BY strength DESC LIMIT ?');
36
+ this.stmtMarkTeachable = db.prepare('UPDATE curriculum_items SET teachable = 1 WHERE id = ?');
37
+ this.stmtTotalPrinciples = db.prepare('SELECT COUNT(*) as cnt FROM curriculum_items');
38
+ this.stmtTeachableCount = db.prepare('SELECT COUNT(*) as cnt FROM curriculum_items WHERE teachable = 1');
39
+ this.stmtCountByBrain = db.prepare('SELECT brain_name, COUNT(*) as cnt FROM curriculum_items GROUP BY brain_name');
40
+ this.log.debug('[Curriculum] Initialized');
41
+ }
42
+ // ── Core: Register ───────────────────────────────────
43
+ registerPrinciple(brainName, domain, principle, strength) {
44
+ const info = this.stmtUpsert.run(brainName, domain, principle, strength);
45
+ this.log.debug(`[Curriculum] Registered: ${brainName}/${domain} (strength=${strength.toFixed(2)})`);
46
+ return {
47
+ id: Number(info.lastInsertRowid),
48
+ brainName,
49
+ domain,
50
+ principle,
51
+ strength,
52
+ teachable: false,
53
+ };
54
+ }
55
+ // ── Core: Get Teachable ──────────────────────────────
56
+ getTeachable(brainName, limit = 10) {
57
+ const rows = this.stmtGetTeachable.all(brainName, limit);
58
+ return rows.map(r => this.toItem(r));
59
+ }
60
+ // ── Core: Mark Teachable ─────────────────────────────
61
+ markTeachable(id) {
62
+ const result = this.stmtMarkTeachable.run(id);
63
+ return result.changes > 0;
64
+ }
65
+ // ── Core: Status ─────────────────────────────────────
66
+ getStatus() {
67
+ const totalPrinciples = this.stmtTotalPrinciples.get().cnt;
68
+ const teachableCount = this.stmtTeachableCount.get().cnt;
69
+ const brainRows = this.stmtCountByBrain.all();
70
+ const byBrain = {};
71
+ for (const row of brainRows) {
72
+ byBrain[row.brain_name] = row.cnt;
73
+ }
74
+ return { totalPrinciples, teachableCount, byBrain };
75
+ }
76
+ // ── Private: Row Mapping ─────────────────────────────
77
+ toItem(row) {
78
+ return {
79
+ id: row.id,
80
+ brainName: row.brain_name,
81
+ domain: row.domain,
82
+ principle: row.principle,
83
+ strength: row.strength,
84
+ teachable: row.teachable === 1,
85
+ createdAt: row.created_at,
86
+ };
87
+ }
88
+ }
89
+ //# sourceMappingURL=curriculum.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"curriculum.js","sourceRoot":"","sources":["../../src/teaching/curriculum.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export { TeachingProtocol, runTeachingMigration } from './teaching-protocol.js';
2
+ export type { TeachingConfig, Lesson, LessonInput, IncomingLesson, LearnResult, LessonRequest, TeachingStatus, } from './teaching-protocol.js';
3
+ export { Curriculum, runCurriculumMigration } from './curriculum.js';
4
+ export type { CurriculumItem, CurriculumStatus, } from './curriculum.js';
@@ -0,0 +1,3 @@
1
+ export { TeachingProtocol, runTeachingMigration } from './teaching-protocol.js';
2
+ export { Curriculum, runCurriculumMigration } from './curriculum.js';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/teaching/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAWhF,OAAO,EAAE,UAAU,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,74 @@
1
+ import type Database from 'better-sqlite3';
2
+ import type { ThoughtStream } from '../consciousness/thought-stream.js';
3
+ export interface TeachingConfig {
4
+ brainName: string;
5
+ minRelevance?: number;
6
+ }
7
+ export interface Lesson {
8
+ id?: number;
9
+ direction: 'sent' | 'received';
10
+ targetBrain?: string;
11
+ sourceBrain?: string;
12
+ domain: string;
13
+ principle: string;
14
+ evidence?: string;
15
+ applicability: number;
16
+ accepted: boolean;
17
+ relevanceScore: number;
18
+ createdAt?: string;
19
+ }
20
+ export interface LessonInput {
21
+ domain: string;
22
+ principle: string;
23
+ evidence?: string;
24
+ applicability?: number;
25
+ }
26
+ export interface IncomingLesson {
27
+ sourceBrain: string;
28
+ domain: string;
29
+ principle: string;
30
+ evidence?: string;
31
+ applicability?: number;
32
+ }
33
+ export interface LearnResult {
34
+ accepted: boolean;
35
+ relevanceScore: number;
36
+ }
37
+ export interface LessonRequest {
38
+ id?: number;
39
+ direction: 'sent';
40
+ targetBrain: string;
41
+ domain: string;
42
+ principle: string;
43
+ createdAt?: string;
44
+ }
45
+ export interface TeachingStatus {
46
+ totalSent: number;
47
+ totalReceived: number;
48
+ acceptedCount: number;
49
+ avgRelevance: number;
50
+ }
51
+ export declare function runTeachingMigration(db: Database.Database): void;
52
+ export declare class TeachingProtocol {
53
+ private readonly db;
54
+ private readonly config;
55
+ private readonly log;
56
+ private ts;
57
+ private readonly stmtInsertLesson;
58
+ private readonly stmtGetHistory;
59
+ private readonly stmtGetHistoryByDirection;
60
+ private readonly stmtTotalSent;
61
+ private readonly stmtTotalReceived;
62
+ private readonly stmtAcceptedCount;
63
+ private readonly stmtAvgRelevance;
64
+ constructor(db: Database.Database, config: TeachingConfig);
65
+ setThoughtStream(stream: ThoughtStream): void;
66
+ teach(targetBrain: string, lesson: LessonInput): Lesson;
67
+ learn(lesson: IncomingLesson): LearnResult;
68
+ requestLesson(fromBrain: string, topic: string): LessonRequest;
69
+ getHistory(direction?: 'sent' | 'received', limit?: number): Lesson[];
70
+ getStatus(): TeachingStatus;
71
+ private evaluateRelevance;
72
+ private getDomainKeywords;
73
+ private toLesson;
74
+ }
@@ -0,0 +1,164 @@
1
+ import { getLogger } from '../utils/logger.js';
2
+ // ── Migration ───────────────────────────────────────────
3
+ export function runTeachingMigration(db) {
4
+ db.exec(`
5
+ CREATE TABLE IF NOT EXISTS teaching_lessons (
6
+ id INTEGER PRIMARY KEY,
7
+ direction TEXT NOT NULL CHECK(direction IN ('sent','received')),
8
+ target_brain TEXT,
9
+ source_brain TEXT,
10
+ domain TEXT NOT NULL,
11
+ principle TEXT NOT NULL,
12
+ evidence TEXT,
13
+ applicability REAL DEFAULT 0.5,
14
+ accepted INTEGER DEFAULT 0,
15
+ relevance_score REAL,
16
+ created_at TEXT DEFAULT (datetime('now'))
17
+ );
18
+ CREATE INDEX IF NOT EXISTS idx_teaching_direction ON teaching_lessons(direction);
19
+ CREATE INDEX IF NOT EXISTS idx_teaching_domain ON teaching_lessons(domain);
20
+ `);
21
+ }
22
+ // ── Engine ──────────────────────────────────────────────
23
+ export class TeachingProtocol {
24
+ db;
25
+ config;
26
+ log = getLogger();
27
+ ts = null;
28
+ // Prepared statements
29
+ stmtInsertLesson;
30
+ stmtGetHistory;
31
+ stmtGetHistoryByDirection;
32
+ stmtTotalSent;
33
+ stmtTotalReceived;
34
+ stmtAcceptedCount;
35
+ stmtAvgRelevance;
36
+ constructor(db, config) {
37
+ this.db = db;
38
+ this.config = {
39
+ brainName: config.brainName,
40
+ minRelevance: config.minRelevance ?? 0.3,
41
+ };
42
+ runTeachingMigration(db);
43
+ this.stmtInsertLesson = db.prepare(`INSERT INTO teaching_lessons (direction, target_brain, source_brain, domain, principle, evidence, applicability, accepted, relevance_score)
44
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`);
45
+ this.stmtGetHistory = db.prepare('SELECT * FROM teaching_lessons ORDER BY id DESC LIMIT ?');
46
+ this.stmtGetHistoryByDirection = db.prepare('SELECT * FROM teaching_lessons WHERE direction = ? ORDER BY id DESC LIMIT ?');
47
+ this.stmtTotalSent = db.prepare("SELECT COUNT(*) as cnt FROM teaching_lessons WHERE direction = 'sent'");
48
+ this.stmtTotalReceived = db.prepare("SELECT COUNT(*) as cnt FROM teaching_lessons WHERE direction = 'received'");
49
+ this.stmtAcceptedCount = db.prepare('SELECT COUNT(*) as cnt FROM teaching_lessons WHERE accepted = 1');
50
+ this.stmtAvgRelevance = db.prepare('SELECT AVG(relevance_score) as avg FROM teaching_lessons WHERE relevance_score IS NOT NULL');
51
+ this.log.debug(`[TeachingProtocol] Initialized for ${this.config.brainName}`);
52
+ }
53
+ // ── Setters ──────────────────────────────────────────
54
+ setThoughtStream(stream) {
55
+ this.ts = stream;
56
+ }
57
+ // ── Core: Teach ──────────────────────────────────────
58
+ teach(targetBrain, lesson) {
59
+ const applicability = lesson.applicability ?? 0.5;
60
+ const relevanceScore = applicability; // When teaching, relevance = applicability estimate
61
+ const info = this.stmtInsertLesson.run('sent', targetBrain, this.config.brainName, lesson.domain, lesson.principle, lesson.evidence ?? null, applicability, 0, relevanceScore);
62
+ this.ts?.emit('teaching', 'reflecting', `Teaching ${targetBrain}: ${lesson.principle.substring(0, 60)}`, 'notable');
63
+ this.log.debug(`[TeachingProtocol] Taught ${targetBrain}: ${lesson.domain}`);
64
+ return {
65
+ id: Number(info.lastInsertRowid),
66
+ direction: 'sent',
67
+ targetBrain,
68
+ sourceBrain: this.config.brainName,
69
+ domain: lesson.domain,
70
+ principle: lesson.principle,
71
+ evidence: lesson.evidence,
72
+ applicability,
73
+ accepted: false,
74
+ relevanceScore,
75
+ };
76
+ }
77
+ // ── Core: Learn ──────────────────────────────────────
78
+ learn(lesson) {
79
+ const applicability = lesson.applicability ?? 0.5;
80
+ // Evaluate relevance via keyword overlap with own brain name / known domains
81
+ const relevanceScore = this.evaluateRelevance(lesson);
82
+ const accepted = relevanceScore >= this.config.minRelevance;
83
+ this.stmtInsertLesson.run('received', this.config.brainName, lesson.sourceBrain, lesson.domain, lesson.principle, lesson.evidence ?? null, applicability, accepted ? 1 : 0, relevanceScore);
84
+ this.ts?.emit('teaching', accepted ? 'discovering' : 'reflecting', `Lesson from ${lesson.sourceBrain}: ${accepted ? 'accepted' : 'rejected'} (relevance=${relevanceScore.toFixed(2)})`, accepted ? 'notable' : 'routine');
85
+ this.log.debug(`[TeachingProtocol] Learn from ${lesson.sourceBrain}: ${accepted ? 'accepted' : 'rejected'} (${relevanceScore.toFixed(2)})`);
86
+ return { accepted, relevanceScore };
87
+ }
88
+ // ── Core: Request Lesson ─────────────────────────────
89
+ requestLesson(fromBrain, topic) {
90
+ const info = this.stmtInsertLesson.run('sent', fromBrain, this.config.brainName, topic, `REQUEST: Teach me about ${topic}`, null, 0.5, 0, null);
91
+ this.ts?.emit('teaching', 'reflecting', `Requesting lesson from ${fromBrain}: ${topic}`, 'routine');
92
+ return {
93
+ id: Number(info.lastInsertRowid),
94
+ direction: 'sent',
95
+ targetBrain: fromBrain,
96
+ domain: topic,
97
+ principle: `REQUEST: Teach me about ${topic}`,
98
+ };
99
+ }
100
+ // ── Core: History ────────────────────────────────────
101
+ getHistory(direction, limit = 20) {
102
+ const rows = direction
103
+ ? this.stmtGetHistoryByDirection.all(direction, limit)
104
+ : this.stmtGetHistory.all(limit);
105
+ return rows.map(r => this.toLesson(r));
106
+ }
107
+ // ── Core: Status ─────────────────────────────────────
108
+ getStatus() {
109
+ const totalSent = this.stmtTotalSent.get().cnt;
110
+ const totalReceived = this.stmtTotalReceived.get().cnt;
111
+ const acceptedCount = this.stmtAcceptedCount.get().cnt;
112
+ const avgRow = this.stmtAvgRelevance.get();
113
+ const avgRelevance = avgRow.avg ?? 0;
114
+ return { totalSent, totalReceived, acceptedCount, avgRelevance };
115
+ }
116
+ // ── Private: Relevance Evaluation ────────────────────
117
+ evaluateRelevance(lesson) {
118
+ // Keyword overlap heuristic: check how many words in the lesson
119
+ // match the brain's known domain
120
+ const domainKeywords = this.getDomainKeywords();
121
+ const lessonWords = new Set(`${lesson.domain} ${lesson.principle} ${lesson.evidence ?? ''}`
122
+ .toLowerCase()
123
+ .split(/\s+/)
124
+ .filter(w => w.length > 2));
125
+ let matches = 0;
126
+ for (const keyword of domainKeywords) {
127
+ if (lessonWords.has(keyword))
128
+ matches++;
129
+ }
130
+ // Base relevance from applicability
131
+ const keywordScore = domainKeywords.length > 0
132
+ ? matches / domainKeywords.length
133
+ : 0;
134
+ // Blend keyword match with applicability
135
+ const applicability = lesson.applicability ?? 0.5;
136
+ return keywordScore * 0.6 + applicability * 0.4;
137
+ }
138
+ getDomainKeywords() {
139
+ // Domain keywords based on brain name
140
+ const brainKeywords = {
141
+ brain: ['error', 'code', 'bug', 'pattern', 'debug', 'fix', 'intelligence', 'analysis'],
142
+ 'trading-brain': ['trade', 'market', 'price', 'signal', 'position', 'profit', 'loss', 'equity'],
143
+ 'marketing-brain': ['content', 'engagement', 'social', 'audience', 'campaign', 'strategy', 'brand'],
144
+ };
145
+ return brainKeywords[this.config.brainName] ?? [this.config.brainName];
146
+ }
147
+ // ── Private: Row Mapping ─────────────────────────────
148
+ toLesson(row) {
149
+ return {
150
+ id: row.id,
151
+ direction: row.direction,
152
+ targetBrain: row.target_brain ?? undefined,
153
+ sourceBrain: row.source_brain ?? undefined,
154
+ domain: row.domain,
155
+ principle: row.principle,
156
+ evidence: row.evidence ?? undefined,
157
+ applicability: row.applicability,
158
+ accepted: row.accepted === 1,
159
+ relevanceScore: row.relevance_score,
160
+ createdAt: row.created_at,
161
+ };
162
+ }
163
+ }
164
+ //# sourceMappingURL=teaching-protocol.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"teaching-protocol.js","sourceRoot":"","sources":["../../src/teaching/teaching-protocol.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AA4D/C,2DAA2D;AAE3D,MAAM,UAAU,oBAAoB,CAAC,EAAqB;IACxD,EAAE,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;;GAgBP,CAAC,CAAC;AACL,CAAC;AAED,2DAA2D;AAE3D,MAAM,OAAO,gBAAgB;IACV,EAAE,CAAoB;IACtB,MAAM,CAA2B;IACjC,GAAG,GAAG,SAAS,EAAE,CAAC;IAC3B,EAAE,GAAyB,IAAI,CAAC;IAExC,sBAAsB;IACL,gBAAgB,CAAqB;IACrC,cAAc,CAAqB;IACnC,yBAAyB,CAAqB;IAC9C,aAAa,CAAqB;IAClC,iBAAiB,CAAqB;IACtC,iBAAiB,CAAqB;IACtC,gBAAgB,CAAqB;IAEtD,YAAY,EAAqB,EAAE,MAAsB;QACvD,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,MAAM,GAAG;YACZ,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,YAAY,EAAE,MAAM,CAAC,YAAY,IAAI,GAAG;SACzC,CAAC;QAEF,oBAAoB,CAAC,EAAE,CAAC,CAAC;QAEzB,IAAI,CAAC,gBAAgB,GAAG,EAAE,CAAC,OAAO,CAChC;0CACoC,CACrC,CAAC;QACF,IAAI,CAAC,cAAc,GAAG,EAAE,CAAC,OAAO,CAC9B,yDAAyD,CAC1D,CAAC;QACF,IAAI,CAAC,yBAAyB,GAAG,EAAE,CAAC,OAAO,CACzC,6EAA6E,CAC9E,CAAC;QACF,IAAI,CAAC,aAAa,GAAG,EAAE,CAAC,OAAO,CAC7B,uEAAuE,CACxE,CAAC;QACF,IAAI,CAAC,iBAAiB,GAAG,EAAE,CAAC,OAAO,CACjC,2EAA2E,CAC5E,CAAC;QACF,IAAI,CAAC,iBAAiB,GAAG,EAAE,CAAC,OAAO,CACjC,iEAAiE,CAClE,CAAC;QACF,IAAI,CAAC,gBAAgB,GAAG,EAAE,CAAC,OAAO,CAChC,4FAA4F,CAC7F,CAAC;QAEF,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,sCAAsC,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC;IAChF,CAAC;IAED,wDAAwD;IAExD,gBAAgB,CAAC,MAAqB;QACpC,IAAI,CAAC,EAAE,GAAG,MAAM,CAAC;IACnB,CAAC;IAED,wDAAwD;IAExD,KAAK,CAAC,WAAmB,EAAE,MAAmB;QAC5C,MAAM,aAAa,GAAG,MAAM,CAAC,aAAa,IAAI,GAAG,CAAC;QAClD,MAAM,cAAc,GAAG,aAAa,CAAC,CAAC,oDAAoD;QAE1F,MAAM,IAAI,GAAG,IAAI,CAAC,gBAAgB,CAAC,GAAG,CACpC,MAAM,EACN,WAAW,EACX,IAAI,CAAC,MAAM,CAAC,SAAS,EACrB,MAAM,CAAC,MAAM,EACb,MAAM,CAAC,SAAS,EAChB,MAAM,CAAC,QAAQ,IAAI,IAAI,EACvB,aAAa,EACb,CAAC,EACD,cAAc,CACf,CAAC;QAEF,IAAI,CAAC,EAAE,EAAE,IAAI,CACX,UAAU,EACV,YAAY,EACZ,YAAY,WAAW,KAAK,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,EAC/D,SAAS,CACV,CAAC;QAEF,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,6BAA6B,WAAW,KAAK,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;QAE7E,OAAO;YACL,EAAE,EAAE,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC;YAChC,SAAS,EAAE,MAAM;YACjB,WAAW;YACX,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS;YAClC,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,aAAa;YACb,QAAQ,EAAE,KAAK;YACf,cAAc;SACf,CAAC;IACJ,CAAC;IAED,wDAAwD;IAExD,KAAK,CAAC,MAAsB;QAC1B,MAAM,aAAa,GAAG,MAAM,CAAC,aAAa,IAAI,GAAG,CAAC;QAElD,6EAA6E;QAC7E,MAAM,cAAc,GAAG,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;QACtD,MAAM,QAAQ,GAAG,cAAc,IAAI,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC;QAE5D,IAAI,CAAC,gBAAgB,CAAC,GAAG,CACvB,UAAU,EACV,IAAI,CAAC,MAAM,CAAC,SAAS,EACrB,MAAM,CAAC,WAAW,EAClB,MAAM,CAAC,MAAM,EACb,MAAM,CAAC,SAAS,EAChB,MAAM,CAAC,QAAQ,IAAI,IAAI,EACvB,aAAa,EACb,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAChB,cAAc,CACf,CAAC;QAEF,IAAI,CAAC,EAAE,EAAE,IAAI,CACX,UAAU,EACV,QAAQ,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,YAAY,EACvC,eAAe,MAAM,CAAC,WAAW,KAAK,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,eAAe,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EACnH,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CACjC,CAAC;QAEF,IAAI,CAAC,GAAG,CAAC,KAAK,CACZ,iCAAiC,MAAM,CAAC,WAAW,KAAK,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,KAAK,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAC5H,CAAC;QAEF,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,CAAC;IACtC,CAAC;IAED,wDAAwD;IAExD,aAAa,CAAC,SAAiB,EAAE,KAAa;QAC5C,MAAM,IAAI,GAAG,IAAI,CAAC,gBAAgB,CAAC,GAAG,CACpC,MAAM,EACN,SAAS,EACT,IAAI,CAAC,MAAM,CAAC,SAAS,EACrB,KAAK,EACL,2BAA2B,KAAK,EAAE,EAClC,IAAI,EACJ,GAAG,EACH,CAAC,EACD,IAAI,CACL,CAAC;QAEF,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,UAAU,EAAE,YAAY,EAAE,0BAA0B,SAAS,KAAK,KAAK,EAAE,EAAE,SAAS,CAAC,CAAC;QAEpG,OAAO;YACL,EAAE,EAAE,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC;YAChC,SAAS,EAAE,MAAM;YACjB,WAAW,EAAE,SAAS;YACtB,MAAM,EAAE,KAAK;YACb,SAAS,EAAE,2BAA2B,KAAK,EAAE;SAC9C,CAAC;IACJ,CAAC;IAED,wDAAwD;IAExD,UAAU,CAAC,SAA+B,EAAE,KAAK,GAAG,EAAE;QACpD,MAAM,IAAI,GAAG,SAAS;YACpB,CAAC,CAAE,IAAI,CAAC,yBAAyB,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,CAA+B;YACrF,CAAC,CAAE,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,KAAK,CAA+B,CAAC;QAElE,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;IACzC,CAAC;IAED,wDAAwD;IAExD,SAAS;QACP,MAAM,SAAS,GAAI,IAAI,CAAC,aAAa,CAAC,GAAG,EAAsB,CAAC,GAAG,CAAC;QACpE,MAAM,aAAa,GAAI,IAAI,CAAC,iBAAiB,CAAC,GAAG,EAAsB,CAAC,GAAG,CAAC;QAC5E,MAAM,aAAa,GAAI,IAAI,CAAC,iBAAiB,CAAC,GAAG,EAAsB,CAAC,GAAG,CAAC;QAC5E,MAAM,MAAM,GAAG,IAAI,CAAC,gBAAgB,CAAC,GAAG,EAA4B,CAAC;QACrE,MAAM,YAAY,GAAG,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC;QAErC,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,aAAa,EAAE,YAAY,EAAE,CAAC;IACnE,CAAC;IAED,wDAAwD;IAEhD,iBAAiB,CAAC,MAAsB;QAC9C,gEAAgE;QAChE,iCAAiC;QACjC,MAAM,cAAc,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAChD,MAAM,WAAW,GAAG,IAAI,GAAG,CACzB,GAAG,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,QAAQ,IAAI,EAAE,EAAE;aAC5D,WAAW,EAAE;aACb,KAAK,CAAC,KAAK,CAAC;aACZ,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAC7B,CAAC;QAEF,IAAI,OAAO,GAAG,CAAC,CAAC;QAChB,KAAK,MAAM,OAAO,IAAI,cAAc,EAAE,CAAC;YACrC,IAAI,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC;gBAAE,OAAO,EAAE,CAAC;QAC1C,CAAC;QAED,oCAAoC;QACpC,MAAM,YAAY,GAAG,cAAc,CAAC,MAAM,GAAG,CAAC;YAC5C,CAAC,CAAC,OAAO,GAAG,cAAc,CAAC,MAAM;YACjC,CAAC,CAAC,CAAC,CAAC;QAEN,yCAAyC;QACzC,MAAM,aAAa,GAAG,MAAM,CAAC,aAAa,IAAI,GAAG,CAAC;QAClD,OAAO,YAAY,GAAG,GAAG,GAAG,aAAa,GAAG,GAAG,CAAC;IAClD,CAAC;IAEO,iBAAiB;QACvB,sCAAsC;QACtC,MAAM,aAAa,GAA6B;YAC9C,KAAK,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,cAAc,EAAE,UAAU,CAAC;YACtF,eAAe,EAAE,CAAC,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC;YAC/F,iBAAiB,EAAE,CAAC,SAAS,EAAE,YAAY,EAAE,QAAQ,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,OAAO,CAAC;SACpG,CAAC;QAEF,OAAO,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACzE,CAAC;IAED,wDAAwD;IAEhD,QAAQ,CAAC,GAA4B;QAC3C,OAAO;YACL,EAAE,EAAE,GAAG,CAAC,EAAY;YACpB,SAAS,EAAE,GAAG,CAAC,SAAgC;YAC/C,WAAW,EAAG,GAAG,CAAC,YAAuB,IAAI,SAAS;YACtD,WAAW,EAAG,GAAG,CAAC,YAAuB,IAAI,SAAS;YACtD,MAAM,EAAE,GAAG,CAAC,MAAgB;YAC5B,SAAS,EAAE,GAAG,CAAC,SAAmB;YAClC,QAAQ,EAAG,GAAG,CAAC,QAAmB,IAAI,SAAS;YAC/C,aAAa,EAAE,GAAG,CAAC,aAAuB;YAC1C,QAAQ,EAAG,GAAG,CAAC,QAAmB,KAAK,CAAC;YACxC,cAAc,EAAE,GAAG,CAAC,eAAyB;YAC7C,SAAS,EAAE,GAAG,CAAC,UAAoB;SACpC,CAAC;IACJ,CAAC;CACF"}