bulk episodic deletion
This commit is contained in:
@@ -112,6 +112,29 @@ app.post('/episodes', async (req, res) => {
|
|||||||
res.status(201).json(episode);
|
res.status(201).json(episode);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
app.get('/episodes', (req, res) => {
|
||||||
|
const { limit = 50, offset = 0, sessionId, q } = req.query;
|
||||||
|
|
||||||
|
if (q) {
|
||||||
|
const results = episodic.searchEpisodes(q, Number(limit));
|
||||||
|
return res.json({ episodes: results, total: results.length });
|
||||||
|
}
|
||||||
|
|
||||||
|
const db = getDB();
|
||||||
|
let episodes;
|
||||||
|
|
||||||
|
if (sessionId) {
|
||||||
|
episodes = episodic.getEpisodesBySession(Number(sessionId), Number(limit), Number(offset));
|
||||||
|
} else {
|
||||||
|
episodes = db.prepare(
|
||||||
|
`SELECT * FROM episodes ORDER BY created_at DESC LIMIT ? OFFSET ?`
|
||||||
|
).all(Number(limit), Number(offset)).map(row => require('@nexusai/shared').parseRow(row));
|
||||||
|
}
|
||||||
|
|
||||||
|
const total = db.prepare(`SELECT COUNT(*) as count FROM episodes`).get().count;
|
||||||
|
res.json({ episodes, total });
|
||||||
|
});
|
||||||
|
|
||||||
// Search MUST come before /:id — otherwise 'search' gets captured as an id
|
// Search MUST come before /:id — otherwise 'search' gets captured as an id
|
||||||
app.get('/episodes/search', (req, res) => {
|
app.get('/episodes/search', (req, res) => {
|
||||||
const { q, limit = EPISODIC.DEFAULT_PAGE_SIZE } = req.query;
|
const { q, limit = EPISODIC.DEFAULT_PAGE_SIZE } = req.query;
|
||||||
@@ -138,7 +161,12 @@ app.get('/sessions/:id/episodes', (req, res) => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
app.delete('/episodes/:id', (req, res) => {
|
app.delete('/episodes/:id', (req, res) => {
|
||||||
episodic.deleteEpisode(req.params.id);
|
const id = Number(req.params.id);
|
||||||
|
episodic.deleteEpisode(id);
|
||||||
|
|
||||||
|
semantic.deleteEpisode(id) // fire-and-forget
|
||||||
|
.catch(err => console.error(`[Memory] Qdrant delete failed for episode ${id}:`, err.message));
|
||||||
|
|
||||||
res.status(204).send();
|
res.status(204).send();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -95,6 +95,11 @@ async function deleteVector(collection, id) {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async function deleteEpisode(id) {
|
||||||
|
return deleteVector(COLLECTIONS.EPISODES, id);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
module.exports = {
|
module.exports = {
|
||||||
initCollections,
|
initCollections,
|
||||||
upsertEpisode,
|
upsertEpisode,
|
||||||
@@ -103,5 +108,6 @@ module.exports = {
|
|||||||
searchEpisodes,
|
searchEpisodes,
|
||||||
searchEntities,
|
searchEntities,
|
||||||
searchSummaries,
|
searchSummaries,
|
||||||
deleteVector
|
deleteVector,
|
||||||
|
deleteEpisode
|
||||||
};
|
};
|
||||||
BIN
packages/source.zip
Normal file
BIN
packages/source.zip
Normal file
Binary file not shown.
Reference in New Issue
Block a user