feat(工作台): mcn-workshop 会话超 6 小时自动清除(软删除)
- server.js 启动段新增 cleanupExpiredSessions(): cwd 含 mcn-workshop + status=completed + 最后活动超 6h 且未删 → 置 deleted_at 软删除 - 启动时执行一次 + setInterval 每小时自动检查; working 会话不删(安全红线) - 实测: 清除 9 条(13.6h~114.8h) 保留 1 条(1.5h 新会话)
This commit is contained in:
1 parent
56fc5e08fc
commit
838aa4d443
2 files changed
+36
No files matched your search
@@ -190,3 +190,9 @@
|
||||
- **入库链路 PASS**:POST /api/import/account {account:俊希,root:桌面MCNSkill项目} → {ok:true, video_source:6, persona:0, videos_upserted:0, skipped:[persona(重复)]};6 条 source 全部 content+analysis_json 双字段(analysis 860~33916字符);persona 幂等仍 1 行 7010 字符;video_analysis=0 属正常(视频分析/ 目录无「拆解分析.md」,该字段只收拆解产物)
|
||||
- **库表结构澄清**:account_video_source/analysis 无 account_id 列,靠 video_id→account_videos.id 关联;俊希 6 条 source video_id=null(代码设计 insSource.run(null,...)),JOIN 查不到属正常;id=47(02:02)与 id=80(12:38)同 detailId 33021 但 aweme_id 不同=历史遗留映射差异,非本次问题
|
||||
- 已 commit(2 小时节奏内不 push)
|
||||
|
||||
## 09-01 14:1x mcn-workshop 会话超 6 小时自动清除(用户需求)
|
||||
- **需求**:mcn-workshop 中的会话超过 6 个小时的自动清除
|
||||
- **实现(server.js 启动段)**:`cleanupExpiredSessions()` 软删除(置 deleted_at)workbuddy.db sessions 表——cwd LIKE '%mcn-workshop%'(与 /api/run cwd 常量一致)+ status='completed'(working 执行中绝不删)+ deleted_at IS NULL + COALESCE(last_activity_at, updated_at, created_at, 0) < now-6h;启动时执行一次 + setInterval 每小时自动检查;删除条数 log 输出
|
||||
- **字段判定依据**:sessions 表 cwd 区分空间(mcn-workshop 10 条);时间用 last_activity_at(最后活动)最准——442280f0 的 updated_at 曾被系统触碰(3h 前)但 last_activity 实为 14.1h 前,故以 last_activity 优先
|
||||
- **实测**:重启服务 → 清除 9 条(13.6h~114.8h)保留 1 条(俊希创作 1.5h)working 零误删
|
||||
@@ -667,6 +667,36 @@ const server = http.createServer((req, res) => {
|
||||
});
|
||||
});
|
||||
|
||||
// ---- 会话自动清理:mcn-workshop 空间超 6 小时无活动的已结束会话自动清除 ----
|
||||
// 09-01 用户需求:工作台触发(cwd=D:\AgentSkill\mcn-workshop)的 AI 会话任务,超过 6 小时自动清除
|
||||
// 判定:cwd 含 mcn-workshop + status=completed(执行中一律不删)+ 未删过 + 最后活动时间超过 6 小时
|
||||
// 方式:软删除(置 deleted_at),客户端左侧会话栏按 deleted_at 过滤即不再显示;可逆安全
|
||||
const SESSION_TTL_MS = 6 * 3600 * 1000; // 6 小时
|
||||
const SESSION_CWD_PATTERN = '%mcn-workshop%'; // 与 /api/run 写入的 cwd 一致
|
||||
const SESSION_CLEAN_INTERVAL_MS = 60 * 60 * 1000; // 每小时检查一次
|
||||
|
||||
function cleanupExpiredSessions() {
|
||||
try {
|
||||
const { DatabaseSync } = require('node:sqlite');
|
||||
const db = new DatabaseSync(process.env.WORKBUDDY_DB || path.join(os.homedir(), '.workbuddy', 'workbuddy.db'));
|
||||
const now = Date.now();
|
||||
const cutoff = now - SESSION_TTL_MS;
|
||||
const r = db.prepare(`
|
||||
UPDATE sessions SET deleted_at = ?
|
||||
WHERE cwd LIKE ?
|
||||
AND status = 'completed'
|
||||
AND deleted_at IS NULL
|
||||
AND COALESCE(last_activity_at, updated_at, created_at, 0) < ?
|
||||
`).run(now, SESSION_CWD_PATTERN, cutoff);
|
||||
db.close();
|
||||
if (Number(r.changes) > 0) log(`会话自动清理:已清除 mcn-workshop 超 6 小时无活动的已完成会话 ${r.changes} 条`);
|
||||
} catch (e) {
|
||||
console.error('会话自动清理失败:', e.message);
|
||||
}
|
||||
}
|
||||
cleanupExpiredSessions();
|
||||
setInterval(cleanupExpiredSessions, SESSION_CLEAN_INTERVAL_MS);
|
||||
|
||||
// ---- 端口自动避让 ----
|
||||
function listen(port) {
|
||||
server.once('error', (e) => {
|
||||
|
||||
Reference in new issue
Block a user