summary system backend implementation

This commit is contained in:
Storme-bit
2026-04-19 06:50:24 -07:00
parent 15c1bec609
commit 2769f436fa
10 changed files with 210 additions and 106 deletions

View File

@@ -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`);

View File

@@ -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

View 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 };