logger clean up
This commit is contained in:
2
.gitignore
vendored
2
.gitignore
vendored
@@ -5,5 +5,5 @@ data/
|
|||||||
.env
|
.env
|
||||||
.env.*
|
.env.*
|
||||||
*.db
|
*.db
|
||||||
/.claude
|
.claude/settings.local.json
|
||||||
EOF
|
EOF
|
||||||
2
.vscode/settings.json
vendored
2
.vscode/settings.json
vendored
@@ -1,2 +0,0 @@
|
|||||||
{
|
|
||||||
}
|
|
||||||
@@ -43,14 +43,14 @@
|
|||||||
*Target: Next development session (Saturday)*
|
*Target: Next development session (Saturday)*
|
||||||
|
|
||||||
### Bug Fixes
|
### Bug Fixes
|
||||||
- [ ] **Entity extraction JSON parsing** — robustify response parser in `extraction.js` to handle model returning markdown fences or preamble around JSON
|
- [x] **Entity extraction JSON parsing** — robustify response parser in `extraction.js` to handle model returning markdown fences or preamble around JSON
|
||||||
- [ ] **Qdrant entity search empty results** — verify entities embedded post-isolation-fix are surfacing correctly in project session searches
|
- [ ] **Qdrant entity search empty results** — verify entities embedded post-isolation-fix are surfacing correctly in project session searches
|
||||||
|
|
||||||
### Tech Debt
|
### Tech Debt
|
||||||
- [ ] **Logging** — introduce `LOG_LEVEL` env var across all services; reduce noise in production
|
- [x] **Logging** — introduce `LOG_LEVEL` env var across all services; reduce noise in production
|
||||||
- [ ] **Error response consistency** — audit all endpoints for uniform `{ error, detail }` shape
|
- [x] **Error response consistency** — audit all endpoints for uniform `{ error, detail }` shape
|
||||||
- [ ] **Constants audit** — move any remaining inline magic numbers (limits, thresholds, timeouts) to shared config
|
- [x] **Constants audit** — move any remaining inline magic numbers (limits, thresholds, timeouts) to shared config
|
||||||
- [ ] **Orchestration `chat/index.js` review** — extract any logic that has grown beyond its intended scope into dedicated modules
|
- [x] **Orchestration `chat/index.js` review** — extract any logic that has grown beyond its intended scope into dedicated modules
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import { API_DEFAULTS } from "../config/constants";
|
import { API_DEFAULTS } from "../config/constants";
|
||||||
import { logger } from "@nexusai/shared";
|
|
||||||
|
|
||||||
const BASE_URL = import.meta.env.VITE_ORCHESTRATION_URL ?? '';
|
const BASE_URL = import.meta.env.VITE_ORCHESTRATION_URL ?? '';
|
||||||
|
|
||||||
@@ -79,7 +79,7 @@ export function streamMessage(sessionId, message, model, { onChunk, onDone, onEr
|
|||||||
if (data.done) onDone({ model: data.model ?? model, tokenCount: data.tokenCount ?? 0 });
|
if (data.done) onDone({ model: data.model ?? model, tokenCount: data.tokenCount ?? 0 });
|
||||||
if (data.error) onError(new Error(data.error));
|
if (data.error) onError(new Error(data.error));
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
logger.error('[chat-client] Failed to parse SSE event:', raw, err);
|
console.error('[chat-client] Failed to parse SSE event:', raw, err);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import React, { useState, useEffect } from 'react';
|
import React, { useState, useEffect } from 'react';
|
||||||
import { fetchSessions, deleteSession } from '../api/orchestration';
|
import { fetchSessions, deleteSession } from '../api/orchestration';
|
||||||
import { CLIENT_DEFAULTS } from '../config/constants';
|
import { CLIENT_DEFAULTS } from '../config/constants';
|
||||||
const { logger } = require('@nexusai/shared');
|
|
||||||
|
|
||||||
const PAGE_SIZE = CLIENT_DEFAULTS.PAGE_SIZE;
|
const PAGE_SIZE = CLIENT_DEFAULTS.PAGE_SIZE;
|
||||||
|
|
||||||
@@ -26,7 +26,7 @@ export default function AllChatsView({ onSelectSession, onBack, projects }) {
|
|||||||
setSessions(data);
|
setSessions(data);
|
||||||
setTotal(data.length === PAGE_SIZE ? (p + 2) * PAGE_SIZE : p * PAGE_SIZE + data.length);
|
setTotal(data.length === PAGE_SIZE ? (p + 2) * PAGE_SIZE : p * PAGE_SIZE + data.length);
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
logger.error('[AllChatsView] Failed to load sessions:', err.message);
|
console.error('[AllChatsView] Failed to load sessions:', err.message);
|
||||||
} finally {
|
} finally {
|
||||||
setLoading(false);
|
setLoading(false);
|
||||||
}
|
}
|
||||||
@@ -55,7 +55,7 @@ export default function AllChatsView({ onSelectSession, onBack, projects }) {
|
|||||||
setConfirmOpen(false);
|
setConfirmOpen(false);
|
||||||
await loadPage(page);
|
await loadPage(page);
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
logger.error('[AllChatsView] Bulk delete failed:', err.message);
|
console.error('[AllChatsView] Bulk delete failed:', err.message);
|
||||||
} finally {
|
} finally {
|
||||||
setDeleting(false);
|
setDeleting(false);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import React, { useState, useEffect } from 'react';
|
import React, { useState, useEffect } from 'react';
|
||||||
import ProjectModal from './ProjectModal';
|
import ProjectModal from './ProjectModal';
|
||||||
import { fetchProjects, createProject, updateProject, deleteProject } from '../api/orchestration';
|
import { fetchProjects, createProject, updateProject, deleteProject } from '../api/orchestration';
|
||||||
const { logger } = require('@nexusai/shared');
|
|
||||||
|
|
||||||
export default function AllProjectsView({ onProjectsChange, onBack, onSelectProject, onNavigate }) {
|
export default function AllProjectsView({ onProjectsChange, onBack, onSelectProject, onNavigate }) {
|
||||||
const [projects, setProjects] = useState([]);
|
const [projects, setProjects] = useState([]);
|
||||||
@@ -15,7 +15,7 @@ export default function AllProjectsView({ onProjectsChange, onBack, onSelectProj
|
|||||||
try {
|
try {
|
||||||
setProjects(await fetchProjects());
|
setProjects(await fetchProjects());
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
logger.error('[AllProjectsView] Failed to load:', err.message);
|
console.error('[AllProjectsView] Failed to load:', err.message);
|
||||||
} finally {
|
} finally {
|
||||||
setLoading(false);
|
setLoading(false);
|
||||||
}
|
}
|
||||||
@@ -31,7 +31,7 @@ async function handleSave({ name, description, colour, icon }) {
|
|||||||
await load();
|
await load();
|
||||||
onProjectsChange?.(); // add this
|
onProjectsChange?.(); // add this
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
logger.error('[AllProjectsView] Save failed:', err.message);
|
console.error('[AllProjectsView] Save failed:', err.message);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -41,7 +41,7 @@ async function handleDelete(id) {
|
|||||||
await load();
|
await load();
|
||||||
onProjectsChange?.(); // add this
|
onProjectsChange?.(); // add this
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
logger.error('[AllProjectsView] Delete failed:', err.message);
|
console.error('[AllProjectsView] Delete failed:', err.message);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
import React, { useState, useEffect } from 'react';
|
import React, { useState, useEffect } from 'react';
|
||||||
import { fetchSessions, updateProject, deleteProject, generateProjectSummary, fetchProjectOverviewSummary } from '../api/orchestration';
|
import { fetchSessions, updateProject, deleteProject, generateProjectSummary, fetchProjectOverviewSummary } from '../api/orchestration';
|
||||||
import ProjectModal from './ProjectModal';
|
import ProjectModal from './ProjectModal';
|
||||||
const { logger } = require('@nexusai/shared');
|
|
||||||
|
|
||||||
export default function ProjectView({ project, onNavigate, onBack, onSelectSession, onNewProjectChat, onProjectsChange }) {
|
export default function ProjectView({ project, onNavigate, onBack, onSelectSession, onNewProjectChat, onProjectsChange }) {
|
||||||
const [sessions, setSessions] = useState([]);
|
const [sessions, setSessions] = useState([]);
|
||||||
@@ -22,7 +21,7 @@ export default function ProjectView({ project, onNavigate, onBack, onSelectSessi
|
|||||||
try {
|
try {
|
||||||
setOverview(await fetchProjectOverviewSummary(project.id));
|
setOverview(await fetchProjectOverviewSummary(project.id));
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
logger.error('[ProjectView] Failed to load overview:', err.message);
|
console.error('[ProjectView] Failed to load overview:', err.message);
|
||||||
} finally {
|
} finally {
|
||||||
setOverviewLoading(false);
|
setOverviewLoading(false);
|
||||||
}
|
}
|
||||||
@@ -35,7 +34,7 @@ export default function ProjectView({ project, onNavigate, onBack, onSelectSessi
|
|||||||
try {
|
try {
|
||||||
setSessions(await fetchSessions(50, 0, project.id));
|
setSessions(await fetchSessions(50, 0, project.id));
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
logger.error('[ProjectView] Failed to load sessions:', err.message);
|
console.error('[ProjectView] Failed to load sessions:', err.message);
|
||||||
} finally {
|
} finally {
|
||||||
setLoading(false);
|
setLoading(false);
|
||||||
}
|
}
|
||||||
@@ -61,7 +60,7 @@ export default function ProjectView({ project, onNavigate, onBack, onSelectSessi
|
|||||||
onProjectsChange?.();
|
onProjectsChange?.();
|
||||||
setModal(null);
|
setModal(null);
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
logger.error('[ProjectView] Update failed:', err.message);
|
console.error('[ProjectView] Update failed:', err.message);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -71,7 +70,7 @@ export default function ProjectView({ project, onNavigate, onBack, onSelectSessi
|
|||||||
onProjectsChange?.();
|
onProjectsChange?.();
|
||||||
onBack();
|
onBack();
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
logger.error('[ProjectView] Delete failed:', err.message);
|
console.error('[ProjectView] Delete failed:', err.message);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -376,7 +375,7 @@ function NotesSection({ projectId, initialNotes }) {
|
|||||||
await updateProject(projectId, { notes });
|
await updateProject(projectId, { notes });
|
||||||
setSavedNotes(notes);
|
setSavedNotes(notes);
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
logger.error('[NotesSection] Save failed:', err.message);
|
console.error('[NotesSection] Save failed:', err.message);
|
||||||
} finally {
|
} finally {
|
||||||
setSaving(false);
|
setSaving(false);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ import React, { useState, useEffect, useCallback } from 'react';
|
|||||||
import { useSettings } from '../hooks/useSettings';
|
import { useSettings } from '../hooks/useSettings';
|
||||||
import { useModels } from '../hooks/useModels';
|
import { useModels } from '../hooks/useModels';
|
||||||
import { getServiceHealth } from '../api/orchestration';
|
import { getServiceHealth } from '../api/orchestration';
|
||||||
const { logger } = require('@nexusai/shared');
|
|
||||||
|
|
||||||
export default function SettingsView({ onNavigate, onBack, modelProps }) {
|
export default function SettingsView({ onNavigate, onBack, modelProps }) {
|
||||||
const { settings, saveSetting, saving } = useSettings();
|
const { settings, saveSetting, saving } = useSettings();
|
||||||
@@ -277,7 +277,7 @@ function ServiceHealth() {
|
|||||||
setServices(await getServiceHealth());
|
setServices(await getServiceHealth());
|
||||||
setLastChecked(new Date());
|
setLastChecked(new Date());
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
logger.error('[ServiceHealth]', err.message);
|
console.error('[ServiceHealth]', err.message);
|
||||||
} finally {
|
} finally {
|
||||||
setLoading(false);
|
setLoading(false);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,7 +2,6 @@ import React, { useState } from 'react';
|
|||||||
import SessionModal from './SessionModal';
|
import SessionModal from './SessionModal';
|
||||||
import { useContextMenu } from '../hooks/useContextMenu';
|
import { useContextMenu } from '../hooks/useContextMenu';
|
||||||
import { renameSession, deleteSession, updateSession } from '../api/orchestration';
|
import { renameSession, deleteSession, updateSession } from '../api/orchestration';
|
||||||
const { logger } = require('@nexusai/shared');
|
|
||||||
|
|
||||||
|
|
||||||
export default function Sidebar({
|
export default function Sidebar({
|
||||||
@@ -33,7 +32,7 @@ export default function Sidebar({
|
|||||||
await updateSession(session.external_id, { name, projectId });
|
await updateSession(session.external_id, { name, projectId });
|
||||||
onSessionsChange();
|
onSessionsChange();
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
logger.error('[Sidebar] Rename failed:', err.message);
|
console.error('[Sidebar] Rename failed:', err.message);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -42,7 +41,7 @@ export default function Sidebar({
|
|||||||
await deleteSession(session.external_id);
|
await deleteSession(session.external_id);
|
||||||
onSessionsChange(session);
|
onSessionsChange(session);
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
logger.error('[Sidebar] Delete failed:', err.message);
|
console.error('[Sidebar] Delete failed:', err.message);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
import React, { useEffect, useState, useCallback, useRef } from 'react';
|
import React, { useEffect, useState, useCallback, useRef } from 'react';
|
||||||
import { streamMessage, updateSession } from '../api/orchestration';
|
import { streamMessage, updateSession } from '../api/orchestration';
|
||||||
const { logger } = require('@nexusai/shared');
|
|
||||||
|
|
||||||
export function useChat({ activeSession, appendMessage, updateLastMessage, refreshSessions }) {
|
export function useChat({ activeSession, appendMessage, updateLastMessage, refreshSessions }) {
|
||||||
const [streaming, setStreaming] = useState(false);
|
const [streaming, setStreaming] = useState(false);
|
||||||
@@ -74,7 +73,7 @@ export function useChat({ activeSession, appendMessage, updateLastMessage, refre
|
|||||||
// Assign project after first message if one was set
|
// Assign project after first message if one was set
|
||||||
if (projectId) {
|
if (projectId) {
|
||||||
updateSession(targetSession.external_id, { projectId })
|
updateSession(targetSession.external_id, { projectId })
|
||||||
.catch(err => logger.warn('[useChat] Failed to assign project:', err.message));
|
.catch(err => console.warn('[useChat] Failed to assign project:', err.message));
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|||||||
@@ -2,7 +2,6 @@
|
|||||||
import { useState, useEffect } from 'react';
|
import { useState, useEffect } from 'react';
|
||||||
import { fetchModels } from '../api/orchestration';
|
import { fetchModels } from '../api/orchestration';
|
||||||
import { FALLBACK_MODELS, DEFAULT_MODEL } from '../config/constants';
|
import { FALLBACK_MODELS, DEFAULT_MODEL } from '../config/constants';
|
||||||
const { logger } = require('@nexusai/shared');
|
|
||||||
|
|
||||||
export function useModels() {
|
export function useModels() {
|
||||||
const [models, setModels] = useState(FALLBACK_MODELS);
|
const [models, setModels] = useState(FALLBACK_MODELS);
|
||||||
@@ -16,7 +15,7 @@ export function useModels() {
|
|||||||
setSelectedModel(data[0]?.value ?? DEFAULT_MODEL);
|
setSelectedModel(data[0]?.value ?? DEFAULT_MODEL);
|
||||||
})
|
})
|
||||||
.catch(err => {
|
.catch(err => {
|
||||||
logger.warn('[useModels] Falling back to static list:', err.message);
|
console.warn('[useModels] Falling back to static list:', err.message);
|
||||||
})
|
})
|
||||||
.finally(() => setLoading(false));
|
.finally(() => setLoading(false));
|
||||||
}, []);
|
}, []);
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import { useState, useEffect, useCallback } from 'react';
|
import { useState, useEffect, useCallback } from 'react';
|
||||||
import { fetchProjects } from '../api/orchestration';
|
import { fetchProjects } from '../api/orchestration';
|
||||||
const { logger } = require('@nexusai/shared');
|
|
||||||
|
|
||||||
export function useProjects() {
|
export function useProjects() {
|
||||||
const [projects, setProjects] = useState([]);
|
const [projects, setProjects] = useState([]);
|
||||||
@@ -9,7 +9,7 @@ export function useProjects() {
|
|||||||
try {
|
try {
|
||||||
setProjects(await fetchProjects());
|
setProjects(await fetchProjects());
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
logger.warn('[useProjects] Failed to load projects:', err.message);
|
console.warn('[useProjects] Failed to load projects:', err.message);
|
||||||
}
|
}
|
||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
|
|||||||
@@ -1,13 +1,12 @@
|
|||||||
import { useState, useEffect } from 'react';
|
import { useState, useEffect } from 'react';
|
||||||
import { getSettings, updateSettings } from '../api/orchestration';
|
import { getSettings, updateSettings } from '../api/orchestration';
|
||||||
const { logger } = require('@nexusai/shared');
|
|
||||||
|
|
||||||
export function useSettings() {
|
export function useSettings() {
|
||||||
const [settings, setSettings] = useState(null);
|
const [settings, setSettings] = useState(null);
|
||||||
const [saving, setSaving] = useState(false);
|
const [saving, setSaving] = useState(false);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
getSettings().then(setSettings).catch(logger.error);
|
getSettings().then(setSettings).catch(console.error);
|
||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
async function saveSetting(key, value) {
|
async function saveSetting(key, value) {
|
||||||
@@ -16,7 +15,7 @@ export function useSettings() {
|
|||||||
const updated = await updateSettings({ [key]: value });
|
const updated = await updateSettings({ [key]: value });
|
||||||
setSettings(updated);
|
setSettings(updated);
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
logger.error('[useSettings] Save failed:', err.message);
|
console.error('[useSettings] Save failed:', err.message);
|
||||||
} finally {
|
} finally {
|
||||||
setSaving(false);
|
setSaving(false);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user