@timmeck/brain-core 2.36.24 → 2.36.26
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.
- package/dist/active-learning/__tests__/active-learning.test.d.ts +1 -0
- package/dist/active-learning/__tests__/active-learning.test.js +132 -0
- package/dist/active-learning/__tests__/active-learning.test.js.map +1 -0
- package/dist/active-learning/active-learner.d.ts +79 -0
- package/dist/active-learning/active-learner.js +224 -0
- package/dist/active-learning/active-learner.js.map +1 -0
- package/dist/active-learning/index.d.ts +2 -0
- package/dist/active-learning/index.js +2 -0
- package/dist/active-learning/index.js.map +1 -0
- package/dist/code-health/__tests__/code-health.test.d.ts +1 -0
- package/dist/code-health/__tests__/code-health.test.js +123 -0
- package/dist/code-health/__tests__/code-health.test.js.map +1 -0
- package/dist/code-health/health-monitor.d.ts +55 -0
- package/dist/code-health/health-monitor.js +180 -0
- package/dist/code-health/health-monitor.js.map +1 -0
- package/dist/code-health/index.d.ts +2 -0
- package/dist/code-health/index.js +2 -0
- package/dist/code-health/index.js.map +1 -0
- package/dist/consensus/__tests__/consensus.test.d.ts +1 -0
- package/dist/consensus/__tests__/consensus.test.js +159 -0
- package/dist/consensus/__tests__/consensus.test.js.map +1 -0
- package/dist/consensus/consensus-engine.d.ts +81 -0
- package/dist/consensus/consensus-engine.js +237 -0
- package/dist/consensus/consensus-engine.js.map +1 -0
- package/dist/consensus/index.d.ts +2 -0
- package/dist/consensus/index.js +2 -0
- package/dist/consensus/index.js.map +1 -0
- package/dist/feedback/__tests__/feedback-engine.test.d.ts +1 -0
- package/dist/feedback/__tests__/feedback-engine.test.js +156 -0
- package/dist/feedback/__tests__/feedback-engine.test.js.map +1 -0
- package/dist/feedback/feedback-engine.d.ts +61 -0
- package/dist/feedback/feedback-engine.js +203 -0
- package/dist/feedback/feedback-engine.js.map +1 -0
- package/dist/feedback/index.d.ts +2 -0
- package/dist/feedback/index.js +2 -0
- package/dist/feedback/index.js.map +1 -0
- package/dist/index.d.ts +32 -0
- package/dist/index.js +27 -0
- package/dist/index.js.map +1 -1
- package/dist/knowledge-graph/__tests__/knowledge-graph.test.d.ts +1 -0
- package/dist/knowledge-graph/__tests__/knowledge-graph.test.js +215 -0
- package/dist/knowledge-graph/__tests__/knowledge-graph.test.js.map +1 -0
- package/dist/knowledge-graph/fact-extractor.d.ts +23 -0
- package/dist/knowledge-graph/fact-extractor.js +70 -0
- package/dist/knowledge-graph/fact-extractor.js.map +1 -0
- package/dist/knowledge-graph/graph-engine.d.ts +78 -0
- package/dist/knowledge-graph/graph-engine.js +276 -0
- package/dist/knowledge-graph/graph-engine.js.map +1 -0
- package/dist/knowledge-graph/index.d.ts +4 -0
- package/dist/knowledge-graph/index.js +3 -0
- package/dist/knowledge-graph/index.js.map +1 -0
- package/dist/proactive/__tests__/proactive-engine.test.d.ts +1 -0
- package/dist/proactive/__tests__/proactive-engine.test.js +183 -0
- package/dist/proactive/__tests__/proactive-engine.test.js.map +1 -0
- package/dist/proactive/index.d.ts +2 -0
- package/dist/proactive/index.js +2 -0
- package/dist/proactive/index.js.map +1 -0
- package/dist/proactive/proactive-engine.d.ts +86 -0
- package/dist/proactive/proactive-engine.js +252 -0
- package/dist/proactive/proactive-engine.js.map +1 -0
- package/dist/rag/__tests__/rag-engine.test.d.ts +1 -0
- package/dist/rag/__tests__/rag-engine.test.js +235 -0
- package/dist/rag/__tests__/rag-engine.test.js.map +1 -0
- package/dist/rag/index.d.ts +4 -0
- package/dist/rag/index.js +3 -0
- package/dist/rag/index.js.map +1 -0
- package/dist/rag/rag-engine.d.ts +98 -0
- package/dist/rag/rag-engine.js +310 -0
- package/dist/rag/rag-engine.js.map +1 -0
- package/dist/rag/rag-indexer.d.ts +52 -0
- package/dist/rag/rag-indexer.js +144 -0
- package/dist/rag/rag-indexer.js.map +1 -0
- package/dist/research/__tests__/semantic-compressor.test.d.ts +1 -0
- package/dist/research/__tests__/semantic-compressor.test.js +153 -0
- package/dist/research/__tests__/semantic-compressor.test.js.map +1 -0
- package/dist/research/semantic-compressor.d.ts +55 -0
- package/dist/research/semantic-compressor.js +227 -0
- package/dist/research/semantic-compressor.js.map +1 -0
- package/dist/teaching/__tests__/teaching.test.d.ts +1 -0
- package/dist/teaching/__tests__/teaching.test.js +151 -0
- package/dist/teaching/__tests__/teaching.test.js.map +1 -0
- package/dist/teaching/curriculum.d.ts +32 -0
- package/dist/teaching/curriculum.js +89 -0
- package/dist/teaching/curriculum.js.map +1 -0
- package/dist/teaching/index.d.ts +4 -0
- package/dist/teaching/index.js +3 -0
- package/dist/teaching/index.js.map +1 -0
- package/dist/teaching/teaching-protocol.d.ts +74 -0
- package/dist/teaching/teaching-protocol.js +164 -0
- package/dist/teaching/teaching-protocol.js.map +1 -0
- package/dist/tool-learning/__tests__/tool-learning.test.d.ts +1 -0
- package/dist/tool-learning/__tests__/tool-learning.test.js +187 -0
- package/dist/tool-learning/__tests__/tool-learning.test.js.map +1 -0
- package/dist/tool-learning/index.d.ts +4 -0
- package/dist/tool-learning/index.js +3 -0
- package/dist/tool-learning/index.js.map +1 -0
- package/dist/tool-learning/tool-patterns.d.ts +47 -0
- package/dist/tool-learning/tool-patterns.js +125 -0
- package/dist/tool-learning/tool-patterns.js.map +1 -0
- package/dist/tool-learning/tool-tracker.d.ts +58 -0
- package/dist/tool-learning/tool-tracker.js +135 -0
- package/dist/tool-learning/tool-tracker.js.map +1 -0
- package/dist/user-model/__tests__/user-model.test.d.ts +1 -0
- package/dist/user-model/__tests__/user-model.test.js +142 -0
- package/dist/user-model/__tests__/user-model.test.js.map +1 -0
- package/dist/user-model/adaptive-context.d.ts +18 -0
- package/dist/user-model/adaptive-context.js +46 -0
- package/dist/user-model/adaptive-context.js.map +1 -0
- package/dist/user-model/index.d.ts +4 -0
- package/dist/user-model/index.js +3 -0
- package/dist/user-model/index.js.map +1 -0
- package/dist/user-model/user-model.d.ts +53 -0
- package/dist/user-model/user-model.js +204 -0
- package/dist/user-model/user-model.js.map +1 -0
- package/dist/utils/logger.js +4 -3
- package/dist/utils/logger.js.map +1 -1
- 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 @@
|
|
|
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 @@
|
|
|
1
|
+
export {};
|
|
@@ -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 @@
|
|
|
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"}
|