@zooique/memora 2.0.0 → 3.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 +1028 -0
- package/README.en.md +305 -0
- package/README.md +303 -148
- package/config.example.json +43 -0
- package/dist/agent/agent.d.ts +438 -295
- package/dist/agent/agent.d.ts.map +1 -1
- package/dist/agent/agent.js +1368 -836
- package/dist/agent/agent.js.map +1 -1
- package/dist/agent/assembler.d.ts +117 -39
- package/dist/agent/assembler.d.ts.map +1 -1
- package/dist/agent/assembler.js +574 -71
- package/dist/agent/assembler.js.map +1 -1
- package/dist/agent/budget.d.ts +131 -0
- package/dist/agent/budget.d.ts.map +1 -0
- package/dist/agent/budget.js +128 -0
- package/dist/agent/budget.js.map +1 -0
- package/dist/agent/builtinToolHandlers.d.ts +229 -17
- package/dist/agent/builtinToolHandlers.d.ts.map +1 -1
- package/dist/agent/builtinToolHandlers.js +758 -70
- package/dist/agent/builtinToolHandlers.js.map +1 -1
- package/dist/agent/builtinTools.d.ts +198 -7
- package/dist/agent/builtinTools.d.ts.map +1 -1
- package/dist/agent/builtinTools.js +646 -14
- package/dist/agent/builtinTools.js.map +1 -1
- package/dist/agent/compaction.d.ts +93 -0
- package/dist/agent/compaction.d.ts.map +1 -0
- package/dist/agent/compaction.js +192 -0
- package/dist/agent/compaction.js.map +1 -0
- package/dist/agent/constants.d.ts +139 -18
- package/dist/agent/constants.d.ts.map +1 -1
- package/dist/agent/constants.js +154 -18
- package/dist/agent/constants.js.map +1 -1
- package/dist/agent/contextManager.d.ts +126 -76
- package/dist/agent/contextManager.d.ts.map +1 -1
- package/dist/agent/contextManager.js +197 -135
- package/dist/agent/contextManager.js.map +1 -1
- package/dist/agent/contextPreparer.d.ts +78 -0
- package/dist/agent/contextPreparer.d.ts.map +1 -0
- package/dist/agent/contextPreparer.js +128 -0
- package/dist/agent/contextPreparer.js.map +1 -0
- package/dist/agent/duplicateInterceptor.d.ts +67 -0
- package/dist/agent/duplicateInterceptor.d.ts.map +1 -0
- package/dist/agent/duplicateInterceptor.js +82 -0
- package/dist/agent/duplicateInterceptor.js.map +1 -0
- package/dist/agent/guardRail.d.ts +166 -0
- package/dist/agent/guardRail.d.ts.map +1 -0
- package/dist/agent/guardRail.js +333 -0
- package/dist/agent/guardRail.js.map +1 -0
- package/dist/agent/loop.d.ts +718 -253
- package/dist/agent/loop.d.ts.map +1 -1
- package/dist/agent/loop.js +2215 -648
- package/dist/agent/loop.js.map +1 -1
- package/dist/agent/managers/archiveCoordinator.d.ts +21 -74
- package/dist/agent/managers/archiveCoordinator.d.ts.map +1 -1
- package/dist/agent/managers/archiveCoordinator.js +32 -105
- package/dist/agent/managers/archiveCoordinator.js.map +1 -1
- package/dist/agent/managers/chatLockManager.d.ts +20 -88
- package/dist/agent/managers/chatLockManager.d.ts.map +1 -1
- package/dist/agent/managers/chatLockManager.js +31 -103
- package/dist/agent/managers/chatLockManager.js.map +1 -1
- package/dist/agent/managers/dedupManager.d.ts +85 -0
- package/dist/agent/managers/dedupManager.d.ts.map +1 -0
- package/dist/agent/managers/dedupManager.js +248 -0
- package/dist/agent/managers/dedupManager.js.map +1 -0
- package/dist/agent/managers/goalConsistencyChecker.d.ts +42 -0
- package/dist/agent/managers/goalConsistencyChecker.d.ts.map +1 -0
- package/dist/agent/managers/goalConsistencyChecker.js +178 -0
- package/dist/agent/managers/goalConsistencyChecker.js.map +1 -0
- package/dist/agent/managers/llmCaller.d.ts +124 -0
- package/dist/agent/managers/llmCaller.d.ts.map +1 -0
- package/dist/agent/managers/llmCaller.js +417 -0
- package/dist/agent/managers/llmCaller.js.map +1 -0
- package/dist/agent/managers/llmJudgeHelper.d.ts +21 -0
- package/dist/agent/managers/llmJudgeHelper.d.ts.map +1 -0
- package/dist/agent/managers/llmJudgeHelper.js +32 -0
- package/dist/agent/managers/llmJudgeHelper.js.map +1 -0
- package/dist/agent/managers/loopMetrics.d.ts +58 -0
- package/dist/agent/managers/loopMetrics.d.ts.map +1 -0
- package/dist/agent/managers/loopMetrics.js +68 -0
- package/dist/agent/managers/loopMetrics.js.map +1 -0
- package/dist/agent/managers/memoryAdvisor.d.ts +27 -120
- package/dist/agent/managers/memoryAdvisor.d.ts.map +1 -1
- package/dist/agent/managers/memoryAdvisor.js +56 -192
- package/dist/agent/managers/memoryAdvisor.js.map +1 -1
- package/dist/agent/managers/memoryGovernance.d.ts +24 -0
- package/dist/agent/managers/memoryGovernance.d.ts.map +1 -0
- package/dist/agent/managers/memoryGovernance.js +46 -0
- package/dist/agent/managers/memoryGovernance.js.map +1 -0
- package/dist/agent/managers/memoryInspector.d.ts +59 -393
- package/dist/agent/managers/memoryInspector.d.ts.map +1 -1
- package/dist/agent/managers/memoryInspector.js +92 -736
- package/dist/agent/managers/memoryInspector.js.map +1 -1
- package/dist/agent/managers/roundSummaryGenerator.d.ts +56 -0
- package/dist/agent/managers/roundSummaryGenerator.d.ts.map +1 -0
- package/dist/agent/managers/roundSummaryGenerator.js +201 -0
- package/dist/agent/managers/roundSummaryGenerator.js.map +1 -0
- package/dist/agent/managers/sessionArchiver.d.ts +19 -63
- package/dist/agent/managers/sessionArchiver.d.ts.map +1 -1
- package/dist/agent/managers/sessionArchiver.js +83 -157
- package/dist/agent/managers/sessionArchiver.js.map +1 -1
- package/dist/agent/managers/sessionManager.d.ts +286 -57
- package/dist/agent/managers/sessionManager.d.ts.map +1 -1
- package/dist/agent/managers/sessionManager.js +846 -85
- package/dist/agent/managers/sessionManager.js.map +1 -1
- package/dist/agent/managers/sessionNamer.d.ts +35 -0
- package/dist/agent/managers/sessionNamer.d.ts.map +1 -0
- package/dist/agent/managers/sessionNamer.js +104 -0
- package/dist/agent/managers/sessionNamer.js.map +1 -0
- package/dist/agent/managers/streamAccumulator.d.ts +20 -0
- package/dist/agent/managers/streamAccumulator.d.ts.map +1 -0
- package/dist/agent/managers/streamAccumulator.js +15 -0
- package/dist/agent/managers/streamAccumulator.js.map +1 -0
- package/dist/agent/managers/textPolishManager.d.ts +8 -44
- package/dist/agent/managers/textPolishManager.d.ts.map +1 -1
- package/dist/agent/managers/textPolishManager.js +12 -47
- package/dist/agent/managers/textPolishManager.js.map +1 -1
- package/dist/agent/managers/toolCallHelpers.d.ts +105 -0
- package/dist/agent/managers/toolCallHelpers.d.ts.map +1 -0
- package/dist/agent/managers/toolCallHelpers.js +161 -0
- package/dist/agent/managers/toolCallHelpers.js.map +1 -0
- package/dist/agent/managers/workProjection.d.ts +57 -87
- package/dist/agent/managers/workProjection.d.ts.map +1 -1
- package/dist/agent/managers/workProjection.js +166 -246
- package/dist/agent/managers/workProjection.js.map +1 -1
- package/dist/agent/messageHistory.d.ts +134 -84
- package/dist/agent/messageHistory.d.ts.map +1 -1
- package/dist/agent/messageHistory.js +419 -133
- package/dist/agent/messageHistory.js.map +1 -1
- package/dist/agent/needsPlanning.d.ts +28 -0
- package/dist/agent/needsPlanning.d.ts.map +1 -0
- package/dist/agent/needsPlanning.js +68 -0
- package/dist/agent/needsPlanning.js.map +1 -0
- package/dist/agent/seed/index.d.ts +11 -0
- package/dist/agent/seed/index.d.ts.map +1 -0
- package/dist/agent/seed/index.js +10 -0
- package/dist/agent/seed/index.js.map +1 -0
- package/dist/agent/seed/orchestrator.d.ts +83 -0
- package/dist/agent/seed/orchestrator.d.ts.map +1 -0
- package/dist/agent/seed/orchestrator.js +260 -0
- package/dist/agent/seed/orchestrator.js.map +1 -0
- package/dist/agent/seed/prepare.d.ts +49 -0
- package/dist/agent/seed/prepare.d.ts.map +1 -0
- package/dist/agent/seed/prepare.js +107 -0
- package/dist/agent/seed/prepare.js.map +1 -0
- package/dist/agent/seed/types.d.ts +115 -0
- package/dist/agent/seed/types.d.ts.map +1 -0
- package/dist/agent/seed/types.js +15 -0
- package/dist/agent/seed/types.js.map +1 -0
- package/dist/agent/sessionStateMachine.d.ts +78 -0
- package/dist/agent/sessionStateMachine.d.ts.map +1 -0
- package/dist/agent/sessionStateMachine.js +182 -0
- package/dist/agent/sessionStateMachine.js.map +1 -0
- package/dist/agent/taskTableRenderer.d.ts +51 -0
- package/dist/agent/taskTableRenderer.d.ts.map +1 -0
- package/dist/agent/taskTableRenderer.js +115 -0
- package/dist/agent/taskTableRenderer.js.map +1 -0
- package/dist/agent/toolExecutor.d.ts +255 -9
- package/dist/agent/toolExecutor.d.ts.map +1 -1
- package/dist/agent/toolExecutor.js +956 -20
- package/dist/agent/toolExecutor.js.map +1 -1
- package/dist/agent/toolLedger.d.ts +120 -0
- package/dist/agent/toolLedger.d.ts.map +1 -0
- package/dist/agent/toolLedger.js +149 -0
- package/dist/agent/toolLedger.js.map +1 -0
- package/dist/agent/toolResultCache.d.ts +134 -0
- package/dist/agent/toolResultCache.d.ts.map +1 -0
- package/dist/agent/toolResultCache.js +243 -0
- package/dist/agent/toolResultCache.js.map +1 -0
- package/dist/agent/toolResultOffload.d.ts +59 -0
- package/dist/agent/toolResultOffload.d.ts.map +1 -0
- package/dist/agent/toolResultOffload.js +70 -0
- package/dist/agent/toolResultOffload.js.map +1 -0
- package/dist/agent/toolRunner.d.ts +59 -0
- package/dist/agent/toolRunner.d.ts.map +1 -0
- package/dist/agent/toolRunner.js +147 -0
- package/dist/agent/toolRunner.js.map +1 -0
- package/dist/agent/tracer.d.ts +99 -107
- package/dist/agent/tracer.d.ts.map +1 -1
- package/dist/agent/tracer.js +24 -69
- package/dist/agent/tracer.js.map +1 -1
- package/dist/agent/types.d.ts +512 -162
- package/dist/agent/types.d.ts.map +1 -1
- package/dist/agent/types.js +2 -51
- package/dist/agent/types.js.map +1 -1
- package/dist/code-exec/codeExecutionProvider.d.ts +16 -0
- package/dist/code-exec/codeExecutionProvider.d.ts.map +1 -0
- package/dist/code-exec/codeExecutionProvider.js +57 -0
- package/dist/code-exec/codeExecutionProvider.js.map +1 -0
- package/dist/code-exec/types.d.ts +37 -0
- package/dist/code-exec/types.d.ts.map +1 -0
- package/dist/code-exec/types.js +12 -0
- package/dist/code-exec/types.js.map +1 -0
- package/dist/config/expandEnvVars.d.ts +22 -0
- package/dist/config/expandEnvVars.d.ts.map +1 -0
- package/dist/config/expandEnvVars.js +38 -0
- package/dist/config/expandEnvVars.js.map +1 -0
- package/dist/config/loader.d.ts +59 -242
- package/dist/config/loader.d.ts.map +1 -1
- package/dist/config/loader.js +237 -194
- package/dist/config/loader.js.map +1 -1
- package/dist/index.d.ts +69 -74
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +93 -63
- package/dist/index.js.map +1 -1
- package/dist/llm/abortSignal.d.ts +2 -3
- package/dist/llm/abortSignal.d.ts.map +1 -1
- package/dist/llm/abortSignal.js +2 -3
- package/dist/llm/abortSignal.js.map +1 -1
- package/dist/llm/factory.d.ts +29 -25
- package/dist/llm/factory.d.ts.map +1 -1
- package/dist/llm/factory.js +34 -69
- package/dist/llm/factory.js.map +1 -1
- package/dist/llm/openaiCompatible.d.ts +25 -40
- package/dist/llm/openaiCompatible.d.ts.map +1 -1
- package/dist/llm/openaiCompatible.js +181 -129
- package/dist/llm/openaiCompatible.js.map +1 -1
- package/dist/llm/provider.d.ts +29 -42
- package/dist/llm/provider.d.ts.map +1 -1
- package/dist/llm/provider.js +11 -10
- package/dist/llm/provider.js.map +1 -1
- package/dist/llm/types.d.ts +54 -11
- package/dist/llm/types.d.ts.map +1 -1
- package/dist/llm/types.js +0 -5
- package/dist/llm/types.js.map +1 -1
- package/dist/logging/logger.d.ts +8 -29
- package/dist/logging/logger.d.ts.map +1 -1
- package/dist/logging/logger.js +43 -233
- package/dist/logging/logger.js.map +1 -1
- package/dist/logging/loggerInterface.d.ts +9 -8
- package/dist/logging/loggerInterface.d.ts.map +1 -1
- package/dist/memory/gcService.d.ts +164 -0
- package/dist/memory/gcService.d.ts.map +1 -0
- package/dist/memory/gcService.js +215 -0
- package/dist/memory/gcService.js.map +1 -0
- package/dist/memory/governance.d.ts +17 -0
- package/dist/memory/governance.d.ts.map +1 -0
- package/dist/memory/governance.js +17 -0
- package/dist/memory/governance.js.map +1 -0
- package/dist/memory/inMemoryRoundStore.d.ts +124 -0
- package/dist/memory/inMemoryRoundStore.d.ts.map +1 -0
- package/dist/memory/inMemoryRoundStore.js +216 -0
- package/dist/memory/inMemoryRoundStore.js.map +1 -0
- package/dist/memory/inMemorySessionStore.d.ts +92 -0
- package/dist/memory/inMemorySessionStore.d.ts.map +1 -0
- package/dist/memory/inMemorySessionStore.js +219 -0
- package/dist/memory/inMemorySessionStore.js.map +1 -0
- package/dist/memory/inMemorySessionViewLoader.d.ts +89 -0
- package/dist/memory/inMemorySessionViewLoader.d.ts.map +1 -0
- package/dist/memory/inMemorySessionViewLoader.js +183 -0
- package/dist/memory/inMemorySessionViewLoader.js.map +1 -0
- package/dist/memory/inMemoryStorage.d.ts +26 -141
- package/dist/memory/inMemoryStorage.d.ts.map +1 -1
- package/dist/memory/inMemoryStorage.js +48 -187
- package/dist/memory/inMemoryStorage.js.map +1 -1
- package/dist/memory/keywordsTouch.d.ts +20 -0
- package/dist/memory/keywordsTouch.d.ts.map +1 -0
- package/dist/memory/keywordsTouch.js +25 -0
- package/dist/memory/keywordsTouch.js.map +1 -0
- package/dist/memory/lockManager.d.ts +7 -2
- package/dist/memory/lockManager.d.ts.map +1 -1
- package/dist/memory/lockManager.js +35 -11
- package/dist/memory/lockManager.js.map +1 -1
- package/dist/memory/projectManager.d.ts +30 -128
- package/dist/memory/projectManager.d.ts.map +1 -1
- package/dist/memory/projectManager.js +39 -171
- package/dist/memory/projectManager.js.map +1 -1
- package/dist/memory/projectRegistry.d.ts +22 -37
- package/dist/memory/projectRegistry.d.ts.map +1 -1
- package/dist/memory/projectRegistry.js +78 -85
- package/dist/memory/projectRegistry.js.map +1 -1
- package/dist/memory/roundStore.d.ts +629 -0
- package/dist/memory/roundStore.d.ts.map +1 -0
- package/dist/memory/roundStore.js +116 -0
- package/dist/memory/roundStore.js.map +1 -0
- package/dist/memory/sessionStore.d.ts +70 -61
- package/dist/memory/sessionStore.d.ts.map +1 -1
- package/dist/memory/sessionStore.js +23 -1
- package/dist/memory/sessionStore.js.map +1 -1
- package/dist/memory/sessionViewLoader.d.ts +141 -0
- package/dist/memory/sessionViewLoader.d.ts.map +1 -0
- package/dist/memory/sessionViewLoader.js +65 -0
- package/dist/memory/sessionViewLoader.js.map +1 -0
- package/dist/memory/sourceValidation.d.ts +18 -9
- package/dist/memory/sourceValidation.d.ts.map +1 -1
- package/dist/memory/sourceValidation.js +35 -29
- package/dist/memory/sourceValidation.js.map +1 -1
- package/dist/memory/storageInterface.d.ts +45 -126
- package/dist/memory/storageInterface.d.ts.map +1 -1
- package/dist/memory/types.d.ts +82 -168
- package/dist/memory/types.d.ts.map +1 -1
- package/dist/memory/types.js +116 -79
- package/dist/memory/types.js.map +1 -1
- package/dist/project-search/projectSearchProvider.d.ts +29 -0
- package/dist/project-search/projectSearchProvider.d.ts.map +1 -0
- package/dist/project-search/projectSearchProvider.js +57 -0
- package/dist/project-search/projectSearchProvider.js.map +1 -0
- package/dist/project-search/terms.d.ts +14 -0
- package/dist/project-search/terms.d.ts.map +1 -0
- package/dist/project-search/terms.js +68 -0
- package/dist/project-search/terms.js.map +1 -0
- package/dist/project-search/types.d.ts +139 -0
- package/dist/project-search/types.d.ts.map +1 -0
- package/dist/project-search/types.js +8 -0
- package/dist/project-search/types.js.map +1 -0
- package/dist/role-pack/capabilityMap.d.ts +28 -0
- package/dist/role-pack/capabilityMap.d.ts.map +1 -0
- package/dist/role-pack/capabilityMap.js +56 -0
- package/dist/role-pack/capabilityMap.js.map +1 -0
- package/dist/role-pack/constants.d.ts +21 -0
- package/dist/role-pack/constants.d.ts.map +1 -0
- package/dist/role-pack/constants.js +21 -0
- package/dist/role-pack/constants.js.map +1 -0
- package/dist/role-pack/rolePackManager.d.ts +269 -0
- package/dist/role-pack/rolePackManager.d.ts.map +1 -0
- package/dist/role-pack/rolePackManager.js +1082 -0
- package/dist/role-pack/rolePackManager.js.map +1 -0
- package/dist/role-pack/strategyKeys.d.ts +100 -0
- package/dist/role-pack/strategyKeys.d.ts.map +1 -0
- package/dist/role-pack/strategyKeys.js +184 -0
- package/dist/role-pack/strategyKeys.js.map +1 -0
- package/dist/role-pack/strategyResolver.d.ts +109 -0
- package/dist/role-pack/strategyResolver.d.ts.map +1 -0
- package/dist/role-pack/strategyResolver.js +304 -0
- package/dist/role-pack/strategyResolver.js.map +1 -0
- package/dist/role-pack/types.d.ts +237 -0
- package/dist/role-pack/types.d.ts.map +1 -0
- package/dist/role-pack/types.js +8 -0
- package/dist/role-pack/types.js.map +1 -0
- package/dist/role-pack/validator.d.ts +38 -0
- package/dist/role-pack/validator.d.ts.map +1 -0
- package/dist/role-pack/validator.js +436 -0
- package/dist/role-pack/validator.js.map +1 -0
- package/dist/security/pathGuard.d.ts +69 -72
- package/dist/security/pathGuard.d.ts.map +1 -1
- package/dist/security/pathGuard.js +151 -131
- package/dist/security/pathGuard.js.map +1 -1
- package/dist/skill/skillLayer3.d.ts +91 -0
- package/dist/skill/skillLayer3.d.ts.map +1 -0
- package/dist/skill/skillLayer3.js +104 -0
- package/dist/skill/skillLayer3.js.map +1 -0
- package/dist/skill/skillManager.d.ts +127 -56
- package/dist/skill/skillManager.d.ts.map +1 -1
- package/dist/skill/skillManager.js +318 -163
- package/dist/skill/skillManager.js.map +1 -1
- package/dist/skill/skillScriptRunner.d.ts +97 -0
- package/dist/skill/skillScriptRunner.d.ts.map +1 -0
- package/dist/skill/skillScriptRunner.js +271 -0
- package/dist/skill/skillScriptRunner.js.map +1 -0
- package/dist/skill/types.d.ts +73 -17
- package/dist/skill/types.d.ts.map +1 -1
- package/dist/skill/types.js +5 -1
- package/dist/skill/types.js.map +1 -1
- package/dist/utils/array.d.ts +5 -6
- package/dist/utils/array.d.ts.map +1 -1
- package/dist/utils/array.js +6 -6
- package/dist/utils/array.js.map +1 -1
- package/dist/utils/atomicWrite.d.ts +8 -0
- package/dist/utils/atomicWrite.d.ts.map +1 -0
- package/dist/utils/atomicWrite.js +31 -0
- package/dist/utils/atomicWrite.js.map +1 -0
- package/dist/utils/backgroundTask.d.ts +38 -0
- package/dist/utils/backgroundTask.d.ts.map +1 -0
- package/dist/utils/backgroundTask.js +117 -0
- package/dist/utils/backgroundTask.js.map +1 -0
- package/dist/utils/configResourceManager.d.ts +79 -0
- package/dist/utils/configResourceManager.d.ts.map +1 -0
- package/dist/utils/configResourceManager.js +150 -0
- package/dist/utils/configResourceManager.js.map +1 -0
- package/dist/utils/errors.d.ts +48 -56
- package/dist/utils/errors.d.ts.map +1 -1
- package/dist/utils/errors.js +60 -58
- package/dist/utils/errors.js.map +1 -1
- package/dist/utils/eventEmitter.d.ts +141 -63
- package/dist/utils/eventEmitter.d.ts.map +1 -1
- package/dist/utils/eventEmitter.js +50 -35
- package/dist/utils/eventEmitter.js.map +1 -1
- package/dist/utils/fileSafe.d.ts +20 -0
- package/dist/utils/fileSafe.d.ts.map +1 -0
- package/dist/utils/fileSafe.js +56 -0
- package/dist/utils/fileSafe.js.map +1 -0
- package/dist/utils/frontmatter.d.ts +2 -3
- package/dist/utils/frontmatter.d.ts.map +1 -1
- package/dist/utils/frontmatter.js +6 -5
- package/dist/utils/frontmatter.js.map +1 -1
- package/dist/utils/hash.d.ts +12 -0
- package/dist/utils/hash.d.ts.map +1 -0
- package/dist/utils/hash.js +27 -0
- package/dist/utils/hash.js.map +1 -0
- package/dist/utils/http.d.ts +17 -0
- package/dist/utils/http.d.ts.map +1 -0
- package/dist/utils/http.js +29 -0
- package/dist/utils/http.js.map +1 -0
- package/dist/utils/json.d.ts +1 -1
- package/dist/utils/json.js +1 -1
- package/dist/utils/math.d.ts +34 -1
- package/dist/utils/math.d.ts.map +1 -1
- package/dist/utils/math.js +47 -14
- package/dist/utils/math.js.map +1 -1
- package/dist/utils/objects.d.ts +2 -3
- package/dist/utils/objects.d.ts.map +1 -1
- package/dist/utils/objects.js +2 -3
- package/dist/utils/objects.js.map +1 -1
- package/dist/utils/recallDefaults.d.ts +16 -0
- package/dist/utils/recallDefaults.d.ts.map +1 -0
- package/dist/utils/recallDefaults.js +16 -0
- package/dist/utils/recallDefaults.js.map +1 -0
- package/dist/utils/safeTimer.d.ts +8 -36
- package/dist/utils/safeTimer.d.ts.map +1 -1
- package/dist/utils/safeTimer.js +9 -37
- package/dist/utils/safeTimer.js.map +1 -1
- package/dist/utils/scanner.d.ts +97 -17
- package/dist/utils/scanner.d.ts.map +1 -1
- package/dist/utils/scanner.js +269 -47
- package/dist/utils/scanner.js.map +1 -1
- package/dist/utils/segmenter.d.ts +20 -29
- package/dist/utils/segmenter.d.ts.map +1 -1
- package/dist/utils/segmenter.js +230 -88
- package/dist/utils/segmenter.js.map +1 -1
- package/dist/utils/strings.d.ts +15 -32
- package/dist/utils/strings.d.ts.map +1 -1
- package/dist/utils/strings.js +25 -44
- package/dist/utils/strings.js.map +1 -1
- package/dist/utils/time.d.ts +37 -0
- package/dist/utils/time.d.ts.map +1 -1
- package/dist/utils/time.js +56 -0
- package/dist/utils/time.js.map +1 -1
- package/dist/utils/toError.d.ts +13 -1
- package/dist/utils/toError.d.ts.map +1 -1
- package/dist/utils/toError.js +18 -1
- package/dist/utils/toError.js.map +1 -1
- package/dist/web-fetch/fetchWebFetchProvider.d.ts +14 -0
- package/dist/web-fetch/fetchWebFetchProvider.d.ts.map +1 -0
- package/dist/web-fetch/fetchWebFetchProvider.js +69 -0
- package/dist/web-fetch/fetchWebFetchProvider.js.map +1 -0
- package/dist/web-fetch/types.d.ts +30 -0
- package/dist/web-fetch/types.d.ts.map +1 -0
- package/dist/web-fetch/types.js +7 -0
- package/dist/web-fetch/types.js.map +1 -0
- package/dist/web-fetch/webFetchProvider.d.ts +10 -0
- package/dist/web-fetch/webFetchProvider.d.ts.map +1 -0
- package/dist/web-fetch/webFetchProvider.js +28 -0
- package/dist/web-fetch/webFetchProvider.js.map +1 -0
- package/dist/web-search/fetchWebSearchProvider.d.ts +27 -0
- package/dist/web-search/fetchWebSearchProvider.d.ts.map +1 -0
- package/dist/web-search/fetchWebSearchProvider.js +199 -0
- package/dist/web-search/fetchWebSearchProvider.js.map +1 -0
- package/dist/web-search/types.d.ts +46 -0
- package/dist/web-search/types.d.ts.map +1 -0
- package/dist/web-search/types.js +2 -0
- package/dist/{persona → web-search}/types.js.map +1 -1
- package/dist/web-search/webSearchProvider.d.ts +10 -0
- package/dist/web-search/webSearchProvider.d.ts.map +1 -0
- package/dist/web-search/webSearchProvider.js +30 -0
- package/dist/web-search/webSearchProvider.js.map +1 -0
- package/docs/architecture/role-pack-authoring-guide.md +243 -0
- package/docs/architecture/role-pack-spec.md +767 -0
- package/docs/memora-api-reference.md +1175 -0
- package/docs/memora-/346/216/245/345/205/245/346/214/207/345/215/227.md +843 -0
- package/docs/role-pack-/345/274/200/346/224/276/351/224/256/346/214/207/345/215/227.md +148 -0
- package/package.json +105 -83
- package/role-packs/README.md +41 -0
- package/role-packs/memora/345/212/251/346/211/213/manifest.json +12 -0
- package/role-packs/memora/345/212/251/346/211/213/persona.md +12 -0
- package/role-packs/memora/345/212/251/346/211/213/rules.md +4 -0
- package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/manifest.json +44 -0
- package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/persona.md +46 -0
- package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/rules.md +15 -0
- package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/character-sheet.md +34 -0
- package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/core-extractor.md +37 -0
- package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/craft-review.md +69 -0
- package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/dialogue-craft.md +45 -0
- package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/emotion-wave.md +46 -0
- package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/empathy-craft.md +79 -0
- package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/foreshadow.md +29 -0
- package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/hotspot-mapping.md +121 -0
- package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/idea-lever.md +42 -0
- package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/logline-craft.md +47 -0
- package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/longform-guard.md +64 -0
- package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/need-finder.md +40 -0
- package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/outline-expand.md +46 -0
- package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/pacing-hook.md +34 -0
- package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/polish-method.md +113 -0
- package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/pov-discipline.md +79 -0
- package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/project-init/SKILL.md +112 -0
- 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 +441 -0
- package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/relationship-web.md +47 -0
- package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/scene-craft.md +46 -0
- package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/story-bible.md +60 -0
- package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/story-structure.md +36 -0
- package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/style-weaver.md +109 -0
- package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/three-layer-check.md +27 -0
- package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/world-builder.md +41 -0
- 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 +48 -0
- package/role-packs//347/231/275/350/257/235/346/226/271/346/241/210/350/256/276/350/256/241/345/270/210/persona.md +73 -0
- package/role-packs//347/231/275/350/257/235/346/226/271/346/241/210/350/256/276/350/256/241/345/270/210/rules.md +19 -0
- package/role-packs//347/231/275/350/257/235/346/226/271/346/241/210/350/256/276/350/256/241/345/270/210/skills/api-doc-writer.md +40 -0
- package/role-packs//347/231/275/350/257/235/346/226/271/346/241/210/350/256/276/350/256/241/345/270/210/skills/doc-planner.md +42 -0
- package/role-packs//347/231/275/350/257/235/346/226/271/346/241/210/350/256/276/350/256/241/345/270/210/skills/nutrient-search.md +28 -0
- package/role-packs//347/231/275/350/257/235/346/226/271/346/241/210/350/256/276/350/256/241/345/270/210/skills/seed-finder.md +28 -0
- package/role-packs//347/231/275/350/257/235/346/226/271/346/241/210/350/256/276/350/256/241/345/270/210/skills/ssot-audit.md +34 -0
- package/role-packs//347/231/275/350/257/235/346/226/271/346/241/210/350/256/276/350/256/241/345/270/210/skills/style-guide.md +40 -0
- package/dist/agent/guardrail.d.ts +0 -47
- package/dist/agent/guardrail.d.ts.map +0 -1
- package/dist/agent/guardrail.js +0 -51
- package/dist/agent/guardrail.js.map +0 -1
- package/dist/agent/managers/autoConfigRefiner.d.ts +0 -39
- package/dist/agent/managers/autoConfigRefiner.d.ts.map +0 -1
- package/dist/agent/managers/autoConfigRefiner.js +0 -150
- package/dist/agent/managers/autoConfigRefiner.js.map +0 -1
- package/dist/agent/managers/configManager.d.ts +0 -125
- package/dist/agent/managers/configManager.d.ts.map +0 -1
- package/dist/agent/managers/configManager.js +0 -194
- package/dist/agent/managers/configManager.js.map +0 -1
- package/dist/agent/managers/insightExtractor.d.ts +0 -139
- package/dist/agent/managers/insightExtractor.d.ts.map +0 -1
- package/dist/agent/managers/insightExtractor.js +0 -401
- package/dist/agent/managers/insightExtractor.js.map +0 -1
- package/dist/agent/managers/memoryDecayScheduler.d.ts +0 -198
- package/dist/agent/managers/memoryDecayScheduler.d.ts.map +0 -1
- package/dist/agent/managers/memoryDecayScheduler.js +0 -349
- package/dist/agent/managers/memoryDecayScheduler.js.map +0 -1
- package/dist/agent/managers/relationBuilder.d.ts +0 -131
- package/dist/agent/managers/relationBuilder.d.ts.map +0 -1
- package/dist/agent/managers/relationBuilder.js +0 -192
- package/dist/agent/managers/relationBuilder.js.map +0 -1
- package/dist/agent/personaMatcher.d.ts +0 -29
- package/dist/agent/personaMatcher.d.ts.map +0 -1
- package/dist/agent/personaMatcher.js +0 -60
- package/dist/agent/personaMatcher.js.map +0 -1
- package/dist/agent/userFactExtractor.d.ts +0 -25
- package/dist/agent/userFactExtractor.d.ts.map +0 -1
- package/dist/agent/userFactExtractor.js +0 -81
- package/dist/agent/userFactExtractor.js.map +0 -1
- package/dist/eval/evalRunner.d.ts +0 -94
- package/dist/eval/evalRunner.d.ts.map +0 -1
- package/dist/eval/evalRunner.js +0 -141
- package/dist/eval/evalRunner.js.map +0 -1
- package/dist/eval/evalTypes.d.ts +0 -148
- package/dist/eval/evalTypes.d.ts.map +0 -1
- package/dist/eval/evalTypes.js +0 -118
- package/dist/eval/evalTypes.js.map +0 -1
- package/dist/eval/scenarios.d.ts +0 -33
- package/dist/eval/scenarios.d.ts.map +0 -1
- package/dist/eval/scenarios.js +0 -109
- package/dist/eval/scenarios.js.map +0 -1
- package/dist/llm/embedding.d.ts +0 -67
- package/dist/llm/embedding.d.ts.map +0 -1
- package/dist/llm/embedding.js +0 -184
- package/dist/llm/embedding.js.map +0 -1
- package/dist/memory/hybridMerge.d.ts +0 -54
- package/dist/memory/hybridMerge.d.ts.map +0 -1
- package/dist/memory/hybridMerge.js +0 -36
- package/dist/memory/hybridMerge.js.map +0 -1
- package/dist/memory/inMemoryRelationStore.d.ts +0 -51
- package/dist/memory/inMemoryRelationStore.d.ts.map +0 -1
- package/dist/memory/inMemoryRelationStore.js +0 -65
- package/dist/memory/inMemoryRelationStore.js.map +0 -1
- package/dist/memory/loader.d.ts +0 -49
- package/dist/memory/loader.d.ts.map +0 -1
- package/dist/memory/loader.js +0 -93
- package/dist/memory/loader.js.map +0 -1
- package/dist/memory/recall.d.ts +0 -66
- package/dist/memory/recall.d.ts.map +0 -1
- package/dist/memory/recall.js +0 -142
- package/dist/memory/recall.js.map +0 -1
- package/dist/memory/relationStore.d.ts +0 -78
- package/dist/memory/relationStore.d.ts.map +0 -1
- package/dist/memory/relationStore.js +0 -2
- package/dist/memory/relationStore.js.map +0 -1
- package/dist/memory/store.d.ts +0 -50
- package/dist/memory/store.d.ts.map +0 -1
- package/dist/memory/store.js +0 -161
- package/dist/memory/store.js.map +0 -1
- package/dist/memory/userProfile.d.ts +0 -156
- package/dist/memory/userProfile.d.ts.map +0 -1
- package/dist/memory/userProfile.js +0 -320
- package/dist/memory/userProfile.js.map +0 -1
- package/dist/memory/vectorStore.d.ts +0 -185
- package/dist/memory/vectorStore.d.ts.map +0 -1
- package/dist/memory/vectorStore.js +0 -257
- package/dist/memory/vectorStore.js.map +0 -1
- package/dist/persona/personaManager.d.ts +0 -160
- package/dist/persona/personaManager.d.ts.map +0 -1
- package/dist/persona/personaManager.js +0 -414
- package/dist/persona/personaManager.js.map +0 -1
- package/dist/persona/types.d.ts +0 -32
- package/dist/persona/types.d.ts.map +0 -1
- package/dist/persona/types.js +0 -5
|
@@ -1,43 +1,23 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* 记忆顾问 —
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
* 两者均为纯只读分析计算,仅依赖 IMemoryStorage,不修改任何状态。
|
|
6
|
-
*
|
|
7
|
-
* 设计原则(延续 MemoryInspector):
|
|
8
|
-
* - 纯只读——只读 IMemoryStorage,不修改任何状态
|
|
9
|
-
* - 同步返回——不调 LLM、不调 SQLite 写入
|
|
10
|
-
* - 无状态——所有数据从 IMemoryStorage 实时读取
|
|
11
|
-
*
|
|
12
|
-
* L3 冲突检测(可选增强):
|
|
13
|
-
* - detectConflicts() 是异步方法,调用 LLM 判断记忆间语义冲突
|
|
14
|
-
* - backgroundProvider 未注入时静默跳过(向后兼容)
|
|
15
|
-
* - 仅检测不修复——冲突需要用户决策(降级哪条由用户选择)
|
|
2
|
+
* 记忆顾问 — sourceHealth()(源健康诊断)+ suggest()(关联推荐)+ detectConflicts()(L3 冲突检测)。
|
|
3
|
+
* 纯只读分析计算,仅依赖 IMemoryStorage 不修改状态;同步返回不调 LLM。
|
|
4
|
+
* L3 冲突检测:异步调 LLM 判断记忆间语义冲突,仅检测不修复(降级哪条由用户决策)。
|
|
16
5
|
*/
|
|
17
6
|
import type { Memory } from '../../memory/types.js';
|
|
18
7
|
import type { IMemoryStorage } from '../../memory/storageInterface.js';
|
|
19
8
|
import type { LlmProvider } from '../../llm/provider.js';
|
|
20
|
-
/**
|
|
21
|
-
export type SourceHealthStatus = 'healthy' | 'warning' | 'critical';
|
|
22
|
-
/** 单个 source 的健康指标 */
|
|
9
|
+
/** 单个 source 的事实观测指标(纯事实,不做健康等级判定) */
|
|
23
10
|
export interface SourceHealthEntry {
|
|
24
|
-
/** 来源标签 */
|
|
25
11
|
source: string;
|
|
26
12
|
/** 记忆数量 */
|
|
27
13
|
count: number;
|
|
28
|
-
/**
|
|
29
|
-
avgScore: number;
|
|
30
|
-
/** 距上次访问的天数(取该 source 中最近访问的记忆) */
|
|
14
|
+
/** 距上次访问的天数(取该 source 中最近访问的记忆,冷记忆观测) */
|
|
31
15
|
daysSinceLastAccess: number;
|
|
32
|
-
/** 健康状态:healthy(score≥0.5 且 7 天内有访问)/ warning(score<0.5 或 7-30 天未访问)/ critical(score<0.2 或 30 天以上未访问) */
|
|
33
|
-
status: SourceHealthStatus;
|
|
34
16
|
}
|
|
35
|
-
/**
|
|
17
|
+
/** 记忆源诊断报告(纯事实观测,不设健康等级——记忆健康由 supersede/命中体现) */
|
|
36
18
|
export interface SourceHealthReport {
|
|
37
|
-
/** 各 source
|
|
19
|
+
/** 各 source 事实观测 */
|
|
38
20
|
sources: SourceHealthEntry[];
|
|
39
|
-
/** 整体健康状态(取最差 source 的状态) */
|
|
40
|
-
overallStatus: SourceHealthStatus;
|
|
41
21
|
/** 诊断时间(ISO 8601) */
|
|
42
22
|
diagnosedAt: string;
|
|
43
23
|
}
|
|
@@ -45,20 +25,17 @@ export interface SourceHealthReport {
|
|
|
45
25
|
export interface SuggestOptions {
|
|
46
26
|
/** 返回数量上限(默认 5) */
|
|
47
27
|
limit?: number;
|
|
48
|
-
/** 排除的 source
|
|
28
|
+
/** 排除的 source 标签(默认空数组——设定记忆已归角色包,不再参与召回排除) */
|
|
49
29
|
excludeSources?: string[];
|
|
50
|
-
/** 时效性权重(0-1,默认 0.3):越高越偏好最近访问的记忆 */
|
|
51
|
-
recencyWeight?: number;
|
|
52
30
|
}
|
|
53
31
|
/** 关联推荐结果 */
|
|
54
32
|
export interface SuggestHit {
|
|
55
33
|
/** 记忆唯一标识(source:name 格式) */
|
|
56
34
|
id: string;
|
|
57
|
-
/** 记忆名称 */
|
|
58
35
|
name: string;
|
|
59
36
|
/** 来源标签 */
|
|
60
37
|
source: string;
|
|
61
|
-
/** 推荐分数(0-1
|
|
38
|
+
/** 推荐分数(0-1,score 退役后为纯时效 recency) */
|
|
62
39
|
relevance: number;
|
|
63
40
|
/** 内容预览(截断到 120 字符) */
|
|
64
41
|
contentPreview: string;
|
|
@@ -67,13 +44,11 @@ export interface SuggestHit {
|
|
|
67
44
|
}
|
|
68
45
|
/** 单对记忆的冲突判断结果 */
|
|
69
46
|
export interface ConflictVerdict {
|
|
70
|
-
/** 记忆 A */
|
|
71
47
|
memoryA: Memory;
|
|
72
|
-
/** 记忆 B */
|
|
73
48
|
memoryB: Memory;
|
|
74
49
|
/** 是否存在语义冲突(true → 需用户决策降级哪条) */
|
|
75
50
|
hasConflict: boolean;
|
|
76
|
-
/** 冲突描述(hasConflict=true
|
|
51
|
+
/** 冲突描述(hasConflict=true 时提供冲突点) */
|
|
77
52
|
conflictDescription?: string;
|
|
78
53
|
/** LLM 建议保留的记忆('a' / 'b' / 'both',仅供参考) */
|
|
79
54
|
recommendation?: 'a' | 'b' | 'both';
|
|
@@ -90,108 +65,40 @@ export interface ConflictReport {
|
|
|
90
65
|
conflictCount: number;
|
|
91
66
|
/** 冲突详情列表(供宿主 UI 展示和用户决策) */
|
|
92
67
|
conflicts: ConflictVerdict[];
|
|
93
|
-
/** 跳过原因(LLM 不可用 /
|
|
68
|
+
/** 跳过原因(LLM 不可用 / 无候选对) */
|
|
94
69
|
skippedReason?: string;
|
|
95
70
|
}
|
|
96
|
-
/**
|
|
97
|
-
* 记忆顾问
|
|
98
|
-
*
|
|
99
|
-
* 从 MemoryInspector 拆分,负责基于记忆数据的分析计算:
|
|
100
|
-
* - sourceHealth():记忆源健康诊断(数量、score、新鲜度)
|
|
101
|
-
* - suggest():关联推荐(基于 score + 时效性 + 多样性)
|
|
102
|
-
* - detectConflicts():语义冲突检测(L3,可选,backgroundProvider 注入后启用)
|
|
103
|
-
*
|
|
104
|
-
* 与 MemoryInspector 的分工:
|
|
105
|
-
* - MemoryInspector:直接数据查询(snapshot/search/stats/relations + 写操作代理)
|
|
106
|
-
* - MemoryAdvisor:分析计算(健康诊断 + 推荐排序 + 冲突检测)
|
|
107
|
-
*/
|
|
71
|
+
/** 记忆顾问:与 MemoryInspector 分工(Inspector 直接数据查询,Advisor 分析计算:健康诊断 + 推荐排序 + 冲突检测) */
|
|
108
72
|
export declare class MemoryAdvisor {
|
|
109
73
|
private readonly index;
|
|
110
74
|
/** 后台 LLM Provider(可选,用于 L3 冲突检测,未注入时跳过) */
|
|
111
75
|
private readonly backgroundProvider;
|
|
76
|
+
/** 治理源列表(默认 GOVERNANCE_SOURCES;空治理源时推荐/冲突检测空转,测试可显式注入) */
|
|
77
|
+
private readonly sources;
|
|
78
|
+
constructor(index: IMemoryStorage, backgroundProvider?: LlmProvider | null, sources?: readonly string[]);
|
|
112
79
|
/**
|
|
113
|
-
*
|
|
114
|
-
*
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
/**
|
|
118
|
-
* 记忆源健康诊断
|
|
119
|
-
*
|
|
120
|
-
* 为每个 source 计算健康指标(数量、平均 score、新鲜度、状态),
|
|
121
|
-
* 帮助宿主项目判断是否需要触发衰减、清理或补充。
|
|
122
|
-
*
|
|
123
|
-
* 健康状态判定:
|
|
124
|
-
* - healthy:avgScore ≥ 0.5 且 7 天内有访问
|
|
125
|
-
* - warning:avgScore < 0.5 或 7-30 天未访问
|
|
126
|
-
* - critical:avgScore < 0.2 或 30 天以上未访问
|
|
127
|
-
*
|
|
128
|
-
* 纯只读、同步、不调 LLM,与 stats() 互补(stats 只有数量,本方法有质量指标)。
|
|
129
|
-
* 使用 getAllSources() 发现所有 source 标签,替代全量 search。
|
|
80
|
+
* 记忆源健康诊断:逐 source 计算记忆数量 / 最近访问天数(纯事实观测)。
|
|
81
|
+
* 不设健康等级:记忆健康由 supersede(写时取代)/ 命中体现,
|
|
82
|
+
* 无需榜单级 status 判定(daysSinceLastAccess 作冷记忆观测)。
|
|
83
|
+
* 纯只读同步不调 LLM,用 getAllSources() 发现所有 source 标签(替代全量 search)。
|
|
130
84
|
*/
|
|
131
85
|
sourceHealth(): SourceHealthReport;
|
|
132
86
|
/**
|
|
133
|
-
*
|
|
134
|
-
*
|
|
135
|
-
*
|
|
136
|
-
* 返回"与你当前关注点相关但尚未直接搜索到"的记忆。
|
|
137
|
-
*
|
|
138
|
-
* 适用场景:
|
|
139
|
-
* - 用户搜索后,展示"你可能还想看"
|
|
140
|
-
* - 对话开始时,展示"最近你可能关心的记忆"
|
|
141
|
-
* - 宿主程序构建个性化推荐面板
|
|
142
|
-
*
|
|
143
|
-
* @param query - 可选的搜索关键词(提供时结合搜索结果推荐,省略时基于全局热度推荐)
|
|
144
|
-
* @param options - 推荐选项
|
|
87
|
+
* 关联推荐:不调 LLM 纯计算,综合 accessedAt(时效)+ source 多样性,
|
|
88
|
+
* 返回"相关但尚未直接搜索到"的记忆。query 提供时结合搜索命中推荐,省略时基于最近使用。
|
|
89
|
+
* relevance 为纯时效(recency)
|
|
145
90
|
*/
|
|
146
91
|
suggest(query?: string, options?: SuggestOptions): SuggestHit[];
|
|
147
92
|
/**
|
|
148
|
-
*
|
|
149
|
-
*
|
|
150
|
-
* 流程:
|
|
151
|
-
* 1. 从 insight/profile/work-projection 加载候选记忆(每个 source 取 top 10 条)
|
|
152
|
-
* 2. 同 source 内两两配对,取前 10 对
|
|
153
|
-
* 3. 对每对调用 LLM 判断是否存在语义冲突
|
|
154
|
-
* 4. 返回冲突报告(仅检测,不修复——冲突需要用户决策)
|
|
155
|
-
*
|
|
156
|
-
* 安全设计:
|
|
157
|
-
* - 仅检测不修复——不自动降级任何记忆,返回冲突详情供用户决策
|
|
158
|
-
* - LLM 失败降级——返回已处理的报告,不阻塞调用方
|
|
159
|
-
* - 单对 LLM 失败不阻塞后续检测
|
|
160
|
-
* - backgroundProvider 未注入时静默跳过(向后兼容)
|
|
161
|
-
*
|
|
162
|
-
* 使用场景:
|
|
163
|
-
* - 宿主定时任务定期检测(如每天一次)
|
|
164
|
-
* - 用户手动触发(记忆管理面板的"检测冲突"按钮)
|
|
165
|
-
* - 健康诊断报告的补充(sourceHealth 显示数量,本方法显示质量冲突)
|
|
166
|
-
*
|
|
167
|
-
* @param signal 可选的 AbortSignal(取消正在进行的 LLM 判断)
|
|
168
|
-
* @returns 冲突检测报告
|
|
93
|
+
* 语义冲突检测:加载候选(每 source top 10)→ 同 source 两两配对(前 10 对)→ LLM 判断冲突。
|
|
94
|
+
* 仅检测不修复(不自动降级,冲突需用户决策);LLM 失败不阻塞;provider 未注入静默跳过。
|
|
169
95
|
*/
|
|
170
96
|
detectConflicts(signal?: AbortSignal): Promise<ConflictReport>;
|
|
171
|
-
/**
|
|
172
|
-
* 筛选同 source 内的候选冲突对
|
|
173
|
-
*
|
|
174
|
-
* 策略:
|
|
175
|
-
* - 按 source 分组,同 source 内两两配对
|
|
176
|
-
* - 限制每个 source 的配对数,避免 O(n²) 爆炸
|
|
177
|
-
* - 总候选对数上限 10 对
|
|
178
|
-
*
|
|
179
|
-
* @param candidates 候选记忆列表(已按 source 分组混合)
|
|
180
|
-
* @returns 同 source 候选对列表
|
|
181
|
-
*/
|
|
97
|
+
/** 筛选同 source 内候选冲突对:按 source 分组两两配对,限制每 source 配对数避免 O(n²) 爆炸,总上限 10 对 */
|
|
182
98
|
private findConflictCandidates;
|
|
183
99
|
/**
|
|
184
|
-
* 调用 LLM
|
|
185
|
-
*
|
|
186
|
-
* 使用结构化 JSON 输出(hasConflict + conflictDescription + recommendation + reason),
|
|
187
|
-
* 参照 SessionArchiver.generateSummary 的 parseLlmJson 模式。
|
|
188
|
-
*
|
|
189
|
-
* LLM 失败时抛出异常(由 detectConflicts 捕获并降级跳过此对)。
|
|
190
|
-
*
|
|
191
|
-
* @param memoryA 记忆 A
|
|
192
|
-
* @param memoryB 记忆 B
|
|
193
|
-
* @param signal 可选的 AbortSignal
|
|
194
|
-
* @returns LLM 判断结果
|
|
100
|
+
* 调用 LLM 判断两条记忆是否冲突:结构化 JSON 输出(hasConflict+conflictDescription+recommendation+reason)。
|
|
101
|
+
* 流式累积/解析/异常封装委托 llmJudgeHelper.judgeWithLlm;失败抛 MemoraError 由调用方捕获跳过。
|
|
195
102
|
*/
|
|
196
103
|
private judgeConflict;
|
|
197
104
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"memoryAdvisor.d.ts","sourceRoot":"","sources":["../../../src/agent/managers/memoryAdvisor.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"memoryAdvisor.d.ts","sourceRoot":"","sources":["../../../src/agent/managers/memoryAdvisor.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAKnE,OAAO,KAAK,EAAE,WAAW,EAAW,MAAM,mBAAmB,CAAC;AA6B9D,sCAAsC;AACtC,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,WAAW;IACX,KAAK,EAAE,MAAM,CAAC;IACd,yCAAyC;IACzC,mBAAmB,EAAE,MAAM,CAAC;CAC7B;AAED,kDAAkD;AAClD,MAAM,WAAW,kBAAkB;IACjC,oBAAoB;IACpB,OAAO,EAAE,iBAAiB,EAAE,CAAC;IAC7B,qBAAqB;IACrB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,aAAa;AACb,MAAM,WAAW,cAAc;IAC7B,mBAAmB;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,+CAA+C;IAC/C,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;CAC3B;AAED,aAAa;AACb,MAAM,WAAW,UAAU;IACzB,6BAA6B;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW;IACX,MAAM,EAAE,MAAM,CAAC;IACf,sCAAsC;IACtC,SAAS,EAAE,MAAM,CAAC;IAClB,uBAAuB;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW;IACX,MAAM,EAAE,MAAM,CAAC;CAChB;AAID,kBAAkB;AAClB,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,iCAAiC;IACjC,WAAW,EAAE,OAAO,CAAC;IACrB,oCAAoC;IACpC,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,2CAA2C;IAC3C,cAAc,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,MAAM,CAAC;IACpC,eAAe;IACf,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,kCAAkC;AAClC,MAAM,WAAW,cAAc;IAC7B,gBAAgB;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,qBAAqB;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,6BAA6B;IAC7B,SAAS,EAAE,eAAe,EAAE,CAAC;IAC7B,2BAA2B;IAC3B,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAID,kFAAkF;AAClF,qBAAa,aAAa;IAOtB,OAAO,CAAC,QAAQ,CAAC,KAAK;IANxB,4CAA4C;IAC5C,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAqB;IACxD,0DAA0D;IAC1D,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAoB;gBAGzB,KAAK,EAAE,cAAc,EACtC,kBAAkB,GAAE,WAAW,GAAG,IAAW,EAC7C,OAAO,GAAE,SAAS,MAAM,EAAuB;IAQjD;;;;;OAKG;IACH,YAAY,IAAI,kBAAkB;IAsClC;;;;OAIG;IACH,OAAO,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,OAAO,GAAE,cAAmB,GAAG,UAAU,EAAE;IA6EnE;;;OAGG;IACG,eAAe,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,cAAc,CAAC;IAwEpE,2EAA2E;IAC3E,OAAO,CAAC,sBAAsB;IA+B9B;;;OAGG;YACW,aAAa;CAiC5B"}
|
|
@@ -1,156 +1,92 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
import {
|
|
1
|
+
import { nowIso, ONE_DAY_MS } from '../../utils/time.js';
|
|
2
|
+
import { roundTo } from '../../utils/math.js';
|
|
3
|
+
// 召回排除默认值 SSOT 共享(设定记忆已归角色包,默认不排除)
|
|
4
|
+
import { DEFAULT_RECALL_EXCLUDE_SOURCES } from '../../utils/recallDefaults.js';
|
|
5
|
+
// LLM judge 高阶函数(流式累积 + parseLlmJson + configError 封装)
|
|
6
|
+
import { judgeWithLlm } from '../../agent/managers/llmJudgeHelper.js';
|
|
7
|
+
import { byAccessedDesc } from '../../utils/array.js';
|
|
7
8
|
import { truncate } from '../../utils/strings.js';
|
|
8
9
|
import { logger } from '../../logging/logger.js';
|
|
10
|
+
// 治理源列表 SSOT(设定记忆已归角色包)
|
|
11
|
+
import { GOVERNANCE_SOURCES } from '../../memory/governance.js';
|
|
9
12
|
// ─── 常量 ────────────────────────────────────────────────
|
|
10
13
|
/** 关联推荐:每个 source 采样 top-N 条 */
|
|
11
14
|
const SUGGEST_TOP_PER_SOURCE = 3;
|
|
12
|
-
/**
|
|
15
|
+
/** 关联推荐:时效性窗口(天),超过此天数 relevance 归零(score 退役后纯时效排序) */
|
|
13
16
|
const SUGGEST_RECENCY_WINDOW_DAYS = 30;
|
|
14
|
-
/**
|
|
17
|
+
/** 推荐内容预览字符数 */
|
|
15
18
|
const ADVISOR_PREVIEW_LEN = 120;
|
|
16
|
-
/** source 健康度阈值(低于此值或超期触发 critical/warning) */
|
|
17
|
-
const SOURCE_HEALTH_THRESHOLDS = {
|
|
18
|
-
/** 平均 score 低于此值 → critical */
|
|
19
|
-
CRITICAL_SCORE: 0.2,
|
|
20
|
-
/** 平均 score 低于此值 → warning */
|
|
21
|
-
WARNING_SCORE: 0.5,
|
|
22
|
-
/** 超过此天数未访问 → critical */
|
|
23
|
-
CRITICAL_DAYS: 30,
|
|
24
|
-
/** 超过此天数未访问 → warning */
|
|
25
|
-
WARNING_DAYS: 7,
|
|
26
|
-
};
|
|
27
19
|
// ─── L3 冲突检测常量 ────────────────────────────────────
|
|
28
|
-
/**
|
|
29
|
-
const CONFLICT_SOURCES = [SOURCE_LABELS.INSIGHT, SOURCE_LABELS.PROFILE, SOURCE_LABELS.WORK_PROJECTION];
|
|
30
|
-
/** 单个 source 内参与配对的记忆条数上限(控制 O(n²) 配对规模) */
|
|
20
|
+
/** 单个 source 内参与配对的条数上限(控制 O(n²) 配对规模) */
|
|
31
21
|
const CONFLICT_CANDIDATES_PER_SOURCE = 10;
|
|
32
22
|
/** 单次 LLM 冲突判断的候选对数上限 */
|
|
33
23
|
const CONFLICT_PAIR_LIMIT = 10;
|
|
34
24
|
/** LLM 冲突判断超时(ms) */
|
|
35
25
|
const CONFLICT_TIMEOUT_MS = 15_000;
|
|
36
|
-
/**
|
|
26
|
+
/** 候选内容预览长度(送入 LLM 前截断) */
|
|
37
27
|
const CONFLICT_CONTENT_PREVIEW_LEN = 200;
|
|
38
28
|
// ─── 类 ──────────────────────────────────────────────────
|
|
39
|
-
/**
|
|
40
|
-
* 记忆顾问
|
|
41
|
-
*
|
|
42
|
-
* 从 MemoryInspector 拆分,负责基于记忆数据的分析计算:
|
|
43
|
-
* - sourceHealth():记忆源健康诊断(数量、score、新鲜度)
|
|
44
|
-
* - suggest():关联推荐(基于 score + 时效性 + 多样性)
|
|
45
|
-
* - detectConflicts():语义冲突检测(L3,可选,backgroundProvider 注入后启用)
|
|
46
|
-
*
|
|
47
|
-
* 与 MemoryInspector 的分工:
|
|
48
|
-
* - MemoryInspector:直接数据查询(snapshot/search/stats/relations + 写操作代理)
|
|
49
|
-
* - MemoryAdvisor:分析计算(健康诊断 + 推荐排序 + 冲突检测)
|
|
50
|
-
*/
|
|
29
|
+
/** 记忆顾问:与 MemoryInspector 分工(Inspector 直接数据查询,Advisor 分析计算:健康诊断 + 推荐排序 + 冲突检测) */
|
|
51
30
|
export class MemoryAdvisor {
|
|
52
31
|
index;
|
|
53
32
|
/** 后台 LLM Provider(可选,用于 L3 冲突检测,未注入时跳过) */
|
|
54
33
|
backgroundProvider;
|
|
55
|
-
/**
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
*/
|
|
59
|
-
constructor(index, backgroundProvider = null) {
|
|
34
|
+
/** 治理源列表(默认 GOVERNANCE_SOURCES;空治理源时推荐/冲突检测空转,测试可显式注入) */
|
|
35
|
+
sources;
|
|
36
|
+
constructor(index, backgroundProvider = null, sources = GOVERNANCE_SOURCES) {
|
|
60
37
|
this.index = index;
|
|
61
38
|
this.backgroundProvider = backgroundProvider;
|
|
39
|
+
this.sources = sources;
|
|
62
40
|
}
|
|
63
41
|
// ─── 源健康诊断 ─────────────────────────────────────────
|
|
64
42
|
/**
|
|
65
|
-
*
|
|
66
|
-
*
|
|
67
|
-
*
|
|
68
|
-
*
|
|
69
|
-
*
|
|
70
|
-
* 健康状态判定:
|
|
71
|
-
* - healthy:avgScore ≥ 0.5 且 7 天内有访问
|
|
72
|
-
* - warning:avgScore < 0.5 或 7-30 天未访问
|
|
73
|
-
* - critical:avgScore < 0.2 或 30 天以上未访问
|
|
74
|
-
*
|
|
75
|
-
* 纯只读、同步、不调 LLM,与 stats() 互补(stats 只有数量,本方法有质量指标)。
|
|
76
|
-
* 使用 getAllSources() 发现所有 source 标签,替代全量 search。
|
|
43
|
+
* 记忆源健康诊断:逐 source 计算记忆数量 / 最近访问天数(纯事实观测)。
|
|
44
|
+
* 不设健康等级:记忆健康由 supersede(写时取代)/ 命中体现,
|
|
45
|
+
* 无需榜单级 status 判定(daysSinceLastAccess 作冷记忆观测)。
|
|
46
|
+
* 纯只读同步不调 LLM,用 getAllSources() 发现所有 source 标签(替代全量 search)。
|
|
77
47
|
*/
|
|
78
48
|
sourceHealth() {
|
|
79
|
-
|
|
80
|
-
// 使用 getAllSources() 获取所有有数据的 source 标签
|
|
49
|
+
// 获取所有有数据的 source 标签
|
|
81
50
|
const sourceMap = this.index.getAllSources();
|
|
82
51
|
const sourceSet = new Set();
|
|
83
52
|
for (const [source, count] of sourceMap) {
|
|
84
53
|
if (count > 0)
|
|
85
54
|
sourceSet.add(source);
|
|
86
55
|
}
|
|
87
|
-
// 逐 source 计算健康指标
|
|
88
56
|
const entries = [];
|
|
89
57
|
for (const source of sourceSet) {
|
|
90
58
|
const memories = this.index.getBySource(source);
|
|
91
59
|
const count = memories.length;
|
|
92
|
-
//
|
|
93
|
-
const avgScore = count > 0
|
|
94
|
-
? memories.reduce((sum, m) => sum + m.score, 0) / count
|
|
95
|
-
: 0;
|
|
96
|
-
// 最近访问时间(取该 source 中最新的 accessedAt)
|
|
60
|
+
// 最近访问时间(取该 source 中最新 accessedAt)
|
|
97
61
|
const latestAccess = memories
|
|
98
62
|
.map((m) => new Date(m.accessedAt).getTime())
|
|
99
63
|
.filter((t) => !isNaN(t))
|
|
100
64
|
.sort((a, b) => b - a)[0] ?? 0;
|
|
101
|
-
const daysSinceLastAccess = latestAccess > 0
|
|
102
|
-
? (now - latestAccess) / ONE_DAY_MS
|
|
103
|
-
: Infinity;
|
|
104
|
-
// 健康状态判定
|
|
105
|
-
let status;
|
|
106
|
-
if (avgScore < SOURCE_HEALTH_THRESHOLDS.CRITICAL_SCORE || daysSinceLastAccess > SOURCE_HEALTH_THRESHOLDS.CRITICAL_DAYS) {
|
|
107
|
-
status = 'critical';
|
|
108
|
-
}
|
|
109
|
-
else if (avgScore < SOURCE_HEALTH_THRESHOLDS.WARNING_SCORE || daysSinceLastAccess > SOURCE_HEALTH_THRESHOLDS.WARNING_DAYS) {
|
|
110
|
-
status = 'warning';
|
|
111
|
-
}
|
|
112
|
-
else {
|
|
113
|
-
status = 'healthy';
|
|
114
|
-
}
|
|
65
|
+
const daysSinceLastAccess = latestAccess > 0 ? (Date.now() - latestAccess) / ONE_DAY_MS : Infinity;
|
|
115
66
|
entries.push({
|
|
116
67
|
source,
|
|
117
68
|
count,
|
|
118
|
-
|
|
119
|
-
daysSinceLastAccess: Math.round(daysSinceLastAccess * 10) / 10,
|
|
120
|
-
status,
|
|
69
|
+
daysSinceLastAccess: roundTo(daysSinceLastAccess, 1),
|
|
121
70
|
});
|
|
122
71
|
}
|
|
123
|
-
// 整体状态取最差 source
|
|
124
|
-
const statusPriority = { healthy: 0, warning: 1, critical: 2 };
|
|
125
|
-
const overallStatus = entries.reduce((worst, e) => statusPriority[e.status] > statusPriority[worst] ? e.status : worst, 'healthy');
|
|
126
72
|
return {
|
|
127
|
-
|
|
128
|
-
|
|
73
|
+
// 按 source 名稳定排序(保证输出可预期;无关健康等级)
|
|
74
|
+
sources: entries.sort((a, b) => a.source.localeCompare(b.source)),
|
|
129
75
|
diagnosedAt: nowIso(),
|
|
130
76
|
};
|
|
131
77
|
}
|
|
132
78
|
// ─── 关联推荐 ─────────────────────────────────────────
|
|
133
79
|
/**
|
|
134
|
-
*
|
|
135
|
-
*
|
|
136
|
-
*
|
|
137
|
-
* 返回"与你当前关注点相关但尚未直接搜索到"的记忆。
|
|
138
|
-
*
|
|
139
|
-
* 适用场景:
|
|
140
|
-
* - 用户搜索后,展示"你可能还想看"
|
|
141
|
-
* - 对话开始时,展示"最近你可能关心的记忆"
|
|
142
|
-
* - 宿主程序构建个性化推荐面板
|
|
143
|
-
*
|
|
144
|
-
* @param query - 可选的搜索关键词(提供时结合搜索结果推荐,省略时基于全局热度推荐)
|
|
145
|
-
* @param options - 推荐选项
|
|
80
|
+
* 关联推荐:不调 LLM 纯计算,综合 accessedAt(时效)+ source 多样性,
|
|
81
|
+
* 返回"相关但尚未直接搜索到"的记忆。query 提供时结合搜索命中推荐,省略时基于最近使用。
|
|
82
|
+
* relevance 为纯时效(recency)
|
|
146
83
|
*/
|
|
147
84
|
suggest(query, options = {}) {
|
|
148
|
-
const { limit = 5, excludeSources = [
|
|
149
|
-
const scoreWeight = 1 - recencyWeight;
|
|
85
|
+
const { limit = 5, excludeSources = [...DEFAULT_RECALL_EXCLUDE_SOURCES] } = options;
|
|
150
86
|
const now = Date.now();
|
|
151
87
|
// 收集候选记忆
|
|
152
88
|
const candidates = new Map();
|
|
153
|
-
//
|
|
89
|
+
// 有 query 时先搜直接命中(标记 searchHit)
|
|
154
90
|
if (query && query.trim()) {
|
|
155
91
|
const directHits = this.index.search(query, limit * 3);
|
|
156
92
|
for (const m of directHits) {
|
|
@@ -159,14 +95,13 @@ export class MemoryAdvisor {
|
|
|
159
95
|
}
|
|
160
96
|
}
|
|
161
97
|
}
|
|
162
|
-
//
|
|
163
|
-
const
|
|
164
|
-
for (const source of knownSources) {
|
|
98
|
+
// 按 source 分组采样,确保来源多样性
|
|
99
|
+
for (const source of this.sources) {
|
|
165
100
|
const count = this.index.countBySource(source);
|
|
166
101
|
if (count > 0 && !excludeSources.includes(source)) {
|
|
167
102
|
const memories = this.index.getBySource(source);
|
|
168
|
-
//
|
|
169
|
-
const top = memories.sort(
|
|
103
|
+
// 取最近使用的前 N 条(score 退役后按 accessedAt 降序)
|
|
104
|
+
const top = memories.sort(byAccessedDesc).slice(0, SUGGEST_TOP_PER_SOURCE);
|
|
170
105
|
for (const m of top) {
|
|
171
106
|
if (!candidates.has(m.id)) {
|
|
172
107
|
candidates.set(m.id, { memory: m, searchHit: false });
|
|
@@ -176,16 +111,14 @@ export class MemoryAdvisor {
|
|
|
176
111
|
}
|
|
177
112
|
if (candidates.size === 0)
|
|
178
113
|
return [];
|
|
179
|
-
// 计算综合推荐分数
|
|
180
114
|
const scored = [];
|
|
181
115
|
for (const { memory, searchHit } of candidates.values()) {
|
|
182
|
-
//
|
|
116
|
+
// 时效性分:窗口内线性衰减,超过窗口归零;score 退役后 relevance 即纯时效
|
|
183
117
|
const accessedAt = new Date(memory.accessedAt);
|
|
184
118
|
const daysSinceAccess = isNaN(accessedAt.getTime())
|
|
185
119
|
? SUGGEST_RECENCY_WINDOW_DAYS
|
|
186
120
|
: (now - accessedAt.getTime()) / ONE_DAY_MS;
|
|
187
|
-
const
|
|
188
|
-
const relevance = memory.score * scoreWeight + recency * recencyWeight;
|
|
121
|
+
const relevance = Math.max(0, 1 - daysSinceAccess / SUGGEST_RECENCY_WINDOW_DAYS);
|
|
189
122
|
// 生成推荐理由
|
|
190
123
|
let reason;
|
|
191
124
|
if (searchHit) {
|
|
@@ -194,9 +127,6 @@ export class MemoryAdvisor {
|
|
|
194
127
|
else if (daysSinceAccess < 1) {
|
|
195
128
|
reason = '最近访问';
|
|
196
129
|
}
|
|
197
|
-
else if (memory.score >= 0.8) {
|
|
198
|
-
reason = '高频记忆';
|
|
199
|
-
}
|
|
200
130
|
else {
|
|
201
131
|
reason = `${memory.source} 推荐`;
|
|
202
132
|
}
|
|
@@ -212,37 +142,18 @@ export class MemoryAdvisor {
|
|
|
212
142
|
id: memory.id,
|
|
213
143
|
name: memory.name,
|
|
214
144
|
source: memory.source,
|
|
215
|
-
relevance:
|
|
145
|
+
relevance: roundTo(relevance, 2),
|
|
216
146
|
contentPreview: truncate(memory.content, ADVISOR_PREVIEW_LEN),
|
|
217
147
|
reason,
|
|
218
148
|
}));
|
|
219
149
|
}
|
|
220
150
|
// ─── L3 语义冲突检测(可选,backgroundProvider 注入后启用) ───
|
|
221
151
|
/**
|
|
222
|
-
*
|
|
223
|
-
*
|
|
224
|
-
* 流程:
|
|
225
|
-
* 1. 从 insight/profile/work-projection 加载候选记忆(每个 source 取 top 10 条)
|
|
226
|
-
* 2. 同 source 内两两配对,取前 10 对
|
|
227
|
-
* 3. 对每对调用 LLM 判断是否存在语义冲突
|
|
228
|
-
* 4. 返回冲突报告(仅检测,不修复——冲突需要用户决策)
|
|
229
|
-
*
|
|
230
|
-
* 安全设计:
|
|
231
|
-
* - 仅检测不修复——不自动降级任何记忆,返回冲突详情供用户决策
|
|
232
|
-
* - LLM 失败降级——返回已处理的报告,不阻塞调用方
|
|
233
|
-
* - 单对 LLM 失败不阻塞后续检测
|
|
234
|
-
* - backgroundProvider 未注入时静默跳过(向后兼容)
|
|
235
|
-
*
|
|
236
|
-
* 使用场景:
|
|
237
|
-
* - 宿主定时任务定期检测(如每天一次)
|
|
238
|
-
* - 用户手动触发(记忆管理面板的"检测冲突"按钮)
|
|
239
|
-
* - 健康诊断报告的补充(sourceHealth 显示数量,本方法显示质量冲突)
|
|
240
|
-
*
|
|
241
|
-
* @param signal 可选的 AbortSignal(取消正在进行的 LLM 判断)
|
|
242
|
-
* @returns 冲突检测报告
|
|
152
|
+
* 语义冲突检测:加载候选(每 source top 10)→ 同 source 两两配对(前 10 对)→ LLM 判断冲突。
|
|
153
|
+
* 仅检测不修复(不自动降级,冲突需用户决策);LLM 失败不阻塞;provider 未注入静默跳过。
|
|
243
154
|
*/
|
|
244
155
|
async detectConflicts(signal) {
|
|
245
|
-
//
|
|
156
|
+
// provider 未注入时静默降级
|
|
246
157
|
if (!this.backgroundProvider) {
|
|
247
158
|
return {
|
|
248
159
|
scannedCount: 0,
|
|
@@ -252,12 +163,11 @@ export class MemoryAdvisor {
|
|
|
252
163
|
skippedReason: 'backgroundProvider 未注入',
|
|
253
164
|
};
|
|
254
165
|
}
|
|
255
|
-
// ── 步骤 1:加载候选记忆(每个 source 取 top 10 条,按 score 降序) ──
|
|
256
166
|
const candidates = [];
|
|
257
|
-
for (const source of
|
|
167
|
+
for (const source of this.sources) {
|
|
258
168
|
const memories = this.index.getBySource(source);
|
|
259
|
-
// 按
|
|
260
|
-
const top = memories.sort(
|
|
169
|
+
// 按 accessedAt 降序取 top N(score 退役后按最近使用采样)
|
|
170
|
+
const top = memories.sort(byAccessedDesc).slice(0, CONFLICT_CANDIDATES_PER_SOURCE);
|
|
261
171
|
candidates.push(...top);
|
|
262
172
|
}
|
|
263
173
|
if (candidates.length < 2) {
|
|
@@ -269,7 +179,7 @@ export class MemoryAdvisor {
|
|
|
269
179
|
skippedReason: '候选记忆不足(少于 2 条)',
|
|
270
180
|
};
|
|
271
181
|
}
|
|
272
|
-
//
|
|
182
|
+
// 同 source 内两两配对
|
|
273
183
|
const pairs = this.findConflictCandidates(candidates);
|
|
274
184
|
if (pairs.length === 0) {
|
|
275
185
|
return {
|
|
@@ -280,7 +190,7 @@ export class MemoryAdvisor {
|
|
|
280
190
|
skippedReason: '无同 source 候选对',
|
|
281
191
|
};
|
|
282
192
|
}
|
|
283
|
-
//
|
|
193
|
+
// 逐对调用 LLM 判断冲突
|
|
284
194
|
const conflicts = [];
|
|
285
195
|
for (const pair of pairs) {
|
|
286
196
|
try {
|
|
@@ -302,17 +212,7 @@ export class MemoryAdvisor {
|
|
|
302
212
|
conflicts,
|
|
303
213
|
};
|
|
304
214
|
}
|
|
305
|
-
/**
|
|
306
|
-
* 筛选同 source 内的候选冲突对
|
|
307
|
-
*
|
|
308
|
-
* 策略:
|
|
309
|
-
* - 按 source 分组,同 source 内两两配对
|
|
310
|
-
* - 限制每个 source 的配对数,避免 O(n²) 爆炸
|
|
311
|
-
* - 总候选对数上限 10 对
|
|
312
|
-
*
|
|
313
|
-
* @param candidates 候选记忆列表(已按 source 分组混合)
|
|
314
|
-
* @returns 同 source 候选对列表
|
|
315
|
-
*/
|
|
215
|
+
/** 筛选同 source 内候选冲突对:按 source 分组两两配对,限制每 source 配对数避免 O(n²) 爆炸,总上限 10 对 */
|
|
316
216
|
findConflictCandidates(candidates) {
|
|
317
217
|
// 按 source 分组
|
|
318
218
|
const bySource = new Map();
|
|
@@ -343,36 +243,12 @@ export class MemoryAdvisor {
|
|
|
343
243
|
return pairs.slice(0, CONFLICT_PAIR_LIMIT);
|
|
344
244
|
}
|
|
345
245
|
/**
|
|
346
|
-
* 调用 LLM
|
|
347
|
-
*
|
|
348
|
-
* 使用结构化 JSON 输出(hasConflict + conflictDescription + recommendation + reason),
|
|
349
|
-
* 参照 SessionArchiver.generateSummary 的 parseLlmJson 模式。
|
|
350
|
-
*
|
|
351
|
-
* LLM 失败时抛出异常(由 detectConflicts 捕获并降级跳过此对)。
|
|
352
|
-
*
|
|
353
|
-
* @param memoryA 记忆 A
|
|
354
|
-
* @param memoryB 记忆 B
|
|
355
|
-
* @param signal 可选的 AbortSignal
|
|
356
|
-
* @returns LLM 判断结果
|
|
246
|
+
* 调用 LLM 判断两条记忆是否冲突:结构化 JSON 输出(hasConflict+conflictDescription+recommendation+reason)。
|
|
247
|
+
* 流式累积/解析/异常封装委托 llmJudgeHelper.judgeWithLlm;失败抛 MemoraError 由调用方捕获跳过。
|
|
357
248
|
*/
|
|
358
249
|
async judgeConflict(memoryA, memoryB, signal) {
|
|
359
250
|
const messages = buildConflictMessages(memoryA, memoryB);
|
|
360
|
-
|
|
361
|
-
// 流式累积模式(与 TextPolishManager / SessionArchiver 一致)
|
|
362
|
-
for await (const chunk of this.backgroundProvider.chat(messages, {
|
|
363
|
-
maxTokens: 300,
|
|
364
|
-
temperature: 0,
|
|
365
|
-
timeoutMs: CONFLICT_TIMEOUT_MS,
|
|
366
|
-
signal,
|
|
367
|
-
})) {
|
|
368
|
-
if (chunk.content)
|
|
369
|
-
llmResponse += chunk.content;
|
|
370
|
-
}
|
|
371
|
-
// 解析 LLM 响应(JSON 格式)
|
|
372
|
-
const parsed = parseLlmJson(llmResponse.trim());
|
|
373
|
-
if (!parsed) {
|
|
374
|
-
throw new Error('LLM 冲突判断返回非法 JSON');
|
|
375
|
-
}
|
|
251
|
+
const parsed = await judgeWithLlm(this.backgroundProvider, messages, { maxTokens: 300, timeoutMs: CONFLICT_TIMEOUT_MS, signal }, 'LLM 冲突判断返回非法 JSON');
|
|
376
252
|
// 校验 recommendation 字段(允许 'a' / 'b' / 'both',其他值忽略)
|
|
377
253
|
const recRaw = parsed.recommendation;
|
|
378
254
|
const recommendation = recRaw === 'a' || recRaw === 'b' || recRaw === 'both' ? recRaw : undefined;
|
|
@@ -386,20 +262,8 @@ export class MemoryAdvisor {
|
|
|
386
262
|
};
|
|
387
263
|
}
|
|
388
264
|
}
|
|
389
|
-
// ─── L3 冲突检测 Prompt
|
|
390
|
-
/**
|
|
391
|
-
* 构建冲突判断的 LLM 消息
|
|
392
|
-
*
|
|
393
|
-
* 设计要点:
|
|
394
|
-
* - system 消息定义判断规则(冲突 = 两条记忆表达互相矛盾的信息)
|
|
395
|
-
* - user 消息携带两条记忆的内容预览(截断到 200 字符)
|
|
396
|
-
* - 要求输出结构化 JSON(hasConflict + conflictDescription + recommendation + reason)
|
|
397
|
-
* - few-shot 示例降低 LLM 误判率
|
|
398
|
-
*
|
|
399
|
-
* @param memoryA 记忆 A
|
|
400
|
-
* @param memoryB 记忆 B
|
|
401
|
-
* @returns system + user 消息数组
|
|
402
|
-
*/
|
|
265
|
+
// ─── L3 冲突检测 Prompt 模板(模块级函数) ───
|
|
266
|
+
/** 构建冲突判断的 LLM 消息:system 定义冲突规则 + user 携带两条记忆内容预览,few-shot 降误判率 */
|
|
403
267
|
function buildConflictMessages(memoryA, memoryB) {
|
|
404
268
|
const contentA = memoryA.content.length > CONFLICT_CONTENT_PREVIEW_LEN
|
|
405
269
|
? truncate(memoryA.content, CONFLICT_CONTENT_PREVIEW_LEN, '…[截断]')
|
|
@@ -439,13 +303,13 @@ function buildConflictMessages(memoryA, memoryB) {
|
|
|
439
303
|
role: 'user',
|
|
440
304
|
content: `请判断以下两条记忆是否存在语义冲突:
|
|
441
305
|
|
|
442
|
-
记忆 A
|
|
306
|
+
记忆 A:
|
|
443
307
|
- 名称:${memoryA.name}
|
|
444
308
|
- 来源:${memoryA.source}
|
|
445
309
|
- 创建时间:${memoryA.createdAt}
|
|
446
310
|
- 内容:${contentA}
|
|
447
311
|
|
|
448
|
-
记忆 B
|
|
312
|
+
记忆 B:
|
|
449
313
|
- 名称:${memoryB.name}
|
|
450
314
|
- 来源:${memoryB.source}
|
|
451
315
|
- 创建时间:${memoryB.createdAt}
|