mirror of
https://github.com/siteboon/claudecodeui.git
synced 2026-03-05 14:07:40 +00:00
* feat: implement session rename with SQLite storage (closes #72, fixes #358) - Add session_names table to store custom display names per provider - Add PUT /api/sessions/:sessionId/rename endpoint - Replace stub updateSessionSummary with real API call - Apply custom names across all providers (Claude, Codex, Cursor) - Fix project rename destroying config (spread merge instead of overwrite) - Thread provider parameter through sidebar component chain - Add i18n error messages for rename failures (en, ja, ko, zh-CN) * fix: address CodeRabbit review feedback for session rename - Log migration errors instead of swallowing them silently (db.js) - Add try/catch to applyCustomSessionNames to prevent getProjects abort - Move applyCustomSessionNames to db.js as shared helper (DRY) - Fix Cursor getSessionName to check session.summary for custom names - Move edit state clearing to finally block in updateSessionSummary - Sanitize sessionId, add 500-char summary limit, validate provider whitelist - Remove dead applyCustomSessionNames call on empty manual project sessions * fix: reject sessionId on mismatch instead of silent normalization Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> * fix: enable rename for all providers, add Gemini support, clean up orphans - Enable rename UI (pencil icon) for Codex, Cursor, and Gemini sessions - Keep delete button hidden for Cursor (no backend delete endpoint) - Add 'gemini' to VALID_PROVIDERS and hoist to module scope - Add sessionNamesDb.deleteName on session delete (claude, codex, gemini) - Fix token-usage endpoint sessionId mismatch validation - Remove redundant try/catch in sessionNamesDb methods - Let session_names migration errors propagate to outer handler --------- Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> Co-authored-by: Haileyesus <118998054+blackmammoth@users.noreply.github.com>
49 lines
1.6 KiB
JavaScript
49 lines
1.6 KiB
JavaScript
import express from 'express';
|
|
import sessionManager from '../sessionManager.js';
|
|
import { sessionNamesDb } from '../database/db.js';
|
|
|
|
const router = express.Router();
|
|
|
|
router.get('/sessions/:sessionId/messages', async (req, res) => {
|
|
try {
|
|
const { sessionId } = req.params;
|
|
|
|
if (!sessionId || typeof sessionId !== 'string' || !/^[a-zA-Z0-9_.-]{1,100}$/.test(sessionId)) {
|
|
return res.status(400).json({ success: false, error: 'Invalid session ID format' });
|
|
}
|
|
|
|
const messages = sessionManager.getSessionMessages(sessionId);
|
|
|
|
res.json({
|
|
success: true,
|
|
messages: messages,
|
|
total: messages.length,
|
|
hasMore: false,
|
|
offset: 0,
|
|
limit: messages.length
|
|
});
|
|
} catch (error) {
|
|
console.error('Error fetching Gemini session messages:', error);
|
|
res.status(500).json({ success: false, error: error.message });
|
|
}
|
|
});
|
|
|
|
router.delete('/sessions/:sessionId', async (req, res) => {
|
|
try {
|
|
const { sessionId } = req.params;
|
|
|
|
if (!sessionId || typeof sessionId !== 'string' || !/^[a-zA-Z0-9_.-]{1,100}$/.test(sessionId)) {
|
|
return res.status(400).json({ success: false, error: 'Invalid session ID format' });
|
|
}
|
|
|
|
await sessionManager.deleteSession(sessionId);
|
|
sessionNamesDb.deleteName(sessionId, 'gemini');
|
|
res.json({ success: true });
|
|
} catch (error) {
|
|
console.error(`Error deleting Gemini session ${req.params.sessionId}:`, error);
|
|
res.status(500).json({ success: false, error: error.message });
|
|
}
|
|
});
|
|
|
|
export default router;
|