75 lines
2.1 KiB
JavaScript
75 lines
2.1 KiB
JavaScript
|
|
/**
|
|||
|
|
* 记忆 读写 · /brain/memory
|
|||
|
|
*/
|
|||
|
|
|
|||
|
|
const { Router } = require('express');
|
|||
|
|
const crypto = require('crypto');
|
|||
|
|
const router = Router();
|
|||
|
|
|
|||
|
|
// GET /brain/memory - 查询记忆(支持persona_id和type过滤)
|
|||
|
|
router.get('/', (req, res) => {
|
|||
|
|
try {
|
|||
|
|
let sql = 'SELECT * FROM persona_memory WHERE 1=1';
|
|||
|
|
const params = [];
|
|||
|
|
|
|||
|
|
if (req.query.persona_id) {
|
|||
|
|
sql += ' AND persona_id = ?';
|
|||
|
|
params.push(req.query.persona_id);
|
|||
|
|
}
|
|||
|
|
if (req.query.type) {
|
|||
|
|
sql += ' AND type = ?';
|
|||
|
|
params.push(req.query.type);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
sql += ' ORDER BY timestamp DESC';
|
|||
|
|
|
|||
|
|
const rows = req.db.prepare(sql).all(...params);
|
|||
|
|
const parsed = rows.map(parseJsonFields);
|
|||
|
|
res.json({ data: parsed, total: parsed.length });
|
|||
|
|
} catch (err) {
|
|||
|
|
res.status(500).json({ error: true, message: err.message });
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
// POST /brain/memory - 写入新记忆
|
|||
|
|
router.post('/', (req, res) => {
|
|||
|
|
try {
|
|||
|
|
const { persona_id, type, title, content, importance,
|
|||
|
|
related_dev, related_broadcast, tags, timestamp } = req.body;
|
|||
|
|
|
|||
|
|
if (!persona_id || !type || !title || !content || !importance || !timestamp) {
|
|||
|
|
return res.status(400).json({
|
|||
|
|
error: true,
|
|||
|
|
message: 'Missing required fields: persona_id, type, title, content, importance, timestamp'
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
const memory_id = `MEM-${Date.now()}-${crypto.randomBytes(4).toString('hex')}`;
|
|||
|
|
|
|||
|
|
req.db.prepare(`
|
|||
|
|
INSERT INTO persona_memory
|
|||
|
|
(memory_id, persona_id, type, title, content, importance,
|
|||
|
|
related_dev, related_broadcast, tags, timestamp)
|
|||
|
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|||
|
|
`).run(
|
|||
|
|
memory_id, persona_id, type, title, content, importance,
|
|||
|
|
related_dev || null, related_broadcast || null,
|
|||
|
|
tags ? JSON.stringify(tags) : null, timestamp
|
|||
|
|
);
|
|||
|
|
|
|||
|
|
res.status(201).json({ data: { memory_id }, message: 'Memory created' });
|
|||
|
|
} catch (err) {
|
|||
|
|
res.status(500).json({ error: true, message: err.message });
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
function parseJsonFields(row) {
|
|||
|
|
const result = { ...row };
|
|||
|
|
if (result.tags) {
|
|||
|
|
try { result.tags = JSON.parse(result.tags); } catch (_e) { /* keep raw */ }
|
|||
|
|
}
|
|||
|
|
return result;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
module.exports = router;
|