code clean up pass

This commit is contained in:
Storme-bit
2026-04-26 05:38:47 -07:00
parent 785047a824
commit bdc5947fcb
3 changed files with 15 additions and 30 deletions

View File

@@ -98,27 +98,26 @@ function deleteSessionByExternalId(externalId) {
// --Episodes -------------------------------------------------- // --Episodes --------------------------------------------------
// Creates a new episode linked to a session, with user message, AI response, optional token count, and metadata // Creates a new episode linked to a session, with user message, AI response, optional token count, and metadata
async function createEpisode(sessionId, userMessage, aiResponse, tokenCount = null, metadata = null, projectId=null) { async function createEpisode(sessionId, userMessage, aiResponse, tokenCount = null, projectId=null) {
const db = getDB(); const db = getDB();
// Wrap insert + session touch in a transaction — both succeed or neither does // Wrap insert + session touch in a transaction — both succeed or neither does
const insert = db.transaction(() => { const insert = db.transaction(() => {
const stmt = db.prepare(` const stmt = db.prepare(`
INSERT INTO episodes (session_id, user_message, ai_response, token_count, metadata) INSERT INTO episodes (session_id, user_message, ai_response, token_count)
VALUES (?, ?, ?, ?, ?) VALUES (?, ?, ?, ?)
`); `);
const result = stmt.run( const result = stmt.run(
sessionId, sessionId,
userMessage, userMessage,
aiResponse, aiResponse,
tokenCount, tokenCount,
metadata ? JSON.stringify(metadata) : null
); );
touchSession(sessionId); touchSession(sessionId);
return getEpisode(result.lastInsertRowid); return getEpisode(result.lastInsertRowid);
}); });
const episode= insert(); const episode = insert();
//embed ascynchronously after SQLite completes, non-blocking. If embedding fail, the episode still saved. //embed ascynchronously after SQLite completes, non-blocking. If embedding fail, the episode still saved.
getEpisodeEmbedding(userMessage, aiResponse) getEpisodeEmbedding(userMessage, aiResponse)
@@ -155,11 +154,12 @@ function getEpisodesBySession(sessionId, limit = EPISODIC.DEFAULT_PAGE_SIZE, off
} }
// Retrieves recent episodes across all sessions, ordered by creation time descending, with a limit // Retrieves recent episodes across all sessions, ordered by creation time descending, with a limit
function getRecentEpisodes(limit = EPISODIC.DEFAULT_RECENT_LIMIT) { function getRecentEpisodes(sessionId, limit = EPISODIC.DEFAULT_RECENT_LIMIT) {
// Cross-session recent episodes — useful for recency-based retrieval // Cross-session recent episodes — useful for recency-based retrieval
const db = getDB(); const db = getDB();
const stmt = db.prepare(` const stmt = db.prepare(`
SELECT * FROM episodes SELECT * FROM episodes
WHERE session_id = ?
ORDER BY created_at DESC ORDER BY created_at DESC
LIMIT ? LIMIT ?
`); `);

View File

@@ -83,9 +83,7 @@ app.patch('/sessions/by-external/:externalId', (req, res) => {
} }
}); });
// Deletes a session and all associated episodes
// Updates the session's updated_at timestamp to now
app.delete('/sessions/by-external/:externalId', (req, res) => { app.delete('/sessions/by-external/:externalId', (req, res) => {
episodic.deleteSessionByExternalId(req.params.externalId); episodic.deleteSessionByExternalId(req.params.externalId);
res.status(204).send(); res.status(204).send();
@@ -103,13 +101,6 @@ app.post('/episodes', async (req, res) => {
} }
const episode = await episodic.createEpisode(sessionId, userMessage, aiResponse, tokenCount, metadata, projectId); const episode = await episodic.createEpisode(sessionId, userMessage, aiResponse, tokenCount, metadata, projectId);
console.log('[memory] create episode body:', {
sessionId,
userMessageLength: userMessage?.length,
aiResponseLength: aiResponse?.length,
tokenCount
});
res.status(201).json(episode); res.status(201).json(episode);
}); });

View File

@@ -182,20 +182,15 @@ async function chat(externalId, userMessage, options = {}) {
const result = await inference.complete(prompt, {...options, temperature, repeatPenalty, topP, topK}); const result = await inference.complete(prompt, {...options, temperature, repeatPenalty, topP, topK});
// 6. Write episode back to memory // 6. Write episode back to memory
memory try {
.createEpisode( await memory.createEpisode(
session.id, session.id, userMessage, result.text,
userMessage,
result.text,
(result.evalCount || 0) + (result.promptEvalCount || 0), (result.evalCount || 0) + (result.promptEvalCount || 0),
session.project_id ?? null, session.project_id ?? null,
)
.catch((err) =>
console.error(`[orchestration] Failed to save episode`, err.message),
); );
} catch (err) {
// 7. Trigger summarization check (fire-and-forget) console.error('[orchestration] Failed to save episode:', err.message);
// Pass full episodes list so summarization can sum tokens accurately }
const allEpisodes = await memory.getRecentEpisodes(session.id, 9999); const allEpisodes = await memory.getRecentEpisodes(session.id, 9999);
triggerSummary(session, allEpisodes); triggerSummary(session, allEpisodes);
@@ -258,7 +253,6 @@ async function chatStream(externalId, userMessage, onChunk, options = {}) {
); );
const entities = await getRelevantEntities(userMessage, session.project_id ?? null); const entities = await getRelevantEntities(userMessage, session.project_id ?? null);
console.log('[orchestration] entity search projectId:', session.project_id ?? null);
const prompt = buildPrompt( const prompt = buildPrompt(
recentEpisodes, recentEpisodes,