@zooique/memora 1.0.1 → 2.0.3
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/README.en.md +272 -0
- package/README.md +150 -38
- package/dist/agent/agent.d.ts +257 -115
- package/dist/agent/agent.d.ts.map +1 -1
- package/dist/agent/agent.js +747 -400
- package/dist/agent/agent.js.map +1 -1
- package/dist/agent/assembler.d.ts +32 -16
- package/dist/agent/assembler.d.ts.map +1 -1
- package/dist/agent/assembler.js +83 -47
- package/dist/agent/assembler.js.map +1 -1
- package/dist/agent/builtinToolHandlers.d.ts +27 -2
- package/dist/agent/builtinToolHandlers.d.ts.map +1 -1
- package/dist/agent/builtinToolHandlers.js +78 -5
- package/dist/agent/builtinToolHandlers.js.map +1 -1
- package/dist/agent/constants.d.ts +4 -0
- package/dist/agent/constants.d.ts.map +1 -1
- package/dist/agent/constants.js +4 -0
- package/dist/agent/constants.js.map +1 -1
- package/dist/agent/contextManager.d.ts +8 -0
- package/dist/agent/contextManager.d.ts.map +1 -1
- package/dist/agent/contextManager.js +7 -2
- package/dist/agent/contextManager.js.map +1 -1
- package/dist/agent/guardrail.d.ts +4 -2
- package/dist/agent/guardrail.d.ts.map +1 -1
- package/dist/agent/guardrail.js +13 -5
- package/dist/agent/guardrail.js.map +1 -1
- package/dist/agent/loop.d.ts +137 -15
- package/dist/agent/loop.d.ts.map +1 -1
- package/dist/agent/loop.js +449 -270
- package/dist/agent/loop.js.map +1 -1
- package/dist/agent/managers/archiveCoordinator.d.ts +126 -22
- package/dist/agent/managers/archiveCoordinator.d.ts.map +1 -1
- package/dist/agent/managers/archiveCoordinator.js +239 -44
- package/dist/agent/managers/archiveCoordinator.js.map +1 -1
- package/dist/agent/managers/autoConfigRefiner.d.ts.map +1 -1
- package/dist/agent/managers/autoConfigRefiner.js +4 -8
- package/dist/agent/managers/autoConfigRefiner.js.map +1 -1
- package/dist/agent/managers/chatLockManager.d.ts +116 -0
- package/dist/agent/managers/chatLockManager.d.ts.map +1 -0
- package/dist/agent/managers/chatLockManager.js +191 -0
- package/dist/agent/managers/chatLockManager.js.map +1 -0
- package/dist/agent/managers/configManager.d.ts +87 -3
- package/dist/agent/managers/configManager.d.ts.map +1 -1
- package/dist/agent/managers/configManager.js +139 -2
- package/dist/agent/managers/configManager.js.map +1 -1
- package/dist/agent/managers/dedupManager.d.ts +169 -0
- package/dist/agent/managers/dedupManager.d.ts.map +1 -0
- package/dist/agent/managers/dedupManager.js +336 -0
- package/dist/agent/managers/dedupManager.js.map +1 -0
- package/dist/agent/managers/insightExtractor.d.ts +31 -3
- package/dist/agent/managers/insightExtractor.d.ts.map +1 -1
- package/dist/agent/managers/insightExtractor.js +130 -59
- package/dist/agent/managers/insightExtractor.js.map +1 -1
- package/dist/agent/managers/llmJudgeHelper.d.ts +38 -0
- package/dist/agent/managers/llmJudgeHelper.d.ts.map +1 -0
- package/dist/agent/managers/llmJudgeHelper.js +49 -0
- package/dist/agent/managers/llmJudgeHelper.js.map +1 -0
- package/dist/agent/managers/memoryAdvisor.d.ts +102 -2
- package/dist/agent/managers/memoryAdvisor.d.ts.map +1 -1
- package/dist/agent/managers/memoryAdvisor.js +254 -10
- package/dist/agent/managers/memoryAdvisor.js.map +1 -1
- package/dist/agent/managers/memoryDecayScheduler.d.ts +127 -1
- package/dist/agent/managers/memoryDecayScheduler.d.ts.map +1 -1
- package/dist/agent/managers/memoryDecayScheduler.js +283 -4
- package/dist/agent/managers/memoryDecayScheduler.js.map +1 -1
- package/dist/agent/managers/memoryGovernance.d.ts +56 -0
- package/dist/agent/managers/memoryGovernance.d.ts.map +1 -0
- package/dist/agent/managers/memoryGovernance.js +63 -0
- package/dist/agent/managers/memoryGovernance.js.map +1 -0
- package/dist/agent/managers/memoryInspector.d.ts +113 -30
- package/dist/agent/managers/memoryInspector.d.ts.map +1 -1
- package/dist/agent/managers/memoryInspector.js +165 -32
- package/dist/agent/managers/memoryInspector.js.map +1 -1
- package/dist/agent/managers/relationBuilder.d.ts +4 -4
- package/dist/agent/managers/relationBuilder.d.ts.map +1 -1
- package/dist/agent/managers/relationBuilder.js +5 -4
- package/dist/agent/managers/relationBuilder.js.map +1 -1
- package/dist/agent/managers/sessionArchiver.d.ts +12 -1
- package/dist/agent/managers/sessionArchiver.d.ts.map +1 -1
- package/dist/agent/managers/sessionArchiver.js +87 -30
- package/dist/agent/managers/sessionArchiver.js.map +1 -1
- package/dist/agent/managers/sessionManager.d.ts.map +1 -1
- package/dist/agent/managers/sessionManager.js +9 -17
- package/dist/agent/managers/sessionManager.js.map +1 -1
- package/dist/agent/managers/streamAccumulator.d.ts +45 -0
- package/dist/agent/managers/streamAccumulator.d.ts.map +1 -0
- package/dist/agent/managers/streamAccumulator.js +40 -0
- package/dist/agent/managers/streamAccumulator.js.map +1 -0
- package/dist/agent/managers/textPolishManager.d.ts +62 -0
- package/dist/agent/managers/textPolishManager.d.ts.map +1 -0
- package/dist/agent/managers/textPolishManager.js +96 -0
- package/dist/agent/managers/textPolishManager.js.map +1 -0
- package/dist/agent/managers/workProjection.d.ts +16 -1
- package/dist/agent/managers/workProjection.d.ts.map +1 -1
- package/dist/agent/managers/workProjection.js +48 -24
- package/dist/agent/managers/workProjection.js.map +1 -1
- package/dist/agent/personaMatcher.d.ts +29 -0
- package/dist/agent/personaMatcher.d.ts.map +1 -0
- package/dist/agent/personaMatcher.js +60 -0
- package/dist/agent/personaMatcher.js.map +1 -0
- package/dist/agent/toolExecutor.d.ts +24 -4
- package/dist/agent/toolExecutor.d.ts.map +1 -1
- package/dist/agent/toolExecutor.js +30 -4
- package/dist/agent/toolExecutor.js.map +1 -1
- package/dist/agent/tracer.d.ts +31 -0
- package/dist/agent/tracer.d.ts.map +1 -1
- package/dist/agent/tracer.js +31 -0
- package/dist/agent/tracer.js.map +1 -1
- package/dist/agent/types.d.ts +133 -0
- package/dist/agent/types.d.ts.map +1 -1
- package/dist/agent/types.js +38 -0
- package/dist/agent/types.js.map +1 -1
- package/dist/agent/userFactExtractor.d.ts.map +1 -1
- package/dist/agent/userFactExtractor.js +7 -0
- package/dist/agent/userFactExtractor.js.map +1 -1
- package/dist/config/loader.d.ts +124 -236
- package/dist/config/loader.d.ts.map +1 -1
- package/dist/config/loader.js +296 -118
- package/dist/config/loader.js.map +1 -1
- package/dist/eval/evalRunner.d.ts +94 -0
- package/dist/eval/evalRunner.d.ts.map +1 -0
- package/dist/eval/evalRunner.js +141 -0
- package/dist/eval/evalRunner.js.map +1 -0
- package/dist/eval/evalTypes.d.ts +21 -0
- package/dist/eval/evalTypes.d.ts.map +1 -1
- package/dist/eval/evalTypes.js +15 -0
- package/dist/eval/evalTypes.js.map +1 -1
- package/dist/eval/scenarios.d.ts +33 -0
- package/dist/eval/scenarios.d.ts.map +1 -0
- package/dist/eval/scenarios.js +109 -0
- package/dist/eval/scenarios.js.map +1 -0
- package/dist/index.d.ts +45 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +45 -5
- package/dist/index.js.map +1 -1
- package/dist/llm/abortSignal.d.ts +27 -0
- package/dist/llm/abortSignal.d.ts.map +1 -0
- package/dist/llm/abortSignal.js +44 -0
- package/dist/llm/abortSignal.js.map +1 -0
- package/dist/llm/embedding.d.ts +13 -12
- package/dist/llm/embedding.d.ts.map +1 -1
- package/dist/llm/embedding.js +5 -17
- package/dist/llm/embedding.js.map +1 -1
- package/dist/llm/factory.d.ts +19 -5
- package/dist/llm/factory.d.ts.map +1 -1
- package/dist/llm/factory.js +19 -37
- package/dist/llm/factory.js.map +1 -1
- package/dist/llm/openaiCompatible.d.ts.map +1 -1
- package/dist/llm/openaiCompatible.js +17 -34
- package/dist/llm/openaiCompatible.js.map +1 -1
- package/dist/logging/logger.d.ts +3 -1
- package/dist/logging/logger.d.ts.map +1 -1
- package/dist/logging/logger.js +47 -50
- package/dist/logging/logger.js.map +1 -1
- package/dist/memory/governance.d.ts +50 -0
- package/dist/memory/governance.d.ts.map +1 -0
- package/dist/memory/governance.js +70 -0
- package/dist/memory/governance.js.map +1 -0
- package/dist/memory/hybridMerge.d.ts +0 -4
- package/dist/memory/hybridMerge.d.ts.map +1 -1
- package/dist/memory/hybridMerge.js +19 -4
- package/dist/memory/hybridMerge.js.map +1 -1
- package/dist/memory/inMemoryRelationStore.d.ts +7 -0
- package/dist/memory/inMemoryRelationStore.d.ts.map +1 -1
- package/dist/memory/inMemoryRelationStore.js +15 -0
- package/dist/memory/inMemoryRelationStore.js.map +1 -1
- package/dist/memory/inMemoryStorage.d.ts +36 -1
- package/dist/memory/inMemoryStorage.d.ts.map +1 -1
- package/dist/memory/inMemoryStorage.js +70 -19
- package/dist/memory/inMemoryStorage.js.map +1 -1
- package/dist/memory/loader.d.ts +2 -0
- package/dist/memory/loader.d.ts.map +1 -1
- package/dist/memory/loader.js +8 -1
- package/dist/memory/loader.js.map +1 -1
- package/dist/memory/lockManager.d.ts +7 -2
- package/dist/memory/lockManager.d.ts.map +1 -1
- package/dist/memory/lockManager.js +35 -17
- package/dist/memory/lockManager.js.map +1 -1
- package/dist/memory/projectManager.d.ts +8 -7
- package/dist/memory/projectManager.d.ts.map +1 -1
- package/dist/memory/projectManager.js +33 -15
- package/dist/memory/projectManager.js.map +1 -1
- package/dist/memory/projectRegistry.d.ts +34 -1
- package/dist/memory/projectRegistry.d.ts.map +1 -1
- package/dist/memory/projectRegistry.js +100 -31
- package/dist/memory/projectRegistry.js.map +1 -1
- package/dist/memory/recall.d.ts +16 -0
- package/dist/memory/recall.d.ts.map +1 -1
- package/dist/memory/recall.js +35 -20
- package/dist/memory/recall.js.map +1 -1
- package/dist/memory/relationStore.d.ts +20 -3
- package/dist/memory/relationStore.d.ts.map +1 -1
- package/dist/memory/sourceValidation.d.ts +17 -0
- package/dist/memory/sourceValidation.d.ts.map +1 -1
- package/dist/memory/sourceValidation.js +27 -3
- package/dist/memory/sourceValidation.js.map +1 -1
- package/dist/memory/storageInterface.d.ts +26 -1
- package/dist/memory/storageInterface.d.ts.map +1 -1
- package/dist/memory/store.d.ts +22 -1
- package/dist/memory/store.d.ts.map +1 -1
- package/dist/memory/store.js +58 -20
- package/dist/memory/store.js.map +1 -1
- package/dist/memory/types.d.ts +44 -31
- package/dist/memory/types.d.ts.map +1 -1
- package/dist/memory/types.js +63 -24
- package/dist/memory/types.js.map +1 -1
- package/dist/memory/userProfile.d.ts +32 -8
- package/dist/memory/userProfile.d.ts.map +1 -1
- package/dist/memory/userProfile.js +105 -44
- package/dist/memory/userProfile.js.map +1 -1
- package/dist/memory/vectorStore.d.ts +16 -8
- package/dist/memory/vectorStore.d.ts.map +1 -1
- package/dist/memory/vectorStore.js +49 -22
- package/dist/memory/vectorStore.js.map +1 -1
- package/dist/persona/personaManager.d.ts +38 -63
- package/dist/persona/personaManager.d.ts.map +1 -1
- package/dist/persona/personaManager.js +136 -202
- package/dist/persona/personaManager.js.map +1 -1
- package/dist/skill/skillManager.d.ts +11 -57
- package/dist/skill/skillManager.d.ts.map +1 -1
- package/dist/skill/skillManager.js +46 -141
- package/dist/skill/skillManager.js.map +1 -1
- package/dist/skill/types.d.ts +2 -3
- package/dist/skill/types.d.ts.map +1 -1
- package/dist/utils/array.d.ts +24 -0
- package/dist/utils/array.d.ts.map +1 -0
- package/dist/utils/array.js +24 -0
- package/dist/utils/array.js.map +1 -0
- package/dist/utils/configResourceManager.d.ts +111 -0
- package/dist/utils/configResourceManager.d.ts.map +1 -0
- package/dist/utils/configResourceManager.js +148 -0
- package/dist/utils/configResourceManager.js.map +1 -0
- package/dist/utils/errors.d.ts +27 -8
- package/dist/utils/errors.d.ts.map +1 -1
- package/dist/utils/errors.js +31 -9
- package/dist/utils/errors.js.map +1 -1
- package/dist/utils/eventEmitter.d.ts +88 -4
- package/dist/utils/eventEmitter.d.ts.map +1 -1
- package/dist/utils/eventEmitter.js +23 -0
- package/dist/utils/eventEmitter.js.map +1 -1
- package/dist/utils/frontmatter.d.ts.map +1 -1
- package/dist/utils/frontmatter.js +4 -2
- package/dist/utils/frontmatter.js.map +1 -1
- package/dist/utils/math.d.ts +11 -0
- package/dist/utils/math.d.ts.map +1 -1
- package/dist/utils/math.js +17 -0
- package/dist/utils/math.js.map +1 -1
- package/dist/utils/objects.d.ts +17 -0
- package/dist/utils/objects.d.ts.map +1 -0
- package/dist/utils/objects.js +19 -0
- package/dist/utils/objects.js.map +1 -0
- package/dist/utils/segmenter.d.ts +11 -10
- package/dist/utils/segmenter.d.ts.map +1 -1
- package/dist/utils/segmenter.js +23 -1
- package/dist/utils/segmenter.js.map +1 -1
- package/dist/utils/strings.d.ts +22 -1
- package/dist/utils/strings.d.ts.map +1 -1
- package/dist/utils/strings.js +29 -1
- package/dist/utils/strings.js.map +1 -1
- package/dist/utils/time.d.ts +18 -3
- package/dist/utils/time.d.ts.map +1 -1
- package/dist/utils/time.js +24 -8
- package/dist/utils/time.js.map +1 -1
- package/dist/utils/toError.d.ts +8 -4
- package/dist/utils/toError.d.ts.map +1 -1
- package/dist/utils/toError.js +25 -5
- package/dist/utils/toError.js.map +1 -1
- package/docs/memora-api-reference.md +1235 -0
- package/docs/memora-/346/216/245/345/205/245/346/214/207/345/215/227.md +808 -0
- package/package.json +49 -22
- package/dist/agent/managers/memoryMutator.d.ts +0 -92
- package/dist/agent/managers/memoryMutator.d.ts.map +0 -1
- package/dist/agent/managers/memoryMutator.js +0 -94
- package/dist/agent/managers/memoryMutator.js.map +0 -1
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ChatLockManager — chat() 并发锁管理器
|
|
3
|
+
*
|
|
4
|
+
* 职责:
|
|
5
|
+
* - chat() 并发锁(防止多轮 chat 同时执行)
|
|
6
|
+
* - token 校验(防止 race condition:超时释放后新调用获取锁,旧 finally 误清新调用者资源)
|
|
7
|
+
* - 超时保护(LLM 卡死时中断 generator + 释放锁)
|
|
8
|
+
* - 外部 signal 合并(外部 abort 时触发内部 abort)
|
|
9
|
+
*
|
|
10
|
+
* 从 agent.ts 提取(AUDIT-1-1,ADR-017 架构层先行原则首次实践)
|
|
11
|
+
*
|
|
12
|
+
* race condition 防护设计:
|
|
13
|
+
* 原锁是简单布尔值 `_chatBusy`,无 owner 校验。超时回调与 finally 块无差别清理,
|
|
14
|
+
* 导致 race condition:T=0 A 获取锁 → T=180s 超时释放 → T=181s B 获取锁
|
|
15
|
+
* → T=182s A 的 finally 误清 B 的锁/计时器/controller。
|
|
16
|
+
*
|
|
17
|
+
* 防护方案:
|
|
18
|
+
* - 获取锁时 token 递增:`const myToken = ++this._chatLockToken`
|
|
19
|
+
* - 超时回调校验 `this._chatLockToken === myToken` 后才释放
|
|
20
|
+
* - finally 块校验 `this._chatLockToken === myToken` 后才清理
|
|
21
|
+
* - 不匹配时跳过清理,避免误清新调用者的资源
|
|
22
|
+
*
|
|
23
|
+
* 选择 number 而非 Symbol:递增计数器可序列化、零依赖、足够唯一(同一 Agent 实例内)
|
|
24
|
+
*/
|
|
25
|
+
import { clearSafeTimeout, safeSetTimeout } from '../../utils/safeTimer.js';
|
|
26
|
+
import { logger } from '../../logging/logger.js';
|
|
27
|
+
/**
|
|
28
|
+
* chat() 并发锁管理器
|
|
29
|
+
*
|
|
30
|
+
* 使用方式:
|
|
31
|
+
* const mgr = new ChatLockManager();
|
|
32
|
+
* const { token, internalAbort } = mgr.acquire(180_000);
|
|
33
|
+
* const cleanup = mgr.attachExternalSignal(externalSignal, internalAbort);
|
|
34
|
+
* try {
|
|
35
|
+
* // ... 使用 internalAbort.signal 传递给 generator ...
|
|
36
|
+
* } finally {
|
|
37
|
+
* mgr.release(token);
|
|
38
|
+
* cleanup();
|
|
39
|
+
* }
|
|
40
|
+
*
|
|
41
|
+
* 强制释放(宿主兜底):
|
|
42
|
+
* mgr.forceRelease();
|
|
43
|
+
*
|
|
44
|
+
* 销毁(Agent.close 时):
|
|
45
|
+
* mgr.dispose();
|
|
46
|
+
*/
|
|
47
|
+
export class ChatLockManager {
|
|
48
|
+
/** chat() 是否正在执行(并发锁) */
|
|
49
|
+
_chatBusy = false;
|
|
50
|
+
/**
|
|
51
|
+
* chat() 锁持有者 token(race condition 防护)
|
|
52
|
+
*
|
|
53
|
+
* 获取锁时递增,超时回调和 finally 块据此判断是否仍是当前持有者。
|
|
54
|
+
* 不匹配时跳过清理,避免误清新调用者的资源。
|
|
55
|
+
*/
|
|
56
|
+
_chatLockToken = 0;
|
|
57
|
+
/** 聊天锁超时计时器(防止 LLM 卡死时锁永久持有) */
|
|
58
|
+
chatLockTimer = null;
|
|
59
|
+
/** chat() 内部 AbortController(超时时中断 generator,防止并发) */
|
|
60
|
+
chatAbortController = null;
|
|
61
|
+
/** 当前是否持有锁 */
|
|
62
|
+
get isBusy() {
|
|
63
|
+
return this._chatBusy;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* 获取锁,返回 token + 内部 AbortController
|
|
67
|
+
*
|
|
68
|
+
* @param timeoutMs 锁超时时间(LLM 卡死保护)
|
|
69
|
+
* @param onTimeout 超时回调(用于日志记录等)
|
|
70
|
+
* @returns token(用于 finally 校验)+ internalAbort(用于传递给 loop.processUserInput)
|
|
71
|
+
*/
|
|
72
|
+
acquire(timeoutMs, onTimeout) {
|
|
73
|
+
this._chatBusy = true;
|
|
74
|
+
// 分配本调用的 token,超时回调和 finally 块据此判断是否仍是当前持有者
|
|
75
|
+
// 避免 race condition:超时释放后新调用获取锁,旧 finally 误清新调用者的资源
|
|
76
|
+
const token = ++this._chatLockToken;
|
|
77
|
+
// 内部 AbortController,超时时中断 generator 而非仅释放锁
|
|
78
|
+
const internalAbort = new AbortController();
|
|
79
|
+
this.chatAbortController = internalAbort;
|
|
80
|
+
// 超时保护:LLM 卡死时中断 generator + 释放锁,防止并发
|
|
81
|
+
// 超时回调校验 token 后才清理,避免误清新调用者的资源
|
|
82
|
+
this.chatLockTimer = safeSetTimeout(() => {
|
|
83
|
+
// 令牌不匹配:锁已被新调用者获取(或本调用已正常退出),跳过清理
|
|
84
|
+
if (this._chatLockToken !== token) {
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
logger.warn({ timeoutMs }, 'chat() 锁超时,中断 generator 并释放锁');
|
|
88
|
+
internalAbort.abort();
|
|
89
|
+
this._chatBusy = false;
|
|
90
|
+
this.chatLockTimer = null;
|
|
91
|
+
this.chatAbortController = null;
|
|
92
|
+
onTimeout?.();
|
|
93
|
+
}, timeoutMs);
|
|
94
|
+
return { token, internalAbort };
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* 合并外部 signal:外部 abort 时触发内部 abort
|
|
98
|
+
*
|
|
99
|
+
* addEventListener 对已 aborted 的 signal 不触发回调,
|
|
100
|
+
* 需手动检查并触发 internalAbort,否则外部已取消的请求仍会进入主流程。
|
|
101
|
+
*
|
|
102
|
+
* @returns 清理函数(finally 块中调用 removeEventListener)
|
|
103
|
+
*/
|
|
104
|
+
attachExternalSignal(externalSignal, internalAbort) {
|
|
105
|
+
if (!externalSignal)
|
|
106
|
+
return () => { };
|
|
107
|
+
const onExternalAbort = () => internalAbort.abort();
|
|
108
|
+
externalSignal.addEventListener('abort', onExternalAbort, { once: true });
|
|
109
|
+
// addEventListener 对已 aborted 的 signal 不触发回调
|
|
110
|
+
// 需手动检查并触发 internalAbort,否则外部已取消的请求仍会进入主流程
|
|
111
|
+
if (externalSignal.aborted) {
|
|
112
|
+
internalAbort.abort();
|
|
113
|
+
}
|
|
114
|
+
return () => externalSignal.removeEventListener('abort', onExternalAbort);
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* finally 块清理(token 校验后)
|
|
118
|
+
*
|
|
119
|
+
* 仅当本调用仍是当前锁持有者时才清理资源。
|
|
120
|
+
* 若 token 已变(超时释放后被新调用者获取),跳过清理避免误清新调用者的状态。
|
|
121
|
+
*/
|
|
122
|
+
release(token) {
|
|
123
|
+
if (this._chatLockToken !== token) {
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
this._chatBusy = false;
|
|
127
|
+
this.chatAbortController = null;
|
|
128
|
+
if (this.chatLockTimer) {
|
|
129
|
+
clearSafeTimeout(this.chatLockTimer);
|
|
130
|
+
this.chatLockTimer = null;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* 强制释放对话锁(宿主无进展超时兜底)
|
|
135
|
+
*
|
|
136
|
+
* 场景:宿主主进程"无进展超时"兜底后,generator 可能仍卡在不可中断的 await 点
|
|
137
|
+
* (executeToolCalls 和 generateContextSummary 已覆盖 signal 响应,但其他
|
|
138
|
+
* 第三方库或未来新增的 await 点仍可能不响应 signal)。
|
|
139
|
+
* 此时 _chatBusy 锁未释放,用户再发消息会被 chat() 的竞态保护拒绝,
|
|
140
|
+
* 表现为"UI 能操作但发不出消息",需等到 3 分钟锁超时才能恢复。
|
|
141
|
+
*
|
|
142
|
+
* 安全机制:
|
|
143
|
+
* - 递增 _chatLockToken,让原 chat() 的 finally 块检测到 token 不匹配后
|
|
144
|
+
* 跳过资源清理(避免误清新调用者的 _chatBusy/chatAbortController)
|
|
145
|
+
* - abort chatAbortController,让响应 signal 的 await 点(如 fetch)退出
|
|
146
|
+
* - 原 generator 仍可能在后台运行(无法真正中断不响应 signal 的 await),
|
|
147
|
+
* 但其 finally 块的 token 校验会阻止它影响新调用
|
|
148
|
+
*
|
|
149
|
+
* 幂等性:_chatBusy 已 false 时 no-op(多次调用安全)
|
|
150
|
+
*/
|
|
151
|
+
forceRelease() {
|
|
152
|
+
if (!this._chatBusy)
|
|
153
|
+
return;
|
|
154
|
+
// 递增 token 让原 chat() 的 finally 块跳过清理(避免误清新调用者的资源)
|
|
155
|
+
this._chatLockToken++;
|
|
156
|
+
// abort 当前 generator(响应 signal 的 await 点会 throw AbortError 退出)
|
|
157
|
+
if (this.chatAbortController) {
|
|
158
|
+
this.chatAbortController.abort();
|
|
159
|
+
this.chatAbortController = null;
|
|
160
|
+
}
|
|
161
|
+
// 清理锁超时定时器(避免后续触发重复清理)
|
|
162
|
+
if (this.chatLockTimer) {
|
|
163
|
+
clearSafeTimeout(this.chatLockTimer);
|
|
164
|
+
this.chatLockTimer = null;
|
|
165
|
+
}
|
|
166
|
+
this._chatBusy = false;
|
|
167
|
+
logger.warn('对话锁被强制释放(宿主无进展超时兜底)');
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* 销毁管理器(Agent.close 时调用)
|
|
171
|
+
*
|
|
172
|
+
* 与 forceRelease() 的区别:不记录 warn 日志(close 是正常生命周期,非异常场景)。
|
|
173
|
+
* 递增 token 使任何进行中的 chat() generator 的 finally 块检测到 token 变化后
|
|
174
|
+
* 跳过资源清理(close 已接管清理职责)。
|
|
175
|
+
*/
|
|
176
|
+
dispose() {
|
|
177
|
+
// 递增 token,使任何进行中的 chat() generator 的 finally 块
|
|
178
|
+
// 检测到 token 变化后跳过资源清理(close 已接管清理职责)
|
|
179
|
+
this._chatLockToken++;
|
|
180
|
+
if (this.chatAbortController) {
|
|
181
|
+
this.chatAbortController.abort();
|
|
182
|
+
this.chatAbortController = null;
|
|
183
|
+
}
|
|
184
|
+
if (this.chatLockTimer) {
|
|
185
|
+
clearSafeTimeout(this.chatLockTimer);
|
|
186
|
+
this.chatLockTimer = null;
|
|
187
|
+
}
|
|
188
|
+
this._chatBusy = false;
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
//# sourceMappingURL=chatLockManager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chatLockManager.js","sourceRoot":"","sources":["../../../src/agent/managers/chatLockManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,14 +1,18 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* 配置管理器 — 规则/技能注入 + 配置建议持久化
|
|
2
|
+
* 配置管理器 — 规则/技能注入 + 配置建议持久化 + 设定 CRUD
|
|
3
3
|
*
|
|
4
4
|
* 从 Agent 拆分出来,负责:
|
|
5
5
|
* - addRule / addSimpleRule:运行时规则注入(SQLite + System Prompt)
|
|
6
6
|
* - addSkill / addSimpleSkill:运行时技能注入(仅 SkillManager,session-only)
|
|
7
7
|
* - onConfigSuggestion / confirmConfigSuggestion:模式 3 配置建议回调 + 持久化
|
|
8
|
+
* - deleteRule / updateRule / listRules:规则单条 CRUD(SQLite + System Prompt 同步)
|
|
9
|
+
* - deleteSkill / listSkills:技能单条删除与列表(SQLite + SkillManager 内存同步)
|
|
10
|
+
* - getBootstrapMemories:获取 rule + skill 记忆(供 AgentLoop 刷新 system prompt)
|
|
8
11
|
*
|
|
9
12
|
* 设计原则:
|
|
10
|
-
* - 独立于 Agent 生命周期,仅依赖 Storage / SkillManager /
|
|
13
|
+
* - 独立于 Agent 生命周期,仅依赖 Storage / SkillManager / 回调
|
|
11
14
|
* - 不持有 LLM Provider(纯配置操作)
|
|
15
|
+
* - 不直接操作文件(文件 CRUD 由宿主层 configFileManager 处理,本类只管 SQLite + system prompt 同步)
|
|
12
16
|
*/
|
|
13
17
|
import type { Memory } from '../../memory/types.js';
|
|
14
18
|
import type { IMemoryStorage } from '../../memory/storageInterface.js';
|
|
@@ -46,6 +50,14 @@ export interface ConfigSuggestion {
|
|
|
46
50
|
* 当 type 不在约定值内时,必须提供此字段,否则 confirmConfigSuggestion 抛 configError。
|
|
47
51
|
*/
|
|
48
52
|
memorySource?: string;
|
|
53
|
+
/**
|
|
54
|
+
* 可选:写入配置文件 frontmatter 的额外元数据
|
|
55
|
+
*
|
|
56
|
+
* 键值对会合并到 frontmatter 中(如 `keywords`、`description`),
|
|
57
|
+
* 供 PersonaManager.parseKeywords / SkillManager 等加载时解析。
|
|
58
|
+
* 不传时 frontmatter 仅含标准字段(id/source/score/createdAt/accessedAt)。
|
|
59
|
+
*/
|
|
60
|
+
metadata?: Record<string, string>;
|
|
49
61
|
}
|
|
50
62
|
/** 配置建议回调函数类型 */
|
|
51
63
|
export type ConfigSuggestionHandler = (suggestion: ConfigSuggestion) => void;
|
|
@@ -54,6 +66,7 @@ export declare class ConfigManager {
|
|
|
54
66
|
private readonly skillManager;
|
|
55
67
|
private readonly injectSystemMessage;
|
|
56
68
|
private readonly writeConfigFile?;
|
|
69
|
+
private readonly refreshBootstrapMemories?;
|
|
57
70
|
/** 配置建议回调(模式 3) */
|
|
58
71
|
private suggestionHandler;
|
|
59
72
|
/**
|
|
@@ -61,8 +74,11 @@ export declare class ConfigManager {
|
|
|
61
74
|
* @param skillManager - 技能管理器(运行时注入技能)
|
|
62
75
|
* @param injectSystemMessage - 注入 system 消息的回调(来自 AgentLoop)
|
|
63
76
|
* @param writeConfigFile - 写入配置文件的回调(来自 Agent,解耦 FileStore 依赖)
|
|
77
|
+
* @param refreshBootstrapMemories - 刷新 AgentLoop system prompt 中 bootstrap 段的回调
|
|
78
|
+
* 设定 CRUD(deleteRule/updateRule/deleteSkill)后调用,使 system prompt 中的
|
|
79
|
+
* rule/skill 段立即同步。由 Agent 在装配时注入(assembler.ts)。
|
|
64
80
|
*/
|
|
65
|
-
constructor(index: IMemoryStorage, skillManager: SkillManager, injectSystemMessage: (message: string) => void, writeConfigFile?: ((memory: Memory) => Promise<void>) | undefined);
|
|
81
|
+
constructor(index: IMemoryStorage, skillManager: SkillManager, injectSystemMessage: (message: string) => void, writeConfigFile?: ((memory: Memory) => Promise<void>) | undefined, refreshBootstrapMemories?: (() => void) | undefined);
|
|
66
82
|
/**
|
|
67
83
|
* 注册配置建议回调(模式 3)
|
|
68
84
|
*
|
|
@@ -121,5 +137,73 @@ export declare class ConfigManager {
|
|
|
121
137
|
* 注入后仅在当前会话生效,持久化需调用 config.confirmConfigSuggestion()。
|
|
122
138
|
*/
|
|
123
139
|
addSimpleSkill(name: string, content: string, keywords?: string[]): Promise<void>;
|
|
140
|
+
/**
|
|
141
|
+
* 删除规则(设定面板调用)
|
|
142
|
+
*
|
|
143
|
+
* 软删除 SQLite 中 source='rule' name=name 的记忆,
|
|
144
|
+
* 并刷新 AgentLoop system prompt 中的 bootstrap 段。
|
|
145
|
+
*
|
|
146
|
+
* 文件层删除由宿主层 configFileManager 处理(本方法不操作文件)。
|
|
147
|
+
* 删除后调用 refreshBootstrapMemories 回调,使 system prompt 立即同步。
|
|
148
|
+
*
|
|
149
|
+
* @param name 规则名(与 frontmatter name 字段一致)
|
|
150
|
+
* @returns true 删除成功;false 规则不存在
|
|
151
|
+
*/
|
|
152
|
+
deleteRule(name: string): boolean;
|
|
153
|
+
/**
|
|
154
|
+
* 更新规则内容(设定面板调用)
|
|
155
|
+
*
|
|
156
|
+
* upsert SQLite 中 source='rule' name=name 的记忆,
|
|
157
|
+
* 并刷新 AgentLoop system prompt 中的 bootstrap 段。
|
|
158
|
+
*
|
|
159
|
+
* 文件层更新由宿主层 configFileManager 处理(本方法不操作文件)。
|
|
160
|
+
* 与 addRule 的区别:addRule 是新增(追加 system 消息),
|
|
161
|
+
* updateRule 是覆盖更新(刷新 bootstrap 段,不追加 system 消息)。
|
|
162
|
+
*
|
|
163
|
+
* content 处理:调用方传入的是完整文件内容(含 frontmatter + body),
|
|
164
|
+
* 本方法用 parseFrontmatter 解析后只存 body.trim(),
|
|
165
|
+
* 与 FileStore.parseMemory(store.ts)保持一致——避免 system prompt bootstrap 段
|
|
166
|
+
* 含 frontmatter 噪音,且重启后 MemoryLoader 重新加载时内容一致。
|
|
167
|
+
*
|
|
168
|
+
* @param name 规则名
|
|
169
|
+
* @param content 新的规则文件内容(含 frontmatter + body)
|
|
170
|
+
*/
|
|
171
|
+
updateRule(name: string, content: string): void;
|
|
172
|
+
/**
|
|
173
|
+
* 列出所有规则(设定面板调用)
|
|
174
|
+
*
|
|
175
|
+
* @returns 所有 source='rule' 的活跃记忆(按 score 降序)
|
|
176
|
+
*/
|
|
177
|
+
listRules(): Memory[];
|
|
178
|
+
/**
|
|
179
|
+
* 删除技能(设定面板调用)
|
|
180
|
+
*
|
|
181
|
+
* 软删除 SQLite 中 source='skill' name=name 的记忆,
|
|
182
|
+
* 同步清理 SkillManager 内存缓存,
|
|
183
|
+
* 并刷新 AgentLoop system prompt 中的 bootstrap 段。
|
|
184
|
+
*
|
|
185
|
+
* 文件层删除由宿主层 configFileManager 处理(本方法不操作文件)。
|
|
186
|
+
*
|
|
187
|
+
* @param name 技能名
|
|
188
|
+
* @returns true 删除成功;false 技能不存在
|
|
189
|
+
*/
|
|
190
|
+
deleteSkill(name: string): boolean;
|
|
191
|
+
/**
|
|
192
|
+
* 列出所有技能(设定面板调用)
|
|
193
|
+
*
|
|
194
|
+
* @returns 所有 source='skill' 的活跃记忆(按 score 降序)
|
|
195
|
+
*/
|
|
196
|
+
listSkills(): Memory[];
|
|
197
|
+
/**
|
|
198
|
+
* 获取 bootstrap 记忆(仅 Rule,供 AgentLoop 刷新 system prompt)
|
|
199
|
+
*
|
|
200
|
+
* AgentLoop 的 system prompt 中包含 bootstrap 段(rule 记忆)。
|
|
201
|
+
* Skill 已迁移到 per-round matchAndInjectSkill 动态注入,不再放入 bootstrap。
|
|
202
|
+
* 设定 CRUD 后调用 refreshBootstrapMemories 回调,回调内部调用此方法
|
|
203
|
+
* 获取最新的 rule 记忆,传给 AgentLoop.refreshBootstrapMemories()。
|
|
204
|
+
*
|
|
205
|
+
* @returns rule 活跃记忆数组
|
|
206
|
+
*/
|
|
207
|
+
getBootstrapMemories(): Memory[];
|
|
124
208
|
}
|
|
125
209
|
//# sourceMappingURL=configManager.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"configManager.d.ts","sourceRoot":"","sources":["../../../src/agent/managers/configManager.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"configManager.d.ts","sourceRoot":"","sources":["../../../src/agent/managers/configManager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AACnE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAS5D;;;;;;;;;;GAUG;AACH,MAAM,WAAW,gBAAgB;IAC/B;;;;;OAKG;IACH,IAAI,EAAE,MAAM,CAAC;IACb,oCAAoC;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,wBAAwB;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,4BAA4B;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,yBAAyB;IACzB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;OAIG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;;;;OAMG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACnC;AAED,iBAAiB;AACjB,MAAM,MAAM,uBAAuB,GAAG,CAAC,UAAU,EAAE,gBAAgB,KAAK,IAAI,CAAC;AAI7E,qBAAa,aAAa;IActB,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,YAAY;IAC7B,OAAO,CAAC,QAAQ,CAAC,mBAAmB;IACpC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC;IACjC,OAAO,CAAC,QAAQ,CAAC,wBAAwB,CAAC;IAjB5C,mBAAmB;IACnB,OAAO,CAAC,iBAAiB,CAAwC;IAEjE;;;;;;;;OAQG;gBAEgB,KAAK,EAAE,cAAc,EACrB,YAAY,EAAE,YAAY,EAC1B,mBAAmB,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,EAC9C,eAAe,CAAC,GAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,aAAA,EACnD,wBAAwB,CAAC,GAAE,MAAM,IAAI,aAAA;IAKxD;;;;;OAKG;IACH,kBAAkB,CAAC,OAAO,EAAE,uBAAuB,GAAG,IAAI;IAI1D,oBAAoB;IACpB,IAAI,kBAAkB,IAAI,uBAAuB,GAAG,IAAI,CAEvD;IAED;;;;;;;;;OASG;IACG,uBAAuB,CAAC,UAAU,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IA6E1E;;;;;;OAMG;IACG,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAe5C;;;;;OAKG;IACG,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAgBjE;;;;;;;;;;;;;OAaG;IACG,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAuB7C;;;;;;OAMG;IACG,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,GAAE,MAAM,EAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAiB3F;;;;;;;;;;;OAWG;IACH,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAajC;;;;;;;;;;;;;;;;;OAiBG;IACH,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IAwB/C;;;;OAIG;IACH,SAAS,IAAI,MAAM,EAAE;IAIrB;;;;;;;;;;;OAWG;IACH,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAelC;;;;OAIG;IACH,UAAU,IAAI,MAAM,EAAE;IAItB;;;;;;;;;OASG;IACH,oBAAoB,IAAI,MAAM,EAAE;CAKjC"}
|
|
@@ -2,12 +2,15 @@ import { SOURCE_LABELS } from '../../memory/types.js';
|
|
|
2
2
|
import { configError, toError } from '../../utils/errors.js';
|
|
3
3
|
import { logger } from '../../logging/logger.js';
|
|
4
4
|
import { nowIso } from '../../utils/time.js';
|
|
5
|
+
// parseFrontmatter:与 FileStore.parseMemory 保持一致的 content 处理(只存 body,去掉 frontmatter)
|
|
6
|
+
import { parseFrontmatter } from '../../utils/frontmatter.js';
|
|
5
7
|
// ─── 类 ──────────────────────────────────────────────────
|
|
6
8
|
export class ConfigManager {
|
|
7
9
|
index;
|
|
8
10
|
skillManager;
|
|
9
11
|
injectSystemMessage;
|
|
10
12
|
writeConfigFile;
|
|
13
|
+
refreshBootstrapMemories;
|
|
11
14
|
/** 配置建议回调(模式 3) */
|
|
12
15
|
suggestionHandler = null;
|
|
13
16
|
/**
|
|
@@ -15,12 +18,16 @@ export class ConfigManager {
|
|
|
15
18
|
* @param skillManager - 技能管理器(运行时注入技能)
|
|
16
19
|
* @param injectSystemMessage - 注入 system 消息的回调(来自 AgentLoop)
|
|
17
20
|
* @param writeConfigFile - 写入配置文件的回调(来自 Agent,解耦 FileStore 依赖)
|
|
21
|
+
* @param refreshBootstrapMemories - 刷新 AgentLoop system prompt 中 bootstrap 段的回调
|
|
22
|
+
* 设定 CRUD(deleteRule/updateRule/deleteSkill)后调用,使 system prompt 中的
|
|
23
|
+
* rule/skill 段立即同步。由 Agent 在装配时注入(assembler.ts)。
|
|
18
24
|
*/
|
|
19
|
-
constructor(index, skillManager, injectSystemMessage, writeConfigFile) {
|
|
25
|
+
constructor(index, skillManager, injectSystemMessage, writeConfigFile, refreshBootstrapMemories) {
|
|
20
26
|
this.index = index;
|
|
21
27
|
this.skillManager = skillManager;
|
|
22
28
|
this.injectSystemMessage = injectSystemMessage;
|
|
23
29
|
this.writeConfigFile = writeConfigFile;
|
|
30
|
+
this.refreshBootstrapMemories = refreshBootstrapMemories;
|
|
24
31
|
}
|
|
25
32
|
// ─── 配置建议 ─────────────────────────────────────────
|
|
26
33
|
/**
|
|
@@ -67,7 +74,8 @@ export class ConfigManager {
|
|
|
67
74
|
]);
|
|
68
75
|
}
|
|
69
76
|
// 构造记忆对象并写入配置文件(真理源)
|
|
70
|
-
//
|
|
77
|
+
// 写入 SQLite index(运行时索引):配置文件是真理源,SQLite 是运行时检索索引
|
|
78
|
+
// 两层写入语义:配置文件保证重启后自动加载;SQLite 保证当前会话 search_memories 可检索
|
|
71
79
|
const now = nowIso();
|
|
72
80
|
const memory = {
|
|
73
81
|
id: `${source}:${suggestion.name}`,
|
|
@@ -77,6 +85,8 @@ export class ConfigManager {
|
|
|
77
85
|
createdAt: now,
|
|
78
86
|
accessedAt: now,
|
|
79
87
|
score: suggestion.confidence,
|
|
88
|
+
// metadata 透传到 FileStore.write,合并到 frontmatter(如 keywords/description)
|
|
89
|
+
metadata: suggestion.metadata,
|
|
80
90
|
};
|
|
81
91
|
// 包裹错误处理:磁盘满/权限不足/路径越界等异常转为友好的 configError
|
|
82
92
|
try {
|
|
@@ -90,6 +100,10 @@ export class ConfigManager {
|
|
|
90
100
|
'确认进程对配置目录有写权限',
|
|
91
101
|
], e);
|
|
92
102
|
}
|
|
103
|
+
// 同步写入 SQLite index:当前会话的 search_memories / recall 可立即检索到新创建的配置
|
|
104
|
+
// persona/skill 后续由 reloadConfig → SkillManager.reload / PersonaManager.reload 重新扫描覆盖,
|
|
105
|
+
// 但 rule 的 reloadConfig 是 no-op(agent.ts 内跳过),必须在此显式同步
|
|
106
|
+
this.index.upsert(memory);
|
|
93
107
|
// 如果是规则,立即注入到 AgentLoop(当前会话生效,重启后由配置文件自动加载)
|
|
94
108
|
if (suggestion.type === 'rule') {
|
|
95
109
|
const rulePrompt = `【项目规则】${suggestion.name}\n${suggestion.content}`;
|
|
@@ -190,5 +204,128 @@ export class ConfigManager {
|
|
|
190
204
|
};
|
|
191
205
|
await this.addSkill(memory);
|
|
192
206
|
}
|
|
207
|
+
// ─── 设定 CRUD(设定面板专用) ───────────────────────
|
|
208
|
+
/**
|
|
209
|
+
* 删除规则(设定面板调用)
|
|
210
|
+
*
|
|
211
|
+
* 软删除 SQLite 中 source='rule' name=name 的记忆,
|
|
212
|
+
* 并刷新 AgentLoop system prompt 中的 bootstrap 段。
|
|
213
|
+
*
|
|
214
|
+
* 文件层删除由宿主层 configFileManager 处理(本方法不操作文件)。
|
|
215
|
+
* 删除后调用 refreshBootstrapMemories 回调,使 system prompt 立即同步。
|
|
216
|
+
*
|
|
217
|
+
* @param name 规则名(与 frontmatter name 字段一致)
|
|
218
|
+
* @returns true 删除成功;false 规则不存在
|
|
219
|
+
*/
|
|
220
|
+
deleteRule(name) {
|
|
221
|
+
const id = `rule:${name}`;
|
|
222
|
+
const existing = this.index.getById(id);
|
|
223
|
+
if (!existing) {
|
|
224
|
+
logger.warn({ name, id }, '删除规则失败:规则不存在');
|
|
225
|
+
return false;
|
|
226
|
+
}
|
|
227
|
+
this.index.delete(id);
|
|
228
|
+
this.refreshBootstrapMemories?.();
|
|
229
|
+
logger.info({ name, id }, '规则已删除');
|
|
230
|
+
return true;
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* 更新规则内容(设定面板调用)
|
|
234
|
+
*
|
|
235
|
+
* upsert SQLite 中 source='rule' name=name 的记忆,
|
|
236
|
+
* 并刷新 AgentLoop system prompt 中的 bootstrap 段。
|
|
237
|
+
*
|
|
238
|
+
* 文件层更新由宿主层 configFileManager 处理(本方法不操作文件)。
|
|
239
|
+
* 与 addRule 的区别:addRule 是新增(追加 system 消息),
|
|
240
|
+
* updateRule 是覆盖更新(刷新 bootstrap 段,不追加 system 消息)。
|
|
241
|
+
*
|
|
242
|
+
* content 处理:调用方传入的是完整文件内容(含 frontmatter + body),
|
|
243
|
+
* 本方法用 parseFrontmatter 解析后只存 body.trim(),
|
|
244
|
+
* 与 FileStore.parseMemory(store.ts)保持一致——避免 system prompt bootstrap 段
|
|
245
|
+
* 含 frontmatter 噪音,且重启后 MemoryLoader 重新加载时内容一致。
|
|
246
|
+
*
|
|
247
|
+
* @param name 规则名
|
|
248
|
+
* @param content 新的规则文件内容(含 frontmatter + body)
|
|
249
|
+
*/
|
|
250
|
+
updateRule(name, content) {
|
|
251
|
+
const id = `rule:${name}`;
|
|
252
|
+
const existing = this.index.getById(id);
|
|
253
|
+
const now = nowIso();
|
|
254
|
+
// 与 FileStore.parseMemory 保持一致:只存 body(去掉 frontmatter),避免 system prompt 含噪音
|
|
255
|
+
const { body } = parseFrontmatter(content);
|
|
256
|
+
const memory = {
|
|
257
|
+
id,
|
|
258
|
+
content: body.trim(),
|
|
259
|
+
source: SOURCE_LABELS.RULE,
|
|
260
|
+
name,
|
|
261
|
+
createdAt: existing?.createdAt ?? now,
|
|
262
|
+
accessedAt: now,
|
|
263
|
+
score: existing?.score ?? 0.8,
|
|
264
|
+
};
|
|
265
|
+
// 若 existing 已软删除,需先 restore 再 upsert(避免"通过 upsert 复活软删除记忆"校验失败)
|
|
266
|
+
if (existing?.deletedAt) {
|
|
267
|
+
this.index.restore(id);
|
|
268
|
+
}
|
|
269
|
+
this.index.upsert(memory);
|
|
270
|
+
this.refreshBootstrapMemories?.();
|
|
271
|
+
logger.info({ name, id }, '规则已更新');
|
|
272
|
+
}
|
|
273
|
+
/**
|
|
274
|
+
* 列出所有规则(设定面板调用)
|
|
275
|
+
*
|
|
276
|
+
* @returns 所有 source='rule' 的活跃记忆(按 score 降序)
|
|
277
|
+
*/
|
|
278
|
+
listRules() {
|
|
279
|
+
return this.index.getBySource(SOURCE_LABELS.RULE);
|
|
280
|
+
}
|
|
281
|
+
/**
|
|
282
|
+
* 删除技能(设定面板调用)
|
|
283
|
+
*
|
|
284
|
+
* 软删除 SQLite 中 source='skill' name=name 的记忆,
|
|
285
|
+
* 同步清理 SkillManager 内存缓存,
|
|
286
|
+
* 并刷新 AgentLoop system prompt 中的 bootstrap 段。
|
|
287
|
+
*
|
|
288
|
+
* 文件层删除由宿主层 configFileManager 处理(本方法不操作文件)。
|
|
289
|
+
*
|
|
290
|
+
* @param name 技能名
|
|
291
|
+
* @returns true 删除成功;false 技能不存在
|
|
292
|
+
*/
|
|
293
|
+
deleteSkill(name) {
|
|
294
|
+
const id = `skill:${name}`;
|
|
295
|
+
const existing = this.index.getById(id);
|
|
296
|
+
if (!existing) {
|
|
297
|
+
logger.warn({ name, id }, '删除技能失败:技能不存在');
|
|
298
|
+
return false;
|
|
299
|
+
}
|
|
300
|
+
this.index.delete(id);
|
|
301
|
+
// 同步清理 SkillManager 内存缓存(deleteSkill 内部处理 name 不存在的情况)
|
|
302
|
+
this.skillManager.deleteSkill(name);
|
|
303
|
+
this.refreshBootstrapMemories?.();
|
|
304
|
+
logger.info({ name, id }, '技能已删除');
|
|
305
|
+
return true;
|
|
306
|
+
}
|
|
307
|
+
/**
|
|
308
|
+
* 列出所有技能(设定面板调用)
|
|
309
|
+
*
|
|
310
|
+
* @returns 所有 source='skill' 的活跃记忆(按 score 降序)
|
|
311
|
+
*/
|
|
312
|
+
listSkills() {
|
|
313
|
+
return this.index.getBySource(SOURCE_LABELS.SKILL);
|
|
314
|
+
}
|
|
315
|
+
/**
|
|
316
|
+
* 获取 bootstrap 记忆(仅 Rule,供 AgentLoop 刷新 system prompt)
|
|
317
|
+
*
|
|
318
|
+
* AgentLoop 的 system prompt 中包含 bootstrap 段(rule 记忆)。
|
|
319
|
+
* Skill 已迁移到 per-round matchAndInjectSkill 动态注入,不再放入 bootstrap。
|
|
320
|
+
* 设定 CRUD 后调用 refreshBootstrapMemories 回调,回调内部调用此方法
|
|
321
|
+
* 获取最新的 rule 记忆,传给 AgentLoop.refreshBootstrapMemories()。
|
|
322
|
+
*
|
|
323
|
+
* @returns rule 活跃记忆数组
|
|
324
|
+
*/
|
|
325
|
+
getBootstrapMemories() {
|
|
326
|
+
return [
|
|
327
|
+
...this.index.getBySource(SOURCE_LABELS.RULE),
|
|
328
|
+
];
|
|
329
|
+
}
|
|
193
330
|
}
|
|
194
331
|
//# sourceMappingURL=configManager.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"configManager.js","sourceRoot":"","sources":["../../../src/agent/managers/configManager.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"configManager.js","sourceRoot":"","sources":["../../../src/agent/managers/configManager.ts"],"names":[],"mappings":"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"}
|