feat: 升级至 v0.3.16 — 工单修复 51 项 + 审查修复 30 项(安全加固/适配器/工具系统/数据层/前端)
This commit is contained in:
@@ -14,6 +14,7 @@
|
||||
*/
|
||||
|
||||
import { nanoid } from 'nanoid';
|
||||
import { createHash } from 'crypto';
|
||||
import type Database from 'better-sqlite3';
|
||||
import log from 'electron-log';
|
||||
|
||||
@@ -352,17 +353,21 @@ export class MemoryManager {
|
||||
break;
|
||||
case 'semantic':
|
||||
// v0.3.0 修复:使用 summary 作为 key(若提供),支持更新已有语义记忆
|
||||
// #32 修复: 当 summary 未提供时,使用 content hash 作为 key 实现基于内容的去重
|
||||
// v0.3.0 用 id 作为 key 时,因 id 每次新生成,INSERT OR REPLACE 永远不触发 REPLACE,
|
||||
// 导致重复 store 同一内容会创建多条记忆。改为 contentHash 后,相同内容自动 REPLACE。
|
||||
db.prepare(`
|
||||
INSERT OR REPLACE INTO semantic_memories (id, key, value, category, confidence, source_session, created_at, updated_at, access_count)
|
||||
VALUES (?, ?, ?, ?, ?, ?, ?, ?, 0)
|
||||
`).run(id, item.summary ?? id, item.content, 'general', importance, item.sessionId ?? null, now, now);
|
||||
`).run(id, item.summary ?? this.contentHash(item.content), item.content, 'general', importance, item.sessionId ?? null, now, now);
|
||||
break;
|
||||
case 'working':
|
||||
// v0.3.0 修复:使用 summary 作为 key(若提供),避免硬编码 'default' 导致覆盖
|
||||
// #32 修复: 当 summary 未提供时,使用 content hash 作为 key 实现基于内容的去重
|
||||
db.prepare(`
|
||||
INSERT OR REPLACE INTO working_memories (id, session_id, task_id, key, value, updated_at)
|
||||
VALUES (?, ?, ?, ?, ?, ?)
|
||||
`).run(id, item.sessionId ?? 'default', 'default', item.summary ?? id, item.content, now);
|
||||
`).run(id, item.sessionId ?? 'default', 'default', item.summary ?? this.contentHash(item.content), item.content, now);
|
||||
break;
|
||||
default:
|
||||
// v0.3.0 修复:未知 type 抛错而非静默失败
|
||||
@@ -519,4 +524,13 @@ export class MemoryManager {
|
||||
if (item.content.length > 200) score += 0.1;
|
||||
return Math.min(1, Math.max(0, score));
|
||||
}
|
||||
|
||||
/**
|
||||
* #32 修复: 计算 content 的 SHA-256 hash(取前 16 字符),用于基于内容的去重
|
||||
* 当 store 未提供 summary 时,用 contentHash 作为 semantic/working 的 key,
|
||||
* 使 INSERT OR REPLACE 能基于内容触发 REPLACE,避免重复存储相同内容。
|
||||
*/
|
||||
private contentHash(content: string): string {
|
||||
return createHash('sha256').update(content, 'utf-8').digest('hex').slice(0, 16);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user