summary system backend implementation
This commit is contained in:
@@ -38,6 +38,18 @@ function getDB() {
|
||||
db.exec(`ALTER TABLE projects ADD COLUMN system_prompt TEXT`);
|
||||
} catch {}
|
||||
|
||||
try {
|
||||
db.exec(`ALTER TABLE summaries ADD COLUMN project_id INTEGER REFERENCES projects(id) ON DELETE CASCADE`);
|
||||
} catch {}
|
||||
|
||||
try {
|
||||
db.exec(`ALTER TABLE summaries ADD COLUMN token_count INTEGER`);
|
||||
} catch {}
|
||||
|
||||
try {
|
||||
db.exec(`CREATE INDEX IF NOT EXISTS idx_summaries_project ON summaries(project_id)`);
|
||||
} catch {}
|
||||
|
||||
// Sync FTS index with any existing episodes data
|
||||
db.exec(`INSERT OR REPLACE INTO episodes_fts(rowid, user_message, ai_response)
|
||||
SELECT id, user_message, ai_response FROM episodes`);
|
||||
|
||||
@@ -41,12 +41,17 @@ const schema = `
|
||||
CREATE TABLE IF NOT EXISTS summaries (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
session_id INTEGER REFERENCES sessions(id) ON DELETE CASCADE,
|
||||
project_id INTEGER REFERENCES projects(id) ON DELETE CASCADE,
|
||||
content TEXT NOT NULL,
|
||||
token_count INTEGER,
|
||||
episode_range TEXT,
|
||||
created_at INTEGER NOT NULL DEFAULT (unixepoch()),
|
||||
metadata TEXT
|
||||
);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS idx_summaries_session ON summaries(session_id);
|
||||
CREATE INDEX IF NOT EXISTS idx_summaries_project ON summaries(project_id);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS idx_episodes_session
|
||||
ON episodes(session_id);
|
||||
CREATE INDEX IF NOT EXISTS idx_episodes_created
|
||||
|
||||
53
packages/memory-service/src/db/summaries.js
Normal file
53
packages/memory-service/src/db/summaries.js
Normal file
@@ -0,0 +1,53 @@
|
||||
const { getDB } = require('./index');
|
||||
const { parseRow } = require('@nexusai/shared');
|
||||
|
||||
function createSummary({ sessionId = null, projectId = null, content, tokenCount = null, episodeRange = null, metadata = null }) {
|
||||
const db = getDB();
|
||||
const result = db.prepare(`
|
||||
INSERT INTO summaries (session_id, project_id, content, token_count, episode_range, metadata)
|
||||
VALUES (?, ?, ?, ?, ?, ?)
|
||||
`).run(sessionId, projectId, content, tokenCount, episodeRange, metadata ? JSON.stringify(metadata) : null);
|
||||
|
||||
return getSummary(result.lastInsertRowid);
|
||||
}
|
||||
|
||||
function getSummary(id) {
|
||||
const db = getDB();
|
||||
const row = db.prepare(`SELECT * FROM summaries WHERE id = ?`).get(id);
|
||||
return row ? parseRow(row) : null;
|
||||
}
|
||||
|
||||
function getSummariesBySession(sessionId) {
|
||||
const db = getDB();
|
||||
return db.prepare(`SELECT * FROM summaries WHERE session_id = ? ORDER BY created_at ASC`)
|
||||
.all(sessionId).map(parseRow);
|
||||
}
|
||||
|
||||
function getSummariesByProject(projectId) {
|
||||
const db = getDB();
|
||||
return db.prepare(`SELECT * FROM summaries WHERE project_id = ? ORDER BY created_at ASC`)
|
||||
.all(projectId).map(parseRow);
|
||||
}
|
||||
|
||||
function updateSummary(id, { content, tokenCount, episodeRange, metadata }) {
|
||||
const db = getDB();
|
||||
const fields = [];
|
||||
const values = [];
|
||||
|
||||
if (content !== undefined) { fields.push('content = ?'); values.push(content); }
|
||||
if (tokenCount !== undefined) { fields.push('token_count = ?'); values.push(tokenCount); }
|
||||
if (episodeRange !== undefined){ fields.push('episode_range = ?'); values.push(episodeRange); }
|
||||
if (metadata !== undefined) { fields.push('metadata = ?'); values.push(JSON.stringify(metadata)); }
|
||||
|
||||
if (!fields.length) return getSummary(id);
|
||||
|
||||
values.push(id);
|
||||
db.prepare(`UPDATE summaries SET ${fields.join(', ')} WHERE id = ?`).run(...values);
|
||||
return getSummary(id);
|
||||
}
|
||||
|
||||
function deleteSummary(id) {
|
||||
getDB().prepare(`DELETE FROM summaries WHERE id = ?`).run(id);
|
||||
}
|
||||
|
||||
module.exports = { createSummary, getSummary, getSummariesBySession, getSummariesByProject, updateSummary, deleteSummary };
|
||||
Reference in New Issue
Block a user