@timmeck/brain 2.1.2 → 2.2.1
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 +82 -29
- 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 +5 -4
- package/brain.log +0 -4262
- package/smithery.yaml +0 -10
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
export function up(db) {
|
|
2
|
+
db.exec(`
|
|
3
|
+
CREATE TABLE IF NOT EXISTS tasks (
|
|
4
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
5
|
+
project_id INTEGER,
|
|
6
|
+
session_id INTEGER,
|
|
7
|
+
parent_task_id INTEGER,
|
|
8
|
+
title TEXT NOT NULL,
|
|
9
|
+
description TEXT,
|
|
10
|
+
status TEXT NOT NULL DEFAULT 'pending',
|
|
11
|
+
priority INTEGER NOT NULL DEFAULT 5,
|
|
12
|
+
due_date TEXT,
|
|
13
|
+
completed_at TEXT,
|
|
14
|
+
blocked_by TEXT,
|
|
15
|
+
tags TEXT,
|
|
16
|
+
notes TEXT,
|
|
17
|
+
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
18
|
+
updated_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
19
|
+
embedding BLOB DEFAULT NULL,
|
|
20
|
+
FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE SET NULL,
|
|
21
|
+
FOREIGN KEY (session_id) REFERENCES sessions(id) ON DELETE SET NULL,
|
|
22
|
+
FOREIGN KEY (parent_task_id) REFERENCES tasks(id) ON DELETE SET NULL
|
|
23
|
+
);
|
|
24
|
+
|
|
25
|
+
CREATE INDEX IF NOT EXISTS idx_tasks_project ON tasks(project_id);
|
|
26
|
+
CREATE INDEX IF NOT EXISTS idx_tasks_status ON tasks(status);
|
|
27
|
+
CREATE INDEX IF NOT EXISTS idx_tasks_priority ON tasks(priority DESC);
|
|
28
|
+
CREATE INDEX IF NOT EXISTS idx_tasks_parent ON tasks(parent_task_id);
|
|
29
|
+
|
|
30
|
+
CREATE VIRTUAL TABLE IF NOT EXISTS tasks_fts USING fts5(
|
|
31
|
+
title, description, notes,
|
|
32
|
+
content='tasks', content_rowid='id'
|
|
33
|
+
);
|
|
34
|
+
|
|
35
|
+
CREATE TRIGGER IF NOT EXISTS tasks_ai AFTER INSERT ON tasks BEGIN
|
|
36
|
+
INSERT INTO tasks_fts(rowid, title, description, notes)
|
|
37
|
+
VALUES (new.id, new.title, new.description, new.notes);
|
|
38
|
+
END;
|
|
39
|
+
|
|
40
|
+
CREATE TRIGGER IF NOT EXISTS tasks_ad AFTER DELETE ON tasks BEGIN
|
|
41
|
+
INSERT INTO tasks_fts(tasks_fts, rowid, title, description, notes)
|
|
42
|
+
VALUES ('delete', old.id, old.title, old.description, old.notes);
|
|
43
|
+
END;
|
|
44
|
+
|
|
45
|
+
CREATE TRIGGER IF NOT EXISTS tasks_au AFTER UPDATE ON tasks BEGIN
|
|
46
|
+
INSERT INTO tasks_fts(tasks_fts, rowid, title, description, notes)
|
|
47
|
+
VALUES ('delete', old.id, old.title, old.description, old.notes);
|
|
48
|
+
INSERT INTO tasks_fts(rowid, title, description, notes)
|
|
49
|
+
VALUES (new.id, new.title, new.description, new.notes);
|
|
50
|
+
END;
|
|
51
|
+
`);
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=013_tasks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"013_tasks.js","sourceRoot":"","sources":["../../../src/db/migrations/013_tasks.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,EAAE,CAAC,EAAqB;IACtC,EAAE,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiDP,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
export function up(db) {
|
|
2
|
+
db.exec(`
|
|
3
|
+
CREATE TABLE IF NOT EXISTS project_docs (
|
|
4
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
5
|
+
project_id INTEGER NOT NULL,
|
|
6
|
+
file_path TEXT NOT NULL,
|
|
7
|
+
doc_type TEXT NOT NULL,
|
|
8
|
+
content TEXT NOT NULL,
|
|
9
|
+
content_hash TEXT NOT NULL,
|
|
10
|
+
parsed_metadata TEXT,
|
|
11
|
+
last_indexed_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
12
|
+
embedding BLOB DEFAULT NULL,
|
|
13
|
+
FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE,
|
|
14
|
+
UNIQUE(project_id, file_path)
|
|
15
|
+
);
|
|
16
|
+
|
|
17
|
+
CREATE INDEX IF NOT EXISTS idx_project_docs_project ON project_docs(project_id);
|
|
18
|
+
CREATE INDEX IF NOT EXISTS idx_project_docs_type ON project_docs(doc_type);
|
|
19
|
+
|
|
20
|
+
CREATE VIRTUAL TABLE IF NOT EXISTS project_docs_fts USING fts5(
|
|
21
|
+
file_path, content, parsed_metadata,
|
|
22
|
+
content='project_docs', content_rowid='id'
|
|
23
|
+
);
|
|
24
|
+
|
|
25
|
+
CREATE TRIGGER IF NOT EXISTS project_docs_ai AFTER INSERT ON project_docs BEGIN
|
|
26
|
+
INSERT INTO project_docs_fts(rowid, file_path, content, parsed_metadata)
|
|
27
|
+
VALUES (new.id, new.file_path, new.content, new.parsed_metadata);
|
|
28
|
+
END;
|
|
29
|
+
|
|
30
|
+
CREATE TRIGGER IF NOT EXISTS project_docs_ad AFTER DELETE ON project_docs BEGIN
|
|
31
|
+
INSERT INTO project_docs_fts(project_docs_fts, rowid, file_path, content, parsed_metadata)
|
|
32
|
+
VALUES ('delete', old.id, old.file_path, old.content, old.parsed_metadata);
|
|
33
|
+
END;
|
|
34
|
+
|
|
35
|
+
CREATE TRIGGER IF NOT EXISTS project_docs_au AFTER UPDATE ON project_docs BEGIN
|
|
36
|
+
INSERT INTO project_docs_fts(project_docs_fts, rowid, file_path, content, parsed_metadata)
|
|
37
|
+
VALUES ('delete', old.id, old.file_path, old.content, old.parsed_metadata);
|
|
38
|
+
INSERT INTO project_docs_fts(rowid, file_path, content, parsed_metadata)
|
|
39
|
+
VALUES (new.id, new.file_path, new.content, new.parsed_metadata);
|
|
40
|
+
END;
|
|
41
|
+
`);
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=014_project_docs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"014_project_docs.js","sourceRoot":"","sources":["../../../src/db/migrations/014_project_docs.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,EAAE,CAAC,EAAqB;IACtC,EAAE,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCP,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -8,6 +8,11 @@ import { up as synapsesPhase3 } from './006_synapses_phase3.js';
|
|
|
8
8
|
import { up as feedbackSchema } from './007_feedback.js';
|
|
9
9
|
import { up as gitIntegration } from './008_git_integration.js';
|
|
10
10
|
import { up as embeddings } from './009_embeddings.js';
|
|
11
|
+
import { up as memorySchema } from './010_memory_schema.js';
|
|
12
|
+
import { up as memoryFts } from './011_memory_fts.js';
|
|
13
|
+
import { up as decisionsChangelog } from './012_decisions_changelog.js';
|
|
14
|
+
import { up as tasks } from './013_tasks.js';
|
|
15
|
+
import { up as projectDocs } from './014_project_docs.js';
|
|
11
16
|
const migrations = [
|
|
12
17
|
{ version: 1, name: '001_core_schema', up: coreSchema },
|
|
13
18
|
{ version: 2, name: '002_learning_schema', up: learningSchema },
|
|
@@ -18,6 +23,11 @@ const migrations = [
|
|
|
18
23
|
{ version: 7, name: '007_feedback', up: feedbackSchema },
|
|
19
24
|
{ version: 8, name: '008_git_integration', up: gitIntegration },
|
|
20
25
|
{ version: 9, name: '009_embeddings', up: embeddings },
|
|
26
|
+
{ version: 10, name: '010_memory_schema', up: memorySchema },
|
|
27
|
+
{ version: 11, name: '011_memory_fts', up: memoryFts },
|
|
28
|
+
{ version: 12, name: '012_decisions_changelog', up: decisionsChangelog },
|
|
29
|
+
{ version: 13, name: '013_tasks', up: tasks },
|
|
30
|
+
{ version: 14, name: '014_project_docs', up: projectDocs },
|
|
21
31
|
];
|
|
22
32
|
function ensureMigrationsTable(db) {
|
|
23
33
|
db.exec(`
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/db/migrations/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAE,EAAE,IAAI,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,EAAE,IAAI,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAE,EAAE,IAAI,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,EAAE,IAAI,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAE,EAAE,IAAI,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,EAAE,IAAI,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAE,EAAE,IAAI,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAAE,EAAE,IAAI,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAE,EAAE,IAAI,UAAU,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/db/migrations/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type Database from 'better-sqlite3';
|
|
2
|
+
import type { ChangelogEntry } from '../../types/decision.types.js';
|
|
3
|
+
type CreateChangelogData = Omit<ChangelogEntry, 'id' | 'created_at'>;
|
|
4
|
+
export declare class ChangelogRepository {
|
|
5
|
+
private db;
|
|
6
|
+
private stmts;
|
|
7
|
+
constructor(db: Database.Database);
|
|
8
|
+
create(data: CreateChangelogData): number;
|
|
9
|
+
getById(id: number): ChangelogEntry | undefined;
|
|
10
|
+
findByProject(projectId: number, limit?: number): ChangelogEntry[];
|
|
11
|
+
findByFile(filePath: string, projectId?: number, limit?: number): ChangelogEntry[];
|
|
12
|
+
findBySession(sessionId: number): ChangelogEntry[];
|
|
13
|
+
search(query: string, limit?: number): ChangelogEntry[];
|
|
14
|
+
}
|
|
15
|
+
export {};
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
export class ChangelogRepository {
|
|
2
|
+
db;
|
|
3
|
+
stmts;
|
|
4
|
+
constructor(db) {
|
|
5
|
+
this.db = db;
|
|
6
|
+
this.stmts = {
|
|
7
|
+
create: this.db.prepare(`
|
|
8
|
+
INSERT INTO changelog_entries (project_id, session_id, file_path, change_type, summary, reason, diff_snippet, related_error_id, related_decision_id, commit_hash, embedding)
|
|
9
|
+
VALUES (@project_id, @session_id, @file_path, @change_type, @summary, @reason, @diff_snippet, @related_error_id, @related_decision_id, @commit_hash, @embedding)
|
|
10
|
+
`),
|
|
11
|
+
getById: this.db.prepare('SELECT * FROM changelog_entries WHERE id = ?'),
|
|
12
|
+
findByProject: this.db.prepare('SELECT * FROM changelog_entries WHERE project_id = ? ORDER BY created_at DESC LIMIT ?'),
|
|
13
|
+
findByFile: this.db.prepare('SELECT * FROM changelog_entries WHERE file_path = ? ORDER BY created_at DESC LIMIT ?'),
|
|
14
|
+
findByFileProject: this.db.prepare('SELECT * FROM changelog_entries WHERE file_path = ? AND project_id = ? ORDER BY created_at DESC LIMIT ?'),
|
|
15
|
+
findBySession: this.db.prepare('SELECT * FROM changelog_entries WHERE session_id = ? ORDER BY created_at DESC'),
|
|
16
|
+
search: this.db.prepare(`
|
|
17
|
+
SELECT c.* FROM changelog_entries c
|
|
18
|
+
JOIN changelog_fts ON c.id = changelog_fts.rowid
|
|
19
|
+
WHERE changelog_fts MATCH ?
|
|
20
|
+
ORDER BY rank
|
|
21
|
+
LIMIT ?
|
|
22
|
+
`),
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
create(data) {
|
|
26
|
+
const result = this.stmts.create.run({
|
|
27
|
+
project_id: data.project_id,
|
|
28
|
+
session_id: data.session_id ?? null,
|
|
29
|
+
file_path: data.file_path,
|
|
30
|
+
change_type: data.change_type,
|
|
31
|
+
summary: data.summary,
|
|
32
|
+
reason: data.reason ?? null,
|
|
33
|
+
diff_snippet: data.diff_snippet ?? null,
|
|
34
|
+
related_error_id: data.related_error_id ?? null,
|
|
35
|
+
related_decision_id: data.related_decision_id ?? null,
|
|
36
|
+
commit_hash: data.commit_hash ?? null,
|
|
37
|
+
embedding: data.embedding ?? null,
|
|
38
|
+
});
|
|
39
|
+
return result.lastInsertRowid;
|
|
40
|
+
}
|
|
41
|
+
getById(id) {
|
|
42
|
+
return this.stmts.getById.get(id);
|
|
43
|
+
}
|
|
44
|
+
findByProject(projectId, limit = 50) {
|
|
45
|
+
return this.stmts.findByProject.all(projectId, limit);
|
|
46
|
+
}
|
|
47
|
+
findByFile(filePath, projectId, limit = 50) {
|
|
48
|
+
if (projectId !== undefined) {
|
|
49
|
+
return this.stmts.findByFileProject.all(filePath, projectId, limit);
|
|
50
|
+
}
|
|
51
|
+
return this.stmts.findByFile.all(filePath, limit);
|
|
52
|
+
}
|
|
53
|
+
findBySession(sessionId) {
|
|
54
|
+
return this.stmts.findBySession.all(sessionId);
|
|
55
|
+
}
|
|
56
|
+
search(query, limit = 20) {
|
|
57
|
+
return this.stmts.search.all(query, limit);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=changelog.repository.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"changelog.repository.js","sourceRoot":"","sources":["../../../src/db/repositories/changelog.repository.ts"],"names":[],"mappings":"AAMA,MAAM,OAAO,mBAAmB;IAGV;IAFZ,KAAK,CAA4B;IAEzC,YAAoB,EAAqB;QAArB,OAAE,GAAF,EAAE,CAAmB;QACvC,IAAI,CAAC,KAAK,GAAG;YACX,MAAM,EAAE,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;;;OAGvB,CAAC;YACF,OAAO,EAAE,IAAI,CAAC,EAAE,CAAC,OAAO,CACtB,8CAA8C,CAC/C;YACD,aAAa,EAAE,IAAI,CAAC,EAAE,CAAC,OAAO,CAC5B,uFAAuF,CACxF;YACD,UAAU,EAAE,IAAI,CAAC,EAAE,CAAC,OAAO,CACzB,sFAAsF,CACvF;YACD,iBAAiB,EAAE,IAAI,CAAC,EAAE,CAAC,OAAO,CAChC,yGAAyG,CAC1G;YACD,aAAa,EAAE,IAAI,CAAC,EAAE,CAAC,OAAO,CAC5B,+EAA+E,CAChF;YACD,MAAM,EAAE,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;;;;;;OAMvB,CAAC;SACH,CAAC;IACJ,CAAC;IAED,MAAM,CAAC,IAAyB;QAC9B,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC;YACnC,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,UAAU,EAAE,IAAI,CAAC,UAAU,IAAI,IAAI;YACnC,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,IAAI;YAC3B,YAAY,EAAE,IAAI,CAAC,YAAY,IAAI,IAAI;YACvC,gBAAgB,EAAE,IAAI,CAAC,gBAAgB,IAAI,IAAI;YAC/C,mBAAmB,EAAE,IAAI,CAAC,mBAAmB,IAAI,IAAI;YACrD,WAAW,EAAE,IAAI,CAAC,WAAW,IAAI,IAAI;YACrC,SAAS,EAAE,IAAI,CAAC,SAAS,IAAI,IAAI;SAClC,CAAC,CAAC;QACH,OAAO,MAAM,CAAC,eAAyB,CAAC;IAC1C,CAAC;IAED,OAAO,CAAC,EAAU;QAChB,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAA+B,CAAC;IAClE,CAAC;IAED,aAAa,CAAC,SAAiB,EAAE,QAAgB,EAAE;QACjD,OAAO,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,CAAqB,CAAC;IAC5E,CAAC;IAED,UAAU,CAAC,QAAgB,EAAE,SAAkB,EAAE,QAAgB,EAAE;QACjE,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;YAC5B,OAAO,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,GAAG,CAAC,QAAQ,EAAE,SAAS,EAAE,KAAK,CAAqB,CAAC;QAC1F,CAAC;QACD,OAAO,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,CAAqB,CAAC;IACxE,CAAC;IAED,aAAa,CAAC,SAAiB;QAC7B,OAAO,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,SAAS,CAAqB,CAAC;IACrE,CAAC;IAED,MAAM,CAAC,KAAa,EAAE,QAAgB,EAAE;QACtC,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAqB,CAAC;IACjE,CAAC;CACF"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type Database from 'better-sqlite3';
|
|
2
|
+
import type { DecisionRecord, DecisionCategory, DecisionStatus } from '../../types/decision.types.js';
|
|
3
|
+
type CreateDecisionData = Omit<DecisionRecord, 'id' | 'created_at' | 'updated_at'>;
|
|
4
|
+
export declare class DecisionRepository {
|
|
5
|
+
private db;
|
|
6
|
+
private stmts;
|
|
7
|
+
constructor(db: Database.Database);
|
|
8
|
+
create(data: CreateDecisionData): number;
|
|
9
|
+
getById(id: number): DecisionRecord | undefined;
|
|
10
|
+
findByProject(projectId: number, limit?: number): DecisionRecord[];
|
|
11
|
+
findByCategory(category: DecisionCategory, projectId?: number, status?: DecisionStatus, limit?: number): DecisionRecord[];
|
|
12
|
+
findActive(projectId?: number, limit?: number): DecisionRecord[];
|
|
13
|
+
search(query: string, limit?: number): DecisionRecord[];
|
|
14
|
+
supersede(oldId: number, newId: number): void;
|
|
15
|
+
update(id: number, data: Partial<DecisionRecord>): void;
|
|
16
|
+
}
|
|
17
|
+
export {};
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
export class DecisionRepository {
|
|
2
|
+
db;
|
|
3
|
+
stmts;
|
|
4
|
+
constructor(db) {
|
|
5
|
+
this.db = db;
|
|
6
|
+
this.stmts = {
|
|
7
|
+
create: this.db.prepare(`
|
|
8
|
+
INSERT INTO decisions (project_id, session_id, title, description, alternatives, category, status, superseded_by, tags, embedding)
|
|
9
|
+
VALUES (@project_id, @session_id, @title, @description, @alternatives, @category, @status, @superseded_by, @tags, @embedding)
|
|
10
|
+
`),
|
|
11
|
+
getById: this.db.prepare('SELECT * FROM decisions WHERE id = ?'),
|
|
12
|
+
findByProject: this.db.prepare('SELECT * FROM decisions WHERE project_id = ? ORDER BY created_at DESC LIMIT ?'),
|
|
13
|
+
findByCategory: this.db.prepare('SELECT * FROM decisions WHERE category = ? AND status = ? ORDER BY created_at DESC LIMIT ?'),
|
|
14
|
+
findByCategoryProject: this.db.prepare('SELECT * FROM decisions WHERE category = ? AND project_id = ? AND status = ? ORDER BY created_at DESC LIMIT ?'),
|
|
15
|
+
findActive: this.db.prepare("SELECT * FROM decisions WHERE status = 'active' ORDER BY created_at DESC LIMIT ?"),
|
|
16
|
+
findActiveProject: this.db.prepare("SELECT * FROM decisions WHERE status = 'active' AND project_id = ? ORDER BY created_at DESC LIMIT ?"),
|
|
17
|
+
search: this.db.prepare(`
|
|
18
|
+
SELECT d.* FROM decisions d
|
|
19
|
+
JOIN decisions_fts ON d.id = decisions_fts.rowid
|
|
20
|
+
WHERE decisions_fts MATCH ?
|
|
21
|
+
ORDER BY rank
|
|
22
|
+
LIMIT ?
|
|
23
|
+
`),
|
|
24
|
+
supersede: this.db.prepare("UPDATE decisions SET superseded_by = ?, status = 'superseded', updated_at = datetime('now') WHERE id = ?"),
|
|
25
|
+
update: this.db.prepare(`
|
|
26
|
+
UPDATE decisions
|
|
27
|
+
SET title = COALESCE(@title, title),
|
|
28
|
+
description = COALESCE(@description, description),
|
|
29
|
+
alternatives = COALESCE(@alternatives, alternatives),
|
|
30
|
+
category = COALESCE(@category, category),
|
|
31
|
+
status = COALESCE(@status, status),
|
|
32
|
+
tags = COALESCE(@tags, tags),
|
|
33
|
+
updated_at = datetime('now')
|
|
34
|
+
WHERE id = @id
|
|
35
|
+
`),
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
create(data) {
|
|
39
|
+
const result = this.stmts.create.run({
|
|
40
|
+
project_id: data.project_id ?? null,
|
|
41
|
+
session_id: data.session_id ?? null,
|
|
42
|
+
title: data.title,
|
|
43
|
+
description: data.description,
|
|
44
|
+
alternatives: data.alternatives ?? null,
|
|
45
|
+
category: data.category ?? 'architecture',
|
|
46
|
+
status: data.status ?? 'active',
|
|
47
|
+
superseded_by: data.superseded_by ?? null,
|
|
48
|
+
tags: data.tags ?? null,
|
|
49
|
+
embedding: data.embedding ?? null,
|
|
50
|
+
});
|
|
51
|
+
return result.lastInsertRowid;
|
|
52
|
+
}
|
|
53
|
+
getById(id) {
|
|
54
|
+
return this.stmts.getById.get(id);
|
|
55
|
+
}
|
|
56
|
+
findByProject(projectId, limit = 50) {
|
|
57
|
+
return this.stmts.findByProject.all(projectId, limit);
|
|
58
|
+
}
|
|
59
|
+
findByCategory(category, projectId, status = 'active', limit = 50) {
|
|
60
|
+
if (projectId !== undefined) {
|
|
61
|
+
return this.stmts.findByCategoryProject.all(category, projectId, status, limit);
|
|
62
|
+
}
|
|
63
|
+
return this.stmts.findByCategory.all(category, status, limit);
|
|
64
|
+
}
|
|
65
|
+
findActive(projectId, limit = 50) {
|
|
66
|
+
if (projectId !== undefined) {
|
|
67
|
+
return this.stmts.findActiveProject.all(projectId, limit);
|
|
68
|
+
}
|
|
69
|
+
return this.stmts.findActive.all(limit);
|
|
70
|
+
}
|
|
71
|
+
search(query, limit = 20) {
|
|
72
|
+
return this.stmts.search.all(query, limit);
|
|
73
|
+
}
|
|
74
|
+
supersede(oldId, newId) {
|
|
75
|
+
this.stmts.supersede.run(newId, oldId);
|
|
76
|
+
}
|
|
77
|
+
update(id, data) {
|
|
78
|
+
this.stmts.update.run({
|
|
79
|
+
id,
|
|
80
|
+
title: data.title ?? null,
|
|
81
|
+
description: data.description ?? null,
|
|
82
|
+
alternatives: data.alternatives ?? null,
|
|
83
|
+
category: data.category ?? null,
|
|
84
|
+
status: data.status ?? null,
|
|
85
|
+
tags: data.tags ?? null,
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=decision.repository.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"decision.repository.js","sourceRoot":"","sources":["../../../src/db/repositories/decision.repository.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type Database from 'better-sqlite3';
|
|
2
|
+
import type { ProjectDocRecord, DocType } from '../../types/doc.types.js';
|
|
3
|
+
type CreateDocData = Omit<ProjectDocRecord, 'id' | 'last_indexed_at'>;
|
|
4
|
+
export declare class DocRepository {
|
|
5
|
+
private db;
|
|
6
|
+
private stmts;
|
|
7
|
+
constructor(db: Database.Database);
|
|
8
|
+
create(data: CreateDocData): number;
|
|
9
|
+
upsert(data: CreateDocData): number;
|
|
10
|
+
getById(id: number): ProjectDocRecord | undefined;
|
|
11
|
+
findByProject(projectId: number): ProjectDocRecord[];
|
|
12
|
+
findByType(projectId: number, docType: DocType): ProjectDocRecord[];
|
|
13
|
+
findByPath(projectId: number, filePath: string): ProjectDocRecord | undefined;
|
|
14
|
+
search(query: string, projectId?: number, limit?: number): ProjectDocRecord[];
|
|
15
|
+
}
|
|
16
|
+
export {};
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
export class DocRepository {
|
|
2
|
+
db;
|
|
3
|
+
stmts;
|
|
4
|
+
constructor(db) {
|
|
5
|
+
this.db = db;
|
|
6
|
+
this.stmts = {
|
|
7
|
+
create: this.db.prepare(`
|
|
8
|
+
INSERT INTO project_docs (project_id, file_path, doc_type, content, content_hash, parsed_metadata, embedding)
|
|
9
|
+
VALUES (@project_id, @file_path, @doc_type, @content, @content_hash, @parsed_metadata, @embedding)
|
|
10
|
+
`),
|
|
11
|
+
upsert: this.db.prepare(`
|
|
12
|
+
INSERT INTO project_docs (project_id, file_path, doc_type, content, content_hash, parsed_metadata, embedding)
|
|
13
|
+
VALUES (@project_id, @file_path, @doc_type, @content, @content_hash, @parsed_metadata, @embedding)
|
|
14
|
+
ON CONFLICT(project_id, file_path) DO UPDATE SET
|
|
15
|
+
doc_type = excluded.doc_type,
|
|
16
|
+
content = excluded.content,
|
|
17
|
+
content_hash = excluded.content_hash,
|
|
18
|
+
parsed_metadata = excluded.parsed_metadata,
|
|
19
|
+
embedding = NULL,
|
|
20
|
+
last_indexed_at = datetime('now')
|
|
21
|
+
`),
|
|
22
|
+
getById: this.db.prepare('SELECT * FROM project_docs WHERE id = ?'),
|
|
23
|
+
findByProject: this.db.prepare('SELECT * FROM project_docs WHERE project_id = ? ORDER BY doc_type, file_path'),
|
|
24
|
+
findByType: this.db.prepare('SELECT * FROM project_docs WHERE project_id = ? AND doc_type = ? ORDER BY file_path'),
|
|
25
|
+
findByPath: this.db.prepare('SELECT * FROM project_docs WHERE project_id = ? AND file_path = ?'),
|
|
26
|
+
search: this.db.prepare(`
|
|
27
|
+
SELECT pd.* FROM project_docs pd
|
|
28
|
+
JOIN project_docs_fts ON pd.id = project_docs_fts.rowid
|
|
29
|
+
WHERE project_docs_fts MATCH ?
|
|
30
|
+
ORDER BY rank
|
|
31
|
+
LIMIT ?
|
|
32
|
+
`),
|
|
33
|
+
searchProject: this.db.prepare(`
|
|
34
|
+
SELECT pd.* FROM project_docs pd
|
|
35
|
+
JOIN project_docs_fts ON pd.id = project_docs_fts.rowid
|
|
36
|
+
WHERE project_docs_fts MATCH ? AND pd.project_id = ?
|
|
37
|
+
ORDER BY rank
|
|
38
|
+
LIMIT ?
|
|
39
|
+
`),
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
create(data) {
|
|
43
|
+
const result = this.stmts.create.run({
|
|
44
|
+
project_id: data.project_id,
|
|
45
|
+
file_path: data.file_path,
|
|
46
|
+
doc_type: data.doc_type,
|
|
47
|
+
content: data.content,
|
|
48
|
+
content_hash: data.content_hash,
|
|
49
|
+
parsed_metadata: data.parsed_metadata ?? null,
|
|
50
|
+
embedding: data.embedding ?? null,
|
|
51
|
+
});
|
|
52
|
+
return result.lastInsertRowid;
|
|
53
|
+
}
|
|
54
|
+
upsert(data) {
|
|
55
|
+
const result = this.stmts.upsert.run({
|
|
56
|
+
project_id: data.project_id,
|
|
57
|
+
file_path: data.file_path,
|
|
58
|
+
doc_type: data.doc_type,
|
|
59
|
+
content: data.content,
|
|
60
|
+
content_hash: data.content_hash,
|
|
61
|
+
parsed_metadata: data.parsed_metadata ?? null,
|
|
62
|
+
embedding: data.embedding ?? null,
|
|
63
|
+
});
|
|
64
|
+
return result.lastInsertRowid;
|
|
65
|
+
}
|
|
66
|
+
getById(id) {
|
|
67
|
+
return this.stmts.getById.get(id);
|
|
68
|
+
}
|
|
69
|
+
findByProject(projectId) {
|
|
70
|
+
return this.stmts.findByProject.all(projectId);
|
|
71
|
+
}
|
|
72
|
+
findByType(projectId, docType) {
|
|
73
|
+
return this.stmts.findByType.all(projectId, docType);
|
|
74
|
+
}
|
|
75
|
+
findByPath(projectId, filePath) {
|
|
76
|
+
return this.stmts.findByPath.get(projectId, filePath);
|
|
77
|
+
}
|
|
78
|
+
search(query, projectId, limit = 20) {
|
|
79
|
+
if (projectId !== undefined) {
|
|
80
|
+
return this.stmts.searchProject.all(query, projectId, limit);
|
|
81
|
+
}
|
|
82
|
+
return this.stmts.search.all(query, limit);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=doc.repository.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doc.repository.js","sourceRoot":"","sources":["../../../src/db/repositories/doc.repository.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type Database from 'better-sqlite3';
|
|
2
|
+
import type { MemoryRecord, MemoryCategory, MemoryRepoInterface } from '../../types/memory.types.js';
|
|
3
|
+
type CreateMemoryData = Omit<MemoryRecord, 'id' | 'created_at' | 'updated_at'>;
|
|
4
|
+
export declare class MemoryRepository implements MemoryRepoInterface {
|
|
5
|
+
private db;
|
|
6
|
+
private stmts;
|
|
7
|
+
constructor(db: Database.Database);
|
|
8
|
+
create(data: CreateMemoryData): number;
|
|
9
|
+
getById(id: number): MemoryRecord | undefined;
|
|
10
|
+
findByKey(projectId: number | null, key: string): MemoryRecord | undefined;
|
|
11
|
+
findByCategory(category: MemoryCategory, projectId?: number, limit?: number): MemoryRecord[];
|
|
12
|
+
findActive(projectId?: number, limit?: number): MemoryRecord[];
|
|
13
|
+
search(query: string, limit?: number): MemoryRecord[];
|
|
14
|
+
supersede(oldId: number, newId: number): void;
|
|
15
|
+
deactivate(id: number): void;
|
|
16
|
+
expireOld(): number;
|
|
17
|
+
update(id: number, data: Partial<MemoryRecord>): void;
|
|
18
|
+
findBySession(sessionId: number): MemoryRecord[];
|
|
19
|
+
upsertByKey(projectId: number | null, key: string, content: string, category: MemoryCategory, importance?: number, source?: string, tags?: string[]): {
|
|
20
|
+
memoryId: number;
|
|
21
|
+
superseded?: number;
|
|
22
|
+
};
|
|
23
|
+
countActive(): number;
|
|
24
|
+
countByCategory(): Record<string, number>;
|
|
25
|
+
}
|
|
26
|
+
export {};
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
export class MemoryRepository {
|
|
2
|
+
db;
|
|
3
|
+
stmts;
|
|
4
|
+
constructor(db) {
|
|
5
|
+
this.db = db;
|
|
6
|
+
this.stmts = {
|
|
7
|
+
create: this.db.prepare(`
|
|
8
|
+
INSERT INTO memories (project_id, session_id, category, key, content, importance, source, tags, expires_at, superseded_by, active, embedding)
|
|
9
|
+
VALUES (@project_id, @session_id, @category, @key, @content, @importance, @source, @tags, @expires_at, @superseded_by, @active, @embedding)
|
|
10
|
+
`),
|
|
11
|
+
getById: this.db.prepare('SELECT * FROM memories WHERE id = ?'),
|
|
12
|
+
findByKey: this.db.prepare('SELECT * FROM memories WHERE project_id IS ? AND key = ? AND active = 1'),
|
|
13
|
+
findByCategoryAll: this.db.prepare('SELECT * FROM memories WHERE category = ? AND active = 1 ORDER BY importance DESC LIMIT ?'),
|
|
14
|
+
findByCategoryProject: this.db.prepare('SELECT * FROM memories WHERE category = ? AND project_id = ? AND active = 1 ORDER BY importance DESC LIMIT ?'),
|
|
15
|
+
findActiveAll: this.db.prepare('SELECT * FROM memories WHERE active = 1 ORDER BY updated_at DESC LIMIT ?'),
|
|
16
|
+
findActiveProject: this.db.prepare('SELECT * FROM memories WHERE active = 1 AND project_id = ? ORDER BY updated_at DESC LIMIT ?'),
|
|
17
|
+
search: this.db.prepare(`
|
|
18
|
+
SELECT m.* FROM memories m
|
|
19
|
+
JOIN memories_fts ON m.id = memories_fts.rowid
|
|
20
|
+
WHERE memories_fts MATCH ? AND m.active = 1
|
|
21
|
+
ORDER BY rank
|
|
22
|
+
LIMIT ?
|
|
23
|
+
`),
|
|
24
|
+
supersede: this.db.prepare("UPDATE memories SET superseded_by = ?, active = 0, updated_at = datetime('now') WHERE id = ?"),
|
|
25
|
+
deactivate: this.db.prepare("UPDATE memories SET active = 0, updated_at = datetime('now') WHERE id = ?"),
|
|
26
|
+
expireOld: this.db.prepare("UPDATE memories SET active = 0 WHERE expires_at IS NOT NULL AND expires_at < datetime('now') AND active = 1"),
|
|
27
|
+
update: this.db.prepare(`
|
|
28
|
+
UPDATE memories
|
|
29
|
+
SET content = COALESCE(@content, content),
|
|
30
|
+
importance = COALESCE(@importance, importance),
|
|
31
|
+
tags = COALESCE(@tags, tags),
|
|
32
|
+
expires_at = COALESCE(@expires_at, expires_at),
|
|
33
|
+
updated_at = datetime('now')
|
|
34
|
+
WHERE id = @id
|
|
35
|
+
`),
|
|
36
|
+
findBySession: this.db.prepare('SELECT * FROM memories WHERE session_id = ? AND active = 1 ORDER BY created_at'),
|
|
37
|
+
countActive: this.db.prepare('SELECT COUNT(*) as count FROM memories WHERE active = 1'),
|
|
38
|
+
countByCategory: this.db.prepare('SELECT category, COUNT(*) as count FROM memories WHERE active = 1 GROUP BY category'),
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
create(data) {
|
|
42
|
+
const result = this.stmts.create.run({
|
|
43
|
+
project_id: data.project_id ?? null,
|
|
44
|
+
session_id: data.session_id ?? null,
|
|
45
|
+
category: data.category,
|
|
46
|
+
key: data.key ?? null,
|
|
47
|
+
content: data.content,
|
|
48
|
+
importance: data.importance ?? 5,
|
|
49
|
+
source: data.source ?? 'explicit',
|
|
50
|
+
tags: data.tags ?? null,
|
|
51
|
+
expires_at: data.expires_at ?? null,
|
|
52
|
+
superseded_by: data.superseded_by ?? null,
|
|
53
|
+
active: data.active ?? 1,
|
|
54
|
+
embedding: data.embedding ?? null,
|
|
55
|
+
});
|
|
56
|
+
return result.lastInsertRowid;
|
|
57
|
+
}
|
|
58
|
+
getById(id) {
|
|
59
|
+
return this.stmts.getById.get(id);
|
|
60
|
+
}
|
|
61
|
+
findByKey(projectId, key) {
|
|
62
|
+
return this.stmts.findByKey.get(projectId ?? null, key);
|
|
63
|
+
}
|
|
64
|
+
findByCategory(category, projectId, limit = 50) {
|
|
65
|
+
if (projectId !== undefined) {
|
|
66
|
+
return this.stmts.findByCategoryProject.all(category, projectId, limit);
|
|
67
|
+
}
|
|
68
|
+
return this.stmts.findByCategoryAll.all(category, limit);
|
|
69
|
+
}
|
|
70
|
+
findActive(projectId, limit = 50) {
|
|
71
|
+
if (projectId !== undefined) {
|
|
72
|
+
return this.stmts.findActiveProject.all(projectId, limit);
|
|
73
|
+
}
|
|
74
|
+
return this.stmts.findActiveAll.all(limit);
|
|
75
|
+
}
|
|
76
|
+
search(query, limit = 20) {
|
|
77
|
+
return this.stmts.search.all(query, limit);
|
|
78
|
+
}
|
|
79
|
+
supersede(oldId, newId) {
|
|
80
|
+
this.stmts.supersede.run(newId, oldId);
|
|
81
|
+
}
|
|
82
|
+
deactivate(id) {
|
|
83
|
+
this.stmts.deactivate.run(id);
|
|
84
|
+
}
|
|
85
|
+
expireOld() {
|
|
86
|
+
const result = this.stmts.expireOld.run();
|
|
87
|
+
return result.changes;
|
|
88
|
+
}
|
|
89
|
+
update(id, data) {
|
|
90
|
+
this.stmts.update.run({
|
|
91
|
+
id,
|
|
92
|
+
content: data.content ?? null,
|
|
93
|
+
importance: data.importance ?? null,
|
|
94
|
+
tags: data.tags ?? null,
|
|
95
|
+
expires_at: data.expires_at ?? null,
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
findBySession(sessionId) {
|
|
99
|
+
return this.stmts.findBySession.all(sessionId);
|
|
100
|
+
}
|
|
101
|
+
upsertByKey(projectId, key, content, category, importance = 5, source = 'explicit', tags) {
|
|
102
|
+
const existing = this.findByKey(projectId, key);
|
|
103
|
+
const newId = this.create({
|
|
104
|
+
project_id: projectId,
|
|
105
|
+
session_id: null,
|
|
106
|
+
category,
|
|
107
|
+
key,
|
|
108
|
+
content,
|
|
109
|
+
importance,
|
|
110
|
+
source: source,
|
|
111
|
+
tags: tags ? JSON.stringify(tags) : null,
|
|
112
|
+
expires_at: null,
|
|
113
|
+
superseded_by: null,
|
|
114
|
+
active: 1,
|
|
115
|
+
embedding: null,
|
|
116
|
+
});
|
|
117
|
+
if (existing) {
|
|
118
|
+
this.supersede(existing.id, newId);
|
|
119
|
+
return { memoryId: newId, superseded: existing.id };
|
|
120
|
+
}
|
|
121
|
+
return { memoryId: newId };
|
|
122
|
+
}
|
|
123
|
+
countActive() {
|
|
124
|
+
const row = this.stmts.countActive.get();
|
|
125
|
+
return row.count;
|
|
126
|
+
}
|
|
127
|
+
countByCategory() {
|
|
128
|
+
const rows = this.stmts.countByCategory.all();
|
|
129
|
+
const result = {};
|
|
130
|
+
for (const row of rows) {
|
|
131
|
+
result[row.category] = row.count;
|
|
132
|
+
}
|
|
133
|
+
return result;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
//# sourceMappingURL=memory.repository.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory.repository.js","sourceRoot":"","sources":["../../../src/db/repositories/memory.repository.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type Database from 'better-sqlite3';
|
|
2
|
+
import type { SessionRecord, SessionRepoInterface } from '../../types/memory.types.js';
|
|
3
|
+
type CreateSessionData = Omit<SessionRecord, 'id'>;
|
|
4
|
+
export declare class SessionRepository implements SessionRepoInterface {
|
|
5
|
+
private db;
|
|
6
|
+
private stmts;
|
|
7
|
+
constructor(db: Database.Database);
|
|
8
|
+
create(data: CreateSessionData): number;
|
|
9
|
+
getById(id: number): SessionRecord | undefined;
|
|
10
|
+
findBySessionId(sessionId: string): SessionRecord | undefined;
|
|
11
|
+
findByProject(projectId: number, limit?: number): SessionRecord[];
|
|
12
|
+
findRecent(limit?: number): SessionRecord[];
|
|
13
|
+
update(id: number, data: Partial<SessionRecord>): void;
|
|
14
|
+
search(query: string, limit?: number): SessionRecord[];
|
|
15
|
+
countAll(): number;
|
|
16
|
+
findLast(): SessionRecord | undefined;
|
|
17
|
+
}
|
|
18
|
+
export {};
|