@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,142 @@
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 { UserModel, runUserModelMigration } from '../user-model.js';
9
+ import { AdaptiveContext } from '../adaptive-context.js';
10
+ function createDb() {
11
+ return new Database(':memory:');
12
+ }
13
+ describe('UserModel', () => {
14
+ let db;
15
+ beforeEach(() => {
16
+ db = createDb();
17
+ });
18
+ afterEach(() => {
19
+ db.close();
20
+ });
21
+ it('sets and gets a preference', () => {
22
+ const model = new UserModel(db, { brainName: 'test' });
23
+ model.setPreference('theme', 'dark');
24
+ expect(model.getPreference('theme')).toBe('dark');
25
+ });
26
+ it('returns null for unknown preference', () => {
27
+ const model = new UserModel(db, { brainName: 'test' });
28
+ expect(model.getPreference('nonexistent')).toBeNull();
29
+ });
30
+ it('updateFromInteraction tracks tool frequency', () => {
31
+ const model = new UserModel(db, { brainName: 'test' });
32
+ model.updateFromInteraction('mcp.search', 'finding code', 'success');
33
+ model.updateFromInteraction('mcp.search', 'finding docs', 'success');
34
+ const profile = model.getProfile();
35
+ expect(profile.topTools).toContain('mcp.search');
36
+ });
37
+ it('infers beginner skill level for < 3 successful uses', () => {
38
+ const model = new UserModel(db, { brainName: 'test' });
39
+ model.updateFromInteraction('trading.analyze', 'stocks', 'success');
40
+ model.updateFromInteraction('trading.analyze', 'stocks', 'success');
41
+ const profile = model.getProfile();
42
+ expect(profile.skillDomains.get('trading')).toBe('beginner');
43
+ });
44
+ it('infers intermediate skill level for 3-10 successful uses', () => {
45
+ const model = new UserModel(db, { brainName: 'test' });
46
+ for (let i = 0; i < 5; i++) {
47
+ model.updateFromInteraction('trading.analyze', 'stocks', 'success');
48
+ }
49
+ const profile = model.getProfile();
50
+ expect(profile.skillDomains.get('trading')).toBe('intermediate');
51
+ });
52
+ it('infers expert skill level for > 10 successful uses', () => {
53
+ const model = new UserModel(db, { brainName: 'test' });
54
+ for (let i = 0; i < 12; i++) {
55
+ model.updateFromInteraction('coding.refactor', 'cleanup', 'success');
56
+ }
57
+ const profile = model.getProfile();
58
+ expect(profile.skillDomains.get('coding')).toBe('expert');
59
+ });
60
+ it('getProfile returns complete structure', () => {
61
+ const model = new UserModel(db, { brainName: 'test' });
62
+ model.updateFromInteraction('mcp.search', 'ctx', 'success');
63
+ const profile = model.getProfile();
64
+ expect(profile.skillDomains).toBeInstanceOf(Map);
65
+ expect(Array.isArray(profile.topTools)).toBe(true);
66
+ expect(Array.isArray(profile.activeHours)).toBe(true);
67
+ expect(Array.isArray(profile.errorPatterns)).toBe(true);
68
+ });
69
+ it('migration is idempotent', () => {
70
+ const model1 = new UserModel(db, { brainName: 'test' });
71
+ model1.setPreference('lang', 'en');
72
+ // Run migration again
73
+ runUserModelMigration(db);
74
+ const model2 = new UserModel(db, { brainName: 'test' });
75
+ expect(model2.getPreference('lang')).toBe('en');
76
+ });
77
+ it('getStatus returns correct counts', () => {
78
+ const model = new UserModel(db, { brainName: 'test' });
79
+ const emptyStatus = model.getStatus();
80
+ expect(emptyStatus.totalKeys).toBe(0);
81
+ expect(emptyStatus.domains).toBe(0);
82
+ expect(emptyStatus.lastUpdated).toBeNull();
83
+ model.updateFromInteraction('mcp.search', 'ctx', 'success');
84
+ const status = model.getStatus();
85
+ expect(status.totalKeys).toBeGreaterThan(0);
86
+ expect(status.domains).toBeGreaterThanOrEqual(1);
87
+ expect(status.lastUpdated).not.toBeNull();
88
+ });
89
+ });
90
+ describe('AdaptiveContext', () => {
91
+ it('returns concise for all-expert profile', () => {
92
+ const ctx = new AdaptiveContext();
93
+ const profile = {
94
+ skillDomains: new Map([['coding', 'expert'], ['trading', 'expert']]),
95
+ topTools: [],
96
+ activeHours: [],
97
+ errorPatterns: [],
98
+ };
99
+ const result = ctx.enrichPrompt('How do I do X?', profile);
100
+ expect(result).toContain('Be concise');
101
+ expect(result).toContain('How do I do X?');
102
+ expect(ctx.getDetailLevel(profile)).toBe('concise');
103
+ });
104
+ it('returns detailed for profile with any beginner domain', () => {
105
+ const ctx = new AdaptiveContext();
106
+ const profile = {
107
+ skillDomains: new Map([['coding', 'expert'], ['trading', 'beginner']]),
108
+ topTools: [],
109
+ activeHours: [],
110
+ errorPatterns: [],
111
+ };
112
+ const result = ctx.enrichPrompt('How do I do X?', profile);
113
+ expect(result).toContain('Explain in detail');
114
+ expect(result).toContain('How do I do X?');
115
+ expect(ctx.getDetailLevel(profile)).toBe('detailed');
116
+ });
117
+ it('returns unmodified prompt for default/mixed profile', () => {
118
+ const ctx = new AdaptiveContext();
119
+ const profile = {
120
+ skillDomains: new Map([['coding', 'intermediate'], ['trading', 'expert']]),
121
+ topTools: [],
122
+ activeHours: [],
123
+ errorPatterns: [],
124
+ };
125
+ const result = ctx.enrichPrompt('How do I do X?', profile);
126
+ expect(result).toBe('How do I do X?');
127
+ expect(ctx.getDetailLevel(profile)).toBe('normal');
128
+ });
129
+ it('returns normal for empty profile', () => {
130
+ const ctx = new AdaptiveContext();
131
+ const profile = {
132
+ skillDomains: new Map(),
133
+ topTools: [],
134
+ activeHours: [],
135
+ errorPatterns: [],
136
+ };
137
+ const result = ctx.enrichPrompt('Hello', profile);
138
+ expect(result).toBe('Hello');
139
+ expect(ctx.getDetailLevel(profile)).toBe('normal');
140
+ });
141
+ });
142
+ //# sourceMappingURL=user-model.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user-model.test.js","sourceRoot":"","sources":["../../../src/user-model/__tests__/user-model.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import type { UserProfile } from './user-model.js';
2
+ export type DetailLevel = 'concise' | 'normal' | 'detailed';
3
+ export declare class AdaptiveContext {
4
+ /**
5
+ * Enrich a base prompt based on the user's profile.
6
+ * - If all domains are 'expert': prepend concise instructions.
7
+ * - If any domain is 'beginner': prepend detailed instructions.
8
+ * - Default: return prompt unmodified.
9
+ */
10
+ enrichPrompt(basePrompt: string, profile: UserProfile): string;
11
+ /**
12
+ * Determine the appropriate detail level from a user profile.
13
+ * - 'concise': all domains are expert level
14
+ * - 'detailed': any domain is beginner level
15
+ * - 'normal': default / mixed intermediate
16
+ */
17
+ getDetailLevel(profile: UserProfile): DetailLevel;
18
+ }
@@ -0,0 +1,46 @@
1
+ // ── Adaptive Context — Prompt Enrichment Based on User Profile ─
2
+ //
3
+ // Adjusts prompt detail level based on the user's skill profile.
4
+ // Expert users get concise responses; beginners get detailed explanations.
5
+ // ── Functions ───────────────────────────────────────────
6
+ export class AdaptiveContext {
7
+ /**
8
+ * Enrich a base prompt based on the user's profile.
9
+ * - If all domains are 'expert': prepend concise instructions.
10
+ * - If any domain is 'beginner': prepend detailed instructions.
11
+ * - Default: return prompt unmodified.
12
+ */
13
+ enrichPrompt(basePrompt, profile) {
14
+ const level = this.getDetailLevel(profile);
15
+ switch (level) {
16
+ case 'concise':
17
+ return `Be concise. Skip basics.\n\n${basePrompt}`;
18
+ case 'detailed':
19
+ return `Explain in detail with examples.\n\n${basePrompt}`;
20
+ default:
21
+ return basePrompt;
22
+ }
23
+ }
24
+ /**
25
+ * Determine the appropriate detail level from a user profile.
26
+ * - 'concise': all domains are expert level
27
+ * - 'detailed': any domain is beginner level
28
+ * - 'normal': default / mixed intermediate
29
+ */
30
+ getDetailLevel(profile) {
31
+ const domains = profile.skillDomains;
32
+ if (domains.size === 0)
33
+ return 'normal';
34
+ const levels = Array.from(domains.values());
35
+ // If any domain is beginner, give detailed responses
36
+ if (levels.some(l => l === 'beginner')) {
37
+ return 'detailed';
38
+ }
39
+ // If ALL domains are expert, be concise
40
+ if (levels.every(l => l === 'expert')) {
41
+ return 'concise';
42
+ }
43
+ return 'normal';
44
+ }
45
+ }
46
+ //# sourceMappingURL=adaptive-context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adaptive-context.js","sourceRoot":"","sources":["../../src/user-model/adaptive-context.ts"],"names":[],"mappings":"AAAA,kEAAkE;AAClE,EAAE;AACF,iEAAiE;AACjE,2EAA2E;AAQ3E,2DAA2D;AAE3D,MAAM,OAAO,eAAe;IAC1B;;;;;OAKG;IACH,YAAY,CAAC,UAAkB,EAAE,OAAoB;QACnD,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;QAE3C,QAAQ,KAAK,EAAE,CAAC;YACd,KAAK,SAAS;gBACZ,OAAO,+BAA+B,UAAU,EAAE,CAAC;YACrD,KAAK,UAAU;gBACb,OAAO,uCAAuC,UAAU,EAAE,CAAC;YAC7D;gBACE,OAAO,UAAU,CAAC;QACtB,CAAC;IACH,CAAC;IAED;;;;;OAKG;IACH,cAAc,CAAC,OAAoB;QACjC,MAAM,OAAO,GAAG,OAAO,CAAC,YAAY,CAAC;QAErC,IAAI,OAAO,CAAC,IAAI,KAAK,CAAC;YAAE,OAAO,QAAQ,CAAC;QAExC,MAAM,MAAM,GAAiB,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;QAE1D,qDAAqD;QACrD,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,UAAU,CAAC,EAAE,CAAC;YACvC,OAAO,UAAU,CAAC;QACpB,CAAC;QAED,wCAAwC;QACxC,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,QAAQ,CAAC,EAAE,CAAC;YACtC,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC;CACF"}
@@ -0,0 +1,4 @@
1
+ export { UserModel, runUserModelMigration } from './user-model.js';
2
+ export { AdaptiveContext } from './adaptive-context.js';
3
+ export type { SkillLevel, UserProfile, UserModelConfig, UserModelStatus, } from './user-model.js';
4
+ export type { DetailLevel, } from './adaptive-context.js';
@@ -0,0 +1,3 @@
1
+ export { UserModel, runUserModelMigration } from './user-model.js';
2
+ export { AdaptiveContext } from './adaptive-context.js';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/user-model/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AACnE,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC"}
@@ -0,0 +1,53 @@
1
+ import type Database from 'better-sqlite3';
2
+ import type { ThoughtStream } from '../consciousness/thought-stream.js';
3
+ export type SkillLevel = 'beginner' | 'intermediate' | 'expert';
4
+ export interface UserProfile {
5
+ skillDomains: Map<string, SkillLevel>;
6
+ topTools: string[];
7
+ activeHours: number[];
8
+ errorPatterns: string[];
9
+ }
10
+ export interface UserModelConfig {
11
+ brainName: string;
12
+ }
13
+ export interface UserModelStatus {
14
+ totalKeys: number;
15
+ domains: number;
16
+ lastUpdated: string | null;
17
+ }
18
+ export declare function runUserModelMigration(db: Database.Database): void;
19
+ export declare class UserModel {
20
+ private db;
21
+ private config;
22
+ private ts;
23
+ private log;
24
+ private stmtUpsert;
25
+ private stmtGet;
26
+ private stmtCountKeys;
27
+ private stmtCountDomains;
28
+ private stmtLastUpdated;
29
+ private stmtAllDomains;
30
+ private stmtAllKeys;
31
+ constructor(db: Database.Database, config: UserModelConfig);
32
+ /** Set the ThoughtStream for consciousness integration. */
33
+ setThoughtStream(stream: ThoughtStream): void;
34
+ /**
35
+ * Update profile from a tool interaction.
36
+ * Tracks tool frequency per domain, infers skill levels.
37
+ */
38
+ updateFromInteraction(toolName: string, context: string | null, outcome: string): void;
39
+ /** Build and return the full user profile. */
40
+ getProfile(): UserProfile;
41
+ /** Set an explicit user preference. */
42
+ setPreference(key: string, value: string): void;
43
+ /** Get a stored user preference, or null if not set. */
44
+ getPreference(key: string): string | null;
45
+ /** Get model status summary. */
46
+ getStatus(): UserModelStatus;
47
+ /** Store a key-value pair with confidence. */
48
+ _setKey(key: string, value: string, confidence: number): void;
49
+ /** Retrieve a value by key, or null if not found. */
50
+ _getKey(key: string): string | null;
51
+ /** Infer skill level from successful interaction count. */
52
+ private inferSkillLevel;
53
+ }
@@ -0,0 +1,204 @@
1
+ // ── User Model — Skill Tracking & Preference Storage ─────────
2
+ //
3
+ // Tracks user interactions to infer skill levels per domain,
4
+ // stores explicit preferences, and builds a user profile.
5
+ import { getLogger } from '../utils/logger.js';
6
+ // ── Migration ───────────────────────────────────────────
7
+ export function runUserModelMigration(db) {
8
+ db.exec(`
9
+ CREATE TABLE IF NOT EXISTS user_profile (
10
+ id INTEGER PRIMARY KEY,
11
+ key TEXT UNIQUE NOT NULL,
12
+ value TEXT NOT NULL,
13
+ confidence REAL DEFAULT 0.5,
14
+ updated_at TEXT DEFAULT (datetime('now'))
15
+ );
16
+ `);
17
+ }
18
+ // ── Engine ──────────────────────────────────────────────
19
+ export class UserModel {
20
+ db;
21
+ config;
22
+ ts = null;
23
+ log = getLogger();
24
+ // Prepared statements
25
+ stmtUpsert;
26
+ stmtGet;
27
+ stmtCountKeys;
28
+ stmtCountDomains;
29
+ stmtLastUpdated;
30
+ stmtAllDomains;
31
+ stmtAllKeys;
32
+ constructor(db, config) {
33
+ this.db = db;
34
+ this.config = config;
35
+ runUserModelMigration(db);
36
+ // Prepare all statements
37
+ this.stmtUpsert = db.prepare(`
38
+ INSERT INTO user_profile (key, value, confidence, updated_at)
39
+ VALUES (?, ?, ?, datetime('now'))
40
+ ON CONFLICT(key) DO UPDATE SET
41
+ value = excluded.value,
42
+ confidence = excluded.confidence,
43
+ updated_at = datetime('now')
44
+ `);
45
+ this.stmtGet = db.prepare(`
46
+ SELECT * FROM user_profile WHERE key = ?
47
+ `);
48
+ this.stmtCountKeys = db.prepare(`
49
+ SELECT COUNT(*) AS total FROM user_profile
50
+ `);
51
+ this.stmtCountDomains = db.prepare(`
52
+ SELECT COUNT(*) AS cnt FROM user_profile WHERE key LIKE 'domain:%'
53
+ `);
54
+ this.stmtLastUpdated = db.prepare(`
55
+ SELECT MAX(updated_at) AS last FROM user_profile
56
+ `);
57
+ this.stmtAllDomains = db.prepare(`
58
+ SELECT key, value, confidence FROM user_profile WHERE key LIKE 'domain:%' ORDER BY confidence DESC
59
+ `);
60
+ this.stmtAllKeys = db.prepare(`
61
+ SELECT key, value FROM user_profile ORDER BY updated_at DESC
62
+ `);
63
+ this.log.info(`[user-model] Initialized for ${config.brainName}`);
64
+ }
65
+ /** Set the ThoughtStream for consciousness integration. */
66
+ setThoughtStream(stream) {
67
+ this.ts = stream;
68
+ }
69
+ /**
70
+ * Update profile from a tool interaction.
71
+ * Tracks tool frequency per domain, infers skill levels.
72
+ */
73
+ updateFromInteraction(toolName, context, outcome) {
74
+ // Extract domain from tool name (e.g., "mcp.search" → "mcp", "trading.analyze" → "trading")
75
+ const domain = toolName.includes('.') ? toolName.split('.')[0] : 'general';
76
+ // Update tool frequency
77
+ const toolKey = `tool_freq:${toolName}`;
78
+ const existing = this._getKey(toolKey);
79
+ const currentCount = existing ? parseInt(existing, 10) : 0;
80
+ const newCount = currentCount + 1;
81
+ this._setKey(toolKey, String(newCount), Math.min(newCount / 20, 1.0));
82
+ // Update domain usage count
83
+ const domainKey = `domain_uses:${domain}`;
84
+ const domainExisting = this._getKey(domainKey);
85
+ const domainCount = domainExisting ? parseInt(domainExisting, 10) : 0;
86
+ const newDomainCount = domainCount + 1;
87
+ // Only count successful outcomes toward skill level
88
+ const successKey = `domain_success:${domain}`;
89
+ const successExisting = this._getKey(successKey);
90
+ const successCount = successExisting ? parseInt(successExisting, 10) : 0;
91
+ const newSuccessCount = outcome === 'success' ? successCount + 1 : successCount;
92
+ this._setKey(domainKey, String(newDomainCount), Math.min(newDomainCount / 20, 1.0));
93
+ this._setKey(successKey, String(newSuccessCount), Math.min(newSuccessCount / 20, 1.0));
94
+ // Infer skill level based on successful uses
95
+ const skillLevel = this.inferSkillLevel(newSuccessCount);
96
+ this._setKey(`domain:${domain}`, skillLevel, Math.min(newSuccessCount / 15, 1.0));
97
+ // Track active hour
98
+ const hour = new Date().getHours();
99
+ const hourKey = `active_hour:${hour}`;
100
+ const hourExisting = this._getKey(hourKey);
101
+ const hourCount = hourExisting ? parseInt(hourExisting, 10) : 0;
102
+ this._setKey(hourKey, String(hourCount + 1), 0.5);
103
+ // Track error patterns
104
+ if (outcome === 'failure' && context) {
105
+ const errorKey = `error_pattern:${domain}`;
106
+ const patterns = this._getKey(errorKey);
107
+ const patternList = patterns ? JSON.parse(patterns) : [];
108
+ const snippet = context.substring(0, 100);
109
+ if (!patternList.includes(snippet)) {
110
+ patternList.push(snippet);
111
+ if (patternList.length > 10)
112
+ patternList.shift();
113
+ this._setKey(errorKey, JSON.stringify(patternList), 0.5);
114
+ }
115
+ }
116
+ this.ts?.emit('user-model', 'analyzing', `Updated profile: ${domain} (${skillLevel}), tool ${toolName}`, 'routine');
117
+ }
118
+ /** Build and return the full user profile. */
119
+ getProfile() {
120
+ // Skill domains
121
+ const domainRows = this.stmtAllDomains.all();
122
+ const skillDomains = new Map();
123
+ for (const row of domainRows) {
124
+ const domainName = row.key.replace('domain:', '');
125
+ skillDomains.set(domainName, row.value);
126
+ }
127
+ // Top tools (by frequency)
128
+ const allKeys = this.stmtAllKeys.all();
129
+ const toolFreqs = [];
130
+ for (const row of allKeys) {
131
+ if (row.key.startsWith('tool_freq:')) {
132
+ toolFreqs.push({
133
+ tool: row.key.replace('tool_freq:', ''),
134
+ count: parseInt(row.value, 10),
135
+ });
136
+ }
137
+ }
138
+ toolFreqs.sort((a, b) => b.count - a.count);
139
+ const topTools = toolFreqs.slice(0, 10).map(t => t.tool);
140
+ // Active hours
141
+ const activeHours = [];
142
+ for (const row of allKeys) {
143
+ if (row.key.startsWith('active_hour:')) {
144
+ const hour = parseInt(row.key.replace('active_hour:', ''), 10);
145
+ const count = parseInt(row.value, 10);
146
+ if (count > 0)
147
+ activeHours.push(hour);
148
+ }
149
+ }
150
+ activeHours.sort((a, b) => a - b);
151
+ // Error patterns
152
+ const errorPatterns = [];
153
+ for (const row of allKeys) {
154
+ if (row.key.startsWith('error_pattern:')) {
155
+ try {
156
+ const patterns = JSON.parse(row.value);
157
+ errorPatterns.push(...patterns);
158
+ }
159
+ catch {
160
+ // Ignore malformed entries
161
+ }
162
+ }
163
+ }
164
+ return { skillDomains, topTools, activeHours, errorPatterns };
165
+ }
166
+ /** Set an explicit user preference. */
167
+ setPreference(key, value) {
168
+ this._setKey(`pref:${key}`, value, 1.0);
169
+ }
170
+ /** Get a stored user preference, or null if not set. */
171
+ getPreference(key) {
172
+ return this._getKey(`pref:${key}`);
173
+ }
174
+ /** Get model status summary. */
175
+ getStatus() {
176
+ const totalKeys = this.stmtCountKeys.get().total;
177
+ const domains = this.stmtCountDomains.get().cnt;
178
+ const lastUpdated = this.stmtLastUpdated.get().last;
179
+ return {
180
+ totalKeys,
181
+ domains,
182
+ lastUpdated,
183
+ };
184
+ }
185
+ // ── Internal ──────────────────────────────────────────
186
+ /** Store a key-value pair with confidence. */
187
+ _setKey(key, value, confidence) {
188
+ this.stmtUpsert.run(key, value, confidence);
189
+ }
190
+ /** Retrieve a value by key, or null if not found. */
191
+ _getKey(key) {
192
+ const row = this.stmtGet.get(key);
193
+ return row ? row.value : null;
194
+ }
195
+ /** Infer skill level from successful interaction count. */
196
+ inferSkillLevel(successfulUses) {
197
+ if (successfulUses > 10)
198
+ return 'expert';
199
+ if (successfulUses >= 3)
200
+ return 'intermediate';
201
+ return 'beginner';
202
+ }
203
+ }
204
+ //# sourceMappingURL=user-model.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user-model.js","sourceRoot":"","sources":["../../src/user-model/user-model.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@timmeck/brain-core",
3
- "version": "2.36.23",
3
+ "version": "2.36.25",
4
4
  "description": "Shared core infrastructure for the Brain ecosystem — IPC, MCP, CLI, DB connection, and utilities",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",