From 095c9a623e3c75286c9e5fec131908cabdb0c5a7 Mon Sep 17 00:00:00 2001 From: Storme-bit Date: Sun, 26 Apr 2026 23:00:18 -0700 Subject: [PATCH] error response consistency, human readible1 --- .../inference-service/src/routes/inference.js | 2 +- .../memory-service/src/entities/extraction.js | 18 +++++++++++++++--- packages/memory-service/src/index.js | 8 ++++---- .../orchestration-service/src/routes/chat.js | 2 +- .../src/routes/episodes.js | 4 ++-- .../src/routes/projects.js | 8 ++++---- .../src/routes/summaries.js | 6 +++--- 7 files changed, 30 insertions(+), 18 deletions(-) diff --git a/packages/inference-service/src/routes/inference.js b/packages/inference-service/src/routes/inference.js index 33bef19..f245e4d 100644 --- a/packages/inference-service/src/routes/inference.js +++ b/packages/inference-service/src/routes/inference.js @@ -17,7 +17,7 @@ router.post('/complete', async (req, res) => { res.json(result); } catch (error) { logger.error('[Inference] Completion error:', error.message); - res.status(500).json({ error: error.message }); + res.status(500).json({ error: 'Inference failed', detail: error.message }); } }); diff --git a/packages/memory-service/src/entities/extraction.js b/packages/memory-service/src/entities/extraction.js index ca98099..22503eb 100644 --- a/packages/memory-service/src/entities/extraction.js +++ b/packages/memory-service/src/entities/extraction.js @@ -87,15 +87,27 @@ async function extractAndStoreEntities(userMessage, aiResponse, projectId=null) const data = await res.json(); const raw = data.response?.trim() ?? ''; - const parsed = JSON.parse(raw); + const jsonMatch = raw.match(/\{[\s\S]*\}/); + if (!jsonMatch) { + logger.warn('[entities] No JSON object found in response'); + logger.debug('[entities] Raw response was:', raw); + return; + } + + let parsed; + try { + parsed = JSON.parse(jsonMatch[0]); + } catch (err) { + logger.warn('[entities] Failed to parse extraction response:', err.message); + logger.debug('[entities] Raw response was:', raw); + return; + } const entities = Array.isArray(parsed.entities) ? parsed.entities : []; if (entities.length === 0) { logger.debug('[entities] No entities found in this exchange — skipping'); return; // not an error, just nothing to extract } - if (!Array.isArray(entities)) throw new Error('Response was not a JSON array'); - let saved = 0; diff --git a/packages/memory-service/src/index.js b/packages/memory-service/src/index.js index 75678f1..8786217 100644 --- a/packages/memory-service/src/index.js +++ b/packages/memory-service/src/index.js @@ -80,7 +80,7 @@ app.patch('/sessions/by-external/:externalId', (req, res) => { const session = episodic.updateSessionByExternalId(req.params.externalId, {name, projectId }); res.json(session); } catch (err) { - res.status(500).json({error: err.message }); + res.status(500).json({ error: 'Failed to update session', detail: err.message }); } }); @@ -235,7 +235,7 @@ app.post('/projects', (req, res) => { try { res.status(201).json(createProject({ name: name.trim(), description, colour, icon })); } catch (err) { - res.status(500).json({ error: err.message }); + res.status(500).json({ error: 'Failed to create project', detail: err.message }); } }); @@ -255,7 +255,7 @@ app.post('/projects/:id/summarize', async (req, res) => { if (err.message.includes('No session summaries or episodes')) { return res.status(422).json({ error: err.message }); } - res.status(500).json({ error: err.message }); + res.status(500).json({ error: 'Failed to generate project summary', detail: err.message }); } }); @@ -310,7 +310,7 @@ app.post('/summaries', (req, res) => { const summary = createSummary({ sessionId, projectId, content, tokenCount, episodeRange, metadata }); res.status(201).json(summary); } catch (err) { - res.status(500).json({ error: err.message }); + res.status(500).json({ error: 'Failed to create summary', detail: err.message }); } }); diff --git a/packages/orchestration-service/src/routes/chat.js b/packages/orchestration-service/src/routes/chat.js index 7b36769..ebb6cf5 100644 --- a/packages/orchestration-service/src/routes/chat.js +++ b/packages/orchestration-service/src/routes/chat.js @@ -20,7 +20,7 @@ router.post('/', async (req, res) => { res.json(result) } catch (err) { logger.error(`[orchestration] chat error: `, err.message) - res.status(500).json ({ error: err.message}) + res.status(500).json ({ error: 'Chat failed', detail: err.message }) } }); diff --git a/packages/orchestration-service/src/routes/episodes.js b/packages/orchestration-service/src/routes/episodes.js index 90bf0b0..a4dd204 100644 --- a/packages/orchestration-service/src/routes/episodes.js +++ b/packages/orchestration-service/src/routes/episodes.js @@ -9,7 +9,7 @@ router.get('/', async (req, res) => { const result = await memory.getEpisodes({ limit, offset, sessionId, q }); res.json(result); } catch (err) { - res.status(500).json({ error: err.message }); + res.status(500).json({ error: 'Failed to fetch episodes', detail: err.message }); } }); @@ -18,7 +18,7 @@ router.delete('/:id', async (req, res) => { await memory.deleteEpisode(req.params.id); res.status(204).send(); } catch (err) { - res.status(500).json({ error: err.message }); + res.status(500).json({ error: 'Failed to delete episode', detail: err.message }); } }); diff --git a/packages/orchestration-service/src/routes/projects.js b/packages/orchestration-service/src/routes/projects.js index 8cc799a..13618c5 100644 --- a/packages/orchestration-service/src/routes/projects.js +++ b/packages/orchestration-service/src/routes/projects.js @@ -7,7 +7,7 @@ router.get('/', async (req, res) => { try { res.json(await memory.getProjects()); } catch (err) { - res.status(500).json({ error: err.message }); + res.status(500).json({ error: 'Failed to fetch projects', detail: err.message }); } }); @@ -17,7 +17,7 @@ router.post('/', async (req, res) => { try { res.status(201).json(await memory.createProject({ name: name.trim(), description, colour, icon, isolated })); } catch (err) { - res.status(500).json({ error: err.message }); + res.status(500).json({ error: 'Failed to create project', detail: err.message }); } }); @@ -25,7 +25,7 @@ router.patch('/:id', async (req, res) => { try { res.json(await memory.updateProject(req.params.id, req.body)); } catch (err) { - res.status(500).json({ error: err.message }); + res.status(500).json({ error: 'Failed to update project', detail: err.message }); } }); @@ -34,7 +34,7 @@ router.delete('/:id', async (req, res) => { await memory.deleteProject(req.params.id); res.status(204).send(); } catch (err) { - res.status(500).json({ error: err.message }); + res.status(500).json({ error: 'Failed to delete project', detail: err.message }); } }); diff --git a/packages/orchestration-service/src/routes/summaries.js b/packages/orchestration-service/src/routes/summaries.js index 4c46318..6f56823 100644 --- a/packages/orchestration-service/src/routes/summaries.js +++ b/packages/orchestration-service/src/routes/summaries.js @@ -21,7 +21,7 @@ router.get('/project/:projectId/overview', async (req, res) => { const summary = await memory.getProjectOverviewSummary(req.params.projectId); res.json(summary); } catch (err) { - res.status(500).json({ error: err.message }); + res.status(500).json({ error: 'Failed to fetch project overview summary', detail: err.message }); } }); @@ -32,7 +32,7 @@ router.get('/session/:sessionId', async (req, res) => { const summaries = await memory.getSummariesBySession(session.id); res.json(summaries); } catch (err) { - res.status(500).json({ error: err.message }); + res.status(500).json({ error: 'Failed to fetch session summaries', detail: err.message }); } }); @@ -41,7 +41,7 @@ router.get('/project/:projectId', async (req, res) => { const summaries = await memory.getSummariesByProject(req.params.projectId); res.json(summaries); } catch (err) { - res.status(500).json({ error: err.message }); + res.status(500).json({ error: 'Failed to fetch project summaries', detail: err.message }); } });