重构RecallCommand和RememberCommand以支持新的多行记忆格式。更新了记忆解析和格式化逻辑,增强了对标签的处理能力,提升了记忆的存储和检索体验。

This commit is contained in:
sean
2025-06-15 16:31:39 +08:00
parent 6d88a78cca
commit 195815def7
2 changed files with 119 additions and 20 deletions

View File

@ -82,7 +82,7 @@ ${formattedMemories}
}
/**
* 获取所有记忆(紧凑格式)
* 获取所有记忆(支持多行格式)
*/
async getAllMemories (query) {
this.lastSearchCount = 0
@ -97,18 +97,15 @@ ${formattedMemories}
try {
if (await fs.pathExists(memoryFile)) {
const content = await fs.readFile(memoryFile, 'utf-8')
const lines = content.split('\n')
const memoryBlocks = this.parseMemoryBlocks(content)
for (const line of lines) {
if (line.startsWith('- ')) {
// 解析记忆行
const memory = this.parseMemoryLine(line)
for (const memoryBlock of memoryBlocks) {
const memory = this.parseMemoryBlock(memoryBlock)
if (memory && (!query || this.matchesMemory(memory, query))) {
memories.push(memory)
}
}
}
}
} catch (error) {
console.error('Error reading memories:', error)
}
@ -118,7 +115,90 @@ ${formattedMemories}
}
/**
* 解析记忆行(紧凑格式)
* 解析记忆块(新多行格式)
*/
parseMemoryBlocks (content) {
const blocks = []
const lines = content.split('\n')
let currentBlock = []
let inBlock = false
for (const line of lines) {
if (line.match(/^- \d{4}\/\d{2}\/\d{2} \d{2}:\d{2} START$/)) {
// 开始新的记忆块
if (inBlock && currentBlock.length > 0) {
blocks.push(currentBlock.join('\n'))
}
currentBlock = [line]
inBlock = true
} else if (line === '- END' && inBlock) {
// 结束当前记忆块
currentBlock.push(line)
blocks.push(currentBlock.join('\n'))
currentBlock = []
inBlock = false
} else if (inBlock) {
// 记忆块内容
currentBlock.push(line)
}
}
// 处理未结束的块
if (inBlock && currentBlock.length > 0) {
blocks.push(currentBlock.join('\n'))
}
return blocks
}
/**
* 解析单个记忆块
*/
parseMemoryBlock (blockContent) {
const lines = blockContent.split('\n')
// 解析开始行:- 2025/06/15 15:58 START
const startLine = lines[0]
const startMatch = startLine.match(/^- (\d{4}\/\d{2}\/\d{2} \d{2}:\d{2}) START$/)
if (!startMatch) return null
const timestamp = startMatch[1]
// 查找标签行:--tags xxx
let tagsLine = ''
let contentLines = []
for (let i = 1; i < lines.length; i++) {
const line = lines[i]
if (line.startsWith('--tags ')) {
tagsLine = line
} else if (line !== '- END') {
contentLines.push(line)
}
}
// 提取内容(去除空行)
const content = contentLines.join('\n').trim()
// 解析标签
let tags = []
if (tagsLine) {
const tagsContent = tagsLine.replace('--tags ', '')
const hashTags = tagsContent.match(/#[^\s]+/g) || []
const regularTags = tagsContent.replace(/#[^\s]+/g, '').trim().split(/\s+/).filter(t => t)
tags = [...regularTags, ...hashTags]
}
return {
timestamp,
content,
tags,
source: 'memory'
}
}
/**
* 解析记忆行(向下兼容旧格式)
*/
parseMemoryLine (line) {
// 修复正则表达式,适配实际的记忆格式
@ -179,13 +259,28 @@ ${formattedMemories}
}
/**
* 格式化检索到的记忆(紧凑格式
* 格式化检索到的记忆(支持多行显示
*/
formatRetrievedKnowledge (memories, query) {
return memories.map((memory, index) => {
const content = memory.content.length > 120
? memory.content.substring(0, 120) + '...'
: memory.content
// 多行内容处理:如果内容包含换行,保持原始格式,但限制总长度
let content = memory.content
if (content.length > 200) {
// 保持换行结构但截断过长内容
const lines = content.split('\n')
let truncated = ''
let currentLength = 0
for (const line of lines) {
if (currentLength + line.length + 1 > 180) {
truncated += '...'
break
}
truncated += (truncated ? '\n' : '') + line
currentLength += line.length + 1
}
content = truncated
}
return `📝 ${index + 1}. **记忆** (${memory.timestamp})
${content}

View File

@ -80,7 +80,7 @@ class RememberCommand extends BasePouchCommand {
}
/**
* 格式化为行记忆(紧凑格式)
* 格式化为行记忆块(新格式)
*/
formatMemoryLine (value) {
const now = new Date()
@ -89,7 +89,11 @@ class RememberCommand extends BasePouchCommand {
// 自动生成标签
const tags = this.generateTags(value)
return `- ${timestamp} ${value} #${tags} #评分:8 #有效期:长期`
// 使用新的多行格式
return `- ${timestamp} START
${value}
--tags ${tags} #评分:8 #有效期:长期
- END`
}
/**
@ -110,14 +114,14 @@ class RememberCommand extends BasePouchCommand {
/**
* 追加到记忆文件
*/
async appendToMemoryFile (memoryFile, memoryLine) {
async appendToMemoryFile (memoryFile, memoryBlock) {
// 初始化文件(如果不存在)
if (!await fs.pathExists(memoryFile)) {
await fs.writeFile(memoryFile, `# 陈述性记忆
## 高价值记忆(评分 ≥ 7
${memoryLine}
${memoryBlock}
`)
return 'created'
@ -126,8 +130,8 @@ ${memoryLine}
// 读取现有内容
const content = await fs.readFile(memoryFile, 'utf-8')
// 追加新记忆(在高价值记忆部分)
const updatedContent = content + '\n\n' + memoryLine
// 追加新记忆(在高价值记忆部分)
const updatedContent = content + '\n\n' + memoryBlock
await fs.writeFile(memoryFile, updatedContent)
return 'created'
}