2026-03-12 12:47:56 +08:00
|
|
|
|
const express = require('express');
|
|
|
|
|
|
const router = express.Router();
|
|
|
|
|
|
const db = require('../db');
|
|
|
|
|
|
|
2026-03-13 13:06:46 +08:00
|
|
|
|
/**
|
|
|
|
|
|
* GET /api/session/list
|
|
|
|
|
|
* 获取会话列表(按更新时间倒序,带最后一条消息预览)
|
|
|
|
|
|
*/
|
|
|
|
|
|
router.get('/list', async (req, res) => {
|
|
|
|
|
|
try {
|
|
|
|
|
|
const userId = req.query.userId || null;
|
|
|
|
|
|
const limit = parseInt(req.query.limit) || 50;
|
|
|
|
|
|
const sessions = await db.getSessionList(userId, limit);
|
|
|
|
|
|
res.json({
|
|
|
|
|
|
success: true,
|
|
|
|
|
|
data: sessions.map((s) => ({
|
|
|
|
|
|
id: s.id,
|
|
|
|
|
|
userId: s.user_id,
|
|
|
|
|
|
mode: s.mode,
|
|
|
|
|
|
createdAt: s.created_at,
|
|
|
|
|
|
updatedAt: s.updated_at,
|
|
|
|
|
|
lastMessage: s.last_message ? (s.last_message.length > 60 ? s.last_message.slice(0, 60) + '...' : s.last_message) : null,
|
|
|
|
|
|
messageCount: parseInt(s.message_count) || 0,
|
|
|
|
|
|
})),
|
|
|
|
|
|
});
|
|
|
|
|
|
} catch (err) {
|
|
|
|
|
|
console.error('[Session] List failed:', err.message);
|
|
|
|
|
|
res.status(500).json({ success: false, error: err.message });
|
|
|
|
|
|
}
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* DELETE /api/session/:id
|
|
|
|
|
|
* 删除会话及其所有消息
|
|
|
|
|
|
*/
|
|
|
|
|
|
router.delete('/:id', async (req, res) => {
|
|
|
|
|
|
try {
|
|
|
|
|
|
const { id } = req.params;
|
|
|
|
|
|
await db.deleteSession(id);
|
|
|
|
|
|
res.json({ success: true });
|
|
|
|
|
|
} catch (err) {
|
|
|
|
|
|
console.error('[Session] Delete failed:', err.message);
|
|
|
|
|
|
res.status(500).json({ success: false, error: err.message });
|
|
|
|
|
|
}
|
|
|
|
|
|
});
|
|
|
|
|
|
|
2026-03-12 12:47:56 +08:00
|
|
|
|
/**
|
|
|
|
|
|
* GET /api/session/:id/history
|
|
|
|
|
|
* 获取会话完整历史(用于文字↔语音切换时加载上下文)
|
|
|
|
|
|
*/
|
|
|
|
|
|
router.get('/:id/history', async (req, res) => {
|
|
|
|
|
|
try {
|
|
|
|
|
|
const { id } = req.params;
|
|
|
|
|
|
const limit = parseInt(req.query.limit) || 20;
|
|
|
|
|
|
const format = req.query.format || 'llm'; // 'llm' | 'full'
|
|
|
|
|
|
|
|
|
|
|
|
let messages;
|
|
|
|
|
|
if (format === 'full') {
|
|
|
|
|
|
messages = await db.getRecentMessages(id, limit);
|
|
|
|
|
|
} else {
|
|
|
|
|
|
messages = await db.getHistoryForLLM(id, limit);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
const session = await db.getSession(id);
|
|
|
|
|
|
|
|
|
|
|
|
res.json({
|
|
|
|
|
|
success: true,
|
|
|
|
|
|
data: {
|
|
|
|
|
|
sessionId: id,
|
|
|
|
|
|
mode: session?.mode || null,
|
|
|
|
|
|
messages,
|
|
|
|
|
|
count: messages.length,
|
|
|
|
|
|
},
|
|
|
|
|
|
});
|
|
|
|
|
|
} catch (err) {
|
|
|
|
|
|
console.error('[Session] Get history failed:', err.message);
|
|
|
|
|
|
res.status(500).json({ success: false, error: err.message });
|
|
|
|
|
|
}
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* POST /api/session/:id/switch
|
|
|
|
|
|
* 切换会话模式(voice ↔ chat),返回上下文历史
|
|
|
|
|
|
*/
|
|
|
|
|
|
router.post('/:id/switch', async (req, res) => {
|
|
|
|
|
|
try {
|
|
|
|
|
|
const { id } = req.params;
|
|
|
|
|
|
const { targetMode } = req.body; // 'voice' | 'chat'
|
|
|
|
|
|
|
|
|
|
|
|
if (!targetMode || !['voice', 'chat'].includes(targetMode)) {
|
|
|
|
|
|
return res.status(400).json({ success: false, error: 'targetMode must be "voice" or "chat"' });
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 更新会话模式
|
|
|
|
|
|
await db.updateSessionMode(id, targetMode);
|
|
|
|
|
|
|
|
|
|
|
|
// 返回最近的对话历史供新模式使用
|
|
|
|
|
|
const history = await db.getHistoryForLLM(id, 20);
|
|
|
|
|
|
|
|
|
|
|
|
console.log(`[Session] Switched ${id} to ${targetMode}, history: ${history.length} messages`);
|
|
|
|
|
|
|
|
|
|
|
|
res.json({
|
|
|
|
|
|
success: true,
|
|
|
|
|
|
data: {
|
|
|
|
|
|
sessionId: id,
|
|
|
|
|
|
mode: targetMode,
|
|
|
|
|
|
history,
|
|
|
|
|
|
count: history.length,
|
|
|
|
|
|
},
|
|
|
|
|
|
});
|
|
|
|
|
|
} catch (err) {
|
|
|
|
|
|
console.error('[Session] Switch failed:', err.message);
|
|
|
|
|
|
res.status(500).json({ success: false, error: err.message });
|
|
|
|
|
|
}
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
module.exports = router;
|