@timmeck/brain 2.1.2 → 2.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +71 -21
- package/brain.log +22 -0
- package/dist/brain.js +54 -0
- package/dist/brain.js.map +1 -1
- package/dist/cli/commands/status.js +9 -0
- package/dist/cli/commands/status.js.map +1 -1
- package/dist/db/migrations/010_memory_schema.d.ts +2 -0
- package/dist/db/migrations/010_memory_schema.js +52 -0
- package/dist/db/migrations/010_memory_schema.js.map +1 -0
- package/dist/db/migrations/011_memory_fts.d.ts +2 -0
- package/dist/db/migrations/011_memory_fts.js +54 -0
- package/dist/db/migrations/011_memory_fts.js.map +1 -0
- package/dist/db/migrations/012_decisions_changelog.d.ts +2 -0
- package/dist/db/migrations/012_decisions_changelog.js +97 -0
- package/dist/db/migrations/012_decisions_changelog.js.map +1 -0
- package/dist/db/migrations/013_tasks.d.ts +2 -0
- package/dist/db/migrations/013_tasks.js +53 -0
- package/dist/db/migrations/013_tasks.js.map +1 -0
- package/dist/db/migrations/014_project_docs.d.ts +2 -0
- package/dist/db/migrations/014_project_docs.js +43 -0
- package/dist/db/migrations/014_project_docs.js.map +1 -0
- package/dist/db/migrations/index.js +10 -0
- package/dist/db/migrations/index.js.map +1 -1
- package/dist/db/repositories/changelog.repository.d.ts +15 -0
- package/dist/db/repositories/changelog.repository.js +60 -0
- package/dist/db/repositories/changelog.repository.js.map +1 -0
- package/dist/db/repositories/decision.repository.d.ts +17 -0
- package/dist/db/repositories/decision.repository.js +89 -0
- package/dist/db/repositories/decision.repository.js.map +1 -0
- package/dist/db/repositories/doc.repository.d.ts +16 -0
- package/dist/db/repositories/doc.repository.js +85 -0
- package/dist/db/repositories/doc.repository.js.map +1 -0
- package/dist/db/repositories/memory.repository.d.ts +26 -0
- package/dist/db/repositories/memory.repository.js +136 -0
- package/dist/db/repositories/memory.repository.js.map +1 -0
- package/dist/db/repositories/session.repository.d.ts +18 -0
- package/dist/db/repositories/session.repository.js +82 -0
- package/dist/db/repositories/session.repository.js.map +1 -0
- package/dist/db/repositories/task.repository.d.ts +18 -0
- package/dist/db/repositories/task.repository.js +110 -0
- package/dist/db/repositories/task.repository.js.map +1 -0
- package/dist/embeddings/engine.d.ts +5 -0
- package/dist/embeddings/engine.js +82 -3
- package/dist/embeddings/engine.js.map +1 -1
- package/dist/hooks/post-tool-use.js +40 -18
- package/dist/hooks/post-tool-use.js.map +1 -1
- package/dist/hooks/pre-tool-use.d.ts +2 -0
- package/dist/hooks/pre-tool-use.js +44 -0
- package/dist/hooks/pre-tool-use.js.map +1 -0
- package/dist/ipc/router.d.ts +10 -0
- package/dist/ipc/router.js +37 -1
- package/dist/ipc/router.js.map +1 -1
- package/dist/mcp/tools.js +266 -0
- package/dist/mcp/tools.js.map +1 -1
- package/dist/services/analytics.service.d.ts +13 -0
- package/dist/services/analytics.service.js +13 -0
- package/dist/services/analytics.service.js.map +1 -1
- package/dist/services/changelog.service.d.ts +17 -0
- package/dist/services/changelog.service.js +77 -0
- package/dist/services/changelog.service.js.map +1 -0
- package/dist/services/decision.service.d.ts +17 -0
- package/dist/services/decision.service.js +64 -0
- package/dist/services/decision.service.js.map +1 -0
- package/dist/services/doc.service.d.ts +30 -0
- package/dist/services/doc.service.js +140 -0
- package/dist/services/doc.service.js.map +1 -0
- package/dist/services/memory.service.d.ts +44 -0
- package/dist/services/memory.service.js +189 -0
- package/dist/services/memory.service.js.map +1 -0
- package/dist/services/task.service.d.ts +35 -0
- package/dist/services/task.service.js +116 -0
- package/dist/services/task.service.js.map +1 -0
- package/dist/types/decision.types.d.ts +75 -0
- package/dist/types/decision.types.js +2 -0
- package/dist/types/decision.types.js.map +1 -0
- package/dist/types/doc.types.d.ts +23 -0
- package/dist/types/doc.types.js +2 -0
- package/dist/types/doc.types.js.map +1 -0
- package/dist/types/memory.types.d.ts +1 -0
- package/dist/types/memory.types.js +2 -0
- package/dist/types/memory.types.js.map +1 -0
- package/dist/types/synapse.types.d.ts +2 -2
- package/dist/types/task.types.d.ts +47 -0
- package/dist/types/task.types.js +2 -0
- package/dist/types/task.types.js.map +1 -0
- package/dist/utils/events.d.ts +47 -0
- package/dist/utils/events.js.map +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
export class SessionRepository {
|
|
2
|
+
db;
|
|
3
|
+
stmts;
|
|
4
|
+
constructor(db) {
|
|
5
|
+
this.db = db;
|
|
6
|
+
this.stmts = {
|
|
7
|
+
create: this.db.prepare(`
|
|
8
|
+
INSERT INTO sessions (session_id, project_id, started_at, ended_at, summary, goals, outcome, metadata, embedding)
|
|
9
|
+
VALUES (@session_id, @project_id, @started_at, @ended_at, @summary, @goals, @outcome, @metadata, @embedding)
|
|
10
|
+
`),
|
|
11
|
+
getById: this.db.prepare('SELECT * FROM sessions WHERE id = ?'),
|
|
12
|
+
findBySessionId: this.db.prepare('SELECT * FROM sessions WHERE session_id = ?'),
|
|
13
|
+
findByProject: this.db.prepare('SELECT * FROM sessions WHERE project_id = ? ORDER BY started_at DESC LIMIT ?'),
|
|
14
|
+
findRecent: this.db.prepare('SELECT * FROM sessions ORDER BY started_at DESC LIMIT ?'),
|
|
15
|
+
update: this.db.prepare(`
|
|
16
|
+
UPDATE sessions
|
|
17
|
+
SET summary = COALESCE(@summary, summary),
|
|
18
|
+
ended_at = COALESCE(@ended_at, ended_at),
|
|
19
|
+
outcome = COALESCE(@outcome, outcome),
|
|
20
|
+
goals = COALESCE(@goals, goals),
|
|
21
|
+
metadata = COALESCE(@metadata, metadata)
|
|
22
|
+
WHERE id = @id
|
|
23
|
+
`),
|
|
24
|
+
search: this.db.prepare(`
|
|
25
|
+
SELECT s.* FROM sessions s
|
|
26
|
+
JOIN sessions_fts ON s.id = sessions_fts.rowid
|
|
27
|
+
WHERE sessions_fts MATCH ?
|
|
28
|
+
ORDER BY rank
|
|
29
|
+
LIMIT ?
|
|
30
|
+
`),
|
|
31
|
+
countAll: this.db.prepare('SELECT COUNT(*) as count FROM sessions'),
|
|
32
|
+
findLast: this.db.prepare('SELECT * FROM sessions ORDER BY started_at DESC LIMIT 1'),
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
create(data) {
|
|
36
|
+
const result = this.stmts.create.run({
|
|
37
|
+
session_id: data.session_id,
|
|
38
|
+
project_id: data.project_id ?? null,
|
|
39
|
+
started_at: data.started_at ?? new Date().toISOString(),
|
|
40
|
+
ended_at: data.ended_at ?? null,
|
|
41
|
+
summary: data.summary ?? null,
|
|
42
|
+
goals: data.goals ?? null,
|
|
43
|
+
outcome: data.outcome ?? null,
|
|
44
|
+
metadata: data.metadata ?? null,
|
|
45
|
+
embedding: data.embedding ?? null,
|
|
46
|
+
});
|
|
47
|
+
return result.lastInsertRowid;
|
|
48
|
+
}
|
|
49
|
+
getById(id) {
|
|
50
|
+
return this.stmts.getById.get(id);
|
|
51
|
+
}
|
|
52
|
+
findBySessionId(sessionId) {
|
|
53
|
+
return this.stmts.findBySessionId.get(sessionId);
|
|
54
|
+
}
|
|
55
|
+
findByProject(projectId, limit = 20) {
|
|
56
|
+
return this.stmts.findByProject.all(projectId, limit);
|
|
57
|
+
}
|
|
58
|
+
findRecent(limit = 20) {
|
|
59
|
+
return this.stmts.findRecent.all(limit);
|
|
60
|
+
}
|
|
61
|
+
update(id, data) {
|
|
62
|
+
this.stmts.update.run({
|
|
63
|
+
id,
|
|
64
|
+
summary: data.summary ?? null,
|
|
65
|
+
ended_at: data.ended_at ?? null,
|
|
66
|
+
outcome: data.outcome ?? null,
|
|
67
|
+
goals: data.goals ?? null,
|
|
68
|
+
metadata: data.metadata ?? null,
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
search(query, limit = 20) {
|
|
72
|
+
return this.stmts.search.all(query, limit);
|
|
73
|
+
}
|
|
74
|
+
countAll() {
|
|
75
|
+
const row = this.stmts.countAll.get();
|
|
76
|
+
return row.count;
|
|
77
|
+
}
|
|
78
|
+
findLast() {
|
|
79
|
+
return this.stmts.findLast.get();
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=session.repository.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.repository.js","sourceRoot":"","sources":["../../../src/db/repositories/session.repository.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type Database from 'better-sqlite3';
|
|
2
|
+
import type { TaskRecord, TaskStatus } from '../../types/task.types.js';
|
|
3
|
+
type CreateTaskData = Omit<TaskRecord, 'id' | 'created_at' | 'updated_at'>;
|
|
4
|
+
export declare class TaskRepository {
|
|
5
|
+
private db;
|
|
6
|
+
private stmts;
|
|
7
|
+
constructor(db: Database.Database);
|
|
8
|
+
create(data: CreateTaskData): number;
|
|
9
|
+
getById(id: number): TaskRecord | undefined;
|
|
10
|
+
findByProject(projectId: number, limit?: number): TaskRecord[];
|
|
11
|
+
findByStatus(status: TaskStatus, projectId?: number, limit?: number): TaskRecord[];
|
|
12
|
+
findSubtasks(parentTaskId: number): TaskRecord[];
|
|
13
|
+
findAll(projectId?: number, limit?: number): TaskRecord[];
|
|
14
|
+
search(query: string, limit?: number): TaskRecord[];
|
|
15
|
+
update(id: number, data: Partial<TaskRecord>): void;
|
|
16
|
+
addNote(id: number, note: string): void;
|
|
17
|
+
}
|
|
18
|
+
export {};
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
export class TaskRepository {
|
|
2
|
+
db;
|
|
3
|
+
stmts;
|
|
4
|
+
constructor(db) {
|
|
5
|
+
this.db = db;
|
|
6
|
+
this.stmts = {
|
|
7
|
+
create: this.db.prepare(`
|
|
8
|
+
INSERT INTO tasks (project_id, session_id, parent_task_id, title, description, status, priority, due_date, completed_at, blocked_by, tags, notes, embedding)
|
|
9
|
+
VALUES (@project_id, @session_id, @parent_task_id, @title, @description, @status, @priority, @due_date, @completed_at, @blocked_by, @tags, @notes, @embedding)
|
|
10
|
+
`),
|
|
11
|
+
getById: this.db.prepare('SELECT * FROM tasks WHERE id = ?'),
|
|
12
|
+
findByProject: this.db.prepare('SELECT * FROM tasks WHERE project_id = ? ORDER BY priority DESC, created_at DESC LIMIT ?'),
|
|
13
|
+
findByStatus: this.db.prepare('SELECT * FROM tasks WHERE status = ? ORDER BY priority DESC, created_at DESC LIMIT ?'),
|
|
14
|
+
findByStatusProject: this.db.prepare('SELECT * FROM tasks WHERE status = ? AND project_id = ? ORDER BY priority DESC, created_at DESC LIMIT ?'),
|
|
15
|
+
findSubtasks: this.db.prepare('SELECT * FROM tasks WHERE parent_task_id = ? ORDER BY priority DESC, created_at'),
|
|
16
|
+
findAll: this.db.prepare('SELECT * FROM tasks ORDER BY priority DESC, created_at DESC LIMIT ?'),
|
|
17
|
+
findAllProject: this.db.prepare('SELECT * FROM tasks WHERE project_id = ? ORDER BY priority DESC, created_at DESC LIMIT ?'),
|
|
18
|
+
search: this.db.prepare(`
|
|
19
|
+
SELECT t.* FROM tasks t
|
|
20
|
+
JOIN tasks_fts ON t.id = tasks_fts.rowid
|
|
21
|
+
WHERE tasks_fts MATCH ?
|
|
22
|
+
ORDER BY rank
|
|
23
|
+
LIMIT ?
|
|
24
|
+
`),
|
|
25
|
+
update: this.db.prepare(`
|
|
26
|
+
UPDATE tasks
|
|
27
|
+
SET title = COALESCE(@title, title),
|
|
28
|
+
description = COALESCE(@description, description),
|
|
29
|
+
status = COALESCE(@status, status),
|
|
30
|
+
priority = COALESCE(@priority, priority),
|
|
31
|
+
due_date = COALESCE(@due_date, due_date),
|
|
32
|
+
completed_at = COALESCE(@completed_at, completed_at),
|
|
33
|
+
blocked_by = COALESCE(@blocked_by, blocked_by),
|
|
34
|
+
tags = COALESCE(@tags, tags),
|
|
35
|
+
notes = COALESCE(@notes, notes),
|
|
36
|
+
updated_at = datetime('now')
|
|
37
|
+
WHERE id = @id
|
|
38
|
+
`),
|
|
39
|
+
addNote: this.db.prepare(`
|
|
40
|
+
UPDATE tasks
|
|
41
|
+
SET notes = CASE
|
|
42
|
+
WHEN notes IS NULL THEN @note
|
|
43
|
+
ELSE notes || char(10) || @note
|
|
44
|
+
END,
|
|
45
|
+
updated_at = datetime('now')
|
|
46
|
+
WHERE id = @id
|
|
47
|
+
`),
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
create(data) {
|
|
51
|
+
const result = this.stmts.create.run({
|
|
52
|
+
project_id: data.project_id ?? null,
|
|
53
|
+
session_id: data.session_id ?? null,
|
|
54
|
+
parent_task_id: data.parent_task_id ?? null,
|
|
55
|
+
title: data.title,
|
|
56
|
+
description: data.description ?? null,
|
|
57
|
+
status: data.status ?? 'pending',
|
|
58
|
+
priority: data.priority ?? 5,
|
|
59
|
+
due_date: data.due_date ?? null,
|
|
60
|
+
completed_at: data.completed_at ?? null,
|
|
61
|
+
blocked_by: data.blocked_by ?? null,
|
|
62
|
+
tags: data.tags ?? null,
|
|
63
|
+
notes: data.notes ?? null,
|
|
64
|
+
embedding: data.embedding ?? null,
|
|
65
|
+
});
|
|
66
|
+
return result.lastInsertRowid;
|
|
67
|
+
}
|
|
68
|
+
getById(id) {
|
|
69
|
+
return this.stmts.getById.get(id);
|
|
70
|
+
}
|
|
71
|
+
findByProject(projectId, limit = 50) {
|
|
72
|
+
return this.stmts.findByProject.all(projectId, limit);
|
|
73
|
+
}
|
|
74
|
+
findByStatus(status, projectId, limit = 50) {
|
|
75
|
+
if (projectId !== undefined) {
|
|
76
|
+
return this.stmts.findByStatusProject.all(status, projectId, limit);
|
|
77
|
+
}
|
|
78
|
+
return this.stmts.findByStatus.all(status, limit);
|
|
79
|
+
}
|
|
80
|
+
findSubtasks(parentTaskId) {
|
|
81
|
+
return this.stmts.findSubtasks.all(parentTaskId);
|
|
82
|
+
}
|
|
83
|
+
findAll(projectId, limit = 50) {
|
|
84
|
+
if (projectId !== undefined) {
|
|
85
|
+
return this.stmts.findAllProject.all(projectId, limit);
|
|
86
|
+
}
|
|
87
|
+
return this.stmts.findAll.all(limit);
|
|
88
|
+
}
|
|
89
|
+
search(query, limit = 20) {
|
|
90
|
+
return this.stmts.search.all(query, limit);
|
|
91
|
+
}
|
|
92
|
+
update(id, data) {
|
|
93
|
+
this.stmts.update.run({
|
|
94
|
+
id,
|
|
95
|
+
title: data.title ?? null,
|
|
96
|
+
description: data.description ?? null,
|
|
97
|
+
status: data.status ?? null,
|
|
98
|
+
priority: data.priority ?? null,
|
|
99
|
+
due_date: data.due_date ?? null,
|
|
100
|
+
completed_at: data.completed_at ?? null,
|
|
101
|
+
blocked_by: data.blocked_by ?? null,
|
|
102
|
+
tags: data.tags ?? null,
|
|
103
|
+
notes: data.notes ?? null,
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
addNote(id, note) {
|
|
107
|
+
this.stmts.addNote.run({ id, note });
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=task.repository.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task.repository.js","sourceRoot":"","sources":["../../../src/db/repositories/task.repository.ts"],"names":[],"mappings":"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"}
|
|
@@ -28,6 +28,11 @@ export declare class EmbeddingEngine {
|
|
|
28
28
|
sweep(): Promise<{
|
|
29
29
|
errors: number;
|
|
30
30
|
modules: number;
|
|
31
|
+
memories: number;
|
|
32
|
+
sessions: number;
|
|
33
|
+
decisions: number;
|
|
34
|
+
tasks: number;
|
|
35
|
+
docs: number;
|
|
31
36
|
}>;
|
|
32
37
|
/** Load vector scores for error matching (sync - reads pre-computed embeddings from DB) */
|
|
33
38
|
computeErrorVectorScores(errorId: number, projectId: number): Map<number, number>;
|
|
@@ -89,6 +89,11 @@ export class EmbeddingEngine {
|
|
|
89
89
|
async sweep() {
|
|
90
90
|
let errorsProcessed = 0;
|
|
91
91
|
let modulesProcessed = 0;
|
|
92
|
+
let memoriesProcessed = 0;
|
|
93
|
+
let sessionsProcessed = 0;
|
|
94
|
+
let decisionsProcessed = 0;
|
|
95
|
+
let tasksProcessed = 0;
|
|
96
|
+
let docsProcessed = 0;
|
|
92
97
|
// Process errors without embeddings
|
|
93
98
|
const pendingErrors = this.db.prepare('SELECT id, type, message, context FROM errors WHERE embedding IS NULL ORDER BY id DESC LIMIT ?').all(this.config.batchSize);
|
|
94
99
|
if (pendingErrors.length > 0) {
|
|
@@ -117,10 +122,84 @@ export class EmbeddingEngine {
|
|
|
117
122
|
}
|
|
118
123
|
}
|
|
119
124
|
}
|
|
120
|
-
|
|
121
|
-
|
|
125
|
+
// Process memories without embeddings
|
|
126
|
+
const pendingMemories = this.db.prepare('SELECT id, category, key, content FROM memories WHERE embedding IS NULL AND active = 1 ORDER BY id DESC LIMIT ?').all(this.config.batchSize);
|
|
127
|
+
if (pendingMemories.length > 0) {
|
|
128
|
+
const texts = pendingMemories.map(m => [m.category, m.key, m.content].filter(Boolean).join(' '));
|
|
129
|
+
const embeddings = await this.embedBatch(texts);
|
|
130
|
+
const updateStmt = this.db.prepare('UPDATE memories SET embedding = ? WHERE id = ?');
|
|
131
|
+
for (let i = 0; i < pendingMemories.length; i++) {
|
|
132
|
+
const emb = embeddings[i];
|
|
133
|
+
if (emb) {
|
|
134
|
+
updateStmt.run(EmbeddingEngine.serialize(emb), pendingMemories[i].id);
|
|
135
|
+
memoriesProcessed++;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
// Process sessions without embeddings
|
|
140
|
+
const pendingSessions = this.db.prepare('SELECT id, summary, goals FROM sessions WHERE embedding IS NULL AND summary IS NOT NULL ORDER BY id DESC LIMIT ?').all(this.config.batchSize);
|
|
141
|
+
if (pendingSessions.length > 0) {
|
|
142
|
+
const texts = pendingSessions.map(s => [s.summary, s.goals].filter(Boolean).join(' '));
|
|
143
|
+
const embeddings = await this.embedBatch(texts);
|
|
144
|
+
const updateStmt = this.db.prepare('UPDATE sessions SET embedding = ? WHERE id = ?');
|
|
145
|
+
for (let i = 0; i < pendingSessions.length; i++) {
|
|
146
|
+
const emb = embeddings[i];
|
|
147
|
+
if (emb) {
|
|
148
|
+
updateStmt.run(EmbeddingEngine.serialize(emb), pendingSessions[i].id);
|
|
149
|
+
sessionsProcessed++;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
// Process decisions without embeddings
|
|
154
|
+
const pendingDecisions = this.db.prepare('SELECT id, title, description, alternatives FROM decisions WHERE embedding IS NULL ORDER BY id DESC LIMIT ?').all(this.config.batchSize);
|
|
155
|
+
if (pendingDecisions.length > 0) {
|
|
156
|
+
const texts = pendingDecisions.map(d => [d.title, d.description, d.alternatives].filter(Boolean).join(' '));
|
|
157
|
+
const embeddings = await this.embedBatch(texts);
|
|
158
|
+
const updateStmt = this.db.prepare('UPDATE decisions SET embedding = ? WHERE id = ?');
|
|
159
|
+
for (let i = 0; i < pendingDecisions.length; i++) {
|
|
160
|
+
const emb = embeddings[i];
|
|
161
|
+
if (emb) {
|
|
162
|
+
updateStmt.run(EmbeddingEngine.serialize(emb), pendingDecisions[i].id);
|
|
163
|
+
decisionsProcessed++;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
// Process tasks without embeddings
|
|
168
|
+
const pendingTasks = this.db.prepare('SELECT id, title, description, notes FROM tasks WHERE embedding IS NULL ORDER BY id DESC LIMIT ?').all(this.config.batchSize);
|
|
169
|
+
if (pendingTasks.length > 0) {
|
|
170
|
+
const texts = pendingTasks.map(t => [t.title, t.description, t.notes].filter(Boolean).join(' '));
|
|
171
|
+
const embeddings = await this.embedBatch(texts);
|
|
172
|
+
const updateStmt = this.db.prepare('UPDATE tasks SET embedding = ? WHERE id = ?');
|
|
173
|
+
for (let i = 0; i < pendingTasks.length; i++) {
|
|
174
|
+
const emb = embeddings[i];
|
|
175
|
+
if (emb) {
|
|
176
|
+
updateStmt.run(EmbeddingEngine.serialize(emb), pendingTasks[i].id);
|
|
177
|
+
tasksProcessed++;
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
// Process project docs without embeddings
|
|
182
|
+
const pendingDocs = this.db.prepare('SELECT id, file_path, content FROM project_docs WHERE embedding IS NULL ORDER BY id DESC LIMIT ?').all(this.config.batchSize);
|
|
183
|
+
if (pendingDocs.length > 0) {
|
|
184
|
+
const texts = pendingDocs.map(d =>
|
|
185
|
+
// Truncate content for embedding (max ~500 chars)
|
|
186
|
+
`${d.file_path} ${d.content.slice(0, 500)}`);
|
|
187
|
+
const embeddings = await this.embedBatch(texts);
|
|
188
|
+
const updateStmt = this.db.prepare('UPDATE project_docs SET embedding = ? WHERE id = ?');
|
|
189
|
+
for (let i = 0; i < pendingDocs.length; i++) {
|
|
190
|
+
const emb = embeddings[i];
|
|
191
|
+
if (emb) {
|
|
192
|
+
updateStmt.run(EmbeddingEngine.serialize(emb), pendingDocs[i].id);
|
|
193
|
+
docsProcessed++;
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
const totalProcessed = errorsProcessed + modulesProcessed + memoriesProcessed +
|
|
198
|
+
sessionsProcessed + decisionsProcessed + tasksProcessed + docsProcessed;
|
|
199
|
+
if (totalProcessed > 0) {
|
|
200
|
+
this.logger.info(`Embedding sweep: ${errorsProcessed} errors, ${modulesProcessed} modules, ${memoriesProcessed} memories, ${sessionsProcessed} sessions, ${decisionsProcessed} decisions, ${tasksProcessed} tasks, ${docsProcessed} docs`);
|
|
122
201
|
}
|
|
123
|
-
return { errors: errorsProcessed, modules: modulesProcessed };
|
|
202
|
+
return { errors: errorsProcessed, modules: modulesProcessed, memories: memoriesProcessed, sessions: sessionsProcessed, decisions: decisionsProcessed, tasks: tasksProcessed, docs: docsProcessed };
|
|
124
203
|
}
|
|
125
204
|
/** Load vector scores for error matching (sync - reads pre-computed embeddings from DB) */
|
|
126
205
|
computeErrorVectorScores(errorId, projectId) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"engine.js","sourceRoot":"","sources":["../../src/embeddings/engine.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"engine.js","sourceRoot":"","sources":["../../src/embeddings/engine.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
// PostToolUse hook for Bash tool — auto-detects errors and reports to Brain
|
|
3
|
+
// Also captures significant commands as context memories
|
|
3
4
|
// Configured in .claude/settings.json:
|
|
4
5
|
// { "hooks": { "PostToolUse": [{ "matcher": { "tool_name": "Bash" }, "command": "node <brain-dist>/hooks/post-tool-use.js" }] } }
|
|
5
6
|
import { IpcClient } from '../ipc/client.js';
|
|
@@ -19,6 +20,11 @@ const ERROR_PATTERNS = [
|
|
|
19
20
|
/command not found/,
|
|
20
21
|
/Permission denied/,
|
|
21
22
|
];
|
|
23
|
+
const SIGNIFICANT_PATTERNS = [
|
|
24
|
+
/npm|yarn|pnpm|bun/, /git commit|git push|git merge/, /docker/,
|
|
25
|
+
/test|jest|vitest|mocha/, /build|compile/, /deploy|publish/,
|
|
26
|
+
/migrate|seed/, /install|uninstall/,
|
|
27
|
+
];
|
|
22
28
|
function isError(input) {
|
|
23
29
|
if (input.exit_code !== undefined && input.exit_code !== 0)
|
|
24
30
|
return true;
|
|
@@ -43,29 +49,45 @@ async function main() {
|
|
|
43
49
|
catch {
|
|
44
50
|
return;
|
|
45
51
|
}
|
|
46
|
-
|
|
52
|
+
const hasError = isError(input);
|
|
53
|
+
const hasSignificantCommand = !hasError && input.tool_input?.command &&
|
|
54
|
+
SIGNIFICANT_PATTERNS.some(p => p.test(input.tool_input.command));
|
|
55
|
+
// Skip if nothing to do
|
|
56
|
+
if (!hasError && !hasSignificantCommand)
|
|
47
57
|
return;
|
|
48
58
|
const client = new IpcClient(getPipeName(), 3000);
|
|
49
59
|
try {
|
|
50
60
|
await client.connect();
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
+
if (hasError) {
|
|
62
|
+
// Error detection and reporting
|
|
63
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
64
|
+
const result = await client.request('error.report', {
|
|
65
|
+
project: 'auto-detected',
|
|
66
|
+
errorOutput: input.tool_output,
|
|
67
|
+
command: input.tool_input?.command,
|
|
68
|
+
workingDirectory: process.cwd(),
|
|
69
|
+
});
|
|
70
|
+
if (result.matches?.length > 0) {
|
|
71
|
+
const best = result.matches[0];
|
|
72
|
+
process.stderr.write(`Brain: Similar error found (#${best.errorId}, ${Math.round(best.score * 100)}% match)\n`);
|
|
73
|
+
}
|
|
74
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
75
|
+
const antipatterns = await client.request('prevention.antipatterns', {
|
|
76
|
+
errorType: '',
|
|
77
|
+
message: input.tool_output,
|
|
78
|
+
});
|
|
79
|
+
if (antipatterns?.length > 0 && antipatterns[0].matched) {
|
|
80
|
+
process.stderr.write(`Brain WARNING: Known anti-pattern: ${antipatterns[0].description}\n`);
|
|
81
|
+
}
|
|
61
82
|
}
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
83
|
+
else if (hasSignificantCommand) {
|
|
84
|
+
// Context capture for significant non-error commands
|
|
85
|
+
await client.request('memory.remember', {
|
|
86
|
+
content: `Ran: ${input.tool_input.command}`,
|
|
87
|
+
category: 'context',
|
|
88
|
+
importance: 3,
|
|
89
|
+
source: 'hook',
|
|
90
|
+
});
|
|
69
91
|
}
|
|
70
92
|
}
|
|
71
93
|
catch {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"post-tool-use.js","sourceRoot":"","sources":["../../src/hooks/post-tool-use.ts"],"names":[],"mappings":";AAEA,4EAA4E;AAC5E,uCAAuC;AACvC,kIAAkI;AAElI,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAShD,MAAM,cAAc,GAAG;IACrB,SAAS;IACT,eAAe;IACf,qCAAqC;IACrC,cAAc;IACd,UAAU;IACV,iDAAiD;IACjD,sCAAsC;IACtC,iCAAiC;IACjC,oBAAoB;IACpB,eAAe;IACf,oBAAoB;IACpB,mBAAmB;IACnB,mBAAmB;CACpB,CAAC;AAEF,SAAS,OAAO,CAAC,KAAgB;IAC/B,IAAI,KAAK,CAAC,SAAS,KAAK,SAAS,IAAI,KAAK,CAAC,SAAS,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACxE,OAAO,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC;AAC7D,CAAC;AAED,SAAS,SAAS;IAChB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,IAAI,IAAI,GAAG,EAAE,CAAC;QACd,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QAClC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE,GAAG,IAAI,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QACxD,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,IAAI;IACjB,MAAM,GAAG,GAAG,MAAM,SAAS,EAAE,CAAC;IAC9B,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE;QAAE,OAAO;IAExB,IAAI,KAAgB,CAAC;IACrB,IAAI,CAAC;QACH,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC1B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO;IACT,CAAC;IAED,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO;
|
|
1
|
+
{"version":3,"file":"post-tool-use.js","sourceRoot":"","sources":["../../src/hooks/post-tool-use.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// PreToolUse hook — auto-starts a Brain session for context tracking
|
|
3
|
+
// Configured in .claude/settings.json:
|
|
4
|
+
// { "hooks": { "PreToolUse": [{ "matcher": {}, "hooks": [{ "command": "node <brain-dist>/hooks/pre-tool-use.js" }] }] } }
|
|
5
|
+
import crypto from 'node:crypto';
|
|
6
|
+
import path from 'node:path';
|
|
7
|
+
import { IpcClient } from '../ipc/client.js';
|
|
8
|
+
import { getPipeName } from '../utils/paths.js';
|
|
9
|
+
function readStdin() {
|
|
10
|
+
return new Promise((resolve) => {
|
|
11
|
+
let data = '';
|
|
12
|
+
process.stdin.setEncoding('utf8');
|
|
13
|
+
process.stdin.on('data', (chunk) => { data += chunk; });
|
|
14
|
+
process.stdin.on('end', () => resolve(data));
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
async function main() {
|
|
18
|
+
const raw = await readStdin();
|
|
19
|
+
if (!raw.trim())
|
|
20
|
+
return;
|
|
21
|
+
// Generate a session key based on working directory
|
|
22
|
+
const sessionKey = crypto.createHash('sha256').update(process.cwd()).digest('hex').slice(0, 32);
|
|
23
|
+
const client = new IpcClient(getPipeName(), 3000);
|
|
24
|
+
try {
|
|
25
|
+
await client.connect();
|
|
26
|
+
// Check if session for this working directory already exists
|
|
27
|
+
const existing = await client.request('session.current', { sessionId: sessionKey });
|
|
28
|
+
if (!existing) {
|
|
29
|
+
await client.request('session.start', {
|
|
30
|
+
sessionId: sessionKey,
|
|
31
|
+
project: path.basename(process.cwd()),
|
|
32
|
+
goals: [],
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
// Hook must never block workflow
|
|
38
|
+
}
|
|
39
|
+
finally {
|
|
40
|
+
client.disconnect();
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
main();
|
|
44
|
+
//# sourceMappingURL=pre-tool-use.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pre-tool-use.js","sourceRoot":"","sources":["../../src/hooks/pre-tool-use.ts"],"names":[],"mappings":";AAEA,qEAAqE;AACrE,uCAAuC;AACvC,0HAA0H;AAE1H,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,SAAS,SAAS;IAChB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,IAAI,IAAI,GAAG,EAAE,CAAC;QACd,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QAClC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE,GAAG,IAAI,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QACxD,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,IAAI;IACjB,MAAM,GAAG,GAAG,MAAM,SAAS,EAAE,CAAC;IAC9B,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE;QAAE,OAAO;IAExB,oDAAoD;IACpD,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAEhG,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,WAAW,EAAE,EAAE,IAAI,CAAC,CAAC;IAClD,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,OAAO,EAAE,CAAC;QAEvB,6DAA6D;QAC7D,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,iBAAiB,EAAE,EAAE,SAAS,EAAE,UAAU,EAAE,CAAC,CAAC;QACpF,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,MAAM,CAAC,OAAO,CAAC,eAAe,EAAE;gBACpC,SAAS,EAAE,UAAU;gBACrB,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;gBACrC,KAAK,EAAE,EAAE;aACV,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,iCAAiC;IACnC,CAAC;YAAS,CAAC;QACT,MAAM,CAAC,UAAU,EAAE,CAAC;IACtB,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAC"}
|
package/dist/ipc/router.d.ts
CHANGED
|
@@ -8,6 +8,11 @@ import type { ResearchService } from '../services/research.service.js';
|
|
|
8
8
|
import type { NotificationService } from '../services/notification.service.js';
|
|
9
9
|
import type { AnalyticsService } from '../services/analytics.service.js';
|
|
10
10
|
import type { GitService } from '../services/git.service.js';
|
|
11
|
+
import type { MemoryService } from '../services/memory.service.js';
|
|
12
|
+
import type { DecisionService } from '../services/decision.service.js';
|
|
13
|
+
import type { ChangelogService } from '../services/changelog.service.js';
|
|
14
|
+
import type { TaskService } from '../services/task.service.js';
|
|
15
|
+
import type { DocService } from '../services/doc.service.js';
|
|
11
16
|
import type { LearningEngine } from '../learning/learning-engine.js';
|
|
12
17
|
import type { CrossBrainClient } from '@timmeck/brain-core';
|
|
13
18
|
export interface Services {
|
|
@@ -21,6 +26,11 @@ export interface Services {
|
|
|
21
26
|
notification: NotificationService;
|
|
22
27
|
analytics: AnalyticsService;
|
|
23
28
|
git: GitService;
|
|
29
|
+
memory: MemoryService;
|
|
30
|
+
decision: DecisionService;
|
|
31
|
+
changelog: ChangelogService;
|
|
32
|
+
task: TaskService;
|
|
33
|
+
doc: DocService;
|
|
24
34
|
learning?: LearningEngine;
|
|
25
35
|
crossBrain?: CrossBrainClient;
|
|
26
36
|
}
|
package/dist/ipc/router.js
CHANGED
|
@@ -107,10 +107,46 @@ export class IpcRouter {
|
|
|
107
107
|
throw new Error(`Peer '${peer}' not available`);
|
|
108
108
|
return result;
|
|
109
109
|
}],
|
|
110
|
+
// Memory
|
|
111
|
+
['memory.remember', (params) => s.memory.remember(p(params))],
|
|
112
|
+
['memory.recall', (params) => s.memory.recall(p(params))],
|
|
113
|
+
['memory.forget', (params) => s.memory.forget(p(params).memoryId ?? p(params).memory_id)],
|
|
114
|
+
['memory.preferences', (params) => s.memory.getPreferences(p(params)?.projectId)],
|
|
115
|
+
['memory.decisions', (params) => s.memory.getDecisions(p(params)?.projectId)],
|
|
116
|
+
['memory.goals', (params) => s.memory.getGoals(p(params)?.projectId)],
|
|
117
|
+
['memory.lessons', (params) => s.memory.getLessons(p(params)?.projectId)],
|
|
118
|
+
['memory.stats', () => s.memory.getStats()],
|
|
119
|
+
// Sessions
|
|
120
|
+
['session.start', (params) => s.memory.startSession(p(params))],
|
|
121
|
+
['session.end', (params) => s.memory.endSession(p(params))],
|
|
122
|
+
['session.current', (params) => s.memory.getCurrentSession(p(params).sessionId ?? p(params).session_id)],
|
|
123
|
+
['session.history', (params) => s.memory.getSessionHistory(p(params)?.projectId, p(params)?.limit)],
|
|
124
|
+
// Decisions
|
|
125
|
+
['decision.record', (params) => s.decision.recordDecision(p(params))],
|
|
126
|
+
['decision.query', (params) => s.decision.queryDecisions(p(params))],
|
|
127
|
+
['decision.get', (params) => s.decision.getById(p(params).id)],
|
|
128
|
+
['decision.supersede', (params) => s.decision.supersedeDecision(p(params).oldId ?? p(params).old_id, p(params).newId ?? p(params).new_id)],
|
|
129
|
+
// Changelog
|
|
130
|
+
['changelog.record', (params) => s.changelog.recordChange(p(params))],
|
|
131
|
+
['changelog.query', (params) => s.changelog.queryChanges(p(params))],
|
|
132
|
+
['changelog.get', (params) => s.changelog.getById(p(params).id)],
|
|
133
|
+
['changelog.fileHistory', (params) => s.changelog.getFileHistory(p(params).filePath ?? p(params).file_path, p(params)?.projectId)],
|
|
134
|
+
// Tasks
|
|
135
|
+
['task.add', (params) => s.task.addTask(p(params))],
|
|
136
|
+
['task.update', (params) => s.task.updateTask(p(params).id, p(params))],
|
|
137
|
+
['task.list', (params) => s.task.listTasks(p(params))],
|
|
138
|
+
['task.get', (params) => s.task.getById(p(params).id)],
|
|
139
|
+
['task.context', (params) => s.task.getTaskContext(p(params).id)],
|
|
140
|
+
['task.search', (params) => s.task.searchTasks(p(params).query, p(params)?.limit)],
|
|
141
|
+
// Docs
|
|
142
|
+
['doc.index', (params) => s.doc.indexProject(p(params))],
|
|
143
|
+
['doc.query', (params) => s.doc.queryDocs(p(params))],
|
|
144
|
+
['doc.projectContext', (params) => s.doc.getProjectContext(p(params).projectId ?? p(params).project_id)],
|
|
145
|
+
['doc.get', (params) => s.doc.getById(p(params).id)],
|
|
110
146
|
// Status (cross-brain)
|
|
111
147
|
['status', () => ({
|
|
112
148
|
name: 'brain',
|
|
113
|
-
version: '2.
|
|
149
|
+
version: '2.2.0',
|
|
114
150
|
uptime: Math.floor(process.uptime()),
|
|
115
151
|
pid: process.pid,
|
|
116
152
|
methods: this.listMethods().length,
|