@zooique/memora 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agent/agent.d.ts +155 -23
- package/dist/agent/agent.d.ts.map +1 -1
- package/dist/agent/agent.js +386 -124
- package/dist/agent/agent.js.map +1 -1
- package/dist/agent/assembler.d.ts +8 -2
- package/dist/agent/assembler.d.ts.map +1 -1
- package/dist/agent/assembler.js +17 -6
- package/dist/agent/assembler.js.map +1 -1
- package/dist/agent/builtinToolHandlers.d.ts +1 -1
- package/dist/agent/builtinToolHandlers.d.ts.map +1 -1
- package/dist/agent/builtinToolHandlers.js +5 -3
- package/dist/agent/builtinToolHandlers.js.map +1 -1
- package/dist/agent/builtinTools.d.ts +1 -1
- package/dist/agent/builtinTools.js +2 -2
- package/dist/agent/builtinTools.js.map +1 -1
- package/dist/agent/constants.d.ts +27 -6
- package/dist/agent/constants.d.ts.map +1 -1
- package/dist/agent/constants.js +27 -6
- package/dist/agent/constants.js.map +1 -1
- package/dist/agent/contextManager.d.ts +35 -9
- package/dist/agent/contextManager.d.ts.map +1 -1
- package/dist/agent/contextManager.js +138 -25
- package/dist/agent/contextManager.js.map +1 -1
- package/dist/agent/loop.d.ts +41 -11
- package/dist/agent/loop.d.ts.map +1 -1
- package/dist/agent/loop.js +143 -61
- package/dist/agent/loop.js.map +1 -1
- package/dist/agent/managers/archiveCoordinator.d.ts +100 -0
- package/dist/agent/managers/archiveCoordinator.d.ts.map +1 -0
- package/dist/agent/managers/archiveCoordinator.js +127 -0
- package/dist/agent/managers/archiveCoordinator.js.map +1 -0
- package/dist/agent/managers/autoConfigRefiner.d.ts.map +1 -1
- package/dist/agent/managers/autoConfigRefiner.js +1 -1
- package/dist/agent/managers/autoConfigRefiner.js.map +1 -1
- package/dist/agent/managers/configManager.d.ts +13 -2
- package/dist/agent/managers/configManager.d.ts.map +1 -1
- package/dist/agent/managers/configManager.js +13 -5
- package/dist/agent/managers/configManager.js.map +1 -1
- package/dist/agent/managers/insightExtractor.d.ts +36 -3
- package/dist/agent/managers/insightExtractor.d.ts.map +1 -1
- package/dist/agent/managers/insightExtractor.js +48 -11
- package/dist/agent/managers/insightExtractor.js.map +1 -1
- package/dist/agent/managers/memoryAdvisor.d.ts +4 -2
- package/dist/agent/managers/memoryAdvisor.d.ts.map +1 -1
- package/dist/agent/managers/memoryAdvisor.js +6 -4
- package/dist/agent/managers/memoryAdvisor.js.map +1 -1
- package/dist/agent/managers/memoryDecayScheduler.d.ts +113 -0
- package/dist/agent/managers/memoryDecayScheduler.d.ts.map +1 -0
- package/dist/agent/managers/memoryDecayScheduler.js +134 -0
- package/dist/agent/managers/memoryDecayScheduler.js.map +1 -0
- package/dist/agent/managers/memoryInspector.d.ts +70 -10
- package/dist/agent/managers/memoryInspector.d.ts.map +1 -1
- package/dist/agent/managers/memoryInspector.js +97 -23
- package/dist/agent/managers/memoryInspector.js.map +1 -1
- package/dist/agent/managers/sessionArchiver.d.ts +77 -0
- package/dist/agent/managers/sessionArchiver.d.ts.map +1 -0
- package/dist/agent/managers/sessionArchiver.js +175 -0
- package/dist/agent/managers/sessionArchiver.js.map +1 -0
- package/dist/agent/managers/sessionManager.d.ts +10 -0
- package/dist/agent/managers/sessionManager.d.ts.map +1 -1
- package/dist/agent/managers/sessionManager.js +26 -5
- package/dist/agent/managers/sessionManager.js.map +1 -1
- package/dist/agent/managers/workProjection.d.ts +1 -1
- package/dist/agent/managers/workProjection.d.ts.map +1 -1
- package/dist/agent/managers/workProjection.js +13 -10
- package/dist/agent/managers/workProjection.js.map +1 -1
- package/dist/agent/messageHistory.d.ts +1 -22
- package/dist/agent/messageHistory.d.ts.map +1 -1
- package/dist/agent/messageHistory.js +3 -19
- package/dist/agent/messageHistory.js.map +1 -1
- package/dist/agent/toolExecutor.d.ts +5 -18
- package/dist/agent/toolExecutor.d.ts.map +1 -1
- package/dist/agent/toolExecutor.js +7 -7
- package/dist/agent/toolExecutor.js.map +1 -1
- package/dist/agent/tracer.d.ts +8 -1
- package/dist/agent/tracer.d.ts.map +1 -1
- package/dist/agent/tracer.js +8 -1
- package/dist/agent/tracer.js.map +1 -1
- package/dist/agent/types.d.ts +29 -0
- package/dist/agent/types.d.ts.map +1 -1
- package/dist/agent/{managers/userFactExtractor.d.ts → userFactExtractor.d.ts} +2 -2
- package/dist/agent/userFactExtractor.d.ts.map +1 -0
- package/dist/agent/userFactExtractor.js.map +1 -0
- package/dist/config/loader.d.ts +4 -4
- package/dist/config/loader.d.ts.map +1 -1
- package/dist/config/loader.js +11 -2
- package/dist/config/loader.js.map +1 -1
- package/dist/eval/evalTypes.js +1 -1
- package/dist/eval/evalTypes.js.map +1 -1
- package/dist/index.d.ts +5 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/llm/embedding.d.ts.map +1 -1
- package/dist/llm/embedding.js +8 -6
- package/dist/llm/embedding.js.map +1 -1
- package/dist/llm/factory.d.ts.map +1 -1
- package/dist/llm/factory.js +2 -1
- package/dist/llm/factory.js.map +1 -1
- package/dist/llm/openaiCompatible.d.ts +9 -0
- package/dist/llm/openaiCompatible.d.ts.map +1 -1
- package/dist/llm/openaiCompatible.js +77 -33
- package/dist/llm/openaiCompatible.js.map +1 -1
- package/dist/llm/provider.d.ts +17 -3
- package/dist/llm/provider.d.ts.map +1 -1
- package/dist/llm/provider.js +6 -2
- package/dist/llm/provider.js.map +1 -1
- package/dist/logging/logger.d.ts.map +1 -1
- package/dist/logging/logger.js +25 -9
- package/dist/logging/logger.js.map +1 -1
- package/dist/memory/hybridMerge.d.ts +54 -0
- package/dist/memory/hybridMerge.d.ts.map +1 -0
- package/dist/memory/hybridMerge.js +36 -0
- package/dist/memory/hybridMerge.js.map +1 -0
- package/dist/memory/inMemoryStorage.d.ts +90 -15
- package/dist/memory/inMemoryStorage.d.ts.map +1 -1
- package/dist/memory/inMemoryStorage.js +179 -28
- package/dist/memory/inMemoryStorage.js.map +1 -1
- package/dist/memory/loader.js +1 -1
- package/dist/memory/loader.js.map +1 -1
- package/dist/memory/projectManager.d.ts +34 -5
- package/dist/memory/projectManager.d.ts.map +1 -1
- package/dist/memory/projectManager.js +98 -62
- package/dist/memory/projectManager.js.map +1 -1
- package/dist/memory/recall.d.ts +7 -18
- package/dist/memory/recall.d.ts.map +1 -1
- package/dist/memory/recall.js +14 -19
- package/dist/memory/recall.js.map +1 -1
- package/dist/memory/storageInterface.d.ts +81 -14
- package/dist/memory/storageInterface.d.ts.map +1 -1
- package/dist/memory/store.js +1 -1
- package/dist/memory/store.js.map +1 -1
- package/dist/memory/types.d.ts +7 -1
- package/dist/memory/types.d.ts.map +1 -1
- package/dist/memory/types.js +5 -1
- package/dist/memory/types.js.map +1 -1
- package/dist/memory/userProfile.d.ts +6 -6
- package/dist/memory/userProfile.d.ts.map +1 -1
- package/dist/memory/userProfile.js +20 -15
- package/dist/memory/userProfile.js.map +1 -1
- package/dist/memory/vectorStore.d.ts +35 -0
- package/dist/memory/vectorStore.d.ts.map +1 -1
- package/dist/memory/vectorStore.js +111 -2
- package/dist/memory/vectorStore.js.map +1 -1
- package/dist/persona/personaManager.d.ts +17 -4
- package/dist/persona/personaManager.d.ts.map +1 -1
- package/dist/persona/personaManager.js +44 -12
- package/dist/persona/personaManager.js.map +1 -1
- package/dist/security/pathGuard.d.ts +29 -7
- package/dist/security/pathGuard.d.ts.map +1 -1
- package/dist/security/pathGuard.js +148 -81
- package/dist/security/pathGuard.js.map +1 -1
- package/dist/skill/skillManager.d.ts +15 -0
- package/dist/skill/skillManager.d.ts.map +1 -1
- package/dist/skill/skillManager.js +25 -3
- package/dist/skill/skillManager.js.map +1 -1
- package/dist/skill/types.d.ts +7 -1
- package/dist/skill/types.d.ts.map +1 -1
- package/dist/utils/errors.d.ts +26 -7
- package/dist/utils/errors.d.ts.map +1 -1
- package/dist/utils/errors.js +10 -18
- package/dist/utils/errors.js.map +1 -1
- package/dist/utils/eventEmitter.d.ts +9 -2
- package/dist/utils/eventEmitter.d.ts.map +1 -1
- package/dist/utils/eventEmitter.js +1 -1
- package/dist/utils/eventEmitter.js.map +1 -1
- package/dist/utils/frontmatter.d.ts +8 -1
- package/dist/utils/frontmatter.d.ts.map +1 -1
- package/dist/utils/frontmatter.js +14 -3
- package/dist/utils/frontmatter.js.map +1 -1
- package/dist/utils/path.d.ts +5 -1
- package/dist/utils/path.d.ts.map +1 -1
- package/dist/utils/path.js +5 -1
- package/dist/utils/path.js.map +1 -1
- package/dist/utils/safeTimer.d.ts +19 -0
- package/dist/utils/safeTimer.d.ts.map +1 -1
- package/dist/utils/safeTimer.js +27 -0
- package/dist/utils/safeTimer.js.map +1 -1
- package/dist/utils/segmenter.d.ts +0 -12
- package/dist/utils/segmenter.d.ts.map +1 -1
- package/dist/utils/segmenter.js +8 -3
- package/dist/utils/segmenter.js.map +1 -1
- package/dist/utils/strings.d.ts +1 -1
- package/dist/utils/strings.d.ts.map +1 -1
- package/dist/utils/strings.js +4 -2
- package/dist/utils/strings.js.map +1 -1
- package/package.json +1 -1
- package/dist/agent/managers/userFactExtractor.d.ts.map +0 -1
- package/dist/agent/managers/userFactExtractor.js.map +0 -1
- /package/dist/agent/{managers/userFactExtractor.js → userFactExtractor.js} +0 -0
|
@@ -1,90 +1,230 @@
|
|
|
1
1
|
import { validateSource } from '../memory/types.js';
|
|
2
2
|
import { segmentText } from '../utils/segmenter.js';
|
|
3
|
+
import { configError } from '../utils/errors.js';
|
|
3
4
|
import { logger } from '../logging/logger.js';
|
|
4
5
|
import { applyDecayToMemory } from '../memory/recall.js';
|
|
6
|
+
import { nowIso } from '../utils/time.js';
|
|
5
7
|
/**
|
|
6
8
|
* 内存存储实现
|
|
7
9
|
*
|
|
8
10
|
* 使用 Map 存储记忆,核心操作 O(1)~O(log n)。
|
|
9
|
-
*
|
|
11
|
+
* 优化:维护 source→count 增量缓存,stats()/sourceHealth() 无需全量遍历。
|
|
10
12
|
*/
|
|
11
13
|
export class InMemoryStorage {
|
|
12
14
|
/** 记忆存储(id → Memory) */
|
|
13
15
|
memories = new Map();
|
|
14
|
-
/**
|
|
16
|
+
/** source→count 增量缓存(upsert/delete 时维护,getAllSources 时直接读取) */
|
|
15
17
|
sourceCountCache = new Map();
|
|
16
18
|
/**
|
|
17
19
|
* 插入或更新记忆
|
|
18
20
|
*
|
|
19
21
|
* 自动校验 source 字段,对疑似 typo 发出警告日志。
|
|
20
|
-
*
|
|
22
|
+
* 增量维护 sourceCountCache(仅统计活跃记忆):
|
|
23
|
+
* - 新增活跃记忆:source 计数 +1
|
|
24
|
+
* - 更新同 source 同活跃态:计数不变
|
|
25
|
+
* - 更新换 source:旧 source -1、新 source +1
|
|
26
|
+
* 软删除状态转换维护:
|
|
27
|
+
* - 活跃 → 软删除:source 计数 -1
|
|
28
|
+
* - 软删除 → 活跃:source 计数 +1
|
|
29
|
+
*
|
|
30
|
+
* 软删除校验:
|
|
31
|
+
* 若 existing 已软删除(deletedAt !== undefined)且 newMemory 为活跃态
|
|
32
|
+
* (deletedAt === undefined),抛出错误阻止"通过 upsert 复活软删除记忆"。
|
|
33
|
+
* 调用方必须先显式 restore(id) 恢复记忆后再 upsert。
|
|
34
|
+
* 例外:newMemory 显式带 deletedAt(如测试场景篡改 deletedAt)允许通过,
|
|
35
|
+
* 因为此时调用方明确意图是覆盖软删除状态而非"复活"。
|
|
36
|
+
*
|
|
37
|
+
* 采用 delta 方式:先扣除 existing 的活跃贡献,再加回 newMemory 的活跃贡献。
|
|
38
|
+
* 该方式可统一处理 source 变更 + 软删除状态变更的所有组合,避免分支爆炸。
|
|
21
39
|
*/
|
|
22
40
|
upsert(memory) {
|
|
23
41
|
const result = validateSource(memory.source);
|
|
24
42
|
if (result.severity === 'block') {
|
|
25
|
-
throw
|
|
43
|
+
// 裸 throw 改用 configError 工厂(Iter-1:错误处理统一)
|
|
44
|
+
throw configError('source 校验失败,拒绝写入', result.warning, ['请检查 source 字段是否拼写正确', '参考 ADR-004 source 开放字符串规范']);
|
|
26
45
|
}
|
|
27
46
|
if (result.severity === 'warn' && result.warning) {
|
|
28
47
|
logger.warn({ id: memory.id, source: memory.source, warning: result.warning }, 'source 校验警告');
|
|
29
48
|
}
|
|
30
|
-
//
|
|
49
|
+
// 软删除校验:阻止"通过 upsert 静默复活软删除记忆"
|
|
31
50
|
const existing = this.memories.get(memory.id);
|
|
32
|
-
if (existing && existing.
|
|
51
|
+
if (existing && existing.deletedAt !== undefined && memory.deletedAt === undefined) {
|
|
52
|
+
// existing 已软删除,但 newMemory 试图以活跃态覆盖 → 拒绝
|
|
53
|
+
// 调用方应先 restore(id) 再 upsert,或显式在 newMemory 中带 deletedAt
|
|
54
|
+
throw configError('不允许通过 upsert 复活软删除记忆', `id=${memory.id} 已被软删除(deletedAt=${existing.deletedAt})`, [
|
|
55
|
+
'若需恢复:先调用 restore(id),再 upsert',
|
|
56
|
+
'若需覆盖软删除态:在 newMemory 中显式传入 deletedAt 字段',
|
|
57
|
+
'参考软删除机制设计',
|
|
58
|
+
]);
|
|
59
|
+
}
|
|
60
|
+
// delta 方式维护 sourceCountCache(仅统计活跃记忆)
|
|
61
|
+
// 先扣除 existing 的活跃贡献(若 existing 存在且为活跃态)
|
|
62
|
+
if (existing && existing.deletedAt === undefined) {
|
|
33
63
|
this.decrementSourceCount(existing.source);
|
|
34
64
|
}
|
|
35
65
|
this.memories.set(memory.id, { ...memory });
|
|
36
|
-
//
|
|
37
|
-
|
|
66
|
+
// 再加回 newMemory 的活跃贡献(若 newMemory 为活跃态)
|
|
67
|
+
if (memory.deletedAt === undefined) {
|
|
68
|
+
this.incrementSourceCount(memory.source);
|
|
69
|
+
}
|
|
38
70
|
}
|
|
39
71
|
/**
|
|
40
|
-
*
|
|
72
|
+
* 软删除记忆
|
|
73
|
+
*
|
|
74
|
+
* 写入 deletedAt 时间戳,不物理移除 Map 条目。
|
|
75
|
+
* - 召回/搜索/列表/统计自动过滤已软删除的记忆
|
|
76
|
+
* - 可通过 restore(id) 恢复
|
|
77
|
+
* - 回收站保留期过后由 purgeExpired(before) 物理清理
|
|
41
78
|
*
|
|
42
|
-
*
|
|
79
|
+
* 对已软删除的记忆调用为 no-op。
|
|
80
|
+
* 增量维护 sourceCountCache:软删除时对应 source 减 1。
|
|
43
81
|
*/
|
|
44
82
|
delete(id) {
|
|
45
83
|
const existing = this.memories.get(id);
|
|
46
|
-
|
|
84
|
+
// 不存在或已软删除:no-op
|
|
85
|
+
if (!existing || existing.deletedAt !== undefined)
|
|
86
|
+
return;
|
|
87
|
+
// 写入 deletedAt,标记为软删除
|
|
88
|
+
const softDeleted = { ...existing, deletedAt: nowIso() };
|
|
89
|
+
this.memories.set(id, softDeleted);
|
|
90
|
+
// 活跃 → 软删除:source 计数 -1
|
|
91
|
+
this.decrementSourceCount(existing.source);
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* 恢复软删除的记忆
|
|
95
|
+
*
|
|
96
|
+
* 清除 deletedAt 字段,使记忆重新出现在召回/搜索/列表中。
|
|
97
|
+
* 对活跃记忆调用为 no-op。
|
|
98
|
+
* 增量维护 sourceCountCache:恢复时对应 source 加 1。
|
|
99
|
+
*/
|
|
100
|
+
restore(id) {
|
|
101
|
+
const existing = this.memories.get(id);
|
|
102
|
+
// 不存在或已为活跃态:no-op
|
|
103
|
+
if (!existing || existing.deletedAt === undefined)
|
|
104
|
+
return;
|
|
105
|
+
// 清除 deletedAt,恢复为活跃态
|
|
106
|
+
const restored = { ...existing, deletedAt: undefined };
|
|
107
|
+
this.memories.set(id, restored);
|
|
108
|
+
// 软删除 → 活跃:source 计数 +1
|
|
109
|
+
this.incrementSourceCount(existing.source);
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* 物理删除记忆
|
|
113
|
+
*
|
|
114
|
+
* 从 Map 中彻底移除,不可恢复。
|
|
115
|
+
* 用于回收站的"彻底删除"操作,或测试环境的强制清理。
|
|
116
|
+
*
|
|
117
|
+
* 注意:若记忆为活跃态(未软删除),purge 也会减 1 计数,
|
|
118
|
+
* 但正常流程应先软删除再 purge,此时计数已在 delete() 中扣除。
|
|
119
|
+
*/
|
|
120
|
+
purge(id) {
|
|
121
|
+
const existing = this.memories.get(id);
|
|
122
|
+
if (!existing)
|
|
123
|
+
return;
|
|
124
|
+
// 若为活跃态,扣除计数(软删除态的计数已在 delete() 中扣除)
|
|
125
|
+
if (existing.deletedAt === undefined) {
|
|
47
126
|
this.decrementSourceCount(existing.source);
|
|
48
127
|
}
|
|
49
128
|
this.memories.delete(id);
|
|
50
129
|
}
|
|
51
130
|
/**
|
|
52
|
-
*
|
|
131
|
+
* 列出回收站中的软删除记忆
|
|
132
|
+
*
|
|
133
|
+
* 按 deletedAt 降序(最近删除的在前),便于回收站 UI 展示。
|
|
134
|
+
* 返回浅拷贝,避免调用方修改污染存储内部对象。
|
|
135
|
+
*
|
|
136
|
+
* @param limit - 返回数量上限(默认 50)
|
|
137
|
+
* @returns 软删除记忆列表(副本)
|
|
138
|
+
*/
|
|
139
|
+
listDeleted(limit = 50) {
|
|
140
|
+
return Array.from(this.memories.values())
|
|
141
|
+
.filter((m) => m.deletedAt !== undefined)
|
|
142
|
+
.sort((a, b) => {
|
|
143
|
+
// deletedAt 非 undefined 已由 filter 保证,降序排列(最近在前)
|
|
144
|
+
return b.deletedAt > a.deletedAt ? 1 : b.deletedAt < a.deletedAt ? -1 : 0;
|
|
145
|
+
})
|
|
146
|
+
.slice(0, limit)
|
|
147
|
+
.map((m) => ({ ...m }));
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* 按 ID 获取单条软删除记忆
|
|
151
|
+
*
|
|
152
|
+
* 用于 restore/purge 操作前的存在性校验,避免 listDeleted 默认 50 上限
|
|
153
|
+
* 导致回收站超量时操作失效。
|
|
154
|
+
*
|
|
155
|
+
* @param id 记忆唯一标识
|
|
156
|
+
* @returns 软删除记忆(浅拷贝),不存在或未软删除时返回 null
|
|
157
|
+
*/
|
|
158
|
+
getDeletedById(id) {
|
|
159
|
+
const mem = this.memories.get(id);
|
|
160
|
+
// 不存在或未软删除(deletedAt 为 undefined)均返回 null
|
|
161
|
+
if (!mem || mem.deletedAt === undefined)
|
|
162
|
+
return null;
|
|
163
|
+
return { ...mem };
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* 清理过期的软删除记忆
|
|
167
|
+
*
|
|
168
|
+
* 物理删除所有 deletedAt 早于 before 的记忆。
|
|
169
|
+
* 由宿主项目的定时器调用(默认 30 天保留期)。
|
|
170
|
+
*
|
|
171
|
+
* @param before - 时间阈值,deletedAt 早于此值的记忆将被物理删除
|
|
172
|
+
* @returns 被清理的记忆数量
|
|
173
|
+
*/
|
|
174
|
+
purgeExpired(before) {
|
|
175
|
+
const beforeIso = before.toISOString();
|
|
176
|
+
let count = 0;
|
|
177
|
+
for (const [id, m] of this.memories) {
|
|
178
|
+
// 仅清理已软删除且早于阈值的记忆
|
|
179
|
+
if (m.deletedAt !== undefined && m.deletedAt < beforeIso) {
|
|
180
|
+
this.memories.delete(id);
|
|
181
|
+
count++;
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
return count;
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* 按 ID 获取单条活跃记忆(已软删除的返回 null)
|
|
53
188
|
*
|
|
54
189
|
* 返回浅拷贝,避免调用方修改污染存储内部对象(接口契约:读取隔离)
|
|
55
190
|
*/
|
|
56
191
|
getById(id) {
|
|
57
192
|
const m = this.memories.get(id);
|
|
58
|
-
|
|
193
|
+
// 已软删除的记忆返回 null(活跃态过滤)
|
|
194
|
+
if (!m || m.deletedAt !== undefined)
|
|
195
|
+
return null;
|
|
196
|
+
return { ...m };
|
|
59
197
|
}
|
|
60
198
|
/**
|
|
61
|
-
*
|
|
199
|
+
* 按来源标签获取活跃记忆(自动过滤已软删除的)
|
|
62
200
|
*
|
|
63
201
|
* 返回浅拷贝数组,避免调用方修改污染存储内部对象。
|
|
64
202
|
*
|
|
65
203
|
* @param source - 来源标签(如 'persona'、'rule'、'insight')
|
|
66
|
-
* @returns
|
|
204
|
+
* @returns 该来源的所有活跃记忆(副本),按 score 降序排列
|
|
67
205
|
*/
|
|
68
206
|
getBySource(source) {
|
|
69
207
|
return Array.from(this.memories.values())
|
|
70
|
-
.filter((m) => m.source === source)
|
|
208
|
+
.filter((m) => m.source === source && m.deletedAt === undefined)
|
|
71
209
|
.sort((a, b) => b.score - a.score)
|
|
72
210
|
.map((m) => ({ ...m }));
|
|
73
211
|
}
|
|
74
212
|
/**
|
|
75
|
-
*
|
|
213
|
+
* 文本搜索活跃记忆(自动过滤已软删除的,内存版)
|
|
76
214
|
*
|
|
77
215
|
* 使用 segmentText() 规范分词,与 SqliteStorage 行为一致。
|
|
78
216
|
* 搜索 content 和 name 字段,按 score 降序排列。
|
|
79
217
|
*
|
|
80
218
|
* @param query - 搜索查询文本
|
|
81
219
|
* @param limit - 返回数量上限(默认 10)
|
|
82
|
-
* @returns
|
|
220
|
+
* @returns 匹配的活跃记忆列表
|
|
83
221
|
*/
|
|
84
222
|
search(query, limit = 10) {
|
|
223
|
+
// 仅搜索活跃记忆(deletedAt === undefined)
|
|
224
|
+
const activeMemories = Array.from(this.memories.values()).filter((m) => m.deletedAt === undefined);
|
|
85
225
|
// 空查询:按 score 降序返回(浅拷贝,读取隔离)
|
|
86
226
|
if (!query.trim()) {
|
|
87
|
-
return
|
|
227
|
+
return activeMemories
|
|
88
228
|
.sort((a, b) => b.score - a.score)
|
|
89
229
|
.slice(0, limit)
|
|
90
230
|
.map((m) => ({ ...m }));
|
|
@@ -93,12 +233,12 @@ export class InMemoryStorage {
|
|
|
93
233
|
const tokens = segmentText(query).map((t) => t.toLowerCase());
|
|
94
234
|
// 若分词后无有效 token,降级为按 score 返回
|
|
95
235
|
if (tokens.length === 0) {
|
|
96
|
-
return
|
|
236
|
+
return activeMemories
|
|
97
237
|
.sort((a, b) => b.score - a.score)
|
|
98
238
|
.slice(0, limit)
|
|
99
239
|
.map((m) => ({ ...m }));
|
|
100
240
|
}
|
|
101
|
-
const results =
|
|
241
|
+
const results = activeMemories.filter((m) => {
|
|
102
242
|
const text = `${m.content} ${m.name}`.toLowerCase();
|
|
103
243
|
// 任一 token 命中即可
|
|
104
244
|
return tokens.some((t) => text.includes(t));
|
|
@@ -109,29 +249,39 @@ export class InMemoryStorage {
|
|
|
109
249
|
return results.slice(0, limit).map((m) => ({ ...m }));
|
|
110
250
|
}
|
|
111
251
|
/**
|
|
112
|
-
*
|
|
252
|
+
* 统计活跃记忆总数(不含已软删除的)
|
|
253
|
+
*
|
|
254
|
+
* 优化:直接累加 sourceCountCache 的所有值,O(sources) 复杂度。
|
|
255
|
+
* 因 sourceCountCache 仅维护活跃记忆计数,求和即为活跃总数。
|
|
113
256
|
*/
|
|
114
257
|
count() {
|
|
115
|
-
|
|
258
|
+
let total = 0;
|
|
259
|
+
for (const c of this.sourceCountCache.values())
|
|
260
|
+
total += c;
|
|
261
|
+
return total;
|
|
116
262
|
}
|
|
117
263
|
/**
|
|
118
264
|
* 按来源标签统计记忆数量
|
|
119
265
|
*
|
|
120
|
-
*
|
|
266
|
+
* 优化:直接读取 sourceCountCache,O(1) 复杂度
|
|
267
|
+
* (getAllSources 为 O(sources),因需拷贝 Map,二者复杂度不同)
|
|
121
268
|
* 原实现 O(n) 遍历所有记忆,与增量缓存设计不一致
|
|
122
269
|
*/
|
|
123
270
|
countBySource(source) {
|
|
124
271
|
return this.sourceCountCache.get(source) ?? 0;
|
|
125
272
|
}
|
|
126
273
|
/**
|
|
127
|
-
*
|
|
274
|
+
* 衰减指定来源的活跃记忆 score(跳过已软删除的)
|
|
128
275
|
*
|
|
129
|
-
* 遍历所有匹配 source
|
|
276
|
+
* 遍历所有匹配 source 的活跃记忆,按时间衰减。
|
|
130
277
|
* 生产环境宿主(SqliteStorage)应重写为 SQL UPDATE 批量操作。
|
|
131
278
|
*/
|
|
132
279
|
decayScores(sources, now) {
|
|
133
280
|
let count = 0;
|
|
134
281
|
for (const m of this.memories.values()) {
|
|
282
|
+
// 跳过已软删除的记忆
|
|
283
|
+
if (m.deletedAt !== undefined)
|
|
284
|
+
continue;
|
|
135
285
|
if (!sources.includes(m.source))
|
|
136
286
|
continue;
|
|
137
287
|
if (applyDecayToMemory(m, now)) {
|
|
@@ -143,7 +293,8 @@ export class InMemoryStorage {
|
|
|
143
293
|
/**
|
|
144
294
|
* 获取所有 source 标签及其记忆数量
|
|
145
295
|
*
|
|
146
|
-
*
|
|
296
|
+
* 优化:直接读取增量维护的 sourceCountCache。
|
|
297
|
+
* 复杂度为 O(sources)(拷贝 Map),相比全量遍历 O(n) 仍有显著优化。
|
|
147
298
|
*/
|
|
148
299
|
getAllSources() {
|
|
149
300
|
return new Map(this.sourceCountCache);
|
|
@@ -156,7 +307,7 @@ export class InMemoryStorage {
|
|
|
156
307
|
this.memories.clear();
|
|
157
308
|
this.sourceCountCache.clear();
|
|
158
309
|
}
|
|
159
|
-
// ───
|
|
310
|
+
// ─── source 缓存辅助方法 ─────────────────────────────
|
|
160
311
|
/** source 计数 +1 */
|
|
161
312
|
incrementSourceCount(source) {
|
|
162
313
|
this.sourceCountCache.set(source, (this.sourceCountCache.get(source) ?? 0) + 1);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"inMemoryStorage.js","sourceRoot":"","sources":["../../src/memory/inMemoryStorage.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"inMemoryStorage.js","sourceRoot":"","sources":["../../src/memory/inMemoryStorage.ts"],"names":[],"mappings":"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"}
|
package/dist/memory/loader.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/memory/loader.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,aAAa,EAAe,MAAM,mBAAmB,CAAC;AAC/D,OAAO,EAAE,OAAO,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/memory/loader.ts"],"names":[],"mappings":"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"}
|
|
@@ -20,7 +20,7 @@ export interface ProjectContext {
|
|
|
20
20
|
fileStore: FileStore;
|
|
21
21
|
/** SQLite 索引(通过 IMemoryStorage 接口访问) */
|
|
22
22
|
index: IMemoryStorage;
|
|
23
|
-
/**
|
|
23
|
+
/** 安全守卫(可空,由 Agent 层注入工厂函数创建) */
|
|
24
24
|
security: SecurityGuard | null;
|
|
25
25
|
/** 启动时加载的必召记忆 */
|
|
26
26
|
bootstrapMemories: Memory[];
|
|
@@ -49,7 +49,7 @@ export interface ProjectManagerOptions {
|
|
|
49
49
|
/** 注册表目录(可选,默认与 dataDir 相同) */
|
|
50
50
|
registryDir?: string;
|
|
51
51
|
/**
|
|
52
|
-
*
|
|
52
|
+
* SecurityGuard 工厂函数(由 Agent 层注入,解除 memory→security 反向依赖)
|
|
53
53
|
*
|
|
54
54
|
* 在项目切换时调用,传入项目路径、.memora/ 目录、Agent 级配置目录和数据目录,
|
|
55
55
|
* 返回一个配置好的 SecurityGuard 实例。
|
|
@@ -78,7 +78,7 @@ export declare class ProjectManager {
|
|
|
78
78
|
private currentLockPath;
|
|
79
79
|
/** 外部注入的存储实例(可选,不传则内部创建 InMemoryStorage 兜底) */
|
|
80
80
|
private externalStorage;
|
|
81
|
-
/**
|
|
81
|
+
/** SecurityGuard 工厂函数(由 Agent 层注入) */
|
|
82
82
|
private readonly createSecurityGuard?;
|
|
83
83
|
constructor(options: ProjectManagerOptions);
|
|
84
84
|
/**
|
|
@@ -100,11 +100,39 @@ export declare class ProjectManager {
|
|
|
100
100
|
*
|
|
101
101
|
* memora.db 是 Agent 级共享资源,不随项目切换重建。
|
|
102
102
|
*
|
|
103
|
+
* 主体编排(关闭旧项目 + 锁 + 错误回滚)+ loadAllResources(两层加载)
|
|
104
|
+
* + buildProjectContext(上下文构建)三个子方法分工。
|
|
105
|
+
*
|
|
103
106
|
* @param projectPath 项目根目录
|
|
104
107
|
* @param projectName 项目名称(可选,默认取目录名)
|
|
105
108
|
* @param configDir Agent 级配置目录(personas/rules/skills/tools)
|
|
106
109
|
*/
|
|
107
110
|
initProject(projectPath: string, projectName?: string, configDir?: string): Promise<ProjectContext>;
|
|
111
|
+
/**
|
|
112
|
+
* 加载两层记忆资源
|
|
113
|
+
*
|
|
114
|
+
* 职责:确保 Agent 级存储 + 扫描项目级 + 扫描 Agent 级配置,合并加载结果。
|
|
115
|
+
*
|
|
116
|
+
* @param memoraDir 项目 .memora/ 目录
|
|
117
|
+
* @param configDir Agent 级配置目录(可选)
|
|
118
|
+
* @returns index 存储实例 + loadResult 合并加载结果 + projectFileStore 项目级 FileStore
|
|
119
|
+
*/
|
|
120
|
+
private loadAllResources;
|
|
121
|
+
/**
|
|
122
|
+
* 构建项目上下文
|
|
123
|
+
*
|
|
124
|
+
* 职责:bootstrap 过滤 + 安全守卫创建 + 项目注册 + 日志 + 返回上下文。
|
|
125
|
+
*
|
|
126
|
+
* @param projectPath 项目根目录
|
|
127
|
+
* @param projectName 项目名称(可选,默认取目录名)
|
|
128
|
+
* @param memoraDir 项目 .memora/ 目录
|
|
129
|
+
* @param index 存储实例
|
|
130
|
+
* @param projectFileStore 项目级 FileStore
|
|
131
|
+
* @param loadResult 加载结果
|
|
132
|
+
* @param configDir Agent 级配置目录(用于安全守卫创建)
|
|
133
|
+
* @returns 完整的项目上下文
|
|
134
|
+
*/
|
|
135
|
+
private buildProjectContext;
|
|
108
136
|
/**
|
|
109
137
|
* 关闭当前项目
|
|
110
138
|
* 释放锁文件,但不关闭 Agent 级数据库(memora.db 是共享的)
|
|
@@ -152,8 +180,9 @@ export declare class ProjectManager {
|
|
|
152
180
|
private safeUnlink;
|
|
153
181
|
/**
|
|
154
182
|
* 检查进程是否存活
|
|
155
|
-
*
|
|
156
|
-
*
|
|
183
|
+
*
|
|
184
|
+
* 跨平台统一使用 process.kill(pid, 0) 探测进程存活
|
|
185
|
+
* (Windows 上 process.kill(pid, 0) 同样有效)
|
|
157
186
|
*/
|
|
158
187
|
private isProcessAlive;
|
|
159
188
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"projectManager.d.ts","sourceRoot":"","sources":["../../src/memory/projectManager.ts"],"names":[],"mappings":"AAgCA,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAE9C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAEnE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAI7D,OAAO,EAAiB,KAAK,MAAM,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"projectManager.d.ts","sourceRoot":"","sources":["../../src/memory/projectManager.ts"],"names":[],"mappings":"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"}
|