@zooique/memora 4.0.0 → 5.0.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/CHANGELOG.md +165 -1743
- package/README.en.md +43 -36
- package/README.md +308 -303
- package/dist/agent/agent.d.ts +46 -82
- package/dist/agent/agent.d.ts.map +1 -1
- package/dist/agent/agent.js +153 -220
- package/dist/agent/agent.js.map +1 -1
- package/dist/agent/assembler.d.ts +3 -16
- package/dist/agent/assembler.d.ts.map +1 -1
- package/dist/agent/assembler.js +46 -35
- package/dist/agent/assembler.js.map +1 -1
- package/dist/agent/backgroundTasks.d.ts +8 -1
- package/dist/agent/backgroundTasks.d.ts.map +1 -1
- package/dist/agent/backgroundTasks.js +8 -1
- package/dist/agent/backgroundTasks.js.map +1 -1
- package/dist/agent/budget.d.ts +23 -5
- package/dist/agent/budget.d.ts.map +1 -1
- package/dist/agent/budget.js +8 -2
- package/dist/agent/budget.js.map +1 -1
- package/dist/agent/builtinToolHandlers.d.ts +27 -8
- package/dist/agent/builtinToolHandlers.d.ts.map +1 -1
- package/dist/agent/builtinToolHandlers.js +45 -9
- package/dist/agent/builtinToolHandlers.js.map +1 -1
- package/dist/agent/builtinTools.d.ts.map +1 -1
- package/dist/agent/builtinTools.js +4 -3
- package/dist/agent/builtinTools.js.map +1 -1
- package/dist/agent/constants.d.ts +0 -6
- package/dist/agent/constants.d.ts.map +1 -1
- package/dist/agent/constants.js +7 -8
- 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 +45 -3
- package/dist/agent/contextManager.js.map +1 -1
- package/dist/agent/contextPreparer.d.ts +1 -1
- package/dist/agent/contextPreparer.d.ts.map +1 -1
- package/dist/agent/contextPreparer.js +15 -10
- package/dist/agent/contextPreparer.js.map +1 -1
- package/dist/agent/guardRail.d.ts +1 -1
- package/dist/agent/guardRail.d.ts.map +1 -1
- package/dist/agent/guardRail.js +1 -1
- package/dist/agent/guardRail.js.map +1 -1
- package/dist/agent/loop.d.ts +46 -13
- package/dist/agent/loop.d.ts.map +1 -1
- package/dist/agent/loop.js +128 -25
- package/dist/agent/loop.js.map +1 -1
- package/dist/agent/managers/archiveCoordinator.d.ts +15 -3
- package/dist/agent/managers/archiveCoordinator.d.ts.map +1 -1
- package/dist/agent/managers/archiveCoordinator.js +13 -7
- package/dist/agent/managers/archiveCoordinator.js.map +1 -1
- package/dist/agent/managers/chatLockManager.d.ts +3 -9
- package/dist/agent/managers/chatLockManager.d.ts.map +1 -1
- package/dist/agent/managers/chatLockManager.js +7 -25
- package/dist/agent/managers/chatLockManager.js.map +1 -1
- package/dist/agent/managers/llmCaller.d.ts.map +1 -1
- package/dist/agent/managers/llmCaller.js +27 -1
- package/dist/agent/managers/llmCaller.js.map +1 -1
- package/dist/agent/managers/memoryInspector.d.ts +12 -7
- package/dist/agent/managers/memoryInspector.d.ts.map +1 -1
- package/dist/agent/managers/memoryInspector.js +32 -19
- package/dist/agent/managers/memoryInspector.js.map +1 -1
- package/dist/agent/managers/roundSummaryGenerator.d.ts +3 -1
- package/dist/agent/managers/roundSummaryGenerator.d.ts.map +1 -1
- package/dist/agent/managers/roundSummaryGenerator.js +14 -4
- package/dist/agent/managers/roundSummaryGenerator.js.map +1 -1
- package/dist/agent/managers/sessionArchiver.d.ts +20 -6
- package/dist/agent/managers/sessionArchiver.d.ts.map +1 -1
- package/dist/agent/managers/sessionArchiver.js +19 -5
- package/dist/agent/managers/sessionArchiver.js.map +1 -1
- package/dist/agent/managers/sessionManager.d.ts +21 -88
- package/dist/agent/managers/sessionManager.d.ts.map +1 -1
- package/dist/agent/managers/sessionManager.js +77 -278
- package/dist/agent/managers/sessionManager.js.map +1 -1
- package/dist/agent/seed/orchestrator.d.ts.map +1 -1
- package/dist/agent/seed/orchestrator.js +3 -3
- package/dist/agent/seed/orchestrator.js.map +1 -1
- package/dist/agent/seed/prepare.d.ts.map +1 -1
- package/dist/agent/seed/prepare.js +9 -4
- package/dist/agent/seed/prepare.js.map +1 -1
- package/dist/agent/seed/types.d.ts +11 -4
- package/dist/agent/seed/types.d.ts.map +1 -1
- package/dist/agent/seed/types.js +2 -2
- package/dist/agent/toolExecutor.d.ts +51 -6
- package/dist/agent/toolExecutor.d.ts.map +1 -1
- package/dist/agent/toolExecutor.js +74 -9
- package/dist/agent/toolExecutor.js.map +1 -1
- package/dist/agent/toolResultCache.js +1 -1
- package/dist/agent/toolRunner.d.ts +4 -2
- package/dist/agent/toolRunner.d.ts.map +1 -1
- package/dist/agent/toolRunner.js +7 -4
- package/dist/agent/toolRunner.js.map +1 -1
- package/dist/agent/types.d.ts +8 -25
- package/dist/agent/types.d.ts.map +1 -1
- package/dist/index.d.ts +9 -20
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +35 -32
- package/dist/index.js.map +1 -1
- package/dist/logging/logger.d.ts +4 -1
- package/dist/logging/logger.d.ts.map +1 -1
- package/dist/logging/logger.js +5 -2
- package/dist/logging/logger.js.map +1 -1
- package/dist/memory/gcService.d.ts.map +1 -1
- package/dist/memory/gcService.js +3 -5
- package/dist/memory/gcService.js.map +1 -1
- package/dist/memory/inMemorySessionStore.d.ts +2 -2
- package/dist/memory/inMemorySessionStore.js +2 -2
- package/dist/memory/inMemoryStorage.d.ts +4 -3
- package/dist/memory/inMemoryStorage.d.ts.map +1 -1
- package/dist/memory/inMemoryStorage.js +2 -2
- package/dist/memory/inMemoryStorage.js.map +1 -1
- package/dist/memory/nodeSqliteStorage.d.ts +17 -0
- package/dist/memory/nodeSqliteStorage.d.ts.map +1 -0
- package/dist/memory/nodeSqliteStorage.js +393 -0
- package/dist/memory/nodeSqliteStorage.js.map +1 -0
- package/dist/memory/projectManager.d.ts +10 -20
- package/dist/memory/projectManager.d.ts.map +1 -1
- package/dist/memory/projectManager.js +27 -41
- package/dist/memory/projectManager.js.map +1 -1
- package/dist/memory/roundStore.d.ts +76 -1
- package/dist/memory/roundStore.d.ts.map +1 -1
- package/dist/memory/roundStore.js.map +1 -1
- package/dist/memory/roundSummaryLookup.d.ts +26 -0
- package/dist/memory/roundSummaryLookup.d.ts.map +1 -0
- package/dist/memory/roundSummaryLookup.js +19 -0
- package/dist/memory/roundSummaryLookup.js.map +1 -0
- package/dist/memory/sessionStore.d.ts +19 -2
- package/dist/memory/sessionStore.d.ts.map +1 -1
- package/dist/memory/sessionStore.js.map +1 -1
- package/dist/memory/sourceValidation.d.ts +2 -13
- package/dist/memory/sourceValidation.d.ts.map +1 -1
- package/dist/memory/sourceValidation.js +5 -16
- package/dist/memory/sourceValidation.js.map +1 -1
- package/dist/memory/storageInterface.d.ts +26 -16
- package/dist/memory/storageInterface.d.ts.map +1 -1
- package/dist/memory/supersedeResolve.d.ts +39 -0
- package/dist/memory/supersedeResolve.d.ts.map +1 -0
- package/dist/memory/supersedeResolve.js +16 -0
- package/dist/memory/supersedeResolve.js.map +1 -0
- package/dist/memory/types.d.ts +3 -2
- package/dist/memory/types.d.ts.map +1 -1
- package/dist/memory/types.js +2 -1
- package/dist/memory/types.js.map +1 -1
- package/dist/role-pack/rolePackManager.d.ts +33 -24
- package/dist/role-pack/rolePackManager.d.ts.map +1 -1
- package/dist/role-pack/rolePackManager.js +48 -42
- package/dist/role-pack/rolePackManager.js.map +1 -1
- package/dist/role-pack/strategyKeys.d.ts +8 -0
- package/dist/role-pack/strategyKeys.d.ts.map +1 -1
- package/dist/role-pack/strategyKeys.js +10 -0
- package/dist/role-pack/strategyKeys.js.map +1 -1
- package/dist/role-pack/strategyResolver.d.ts +6 -1
- package/dist/role-pack/strategyResolver.d.ts.map +1 -1
- package/dist/role-pack/strategyResolver.js +20 -2
- package/dist/role-pack/strategyResolver.js.map +1 -1
- package/dist/role-pack/types.d.ts +5 -1
- package/dist/role-pack/types.d.ts.map +1 -1
- package/dist/security/pathGuard.d.ts +1 -1
- package/dist/security/pathGuard.d.ts.map +1 -1
- package/dist/security/pathGuard.js +1 -1
- package/dist/security/pathGuard.js.map +1 -1
- package/dist/utils/backgroundTask.d.ts +56 -34
- package/dist/utils/backgroundTask.d.ts.map +1 -1
- package/dist/utils/backgroundTask.js +130 -99
- package/dist/utils/backgroundTask.js.map +1 -1
- package/dist/utils/errors.d.ts +3 -2
- package/dist/utils/errors.d.ts.map +1 -1
- package/dist/utils/errors.js +3 -2
- package/dist/utils/errors.js.map +1 -1
- package/dist/utils/eventEmitter.d.ts +20 -22
- package/dist/utils/eventEmitter.d.ts.map +1 -1
- package/dist/utils/eventEmitter.js +0 -3
- package/dist/utils/eventEmitter.js.map +1 -1
- package/dist/utils/time.d.ts +3 -3
- package/dist/utils/time.d.ts.map +1 -1
- package/dist/utils/time.js +3 -3
- package/dist/utils/time.js.map +1 -1
- package/dist/utils/toError.d.ts +1 -1
- package/dist/utils/toError.js +1 -1
- package/dist/web-fetch/loginWall.d.ts +39 -0
- package/dist/web-fetch/loginWall.d.ts.map +1 -0
- package/dist/web-fetch/loginWall.js +78 -0
- package/dist/web-fetch/loginWall.js.map +1 -0
- package/dist/web-fetch/types.d.ts +8 -0
- package/dist/web-fetch/types.d.ts.map +1 -1
- package/dist/web-fetch/webFetchProvider.d.ts.map +1 -1
- package/dist/web-fetch/webFetchProvider.js +3 -1
- package/dist/web-fetch/webFetchProvider.js.map +1 -1
- package/dist/web-search/fetchWebSearchProvider.js +28 -23
- package/dist/web-search/fetchWebSearchProvider.js.map +1 -1
- package/docs/architecture/role-pack-authoring-guide.md +3 -1
- package/docs/architecture/role-pack-spec.md +2 -1
- package/docs/memora-api-reference.md +1349 -1276
- package/docs/memora-/345/215/207/347/272/247/346/214/207/345/215/227-4.x-/345/210/260-5.0.0.md +385 -0
- package/docs/memora-/346/216/245/345/205/245/346/214/207/345/215/227.md +87 -49
- package/docs/role-pack-/345/274/200/346/224/276/351/224/256/346/214/207/345/215/227.md +148 -148
- package/package.json +9 -4
- package/role-packs/README.md +41 -40
- package/role-packs/memora/345/212/251/346/211/213/rules.md +4 -4
- package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/manifest.json +1 -0
- package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/persona.md +46 -46
- package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/rules.md +16 -16
- package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/emotion-wave.md +46 -46
- package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/foreshadow.md +29 -29
- package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/outline-expand.md +73 -48
- package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/project-init/scripts/init-novel-project.mjs +445 -441
- package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/story-bible.md +62 -62
- package/role-packs//347/231/275/350/257/235/346/226/271/346/241/210/350/256/276/350/256/241/345/270/210/manifest.json +1 -0
- package/dist/agent/managers/dedupManager.d.ts +0 -85
- package/dist/agent/managers/dedupManager.d.ts.map +0 -1
- package/dist/agent/managers/dedupManager.js +0 -248
- package/dist/agent/managers/dedupManager.js.map +0 -1
- package/dist/agent/managers/goalConsistencyChecker.d.ts +0 -42
- package/dist/agent/managers/goalConsistencyChecker.d.ts.map +0 -1
- package/dist/agent/managers/goalConsistencyChecker.js +0 -178
- package/dist/agent/managers/goalConsistencyChecker.js.map +0 -1
- package/dist/agent/managers/llmJudgeHelper.d.ts +0 -21
- package/dist/agent/managers/llmJudgeHelper.d.ts.map +0 -1
- package/dist/agent/managers/llmJudgeHelper.js +0 -32
- package/dist/agent/managers/llmJudgeHelper.js.map +0 -1
- package/dist/agent/managers/memoryAdvisor.d.ts +0 -105
- package/dist/agent/managers/memoryAdvisor.d.ts.map +0 -1
- package/dist/agent/managers/memoryAdvisor.js +0 -322
- package/dist/agent/managers/memoryAdvisor.js.map +0 -1
- package/dist/agent/managers/memoryGovernance.d.ts +0 -24
- package/dist/agent/managers/memoryGovernance.d.ts.map +0 -1
- package/dist/agent/managers/memoryGovernance.js +0 -46
- package/dist/agent/managers/memoryGovernance.js.map +0 -1
- package/dist/memory/governance.d.ts +0 -17
- package/dist/memory/governance.d.ts.map +0 -1
- package/dist/memory/governance.js +0 -17
- package/dist/memory/governance.js.map +0 -1
- package/dist/memory/projectRegistry.d.ts +0 -47
- package/dist/memory/projectRegistry.d.ts.map +0 -1
- package/dist/memory/projectRegistry.js +0 -151
- package/dist/memory/projectRegistry.js.map +0 -1
- package/dist/utils/recallDefaults.d.ts +0 -16
- package/dist/utils/recallDefaults.d.ts.map +0 -1
- package/dist/utils/recallDefaults.js +0 -16
- package/dist/utils/recallDefaults.js.map +0 -1
|
@@ -1,62 +1,62 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: story-bible
|
|
3
|
-
description: 设定圣经:长篇一致性档案——人物/世界观/时间线/伏笔统一存档,AI 协作刚需
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# story-bible:设定圣经
|
|
7
|
-
|
|
8
|
-
## 用途
|
|
9
|
-
|
|
10
|
-
长篇小说的**一致性总账**。写 50 章后,前文的设定/人物状态/伏笔必须还能查得到、对得上——尤其 AI 协作时,圣经是"前文"的唯一权威来源,不靠模型记忆。
|
|
11
|
-
|
|
12
|
-
## 四卷圣经
|
|
13
|
-
|
|
14
|
-
### 卷 1:人物档案
|
|
15
|
-
|
|
16
|
-
```markdown
|
|
17
|
-
<人物名>
|
|
18
|
-
- 目标(当前):
|
|
19
|
-
- 动机(深层):
|
|
20
|
-
- 压力下的反应方式:
|
|
21
|
-
- 关系:<谁>(连接/张力/弧线)
|
|
22
|
-
- 状态变化:<章节> 发生了什么 → 状态如何变
|
|
23
|
-
```
|
|
24
|
-
|
|
25
|
-
### 卷 2:世界观设定
|
|
26
|
-
|
|
27
|
-
```markdown
|
|
28
|
-
- 时代 / 期限 / 地点 / 冲突层面(四维)
|
|
29
|
-
- 规则清单:每条规则 + 它产生的冲突
|
|
30
|
-
- 修订记录:何时改了什么(防止设定漂移后读者对不上)
|
|
31
|
-
```
|
|
32
|
-
|
|
33
|
-
### 卷 3:时间线
|
|
34
|
-
|
|
35
|
-
```markdown
|
|
36
|
-
| 章节 | 关键事件 | 人物状态 | 伏笔 |
|
|
37
|
-
|------|---------|---------|------|
|
|
38
|
-
```
|
|
39
|
-
|
|
40
|
-
### 卷 4:伏笔台账
|
|
41
|
-
|
|
42
|
-
```markdown
|
|
43
|
-
| 伏笔 | 埋设点(事件/场景) | 计划回收点(事件/场景) | 当前状态(待回收/已回收/悬置) |
|
|
44
|
-
|------|---------|------------|------------------------------|
|
|
45
|
-
```
|
|
46
|
-
|
|
47
|
-
未落正文前只标事件不标章,成文后回填章号(见 rules.md「纲是骨架、章是装箱」)。
|
|
48
|
-
|
|
49
|
-
## AI 协作纪律
|
|
50
|
-
|
|
51
|
-
1. **动笔前先读圣经**(read_file)——不靠对话记忆,承接前文以圣经为准;
|
|
52
|
-
2. **新增设定先入册再写**——正文写到新设定,先补进对应卷再落笔;
|
|
53
|
-
3. **矛盾以圣经为准**——正文与圣经冲突时,正文是错的,改正文;
|
|
54
|
-
4. **每 5 章复盘一次**:时间线/伏笔台账对一遍,防漂移。
|
|
55
|
-
|
|
56
|
-
## 校验清单
|
|
57
|
-
|
|
58
|
-
- [ ] 四卷齐全且最新?
|
|
59
|
-
- [ ] 新增设定已入册?
|
|
60
|
-
- [ ] 伏笔台账无遗漏(埋了没登记)?
|
|
61
|
-
- [ ] 时间线无矛盾?
|
|
62
|
-
- [ ] 动笔前读了圣经?
|
|
1
|
+
---
|
|
2
|
+
name: story-bible
|
|
3
|
+
description: 设定圣经:长篇一致性档案——人物/世界观/时间线/伏笔统一存档,AI 协作刚需
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# story-bible:设定圣经
|
|
7
|
+
|
|
8
|
+
## 用途
|
|
9
|
+
|
|
10
|
+
长篇小说的**一致性总账**。写 50 章后,前文的设定/人物状态/伏笔必须还能查得到、对得上——尤其 AI 协作时,圣经是"前文"的唯一权威来源,不靠模型记忆。
|
|
11
|
+
|
|
12
|
+
## 四卷圣经
|
|
13
|
+
|
|
14
|
+
### 卷 1:人物档案
|
|
15
|
+
|
|
16
|
+
```markdown
|
|
17
|
+
<人物名>
|
|
18
|
+
- 目标(当前):
|
|
19
|
+
- 动机(深层):
|
|
20
|
+
- 压力下的反应方式:
|
|
21
|
+
- 关系:<谁>(连接/张力/弧线)
|
|
22
|
+
- 状态变化:<章节> 发生了什么 → 状态如何变
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
### 卷 2:世界观设定
|
|
26
|
+
|
|
27
|
+
```markdown
|
|
28
|
+
- 时代 / 期限 / 地点 / 冲突层面(四维)
|
|
29
|
+
- 规则清单:每条规则 + 它产生的冲突
|
|
30
|
+
- 修订记录:何时改了什么(防止设定漂移后读者对不上)
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
### 卷 3:时间线
|
|
34
|
+
|
|
35
|
+
```markdown
|
|
36
|
+
| 章节 | 关键事件 | 人物状态 | 伏笔 |
|
|
37
|
+
|------|---------|---------|------|
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
### 卷 4:伏笔台账
|
|
41
|
+
|
|
42
|
+
```markdown
|
|
43
|
+
| 伏笔 | 埋设点(事件/场景) | 计划回收点(事件/场景) | 当前状态(待回收/已回收/悬置) |
|
|
44
|
+
|------|---------|------------|------------------------------|
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
未落正文前只标事件不标章,成文后回填章号(见 rules.md「纲是骨架、章是装箱」)。
|
|
48
|
+
|
|
49
|
+
## AI 协作纪律
|
|
50
|
+
|
|
51
|
+
1. **动笔前先读圣经**(read_file)——不靠对话记忆,承接前文以圣经为准;
|
|
52
|
+
2. **新增设定先入册再写**——正文写到新设定,先补进对应卷再落笔;
|
|
53
|
+
3. **矛盾以圣经为准**——正文与圣经冲突时,正文是错的,改正文;
|
|
54
|
+
4. **每 5 章复盘一次**:时间线/伏笔台账对一遍,防漂移。
|
|
55
|
+
|
|
56
|
+
## 校验清单
|
|
57
|
+
|
|
58
|
+
- [ ] 四卷齐全且最新?
|
|
59
|
+
- [ ] 新增设定已入册?
|
|
60
|
+
- [ ] 伏笔台账无遗漏(埋了没登记)?
|
|
61
|
+
- [ ] 时间线无矛盾?
|
|
62
|
+
- [ ] 动笔前读了圣经?
|
|
@@ -1,85 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* 记忆治理管理者(从 MemoryInspector 拆分,专责异步 LLM 语义去重)。
|
|
3
|
-
* 职责分离:MemoryInspector 纯存储读写,DedupManager 异步 LLM 治理。
|
|
4
|
-
* 设计原则:未注入 provider 时静默降级返回报告不抛错;不物理删除仅软删重复方保留可恢复性;不阻塞主对话热路径。
|
|
5
|
-
*/
|
|
6
|
-
import type { Memory } from '../../memory/types.js';
|
|
7
|
-
import type { IMemoryStorage } from '../../memory/storageInterface.js';
|
|
8
|
-
import type { LlmProvider } from '../../llm/provider.js';
|
|
9
|
-
/** 名称高度相似的候选记忆对(待 LLM 判断语义等价性) */
|
|
10
|
-
export interface DedupPair {
|
|
11
|
-
/** 记忆 A(保留候选) */
|
|
12
|
-
a: Memory;
|
|
13
|
-
/** 记忆 B(重复方,软删候选) */
|
|
14
|
-
b: Memory;
|
|
15
|
-
/** 名称归一化相似度(0-1,越小越相似) */
|
|
16
|
-
nameSimilarity: number;
|
|
17
|
-
}
|
|
18
|
-
/** LLM 对单对记忆的语义等价判断结果 */
|
|
19
|
-
export interface DedupVerdict {
|
|
20
|
-
/** 是否语义等价(true → 软删重复方) */
|
|
21
|
-
isDuplicate: boolean;
|
|
22
|
-
/** 合并后的内容(isDuplicate=true 时提供,保留更完整信息) */
|
|
23
|
-
mergedContent?: string;
|
|
24
|
-
/** LLM 判断理由(便于审计调试) */
|
|
25
|
-
reason: string;
|
|
26
|
-
}
|
|
27
|
-
/** 降级记忆审计详情(供 UI 展示"为什么降级" + 合并后内容) */
|
|
28
|
-
export interface DedupVerdictSummary {
|
|
29
|
-
/** 被降级记忆 ID(与 demotedIds 一一对应) */
|
|
30
|
-
demotedId: string;
|
|
31
|
-
/** LLM 判断理由(便于审计降级是否合理) */
|
|
32
|
-
reason: string;
|
|
33
|
-
/** 合并后完整内容(便于验证合并质量;缺失时渲染器负责截断展示) */
|
|
34
|
-
mergedContent?: string;
|
|
35
|
-
}
|
|
36
|
-
/** 语义去重报告(deduplicateMemories 返回值) */
|
|
37
|
-
export interface DedupReport {
|
|
38
|
-
/** 扫描的候选记忆总数 */
|
|
39
|
-
scannedCount: number;
|
|
40
|
-
/** 发现的名称相似对数 */
|
|
41
|
-
pairCount: number;
|
|
42
|
-
/** LLM 判定为语义等价并执行降级的对数 */
|
|
43
|
-
deduplicatedCount: number;
|
|
44
|
-
/** 被降级记忆 ID 列表(未物理删除) */
|
|
45
|
-
demotedIds: string[];
|
|
46
|
-
/** 降级审计详情(与 demotedIds 一一对应) */
|
|
47
|
-
verdicts?: DedupVerdictSummary[];
|
|
48
|
-
/** 跳过原因(LLM 不可用 / 无候选对) */
|
|
49
|
-
skippedReason?: string;
|
|
50
|
-
}
|
|
51
|
-
/** 语义去重管理器:扫描名称高度相似的记忆对,LLM 判断语义等价性,降级低分记忆。assembler 组合根创建,由 Agent 透传调用。 */
|
|
52
|
-
export declare class DedupManager {
|
|
53
|
-
private readonly index;
|
|
54
|
-
/** 去重完成回调(宿主据此发射事件通知用户) */
|
|
55
|
-
private readonly onCompleted?;
|
|
56
|
-
/** 后台 LLM Provider(可选,未注入时降级跳过) */
|
|
57
|
-
private readonly backgroundProvider;
|
|
58
|
-
/** 治理源列表(默认 GOVERNANCE_SOURCES;空治理源时去重空转,测试可显式注入) */
|
|
59
|
-
private readonly sources;
|
|
60
|
-
constructor(index: IMemoryStorage, backgroundProvider?: LlmProvider | null,
|
|
61
|
-
/** 去重完成回调(宿主据此发射事件通知用户) */
|
|
62
|
-
onCompleted?: ((report: DedupReport) => void) | undefined, sources?: readonly string[]);
|
|
63
|
-
/**
|
|
64
|
-
* 语义去重:加载候选(上限 50)→ 名称相似度筛选对(上限 10)→ LLM 判断语义等价 → 等价则软删重复方。
|
|
65
|
-
* 安全设计:不物理删除仅软删(可恢复);LLM 失败降级不阻塞;provider 未注入静默返回 skippedReason。
|
|
66
|
-
*/
|
|
67
|
-
deduplicateMemories(signal?: AbortSignal): Promise<DedupReport>;
|
|
68
|
-
/**
|
|
69
|
-
* 筛选名称高度相似的候选记忆对。判定:归一化 Levenshtein ≤0.3 或一方包含另一方。
|
|
70
|
-
* 已配对的记忆不再参与后续配对(避免三元组产生多对);按相似度升序(越相似越优先)取前 10 对。
|
|
71
|
-
*/
|
|
72
|
-
private findNameOverlapPairs;
|
|
73
|
-
/** 名称归一化相似度(0-1,越小越相似)。规则:包含关系=0;否则 Levenshtein 距离 / max(len)。 */
|
|
74
|
-
private static computeNameSimilarity;
|
|
75
|
-
/**
|
|
76
|
-
* 调用 LLM 判断单对记忆语义等价:结构化 JSON 输出(isDuplicate+mergedContent+reason)。
|
|
77
|
-
* 流式累积/解析/异常封装委托 llmJudgeHelper.judgeWithLlm;失败抛 MemoraError 由调用方捕获跳过。
|
|
78
|
-
*/
|
|
79
|
-
private judgeDuplicate;
|
|
80
|
-
/** 软删重复记忆(不物理删除保留可恢复;合并内容由 keepMerged 单独写回 a)。重复方以 delete 进入回收站。 */
|
|
81
|
-
private demoteMemory;
|
|
82
|
-
/** 将合并内容写回保留方 a:保持 id/source/name/createdAt 不变,仅刷新 content + accessedAt */
|
|
83
|
-
private keepMerged;
|
|
84
|
-
}
|
|
85
|
-
//# sourceMappingURL=dedupManager.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"dedupManager.d.ts","sourceRoot":"","sources":["../../../src/agent/managers/dedupManager.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AACnE,OAAO,KAAK,EAAE,WAAW,EAAW,MAAM,mBAAmB,CAAC;AAyB9D,kCAAkC;AAClC,MAAM,WAAW,SAAS;IACxB,iBAAiB;IACjB,CAAC,EAAE,MAAM,CAAC;IACV,qBAAqB;IACrB,CAAC,EAAE,MAAM,CAAC;IACV,0BAA0B;IAC1B,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,yBAAyB;AACzB,MAAM,WAAW,YAAY;IAC3B,2BAA2B;IAC3B,WAAW,EAAE,OAAO,CAAC;IACrB,2CAA2C;IAC3C,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,uBAAuB;IACvB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,uCAAuC;AACvC,MAAM,WAAW,mBAAmB;IAClC,kCAAkC;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,2BAA2B;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,qCAAqC;IACrC,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,sCAAsC;AACtC,MAAM,WAAW,WAAW;IAC1B,gBAAgB;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,0BAA0B;IAC1B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,yBAAyB;IACzB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,gCAAgC;IAChC,QAAQ,CAAC,EAAE,mBAAmB,EAAE,CAAC;IACjC,2BAA2B;IAC3B,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAID,4EAA4E;AAC5E,qBAAa,YAAY;IAOrB,OAAO,CAAC,QAAQ,CAAC,KAAK;IAEtB,2BAA2B;IAC3B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC;IAT/B,mCAAmC;IACnC,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAqB;IACxD,qDAAqD;IACrD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAoB;gBAGzB,KAAK,EAAE,cAAc,EACtC,kBAAkB,GAAE,WAAW,GAAG,IAAW;IAC7C,2BAA2B;IACV,WAAW,CAAC,GAAE,CAAC,MAAM,EAAE,WAAW,KAAK,IAAI,aAAA,EAC5D,OAAO,GAAE,SAAS,MAAM,EAAuB;IAMjD;;;OAGG;IACG,mBAAmB,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC;IAmFrE;;;OAGG;IACH,OAAO,CAAC,oBAAoB;IAgC5B,kEAAkE;IAClE,OAAO,CAAC,MAAM,CAAC,qBAAqB;IAkBpC;;;OAGG;YACW,cAAc;IAoB5B,oEAAoE;IACpE,OAAO,CAAC,YAAY;IAIpB,2EAA2E;IAC3E,OAAO,CAAC,UAAU;CASnB"}
|
|
@@ -1,248 +0,0 @@
|
|
|
1
|
-
// LLM judge 高阶函数(流式累积 + parseLlmJson + configError 封装)
|
|
2
|
-
import { judgeWithLlm } from '../../agent/managers/llmJudgeHelper.js';
|
|
3
|
-
// LLM 治理共享常量(统一由 governance.ts 维护)
|
|
4
|
-
import { GOVERNANCE_SOURCES } from '../../memory/governance.js';
|
|
5
|
-
import { levenshtein } from '../../memory/sourceValidation.js';
|
|
6
|
-
import { byAccessedDesc } from '../../utils/array.js';
|
|
7
|
-
import { nowIso } from '../../utils/time.js';
|
|
8
|
-
import { truncate } from '../../utils/strings.js';
|
|
9
|
-
import { logger } from '../../logging/logger.js';
|
|
10
|
-
// ─── L1 语义去重常量 ────────────────────────────────────
|
|
11
|
-
/** 单次去重扫描候选条数上限 */
|
|
12
|
-
const DEDUP_CANDIDATE_LIMIT = 50;
|
|
13
|
-
/** 单次 LLM 判断候选对数上限(每对约 200 tokens) */
|
|
14
|
-
const DEDUP_PAIR_LIMIT = 10;
|
|
15
|
-
/** 名称相似度阈值(归一化 Levenshtein 距离 ≤ 此值视为高度相似进入 LLM 判断) */
|
|
16
|
-
const DEDUP_NAME_SIMILARITY_THRESHOLD = 0.3;
|
|
17
|
-
/** LLM 去重判断超时(ms) */
|
|
18
|
-
const DEDUP_TIMEOUT_MS = 15_000;
|
|
19
|
-
/** 候选内容预览长度(送入 LLM 前截断,控制 token) */
|
|
20
|
-
const DEDUP_CONTENT_PREVIEW_LEN = 200;
|
|
21
|
-
// ─── 类 ──────────────────────────────────────────────────
|
|
22
|
-
/** 语义去重管理器:扫描名称高度相似的记忆对,LLM 判断语义等价性,降级低分记忆。assembler 组合根创建,由 Agent 透传调用。 */
|
|
23
|
-
export class DedupManager {
|
|
24
|
-
index;
|
|
25
|
-
onCompleted;
|
|
26
|
-
/** 后台 LLM Provider(可选,未注入时降级跳过) */
|
|
27
|
-
backgroundProvider;
|
|
28
|
-
/** 治理源列表(默认 GOVERNANCE_SOURCES;空治理源时去重空转,测试可显式注入) */
|
|
29
|
-
sources;
|
|
30
|
-
constructor(index, backgroundProvider = null,
|
|
31
|
-
/** 去重完成回调(宿主据此发射事件通知用户) */
|
|
32
|
-
onCompleted, sources = GOVERNANCE_SOURCES) {
|
|
33
|
-
this.index = index;
|
|
34
|
-
this.onCompleted = onCompleted;
|
|
35
|
-
this.backgroundProvider = backgroundProvider;
|
|
36
|
-
this.sources = sources;
|
|
37
|
-
}
|
|
38
|
-
/**
|
|
39
|
-
* 语义去重:加载候选(上限 50)→ 名称相似度筛选对(上限 10)→ LLM 判断语义等价 → 等价则软删重复方。
|
|
40
|
-
* 安全设计:不物理删除仅软删(可恢复);LLM 失败降级不阻塞;provider 未注入静默返回 skippedReason。
|
|
41
|
-
*/
|
|
42
|
-
async deduplicateMemories(signal) {
|
|
43
|
-
// provider 未注入时静默降级
|
|
44
|
-
if (!this.backgroundProvider) {
|
|
45
|
-
return {
|
|
46
|
-
scannedCount: 0,
|
|
47
|
-
pairCount: 0,
|
|
48
|
-
deduplicatedCount: 0,
|
|
49
|
-
demotedIds: [],
|
|
50
|
-
skippedReason: 'backgroundProvider 未注入',
|
|
51
|
-
};
|
|
52
|
-
}
|
|
53
|
-
const candidates = [];
|
|
54
|
-
for (const source of this.sources) {
|
|
55
|
-
const memories = this.index.getBySource(source);
|
|
56
|
-
candidates.push(...memories);
|
|
57
|
-
}
|
|
58
|
-
// 按 accessedAt 降序(最近使用优先,score 退役后无分可排序)
|
|
59
|
-
candidates.sort(byAccessedDesc);
|
|
60
|
-
const limited = candidates.slice(0, DEDUP_CANDIDATE_LIMIT);
|
|
61
|
-
const pairs = this.findNameOverlapPairs(limited);
|
|
62
|
-
if (pairs.length === 0) {
|
|
63
|
-
return {
|
|
64
|
-
scannedCount: limited.length,
|
|
65
|
-
pairCount: 0,
|
|
66
|
-
deduplicatedCount: 0,
|
|
67
|
-
demotedIds: [],
|
|
68
|
-
skippedReason: '未发现名称相似的记忆对',
|
|
69
|
-
};
|
|
70
|
-
}
|
|
71
|
-
const demotedIds = [];
|
|
72
|
-
const verdicts = [];
|
|
73
|
-
let deduplicatedCount = 0;
|
|
74
|
-
for (const pair of pairs) {
|
|
75
|
-
try {
|
|
76
|
-
const verdict = await this.judgeDuplicate(pair, signal);
|
|
77
|
-
if (verdict.isDuplicate) {
|
|
78
|
-
// 先写合并内容再降级 b:合并写入失败时不破坏 b 原始状态(原子性)
|
|
79
|
-
if (verdict.mergedContent) {
|
|
80
|
-
this.keepMerged(pair.a, verdict.mergedContent);
|
|
81
|
-
}
|
|
82
|
-
// 重复方软删(score 退役后无降级语义,soft-delete 保留可恢复)
|
|
83
|
-
this.demoteMemory(pair.b);
|
|
84
|
-
demotedIds.push(pair.b.id);
|
|
85
|
-
// 收集审计详情(供 UI 展示"为什么降级"和"合并后保留了什么")
|
|
86
|
-
verdicts.push({
|
|
87
|
-
demotedId: pair.b.id,
|
|
88
|
-
reason: verdict.reason,
|
|
89
|
-
mergedContent: verdict.mergedContent,
|
|
90
|
-
});
|
|
91
|
-
deduplicatedCount++;
|
|
92
|
-
logger.info({ demotedId: pair.b.id, keptId: pair.a.id, reason: verdict.reason }, '语义去重:降级重复记忆并合并内容到保留方');
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
catch (err) {
|
|
96
|
-
// 单对失败不阻塞后续对
|
|
97
|
-
logger.warn({ err, pairId: `${pair.a.id}↔${pair.b.id}` }, '语义去重:LLM 判断失败,跳过此对');
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
this.onCompleted?.({
|
|
101
|
-
scannedCount: limited.length,
|
|
102
|
-
pairCount: pairs.length,
|
|
103
|
-
deduplicatedCount,
|
|
104
|
-
demotedIds,
|
|
105
|
-
});
|
|
106
|
-
return {
|
|
107
|
-
scannedCount: limited.length,
|
|
108
|
-
pairCount: pairs.length,
|
|
109
|
-
deduplicatedCount,
|
|
110
|
-
demotedIds,
|
|
111
|
-
verdicts,
|
|
112
|
-
};
|
|
113
|
-
}
|
|
114
|
-
/**
|
|
115
|
-
* 筛选名称高度相似的候选记忆对。判定:归一化 Levenshtein ≤0.3 或一方包含另一方。
|
|
116
|
-
* 已配对的记忆不再参与后续配对(避免三元组产生多对);按相似度升序(越相似越优先)取前 10 对。
|
|
117
|
-
*/
|
|
118
|
-
findNameOverlapPairs(candidates) {
|
|
119
|
-
const pairs = [];
|
|
120
|
-
const usedIds = new Set();
|
|
121
|
-
// 双重循环生成所有可能对,按相似度排序后贪心选取
|
|
122
|
-
const allPairs = [];
|
|
123
|
-
for (let i = 0; i < candidates.length; i++) {
|
|
124
|
-
for (let j = i + 1; j < candidates.length; j++) {
|
|
125
|
-
const a = candidates[i]; // i 前 j 后:candidates 已按 accessedAt 降序,a 为更近使用方(保留候选)
|
|
126
|
-
const b = candidates[j]; // b 为较远使用方(重复候选)
|
|
127
|
-
const similarity = DedupManager.computeNameSimilarity(a.name, b.name);
|
|
128
|
-
if (similarity <= DEDUP_NAME_SIMILARITY_THRESHOLD) {
|
|
129
|
-
allPairs.push({ a, b, nameSimilarity: similarity });
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
// 按相似度升序,越相似越优先处理
|
|
134
|
-
allPairs.sort((x, y) => x.nameSimilarity - y.nameSimilarity);
|
|
135
|
-
// 贪心选取:已配对的记忆不再参与后续配对
|
|
136
|
-
for (const { a, b, nameSimilarity } of allPairs) {
|
|
137
|
-
if (usedIds.has(a.id) || usedIds.has(b.id))
|
|
138
|
-
continue;
|
|
139
|
-
pairs.push({ a, b, nameSimilarity });
|
|
140
|
-
usedIds.add(a.id);
|
|
141
|
-
usedIds.add(b.id);
|
|
142
|
-
if (pairs.length >= DEDUP_PAIR_LIMIT)
|
|
143
|
-
break;
|
|
144
|
-
}
|
|
145
|
-
return pairs;
|
|
146
|
-
}
|
|
147
|
-
/** 名称归一化相似度(0-1,越小越相似)。规则:包含关系=0;否则 Levenshtein 距离 / max(len)。 */
|
|
148
|
-
static computeNameSimilarity(nameA, nameB) {
|
|
149
|
-
// 空名称防御:includes("") 恒真会误判所有记忆高度相似,故空名与任何名称视为完全不同
|
|
150
|
-
if (!nameA || !nameB) {
|
|
151
|
-
return 1;
|
|
152
|
-
}
|
|
153
|
-
// 规则 2:包含关系(如"用户偏好" vs "用户偏好设置")
|
|
154
|
-
if (nameA.includes(nameB) || nameB.includes(nameA)) {
|
|
155
|
-
return 0;
|
|
156
|
-
}
|
|
157
|
-
// 规则 1:归一化 Levenshtein 距离
|
|
158
|
-
const maxLen = Math.max(nameA.length, nameB.length);
|
|
159
|
-
if (maxLen === 0)
|
|
160
|
-
return 0; // 两个空字符串视为完全相似(已被上面拦截,此处防御)
|
|
161
|
-
const distance = levenshtein(nameA, nameB);
|
|
162
|
-
return distance / maxLen;
|
|
163
|
-
}
|
|
164
|
-
/**
|
|
165
|
-
* 调用 LLM 判断单对记忆语义等价:结构化 JSON 输出(isDuplicate+mergedContent+reason)。
|
|
166
|
-
* 流式累积/解析/异常封装委托 llmJudgeHelper.judgeWithLlm;失败抛 MemoraError 由调用方捕获跳过。
|
|
167
|
-
*/
|
|
168
|
-
async judgeDuplicate(pair, signal) {
|
|
169
|
-
const messages = buildDedupMessages(pair);
|
|
170
|
-
const parsed = await judgeWithLlm(this.backgroundProvider, messages, { maxTokens: 300, timeoutMs: DEDUP_TIMEOUT_MS, signal }, 'LLM 去重判断返回非法 JSON');
|
|
171
|
-
return {
|
|
172
|
-
isDuplicate: parsed.isDuplicate === true,
|
|
173
|
-
mergedContent: typeof parsed.mergedContent === 'string' ? parsed.mergedContent : undefined,
|
|
174
|
-
reason: typeof parsed.reason === 'string' ? parsed.reason : '(LLM 未提供理由)',
|
|
175
|
-
};
|
|
176
|
-
}
|
|
177
|
-
/** 软删重复记忆(不物理删除保留可恢复;合并内容由 keepMerged 单独写回 a)。重复方以 delete 进入回收站。 */
|
|
178
|
-
demoteMemory(memory) {
|
|
179
|
-
this.index.delete(memory.id);
|
|
180
|
-
}
|
|
181
|
-
/** 将合并内容写回保留方 a:保持 id/source/name/createdAt 不变,仅刷新 content + accessedAt */
|
|
182
|
-
keepMerged(memory, mergedContent) {
|
|
183
|
-
const updated = {
|
|
184
|
-
...memory,
|
|
185
|
-
content: mergedContent,
|
|
186
|
-
accessedAt: nowIso(),
|
|
187
|
-
};
|
|
188
|
-
this.index.upsert(updated);
|
|
189
|
-
logger.info({ keptId: memory.id }, '语义去重:保留方已合并对方内容');
|
|
190
|
-
}
|
|
191
|
-
}
|
|
192
|
-
// ─── L1 语义去重 Prompt 模板(模块级函数) ───
|
|
193
|
-
/** 构建语义去重判断的 LLM 消息:system 定义语义等价规则 + user 携带候选对内容预览,few-shot 降误判率 */
|
|
194
|
-
function buildDedupMessages(pair) {
|
|
195
|
-
const contentA = pair.a.content.length > DEDUP_CONTENT_PREVIEW_LEN
|
|
196
|
-
? truncate(pair.a.content, DEDUP_CONTENT_PREVIEW_LEN, '…[截断]')
|
|
197
|
-
: pair.a.content;
|
|
198
|
-
const contentB = pair.b.content.length > DEDUP_CONTENT_PREVIEW_LEN
|
|
199
|
-
? truncate(pair.b.content, DEDUP_CONTENT_PREVIEW_LEN, '…[截断]')
|
|
200
|
-
: pair.b.content;
|
|
201
|
-
return [
|
|
202
|
-
{
|
|
203
|
-
role: 'system',
|
|
204
|
-
content: `你是记忆去重助手。判断给定的两条记忆是否语义等价(表达同一事实/偏好/洞察)。
|
|
205
|
-
|
|
206
|
-
判断规则:
|
|
207
|
-
- 语义等价 = 核心信息相同,仅措辞/格式/细节程度不同
|
|
208
|
-
- 语义不等价 = 核心信息不同,或一条是另一条的补充/细化(非等价)
|
|
209
|
-
- 忽略时间戳、ID 等元数据差异
|
|
210
|
-
- 忽略措辞风格差异(如"喜欢"vs"偏爱")
|
|
211
|
-
|
|
212
|
-
输出 JSON 格式:
|
|
213
|
-
{
|
|
214
|
-
"isDuplicate": true/false,
|
|
215
|
-
"mergedContent": "合并后的内容(仅 isDuplicate=true 时提供,保留两条记忆的完整信息)",
|
|
216
|
-
"reason": "判断理由(简短说明)"
|
|
217
|
-
}
|
|
218
|
-
|
|
219
|
-
示例:
|
|
220
|
-
输入 A: "用户偏好简洁的 UI 设计"
|
|
221
|
-
输入 B: "用户喜欢简洁的界面风格"
|
|
222
|
-
输出: {"isDuplicate": true, "mergedContent": "用户偏好简洁的 UI/界面设计风格", "reason": "核心偏好相同,仅措辞差异"}
|
|
223
|
-
|
|
224
|
-
输入 A: "用户是 TypeScript 开发者"
|
|
225
|
-
输入 B: "用户偏好使用 TypeScript 进行后端开发"
|
|
226
|
-
输出: {"isDuplicate": false, "reason": "B 是 A 的细化(限定后端),非语义等价"}`,
|
|
227
|
-
},
|
|
228
|
-
{
|
|
229
|
-
role: 'user',
|
|
230
|
-
content: `请判断以下两条记忆是否语义等价:
|
|
231
|
-
|
|
232
|
-
记忆 A(保留候选):
|
|
233
|
-
- 名称:${pair.a.name}
|
|
234
|
-
- 来源:${pair.a.source}
|
|
235
|
-
- 内容:${contentA}
|
|
236
|
-
|
|
237
|
-
记忆 B(重复候选):
|
|
238
|
-
- 名称:${pair.b.name}
|
|
239
|
-
- 来源:${pair.b.source}
|
|
240
|
-
- 内容:${contentB}
|
|
241
|
-
|
|
242
|
-
名称相似度:${pair.nameSimilarity.toFixed(2)}(0=完全相同,1=完全不同)
|
|
243
|
-
|
|
244
|
-
请输出 JSON 判断结果。`,
|
|
245
|
-
},
|
|
246
|
-
];
|
|
247
|
-
}
|
|
248
|
-
//# sourceMappingURL=dedupManager.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"dedupManager.js","sourceRoot":"","sources":["../../../src/agent/managers/dedupManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* 目标一致性校验器(目标版本一致性校验)。
|
|
3
|
-
* 两层校验:确定性层(关键约束提取 + 文本相似度)+ LLM 层(可选,仅对需确认场景生成解释)。
|
|
4
|
-
* 关键约束由确定性规则提取而非 LLM(防自我引用)。漂移等级:same(>0.7 无需确认)/confirm(0.4-0.7 建议确认)/drift(<0.4 需确认)。
|
|
5
|
-
*/
|
|
6
|
-
/** 漂移等级:same(>0.7 自动应用)/confirm(0.4-0.7 建议确认)/drift(<0.4 需确认) */
|
|
7
|
-
export type DriftLevel = 'same' | 'confirm' | 'drift';
|
|
8
|
-
/** 一致性校验结果 */
|
|
9
|
-
export interface GoalConsistencyResult {
|
|
10
|
-
/** 漂移等级 */
|
|
11
|
-
level: DriftLevel;
|
|
12
|
-
/** 文本相似度(0-1) */
|
|
13
|
-
similarity: number;
|
|
14
|
-
/** 从 mainGoal 中提取的关键约束列表 */
|
|
15
|
-
constraints: string[];
|
|
16
|
-
/** 约束一致性(true = 所有约束均满足,false = 有约束冲突) */
|
|
17
|
-
constraintsConsistent: boolean;
|
|
18
|
-
/** 冲突的约束说明(可选,仅 constraintsConsistent 为 false 时有值) */
|
|
19
|
-
conflictExplanation?: string;
|
|
20
|
-
}
|
|
21
|
-
/** 目标一致性校验器:纯函数式(无状态无副作用),SessionManager / Agent 层直接可用,不依赖外部服务 */
|
|
22
|
-
export declare class GoalConsistencyChecker {
|
|
23
|
-
/** 提取关键约束:从目标描述中按确定性规则提取"必须/不能/需要/确保"等关键词句段(不依赖 LLM 防自我引用),去重返回 */
|
|
24
|
-
extractConstraints(goal: string): string[];
|
|
25
|
-
/** 计算文本相似度:长文本(>20 字符)用 Jaccard,短文本用字符级 bigram(对短文本更敏感) */
|
|
26
|
-
computeSimilarity(a: string, b: string): number;
|
|
27
|
-
/** 执行一致性校验:提取约束 → 算相似度定漂移等级(>0.7 same / >=0.4 confirm / else drift)→ 检查约束是否仍满足 */
|
|
28
|
-
checkConsistency(mainGoal: string, newGoal: string): GoalConsistencyResult;
|
|
29
|
-
/** 检查约束在新目标是否仍满足:对每条约束提取核心词,任一命中即视为满足;全不满足则标记冲突 */
|
|
30
|
-
private checkConstraintsConsistent;
|
|
31
|
-
/** 提取约束核心词:去除标记词保留核心名词短语(如"必须使用TypeScript" → "使用TypeScript"),再按分隔符切分;剥离前缀由 CONSTRAINT_KEYWORDS 生成 */
|
|
32
|
-
private extractKeywords;
|
|
33
|
-
/** Jaccard 相似度:分词后交集/并集。分词策略:中文字符逐字 + 英文单词 + 数字 */
|
|
34
|
-
private jaccardSimilarity;
|
|
35
|
-
/** 字符级 bigram 相似度:拆相邻字符对求交集/并集,适用于短文本 */
|
|
36
|
-
private bigramSimilarity;
|
|
37
|
-
/** 分词:提取中文字符(逐字,对中文更敏感)+ 英文单词(小写)+ 数字;零外部依赖 */
|
|
38
|
-
private tokenize;
|
|
39
|
-
/** 获取字符级 bigram:拆相邻字符对(如 "TypeScript" → ["Ty","yp",...]) */
|
|
40
|
-
private getBigrams;
|
|
41
|
-
}
|
|
42
|
-
//# sourceMappingURL=goalConsistencyChecker.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"goalConsistencyChecker.d.ts","sourceRoot":"","sources":["../../../src/agent/managers/goalConsistencyChecker.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,iEAAiE;AACjE,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC;AAgBtD,cAAc;AACd,MAAM,WAAW,qBAAqB;IACpC,WAAW;IACX,KAAK,EAAE,UAAU,CAAC;IAClB,iBAAiB;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,4BAA4B;IAC5B,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,0CAA0C;IAC1C,qBAAqB,EAAE,OAAO,CAAC;IAC/B,sDAAsD;IACtD,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,kEAAkE;AAClE,qBAAa,sBAAsB;IACjC,mEAAmE;IACnE,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE;IAqB1C,2DAA2D;IAC3D,iBAAiB,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM;IAkB/C,kFAAkF;IAClF,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,qBAAqB;IA6B1E,mDAAmD;IACnD,OAAO,CAAC,0BAA0B;IA6BlC,qGAAqG;IACrG,OAAO,CAAC,eAAe;IAQvB,mDAAmD;IACnD,OAAO,CAAC,iBAAiB;IAgBzB,yCAAyC;IACzC,OAAO,CAAC,gBAAgB;IAgBxB,+CAA+C;IAC/C,OAAO,CAAC,QAAQ;IAgChB,4DAA4D;IAC5D,OAAO,CAAC,UAAU;CAOnB"}
|