@timmeck/brain-core 2.36.24 → 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 (115) hide show
  1. package/dist/active-learning/__tests__/active-learning.test.d.ts +1 -0
  2. package/dist/active-learning/__tests__/active-learning.test.js +132 -0
  3. package/dist/active-learning/__tests__/active-learning.test.js.map +1 -0
  4. package/dist/active-learning/active-learner.d.ts +79 -0
  5. package/dist/active-learning/active-learner.js +224 -0
  6. package/dist/active-learning/active-learner.js.map +1 -0
  7. package/dist/active-learning/index.d.ts +2 -0
  8. package/dist/active-learning/index.js +2 -0
  9. package/dist/active-learning/index.js.map +1 -0
  10. package/dist/code-health/__tests__/code-health.test.d.ts +1 -0
  11. package/dist/code-health/__tests__/code-health.test.js +123 -0
  12. package/dist/code-health/__tests__/code-health.test.js.map +1 -0
  13. package/dist/code-health/health-monitor.d.ts +55 -0
  14. package/dist/code-health/health-monitor.js +180 -0
  15. package/dist/code-health/health-monitor.js.map +1 -0
  16. package/dist/code-health/index.d.ts +2 -0
  17. package/dist/code-health/index.js +2 -0
  18. package/dist/code-health/index.js.map +1 -0
  19. package/dist/consensus/__tests__/consensus.test.d.ts +1 -0
  20. package/dist/consensus/__tests__/consensus.test.js +159 -0
  21. package/dist/consensus/__tests__/consensus.test.js.map +1 -0
  22. package/dist/consensus/consensus-engine.d.ts +81 -0
  23. package/dist/consensus/consensus-engine.js +237 -0
  24. package/dist/consensus/consensus-engine.js.map +1 -0
  25. package/dist/consensus/index.d.ts +2 -0
  26. package/dist/consensus/index.js +2 -0
  27. package/dist/consensus/index.js.map +1 -0
  28. package/dist/feedback/__tests__/feedback-engine.test.d.ts +1 -0
  29. package/dist/feedback/__tests__/feedback-engine.test.js +156 -0
  30. package/dist/feedback/__tests__/feedback-engine.test.js.map +1 -0
  31. package/dist/feedback/feedback-engine.d.ts +61 -0
  32. package/dist/feedback/feedback-engine.js +203 -0
  33. package/dist/feedback/feedback-engine.js.map +1 -0
  34. package/dist/feedback/index.d.ts +2 -0
  35. package/dist/feedback/index.js +2 -0
  36. package/dist/feedback/index.js.map +1 -0
  37. package/dist/index.d.ts +32 -0
  38. package/dist/index.js +27 -0
  39. package/dist/index.js.map +1 -1
  40. package/dist/knowledge-graph/__tests__/knowledge-graph.test.d.ts +1 -0
  41. package/dist/knowledge-graph/__tests__/knowledge-graph.test.js +215 -0
  42. package/dist/knowledge-graph/__tests__/knowledge-graph.test.js.map +1 -0
  43. package/dist/knowledge-graph/fact-extractor.d.ts +23 -0
  44. package/dist/knowledge-graph/fact-extractor.js +70 -0
  45. package/dist/knowledge-graph/fact-extractor.js.map +1 -0
  46. package/dist/knowledge-graph/graph-engine.d.ts +78 -0
  47. package/dist/knowledge-graph/graph-engine.js +276 -0
  48. package/dist/knowledge-graph/graph-engine.js.map +1 -0
  49. package/dist/knowledge-graph/index.d.ts +4 -0
  50. package/dist/knowledge-graph/index.js +3 -0
  51. package/dist/knowledge-graph/index.js.map +1 -0
  52. package/dist/proactive/__tests__/proactive-engine.test.d.ts +1 -0
  53. package/dist/proactive/__tests__/proactive-engine.test.js +183 -0
  54. package/dist/proactive/__tests__/proactive-engine.test.js.map +1 -0
  55. package/dist/proactive/index.d.ts +2 -0
  56. package/dist/proactive/index.js +2 -0
  57. package/dist/proactive/index.js.map +1 -0
  58. package/dist/proactive/proactive-engine.d.ts +86 -0
  59. package/dist/proactive/proactive-engine.js +252 -0
  60. package/dist/proactive/proactive-engine.js.map +1 -0
  61. package/dist/rag/__tests__/rag-engine.test.d.ts +1 -0
  62. package/dist/rag/__tests__/rag-engine.test.js +235 -0
  63. package/dist/rag/__tests__/rag-engine.test.js.map +1 -0
  64. package/dist/rag/index.d.ts +4 -0
  65. package/dist/rag/index.js +3 -0
  66. package/dist/rag/index.js.map +1 -0
  67. package/dist/rag/rag-engine.d.ts +98 -0
  68. package/dist/rag/rag-engine.js +310 -0
  69. package/dist/rag/rag-engine.js.map +1 -0
  70. package/dist/rag/rag-indexer.d.ts +52 -0
  71. package/dist/rag/rag-indexer.js +144 -0
  72. package/dist/rag/rag-indexer.js.map +1 -0
  73. package/dist/research/__tests__/semantic-compressor.test.d.ts +1 -0
  74. package/dist/research/__tests__/semantic-compressor.test.js +153 -0
  75. package/dist/research/__tests__/semantic-compressor.test.js.map +1 -0
  76. package/dist/research/semantic-compressor.d.ts +55 -0
  77. package/dist/research/semantic-compressor.js +227 -0
  78. package/dist/research/semantic-compressor.js.map +1 -0
  79. package/dist/teaching/__tests__/teaching.test.d.ts +1 -0
  80. package/dist/teaching/__tests__/teaching.test.js +151 -0
  81. package/dist/teaching/__tests__/teaching.test.js.map +1 -0
  82. package/dist/teaching/curriculum.d.ts +32 -0
  83. package/dist/teaching/curriculum.js +89 -0
  84. package/dist/teaching/curriculum.js.map +1 -0
  85. package/dist/teaching/index.d.ts +4 -0
  86. package/dist/teaching/index.js +3 -0
  87. package/dist/teaching/index.js.map +1 -0
  88. package/dist/teaching/teaching-protocol.d.ts +74 -0
  89. package/dist/teaching/teaching-protocol.js +164 -0
  90. package/dist/teaching/teaching-protocol.js.map +1 -0
  91. package/dist/tool-learning/__tests__/tool-learning.test.d.ts +1 -0
  92. package/dist/tool-learning/__tests__/tool-learning.test.js +187 -0
  93. package/dist/tool-learning/__tests__/tool-learning.test.js.map +1 -0
  94. package/dist/tool-learning/index.d.ts +4 -0
  95. package/dist/tool-learning/index.js +3 -0
  96. package/dist/tool-learning/index.js.map +1 -0
  97. package/dist/tool-learning/tool-patterns.d.ts +47 -0
  98. package/dist/tool-learning/tool-patterns.js +125 -0
  99. package/dist/tool-learning/tool-patterns.js.map +1 -0
  100. package/dist/tool-learning/tool-tracker.d.ts +58 -0
  101. package/dist/tool-learning/tool-tracker.js +135 -0
  102. package/dist/tool-learning/tool-tracker.js.map +1 -0
  103. package/dist/user-model/__tests__/user-model.test.d.ts +1 -0
  104. package/dist/user-model/__tests__/user-model.test.js +142 -0
  105. package/dist/user-model/__tests__/user-model.test.js.map +1 -0
  106. package/dist/user-model/adaptive-context.d.ts +18 -0
  107. package/dist/user-model/adaptive-context.js +46 -0
  108. package/dist/user-model/adaptive-context.js.map +1 -0
  109. package/dist/user-model/index.d.ts +4 -0
  110. package/dist/user-model/index.js +3 -0
  111. package/dist/user-model/index.js.map +1 -0
  112. package/dist/user-model/user-model.d.ts +53 -0
  113. package/dist/user-model/user-model.js +204 -0
  114. package/dist/user-model/user-model.js.map +1 -0
  115. package/package.json +1 -1
@@ -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":"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"}
@@ -0,0 +1,187 @@
1
+ import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
2
+ import Database from 'better-sqlite3';
3
+ vi.mock('../../utils/logger.js', () => ({
4
+ getLogger: () => ({
5
+ info: vi.fn(), warn: vi.fn(), error: vi.fn(), debug: vi.fn(),
6
+ }),
7
+ }));
8
+ import { ToolTracker, runToolTrackerMigration } from '../tool-tracker.js';
9
+ import { ToolPatternAnalyzer } from '../tool-patterns.js';
10
+ function createDb() {
11
+ return new Database(':memory:');
12
+ }
13
+ describe('ToolTracker', () => {
14
+ let db;
15
+ beforeEach(() => {
16
+ db = createDb();
17
+ });
18
+ afterEach(() => {
19
+ db.close();
20
+ });
21
+ it('records usage and retrieves it', () => {
22
+ const tracker = new ToolTracker(db, { brainName: 'test' });
23
+ tracker.recordUsage('mcp.search', 'searching docs', 150, 'success');
24
+ const stats = tracker.getToolStats('mcp.search');
25
+ expect(stats).toEqual(expect.objectContaining({
26
+ tool: 'mcp.search',
27
+ totalUses: 1,
28
+ successRate: 1,
29
+ }));
30
+ });
31
+ it('returns stats for a single tool', () => {
32
+ const tracker = new ToolTracker(db, { brainName: 'test' });
33
+ tracker.recordUsage('mcp.search', 'ctx', 100, 'success');
34
+ tracker.recordUsage('mcp.search', 'ctx', 200, 'failure');
35
+ const stats = tracker.getToolStats('mcp.search');
36
+ expect(stats).toEqual(expect.objectContaining({
37
+ tool: 'mcp.search',
38
+ totalUses: 2,
39
+ successRate: 0.5,
40
+ avgDuration: 150,
41
+ }));
42
+ });
43
+ it('returns stats for all tools', () => {
44
+ const tracker = new ToolTracker(db, { brainName: 'test' });
45
+ tracker.recordUsage('tool-a', 'ctx', 100, 'success');
46
+ tracker.recordUsage('tool-b', 'ctx', 200, 'success');
47
+ tracker.recordUsage('tool-a', 'ctx', 300, 'success');
48
+ const stats = tracker.getToolStats();
49
+ expect(Array.isArray(stats)).toBe(true);
50
+ expect(stats.length).toBe(2);
51
+ // tool-a should be first (more uses)
52
+ expect(stats[0].tool).toBe('tool-a');
53
+ });
54
+ it('recommends tools sorted by success rate * frequency', () => {
55
+ const tracker = new ToolTracker(db, { brainName: 'test' });
56
+ // tool-a: 3 successes in 'debug' context
57
+ tracker.recordUsage('tool-a', 'debug error', 100, 'success');
58
+ tracker.recordUsage('tool-a', 'debug crash', 100, 'success');
59
+ tracker.recordUsage('tool-a', 'debug log', 100, 'success');
60
+ // tool-b: 1 success in 'debug' context
61
+ tracker.recordUsage('tool-b', 'debug issue', 200, 'success');
62
+ // tool-c: no 'debug' context
63
+ tracker.recordUsage('tool-c', 'build project', 50, 'success');
64
+ const recs = tracker.recommend('debug');
65
+ expect(recs.length).toBeGreaterThanOrEqual(2);
66
+ expect(recs[0].tool).toBe('tool-a');
67
+ // tool-c should not appear (no debug context)
68
+ expect(recs.find(r => r.tool === 'tool-c')).toBeUndefined();
69
+ });
70
+ it('records usage with different outcomes', () => {
71
+ const tracker = new ToolTracker(db, { brainName: 'test' });
72
+ tracker.recordUsage('tool-x', 'ctx', 100, 'success');
73
+ tracker.recordUsage('tool-x', 'ctx', 100, 'failure');
74
+ tracker.recordUsage('tool-x', 'ctx', 100, 'partial');
75
+ const stats = tracker.getToolStats('tool-x');
76
+ expect(stats).toEqual(expect.objectContaining({
77
+ totalUses: 3,
78
+ }));
79
+ // 1 success out of 3 = 0.333...
80
+ expect(stats.successRate).toBeCloseTo(1 / 3, 5);
81
+ });
82
+ it('returns empty stats for unknown tool', () => {
83
+ const tracker = new ToolTracker(db, { brainName: 'test' });
84
+ const stats = tracker.getToolStats('nonexistent');
85
+ expect(stats).toEqual(expect.objectContaining({
86
+ tool: 'nonexistent',
87
+ totalUses: 0,
88
+ successRate: 0,
89
+ }));
90
+ });
91
+ it('getStatus returns correct counts', () => {
92
+ const tracker = new ToolTracker(db, { brainName: 'test' });
93
+ tracker.recordUsage('tool-a', null, null, 'success');
94
+ tracker.recordUsage('tool-b', null, null, 'failure');
95
+ tracker.recordUsage('tool-a', null, null, 'success');
96
+ const status = tracker.getStatus();
97
+ expect(status.totalTracked).toBe(3);
98
+ expect(status.uniqueTools).toBe(2);
99
+ // 2 successes out of 3
100
+ expect(status.avgSuccessRate).toBeCloseTo(2 / 3, 5);
101
+ });
102
+ it('migration is idempotent', () => {
103
+ const tracker1 = new ToolTracker(db, { brainName: 'test' });
104
+ tracker1.recordUsage('tool-a', 'ctx', 100, 'success');
105
+ // Run migration again — should not throw or lose data
106
+ runToolTrackerMigration(db);
107
+ const tracker2 = new ToolTracker(db, { brainName: 'test' });
108
+ const stats = tracker2.getToolStats('tool-a');
109
+ expect(stats).toEqual(expect.objectContaining({ totalUses: 1 }));
110
+ });
111
+ it('getStatus returns zeros when empty', () => {
112
+ const tracker = new ToolTracker(db, { brainName: 'test' });
113
+ const status = tracker.getStatus();
114
+ expect(status.totalTracked).toBe(0);
115
+ expect(status.uniqueTools).toBe(0);
116
+ expect(status.avgSuccessRate).toBe(0);
117
+ });
118
+ });
119
+ describe('ToolPatternAnalyzer', () => {
120
+ let db;
121
+ beforeEach(() => {
122
+ db = createDb();
123
+ // ToolTracker migration creates the table
124
+ runToolTrackerMigration(db);
125
+ });
126
+ afterEach(() => {
127
+ db.close();
128
+ });
129
+ function insertUsage(tool, createdAt) {
130
+ db.prepare(`
131
+ INSERT INTO tool_usage (tool_name, context, outcome, created_at)
132
+ VALUES (?, 'test', 'success', ?)
133
+ `).run(tool, createdAt);
134
+ }
135
+ it('builds transitions correctly', () => {
136
+ insertUsage('search', '2026-03-06 10:00:00');
137
+ insertUsage('read', '2026-03-06 10:01:00');
138
+ insertUsage('edit', '2026-03-06 10:02:00');
139
+ insertUsage('search', '2026-03-06 10:03:00');
140
+ insertUsage('read', '2026-03-06 10:04:00');
141
+ const analyzer = new ToolPatternAnalyzer(db);
142
+ const transitions = analyzer.getTransitions();
143
+ expect(transitions.get('search')?.get('read')).toBe(2);
144
+ expect(transitions.get('read')?.get('edit')).toBe(1);
145
+ expect(transitions.get('edit')?.get('search')).toBe(1);
146
+ });
147
+ it('predicts next tool based on transitions', () => {
148
+ insertUsage('search', '2026-03-06 10:00:00');
149
+ insertUsage('read', '2026-03-06 10:01:00');
150
+ insertUsage('search', '2026-03-06 10:02:00');
151
+ insertUsage('read', '2026-03-06 10:03:00');
152
+ insertUsage('search', '2026-03-06 10:04:00');
153
+ insertUsage('edit', '2026-03-06 10:05:00');
154
+ const analyzer = new ToolPatternAnalyzer(db);
155
+ const predictions = analyzer.predictNext('search');
156
+ expect(predictions.length).toBeGreaterThanOrEqual(1);
157
+ // 'read' follows 'search' 2 out of 3 times
158
+ expect(predictions[0].tool).toBe('read');
159
+ expect(predictions[0].probability).toBeCloseTo(2 / 3, 5);
160
+ });
161
+ it('finds frequent pairs within 5-minute windows', () => {
162
+ // All within 5 minutes of each other
163
+ insertUsage('search', '2026-03-06 10:00:00');
164
+ insertUsage('read', '2026-03-06 10:01:00');
165
+ insertUsage('search', '2026-03-06 10:02:00');
166
+ insertUsage('read', '2026-03-06 10:03:00');
167
+ const analyzer = new ToolPatternAnalyzer(db);
168
+ const pairs = analyzer.getFrequentPairs();
169
+ expect(pairs.length).toBeGreaterThanOrEqual(1);
170
+ const searchRead = pairs.find(p => (p.toolA === 'read' && p.toolB === 'search') ||
171
+ (p.toolA === 'search' && p.toolB === 'read'));
172
+ expect(searchRead).toBeDefined();
173
+ expect(searchRead.count).toBeGreaterThanOrEqual(2);
174
+ });
175
+ it('returns empty predictions for unknown tool', () => {
176
+ const analyzer = new ToolPatternAnalyzer(db);
177
+ const predictions = analyzer.predictNext('nonexistent');
178
+ expect(predictions).toEqual([]);
179
+ });
180
+ it('returns empty sequences when not enough data', () => {
181
+ insertUsage('search', '2026-03-06 10:00:00');
182
+ const analyzer = new ToolPatternAnalyzer(db);
183
+ const sequences = analyzer.getSequences(3);
184
+ expect(sequences).toEqual([]);
185
+ });
186
+ });
187
+ //# sourceMappingURL=tool-learning.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-learning.test.js","sourceRoot":"","sources":["../../../src/tool-learning/__tests__/tool-learning.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export { ToolTracker, runToolTrackerMigration } from './tool-tracker.js';
2
+ export { ToolPatternAnalyzer } from './tool-patterns.js';
3
+ export type { ToolOutcome, ToolUsageRecord, ToolStats, ToolRecommendation, ToolTrackerStatus, ToolTrackerConfig, } from './tool-tracker.js';
4
+ export type { ToolSequence, ToolPrediction, ToolPair, ToolTransition, } from './tool-patterns.js';
@@ -0,0 +1,3 @@
1
+ export { ToolTracker, runToolTrackerMigration } from './tool-tracker.js';
2
+ export { ToolPatternAnalyzer } from './tool-patterns.js';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tool-learning/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AACzE,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC"}