@zooique/memora 2.0.3 → 3.0.1
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 +1037 -0
- package/README.en.md +305 -272
- package/README.md +303 -260
- package/config.example.json +43 -0
- package/dist/agent/agent.d.ts +376 -408
- package/dist/agent/agent.d.ts.map +1 -1
- package/dist/agent/agent.js +1166 -926
- package/dist/agent/agent.js.map +1 -1
- package/dist/agent/assembler.d.ts +105 -43
- package/dist/agent/assembler.d.ts.map +1 -1
- package/dist/agent/assembler.js +543 -75
- 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 +225 -38
- package/dist/agent/builtinToolHandlers.d.ts.map +1 -1
- package/dist/agent/builtinToolHandlers.js +748 -132
- 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 +137 -20
- package/dist/agent/constants.d.ts.map +1 -1
- package/dist/agent/constants.js +152 -20
- package/dist/agent/constants.js.map +1 -1
- package/dist/agent/contextManager.d.ts +119 -77
- package/dist/agent/contextManager.d.ts.map +1 -1
- package/dist/agent/contextManager.js +192 -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 +716 -295
- package/dist/agent/loop.d.ts.map +1 -1
- package/dist/agent/loop.js +2178 -664
- package/dist/agent/loop.js.map +1 -1
- package/dist/agent/managers/archiveCoordinator.d.ts +14 -171
- package/dist/agent/managers/archiveCoordinator.d.ts.map +1 -1
- package/dist/agent/managers/archiveCoordinator.js +19 -287
- 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 +31 -115
- package/dist/agent/managers/dedupManager.d.ts.map +1 -1
- package/dist/agent/managers/dedupManager.js +48 -136
- package/dist/agent/managers/dedupManager.js.map +1 -1
- 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 +8 -25
- package/dist/agent/managers/llmJudgeHelper.d.ts.map +1 -1
- package/dist/agent/managers/llmJudgeHelper.js +7 -24
- package/dist/agent/managers/llmJudgeHelper.js.map +1 -1
- 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 +85 -207
- package/dist/agent/managers/memoryAdvisor.js.map +1 -1
- package/dist/agent/managers/memoryGovernance.d.ts +10 -42
- package/dist/agent/managers/memoryGovernance.d.ts.map +1 -1
- package/dist/agent/managers/memoryGovernance.js +19 -36
- package/dist/agent/managers/memoryGovernance.js.map +1 -1
- package/dist/agent/managers/memoryInspector.d.ts +59 -268
- package/dist/agent/managers/memoryInspector.d.ts.map +1 -1
- package/dist/agent/managers/memoryInspector.js +91 -442
- 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 -68
- package/dist/agent/managers/sessionArchiver.d.ts.map +1 -1
- package/dist/agent/managers/sessionArchiver.js +76 -147
- 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 +8 -33
- package/dist/agent/managers/streamAccumulator.d.ts.map +1 -1
- package/dist/agent/managers/streamAccumulator.js +4 -29
- package/dist/agent/managers/streamAccumulator.js.map +1 -1
- 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 +9 -41
- 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 +55 -100
- package/dist/agent/managers/workProjection.d.ts.map +1 -1
- package/dist/agent/managers/workProjection.js +164 -268
- 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 +236 -10
- package/dist/agent/toolExecutor.d.ts.map +1 -1
- package/dist/agent/toolExecutor.js +932 -21
- 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 +510 -169
- 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 +27 -98
- package/dist/config/loader.d.ts.map +1 -1
- package/dist/config/loader.js +110 -223
- package/dist/config/loader.js.map +1 -1
- package/dist/index.d.ts +67 -77
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +90 -69
- 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 +22 -32
- package/dist/llm/factory.d.ts.map +1 -1
- package/dist/llm/factory.js +29 -46
- 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 +179 -120
- 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 -31
- package/dist/logging/logger.d.ts.map +1 -1
- package/dist/logging/logger.js +28 -215
- 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 +11 -44
- package/dist/memory/governance.d.ts.map +1 -1
- package/dist/memory/governance.js +11 -64
- package/dist/memory/governance.js.map +1 -1
- 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 +25 -175
- package/dist/memory/inMemoryStorage.d.ts.map +1 -1
- package/dist/memory/inMemoryStorage.js +32 -221
- 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 +2 -2
- package/dist/memory/lockManager.d.ts.map +1 -1
- package/dist/memory/lockManager.js +6 -8
- package/dist/memory/lockManager.js.map +1 -1
- package/dist/memory/projectManager.d.ts +30 -129
- package/dist/memory/projectManager.d.ts.map +1 -1
- package/dist/memory/projectManager.js +39 -189
- package/dist/memory/projectManager.js.map +1 -1
- package/dist/memory/projectRegistry.d.ts +14 -62
- package/dist/memory/projectRegistry.d.ts.map +1 -1
- package/dist/memory/projectRegistry.js +27 -111
- 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 +10 -12
- package/dist/memory/sourceValidation.d.ts.map +1 -1
- package/dist/memory/sourceValidation.js +16 -32
- package/dist/memory/sourceValidation.js.map +1 -1
- package/dist/memory/storageInterface.d.ts +44 -150
- package/dist/memory/storageInterface.d.ts.map +1 -1
- package/dist/memory/types.d.ts +65 -164
- package/dist/memory/types.d.ts.map +1 -1
- package/dist/memory/types.js +81 -83
- 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 +136 -19
- package/dist/skill/skillManager.d.ts.map +1 -1
- package/dist/skill/skillManager.js +312 -61
- 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 -16
- 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 +40 -72
- package/dist/utils/configResourceManager.d.ts.map +1 -1
- package/dist/utils/configResourceManager.js +78 -76
- package/dist/utils/configResourceManager.js.map +1 -1
- package/dist/utils/errors.d.ts +44 -69
- package/dist/utils/errors.d.ts.map +1 -1
- package/dist/utils/errors.js +54 -71
- package/dist/utils/errors.js.map +1 -1
- package/dist/utils/eventEmitter.d.ts +104 -103
- package/dist/utils/eventEmitter.d.ts.map +1 -1
- package/dist/utils/eventEmitter.js +37 -45
- 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 +2 -3
- 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 +25 -3
- package/dist/utils/math.d.ts.map +1 -1
- package/dist/utils/math.js +32 -16
- 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 -19
- package/dist/utils/segmenter.d.ts.map +1 -1
- package/dist/utils/segmenter.js +230 -97
- 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 +416 -476
- package/docs/memora-/346/216/245/345/205/245/346/214/207/345/215/227.md +841 -806
- 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 -100
- 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 -49
- package/dist/agent/guardrail.d.ts.map +0 -1
- package/dist/agent/guardrail.js +0 -59
- 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 -146
- package/dist/agent/managers/autoConfigRefiner.js.map +0 -1
- package/dist/agent/managers/configManager.d.ts +0 -209
- package/dist/agent/managers/configManager.d.ts.map +0 -1
- package/dist/agent/managers/configManager.js +0 -331
- 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 -239
- package/dist/agent/managers/memoryDecayScheduler.d.ts.map +0 -1
- package/dist/agent/managers/memoryDecayScheduler.js +0 -413
- 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 -88
- 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 -79
- 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 -50
- package/dist/memory/hybridMerge.d.ts.map +0 -1
- package/dist/memory/hybridMerge.js +0 -51
- package/dist/memory/hybridMerge.js.map +0 -1
- package/dist/memory/inMemoryRelationStore.d.ts +0 -58
- package/dist/memory/inMemoryRelationStore.d.ts.map +0 -1
- package/dist/memory/inMemoryRelationStore.js +0 -80
- package/dist/memory/inMemoryRelationStore.js.map +0 -1
- package/dist/memory/loader.d.ts +0 -51
- package/dist/memory/loader.d.ts.map +0 -1
- package/dist/memory/loader.js +0 -100
- package/dist/memory/loader.js.map +0 -1
- package/dist/memory/recall.d.ts +0 -82
- package/dist/memory/recall.d.ts.map +0 -1
- package/dist/memory/recall.js +0 -157
- package/dist/memory/recall.js.map +0 -1
- package/dist/memory/relationStore.d.ts +0 -95
- 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 -71
- package/dist/memory/store.d.ts.map +0 -1
- package/dist/memory/store.js +0 -199
- package/dist/memory/store.js.map +0 -1
- package/dist/memory/userProfile.d.ts +0 -180
- package/dist/memory/userProfile.d.ts.map +0 -1
- package/dist/memory/userProfile.js +0 -381
- package/dist/memory/userProfile.js.map +0 -1
- package/dist/memory/vectorStore.d.ts +0 -179
- package/dist/memory/vectorStore.d.ts.map +0 -1
- package/dist/memory/vectorStore.js +0 -284
- package/dist/memory/vectorStore.js.map +0 -1
- package/dist/persona/personaManager.d.ts +0 -109
- package/dist/persona/personaManager.d.ts.map +0 -1
- package/dist/persona/personaManager.js +0 -315
- 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,185 +1,101 @@
|
|
|
1
1
|
import { validateSource } from '../memory/sourceValidation.js';
|
|
2
2
|
import { segmentLower } from '../utils/segmenter.js';
|
|
3
|
-
import {
|
|
3
|
+
import { byAccessedDesc } from '../utils/array.js';
|
|
4
4
|
import { configError } from '../utils/errors.js';
|
|
5
5
|
import { logger } from '../logging/logger.js';
|
|
6
|
-
import { applyDecayToMemory } from '../memory/recall.js';
|
|
7
6
|
import { nowIso } from '../utils/time.js';
|
|
8
|
-
import { DECAY_FLOOR, SCORE_CEILING } from '../memory/governance.js';
|
|
9
7
|
/**
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
* 使用 Map 存储记忆,核心操作 O(1)~O(log n)。
|
|
13
|
-
* 优化:维护 source→count 增量缓存,stats()/sourceHealth() 无需全量遍历。
|
|
8
|
+
* 内存存储:Map 存储,核心操作 O(1)~O(log n)。
|
|
9
|
+
* 维护 source→count 增量缓存,stats()/sourceHealth() 无需全量遍历。
|
|
14
10
|
*/
|
|
15
11
|
export class InMemoryStorage {
|
|
16
12
|
/** 记忆存储(id → Memory) */
|
|
17
13
|
memories = new Map();
|
|
18
|
-
/** source→count 增量缓存(upsert/delete 时维护,getAllSources
|
|
14
|
+
/** source→count 增量缓存(upsert/delete 时维护,getAllSources 直接读取) */
|
|
19
15
|
sourceCountCache = new Map();
|
|
20
16
|
/**
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
-
* 自动校验 source 字段,对疑似 typo 发出警告日志。
|
|
24
|
-
* 增量维护 sourceCountCache(仅统计活跃记忆):
|
|
25
|
-
* - 新增活跃记忆:source 计数 +1
|
|
26
|
-
* - 更新同 source 同活跃态:计数不变
|
|
27
|
-
* - 更新换 source:旧 source -1、新 source +1
|
|
28
|
-
* 软删除状态转换维护:
|
|
29
|
-
* - 活跃 → 软删除:source 计数 -1
|
|
30
|
-
* - 软删除 → 活跃:source 计数 +1
|
|
31
|
-
*
|
|
32
|
-
* 软删除校验:
|
|
33
|
-
* 若 existing 已软删除(deletedAt !== undefined)且 newMemory 为活跃态
|
|
34
|
-
* (deletedAt === undefined),抛出错误阻止"通过 upsert 复活软删除记忆"。
|
|
35
|
-
* 调用方必须先显式 restore(id) 恢复记忆后再 upsert。
|
|
36
|
-
* 例外:newMemory 显式带 deletedAt(如测试场景篡改 deletedAt)允许通过,
|
|
37
|
-
* 因为此时调用方明确意图是覆盖软删除状态而非"复活"。
|
|
38
|
-
*
|
|
39
|
-
* 采用 delta 方式:先扣除 existing 的活跃贡献,再加回 newMemory 的活跃贡献。
|
|
40
|
-
* 该方式可统一处理 source 变更 + 软删除状态变更的所有组合,避免分支爆炸。
|
|
17
|
+
* upsert:校验 source + 软删除复活拦截 + delta 维护 sourceCountCache。
|
|
18
|
+
* 增量按 source/软删态加减活跃计数;软删除记忆不能经 upsert 静默复活(须先 restore)。
|
|
41
19
|
*/
|
|
42
20
|
upsert(memory) {
|
|
43
21
|
const result = validateSource(memory.source);
|
|
44
22
|
if (result.severity === 'block') {
|
|
45
|
-
|
|
46
|
-
|
|
23
|
+
throw configError('source 校验失败,拒绝写入', result.warning, [
|
|
24
|
+
'请检查 source 字段是否拼写正确',
|
|
25
|
+
'参考 source 开放字符串规范',
|
|
26
|
+
]);
|
|
47
27
|
}
|
|
48
28
|
if (result.severity === 'warn' && result.warning) {
|
|
49
29
|
logger.warn({ id: memory.id, source: memory.source, warning: result.warning }, 'source 校验警告');
|
|
50
30
|
}
|
|
51
|
-
//
|
|
31
|
+
// 软删除校验:阻止经 upsert 静默复活软删除记忆(须先显式 restore)
|
|
52
32
|
const existing = this.memories.get(memory.id);
|
|
53
33
|
if (existing && existing.deletedAt !== undefined && memory.deletedAt === undefined) {
|
|
54
|
-
// existing 已软删除,但 newMemory 试图以活跃态覆盖 → 拒绝
|
|
55
|
-
// 调用方应先 restore(id) 再 upsert,或显式在 newMemory 中带 deletedAt
|
|
56
34
|
throw configError('不允许通过 upsert 复活软删除记忆', `id=${memory.id} 已被软删除(deletedAt=${existing.deletedAt})`, [
|
|
57
35
|
'若需恢复:先调用 restore(id),再 upsert',
|
|
58
36
|
'若需覆盖软删除态:在 newMemory 中显式传入 deletedAt 字段',
|
|
59
37
|
'参考软删除机制设计',
|
|
60
38
|
]);
|
|
61
39
|
}
|
|
62
|
-
// delta
|
|
63
|
-
// 先扣除 existing 的活跃贡献(若 existing 存在且为活跃态)
|
|
40
|
+
// delta 维护 sourceCountCache:先扣 existing 活跃贡献,再加回 newMemory 活跃贡献
|
|
64
41
|
if (existing && existing.deletedAt === undefined) {
|
|
65
42
|
this.decrementSourceCount(existing.source);
|
|
66
43
|
}
|
|
67
44
|
this.memories.set(memory.id, { ...memory });
|
|
68
|
-
// 再加回 newMemory 的活跃贡献(若 newMemory 为活跃态)
|
|
69
45
|
if (memory.deletedAt === undefined) {
|
|
70
46
|
this.incrementSourceCount(memory.source);
|
|
71
47
|
}
|
|
72
48
|
}
|
|
73
|
-
/**
|
|
74
|
-
* 软删除记忆
|
|
75
|
-
*
|
|
76
|
-
* 写入 deletedAt 时间戳,不物理移除 Map 条目。
|
|
77
|
-
* - 召回/搜索/列表/统计自动过滤已软删除的记忆
|
|
78
|
-
* - 可通过 restore(id) 恢复
|
|
79
|
-
* - 回收站保留期过后由 purgeExpired(before) 物理清理
|
|
80
|
-
*
|
|
81
|
-
* 对已软删除的记忆调用为 no-op。
|
|
82
|
-
* 增量维护 sourceCountCache:软删除时对应 source 减 1。
|
|
83
|
-
*/
|
|
49
|
+
/** 软删除:写 deletedAt 标记不物理移除;可 restore 恢复,过期由 purgeExpired 清理 */
|
|
84
50
|
delete(id) {
|
|
85
51
|
const existing = this.memories.get(id);
|
|
86
|
-
// 不存在或已软删除:no-op
|
|
87
52
|
if (!existing || existing.deletedAt !== undefined)
|
|
88
53
|
return;
|
|
89
|
-
// 写入 deletedAt,标记为软删除
|
|
90
54
|
const softDeleted = { ...existing, deletedAt: nowIso() };
|
|
91
55
|
this.memories.set(id, softDeleted);
|
|
92
|
-
// 活跃 → 软删除:source 计数 -1
|
|
93
56
|
this.decrementSourceCount(existing.source);
|
|
94
57
|
}
|
|
95
|
-
/**
|
|
96
|
-
* 恢复软删除的记忆
|
|
97
|
-
*
|
|
98
|
-
* 清除 deletedAt 字段,使记忆重新出现在召回/搜索/列表中。
|
|
99
|
-
* 对活跃记忆调用为 no-op。
|
|
100
|
-
* 增量维护 sourceCountCache:恢复时对应 source 加 1。
|
|
101
|
-
*/
|
|
58
|
+
/** 恢复软删除:清除 deletedAt 使记忆重回召回/搜索/列表;活跃态调用为 no-op */
|
|
102
59
|
restore(id) {
|
|
103
60
|
const existing = this.memories.get(id);
|
|
104
|
-
// 不存在或已为活跃态:no-op
|
|
105
61
|
if (!existing || existing.deletedAt === undefined)
|
|
106
62
|
return;
|
|
107
|
-
// 清除 deletedAt,恢复为活跃态
|
|
108
63
|
const restored = { ...existing, deletedAt: undefined };
|
|
109
64
|
this.memories.set(id, restored);
|
|
110
|
-
// 软删除 → 活跃:source 计数 +1
|
|
111
65
|
this.incrementSourceCount(existing.source);
|
|
112
66
|
}
|
|
113
|
-
/**
|
|
114
|
-
* 物理删除记忆
|
|
115
|
-
*
|
|
116
|
-
* 从 Map 中彻底移除,不可恢复。
|
|
117
|
-
* 用于回收站的"彻底删除"操作,或测试环境的强制清理。
|
|
118
|
-
*
|
|
119
|
-
* 注意:若记忆为活跃态(未软删除),purge 也会减 1 计数,
|
|
120
|
-
* 但正常流程应先软删除再 purge,此时计数已在 delete() 中扣除。
|
|
121
|
-
*/
|
|
67
|
+
/** 物理删除:从 Map 彻底移除不可恢复;活跃态亦扣减计数(正常流程先 delete 已扣) */
|
|
122
68
|
purge(id) {
|
|
123
69
|
const existing = this.memories.get(id);
|
|
124
70
|
if (!existing)
|
|
125
71
|
return;
|
|
126
|
-
// 若为活跃态,扣除计数(软删除态的计数已在 delete() 中扣除)
|
|
127
72
|
if (existing.deletedAt === undefined) {
|
|
128
73
|
this.decrementSourceCount(existing.source);
|
|
129
74
|
}
|
|
130
75
|
this.memories.delete(id);
|
|
131
76
|
}
|
|
132
|
-
/**
|
|
133
|
-
* 列出回收站中的软删除记忆
|
|
134
|
-
*
|
|
135
|
-
* 按 deletedAt 降序(最近删除的在前),便于回收站 UI 展示。
|
|
136
|
-
* 返回浅拷贝,避免调用方修改污染存储内部对象。
|
|
137
|
-
*
|
|
138
|
-
* @param limit - 返回数量上限。`limit <= 0` 或 `undefined` 表示不设上限(返回全部);
|
|
139
|
-
* 正整数 N 表示返回最近 N 条。默认 undefined(全部)。
|
|
140
|
-
* @returns 软删除记忆列表(副本)
|
|
141
|
-
*/
|
|
77
|
+
/** 列出软删除记忆,按 deletedAt 降序;limit<=0 或 undefined 表示不设上限(返回全部) */
|
|
142
78
|
listDeleted(limit) {
|
|
143
79
|
const all = Array.from(this.memories.values())
|
|
144
80
|
.filter((m) => m.deletedAt !== undefined)
|
|
145
81
|
.sort((a, b) => {
|
|
146
|
-
// deletedAt 非 undefined 已由 filter 保证,降序排列(最近在前)
|
|
147
82
|
return b.deletedAt > a.deletedAt ? 1 : b.deletedAt < a.deletedAt ? -1 : 0;
|
|
148
83
|
})
|
|
149
84
|
.map((m) => ({ ...m }));
|
|
150
|
-
// limit <= 0 或 undefined 表示不设上限(与 storageInterface 契约一致)
|
|
151
85
|
return limit !== undefined && limit > 0 ? all.slice(0, limit) : all;
|
|
152
86
|
}
|
|
153
|
-
/**
|
|
154
|
-
* 按 ID 获取单条软删除记忆
|
|
155
|
-
*
|
|
156
|
-
* 用于 restore/purge 操作前的存在性校验,避免 listDeleted 默认 50 上限
|
|
157
|
-
* 导致回收站超量时操作失效。
|
|
158
|
-
*
|
|
159
|
-
* @param id 记忆唯一标识
|
|
160
|
-
* @returns 软删除记忆(浅拷贝),不存在或未软删除时返回 null
|
|
161
|
-
*/
|
|
87
|
+
/** 按 ID 取单条软删除记忆(浅拷贝);不存在或未软删除返回 null */
|
|
162
88
|
getDeletedById(id) {
|
|
163
89
|
const mem = this.memories.get(id);
|
|
164
|
-
// 不存在或未软删除(deletedAt 为 undefined)均返回 null
|
|
165
90
|
if (!mem || mem.deletedAt === undefined)
|
|
166
91
|
return null;
|
|
167
92
|
return { ...mem };
|
|
168
93
|
}
|
|
169
|
-
/**
|
|
170
|
-
* 清理过期的软删除记忆
|
|
171
|
-
*
|
|
172
|
-
* 物理删除所有 deletedAt 早于 before 的记忆。
|
|
173
|
-
* 由宿主项目的定时器调用(默认 30 天保留期)。
|
|
174
|
-
*
|
|
175
|
-
* @param before - 时间阈值,deletedAt 早于此值的记忆将被物理删除
|
|
176
|
-
* @returns 被清理的记忆数量
|
|
177
|
-
*/
|
|
94
|
+
/** 物理删除 deletedAt 早于 before 的软删除记忆,返回清理数量(宿主定时器默认 30 天保留期调用) */
|
|
178
95
|
purgeExpired(before) {
|
|
179
96
|
const beforeIso = before.toISOString();
|
|
180
97
|
let count = 0;
|
|
181
98
|
for (const [id, m] of this.memories) {
|
|
182
|
-
// 仅清理已软删除且早于阈值的记忆
|
|
183
99
|
if (m.deletedAt !== undefined && m.deletedAt < beforeIso) {
|
|
184
100
|
this.memories.delete(id);
|
|
185
101
|
count++;
|
|
@@ -187,52 +103,28 @@ export class InMemoryStorage {
|
|
|
187
103
|
}
|
|
188
104
|
return count;
|
|
189
105
|
}
|
|
190
|
-
/**
|
|
191
|
-
* 按 ID 获取单条活跃记忆(已软删除的返回 null)
|
|
192
|
-
*
|
|
193
|
-
* 返回浅拷贝,避免调用方修改污染存储内部对象(接口契约:读取隔离)
|
|
194
|
-
*/
|
|
106
|
+
/** 按 ID 取活跃记忆(浅拷贝,软删除返回 null,读取隔离契约) */
|
|
195
107
|
getById(id) {
|
|
196
108
|
const m = this.memories.get(id);
|
|
197
|
-
// 已软删除的记忆返回 null(活跃态过滤)
|
|
198
109
|
if (!m || m.deletedAt !== undefined)
|
|
199
110
|
return null;
|
|
200
111
|
return { ...m };
|
|
201
112
|
}
|
|
202
|
-
/**
|
|
203
|
-
* 按来源标签获取活跃记忆(自动过滤已软删除的)
|
|
204
|
-
*
|
|
205
|
-
* 返回浅拷贝数组,避免调用方修改污染存储内部对象。
|
|
206
|
-
*
|
|
207
|
-
* @param source - 来源标签(如 'persona'、'rule'、'insight')
|
|
208
|
-
* @returns 该来源的所有活跃记忆(副本),按 score 降序排列
|
|
209
|
-
*/
|
|
113
|
+
/** 按 source 取活跃记忆(浅拷贝,自动过滤软删除,accessedAt 降序) */
|
|
210
114
|
getBySource(source) {
|
|
211
115
|
return Array.from(this.memories.values())
|
|
212
116
|
.filter((m) => m.source === source && m.deletedAt === undefined)
|
|
213
|
-
.sort(
|
|
117
|
+
.sort(byAccessedDesc)
|
|
214
118
|
.map((m) => ({ ...m }));
|
|
215
119
|
}
|
|
216
|
-
/**
|
|
217
|
-
* 文本搜索活跃记忆(自动过滤已软删除的,内存版)
|
|
218
|
-
*
|
|
219
|
-
* 使用 segmentText() 规范分词,与 SqliteStorage 行为一致。
|
|
220
|
-
* 搜索 content 和 name 字段,按 score 降序排列。
|
|
221
|
-
*
|
|
222
|
-
* @param query - 搜索查询文本
|
|
223
|
-
* @param limit - 返回数量上限(默认 10)
|
|
224
|
-
* @returns 匹配的活跃记忆列表
|
|
225
|
-
*/
|
|
120
|
+
/** 文本搜索活跃记忆(segmentLower 与 SqliteStorage/keywordsTouch 一致),accessedAt 降序,limit 默认 10 */
|
|
226
121
|
search(query, limit = 10) {
|
|
227
|
-
// 仅搜索活跃记忆(deletedAt === undefined)
|
|
228
122
|
const activeMemories = Array.from(this.memories.values()).filter((m) => m.deletedAt === undefined);
|
|
229
|
-
//
|
|
123
|
+
// 空查询或分词无有效 token:按 accessedAt 返回
|
|
230
124
|
if (!query.trim()) {
|
|
231
125
|
return this.sortCopyLimit(activeMemories, limit);
|
|
232
126
|
}
|
|
233
|
-
// 规范分词(与 recall.ts extractKeywords 共用 segmentText)
|
|
234
127
|
const tokens = segmentLower(query);
|
|
235
|
-
// 若分词后无有效 token,降级为按 score 返回
|
|
236
128
|
if (tokens.length === 0) {
|
|
237
129
|
return this.sortCopyLimit(activeMemories, limit);
|
|
238
130
|
}
|
|
@@ -241,129 +133,48 @@ export class InMemoryStorage {
|
|
|
241
133
|
// 任一 token 命中即可
|
|
242
134
|
return tokens.some((t) => text.includes(t));
|
|
243
135
|
});
|
|
244
|
-
// 按 score 降序排序,返回浅拷贝(避免调用方修改污染存储内部对象)
|
|
245
136
|
return this.sortCopyLimit(results, limit);
|
|
246
137
|
}
|
|
247
|
-
/**
|
|
248
|
-
* 排序 + 截断 + 浅拷贝三件套
|
|
249
|
-
*
|
|
250
|
-
* 消除 search() 内 3 次重复的 .sort(byScoreDesc).slice(0, limit).map((m) => ({ ...m })) 模式
|
|
251
|
-
* (ADR-017 枝叶层 2 次提取原则,3 次重复已超阈值)。
|
|
252
|
-
*
|
|
253
|
-
* @param memories 待处理的记忆数组
|
|
254
|
-
* @param limit 返回数量上限
|
|
255
|
-
* @returns 排序截断后的浅拷贝记忆数组
|
|
256
|
-
*/
|
|
138
|
+
/** 排序 + 截断 + 浅拷贝,消除 search 内重复的 pattern */
|
|
257
139
|
sortCopyLimit(memories, limit) {
|
|
258
140
|
return memories
|
|
259
|
-
.sort(
|
|
141
|
+
.sort(byAccessedDesc)
|
|
260
142
|
.slice(0, limit)
|
|
261
143
|
.map((m) => ({ ...m }));
|
|
262
144
|
}
|
|
263
|
-
/**
|
|
264
|
-
* 统计活跃记忆总数(不含已软删除的)
|
|
265
|
-
*
|
|
266
|
-
* 优化:直接累加 sourceCountCache 的所有值,O(sources) 复杂度。
|
|
267
|
-
* 因 sourceCountCache 仅维护活跃记忆计数,求和即为活跃总数。
|
|
268
|
-
*/
|
|
145
|
+
/** 活跃记忆总数:累加 sourceCountCache(仅维护活跃计数) */
|
|
269
146
|
count() {
|
|
270
147
|
let total = 0;
|
|
271
148
|
for (const c of this.sourceCountCache.values())
|
|
272
149
|
total += c;
|
|
273
150
|
return total;
|
|
274
151
|
}
|
|
275
|
-
/**
|
|
276
|
-
* 按来源标签统计记忆数量
|
|
277
|
-
*
|
|
278
|
-
* 优化:直接读取 sourceCountCache,O(1) 复杂度
|
|
279
|
-
* (getAllSources 为 O(sources),因需拷贝 Map,二者复杂度不同)
|
|
280
|
-
* 原实现 O(n) 遍历所有记忆,与增量缓存设计不一致
|
|
281
|
-
*/
|
|
152
|
+
/** 按 source 统计活跃数量,O(1) 读 sourceCountCache */
|
|
282
153
|
countBySource(source) {
|
|
283
154
|
return this.sourceCountCache.get(source) ?? 0;
|
|
284
155
|
}
|
|
285
|
-
/**
|
|
286
|
-
|
|
287
|
-
*
|
|
288
|
-
* 遍历所有匹配 source 的活跃记忆,按时间衰减。
|
|
289
|
-
* 生产环境宿主(SqliteStorage)应重写为 SQL UPDATE 批量操作。
|
|
290
|
-
*/
|
|
291
|
-
decayScores(sources, now) {
|
|
292
|
-
let count = 0;
|
|
293
|
-
for (const m of this.memories.values()) {
|
|
294
|
-
// 跳过已软删除的记忆
|
|
295
|
-
if (m.deletedAt !== undefined)
|
|
296
|
-
continue;
|
|
297
|
-
if (!sources.includes(m.source))
|
|
298
|
-
continue;
|
|
299
|
-
if (applyDecayToMemory(m, now)) {
|
|
300
|
-
count++;
|
|
301
|
-
}
|
|
302
|
-
}
|
|
303
|
-
return count;
|
|
304
|
-
}
|
|
305
|
-
/**
|
|
306
|
-
* 原子增加记忆 score(MIND2-L3:消除 boost read-modify-write 并发冲突)
|
|
307
|
-
*
|
|
308
|
-
* score = clamp(score + delta, DECAY_FLOOR, SCORE_CEILING),同时更新 accessedAt。
|
|
309
|
-
* JS 单线程下与同步 storage 调用天然原子。
|
|
310
|
-
*
|
|
311
|
-
* @param id 记忆 ID
|
|
312
|
-
* @param delta 增量(正数 boost,负数可降级)
|
|
313
|
-
* @param now 当前时间(ISO 8601)
|
|
314
|
-
* @returns 记忆不存在/软删除时返回 false,成功返回 true
|
|
315
|
-
*/
|
|
316
|
-
incrementScore(id, delta, now) {
|
|
156
|
+
/** 刷新 accessedAt(score 退役后的唯一写位);不存在/软删返回 false */
|
|
157
|
+
touch(id, now) {
|
|
317
158
|
const memory = this.memories.get(id);
|
|
318
|
-
// 记忆不存在或已软删除 → 返回 false(与 boostScores 原有"静默跳过"语义一致)
|
|
319
159
|
if (!memory || memory.deletedAt !== undefined)
|
|
320
160
|
return false;
|
|
321
|
-
// clamp 到 [DECAY_FLOOR, SCORE_CEILING],与 boostScore 原逻辑一致
|
|
322
|
-
memory.score = Math.max(DECAY_FLOOR, Math.min(SCORE_CEILING, memory.score + delta));
|
|
323
161
|
memory.accessedAt = now;
|
|
324
162
|
return true;
|
|
325
163
|
}
|
|
326
|
-
/**
|
|
327
|
-
* 原子设置记忆 score 绝对值(MIND2-L3:消除 demote spread 旧快照覆盖其他字段)
|
|
328
|
-
*
|
|
329
|
-
* 直接设置 score = newScore,不 clamp(调用方负责传合法值)。同时更新 accessedAt。
|
|
330
|
-
*
|
|
331
|
-
* @param id 记忆 ID
|
|
332
|
-
* @param newScore 新 score 绝对值
|
|
333
|
-
* @param now 当前时间(ISO 8601)
|
|
334
|
-
* @returns 记忆不存在/软删除时返回 false,成功返回 true
|
|
335
|
-
*/
|
|
336
|
-
setScore(id, newScore, now) {
|
|
337
|
-
const memory = this.memories.get(id);
|
|
338
|
-
if (!memory || memory.deletedAt !== undefined)
|
|
339
|
-
return false;
|
|
340
|
-
memory.score = newScore;
|
|
341
|
-
memory.accessedAt = now;
|
|
342
|
-
return true;
|
|
343
|
-
}
|
|
344
|
-
/**
|
|
345
|
-
* 获取所有 source 标签及其记忆数量
|
|
346
|
-
*
|
|
347
|
-
* 优化:直接读取增量维护的 sourceCountCache。
|
|
348
|
-
* 复杂度为 O(sources)(拷贝 Map),相比全量遍历 O(n) 仍有显著优化。
|
|
349
|
-
*/
|
|
164
|
+
/** 全部 source 及活跃计数(拷贝 Map,O(sources)) */
|
|
350
165
|
getAllSources() {
|
|
351
166
|
return new Map(this.sourceCountCache);
|
|
352
167
|
}
|
|
353
|
-
/**
|
|
354
|
-
* 关闭(内存实现无需关闭)
|
|
355
|
-
*/
|
|
168
|
+
/** 关闭即丢弃全部记忆(终结操作不可逆);勿在会话暂停/检查点恢复等状态层动作调用 */
|
|
356
169
|
close() {
|
|
357
|
-
// 内存实现无需关闭,清空数据即可
|
|
358
170
|
this.memories.clear();
|
|
359
171
|
this.sourceCountCache.clear();
|
|
360
172
|
}
|
|
361
|
-
// ─── source 缓存辅助方法 ─────────────────────────────
|
|
362
173
|
/** source 计数 +1 */
|
|
363
174
|
incrementSourceCount(source) {
|
|
364
175
|
this.sourceCountCache.set(source, (this.sourceCountCache.get(source) ?? 0) + 1);
|
|
365
176
|
}
|
|
366
|
-
/** source 计数 -1(减至 0
|
|
177
|
+
/** source 计数 -1(减至 0 移除键) */
|
|
367
178
|
decrementSourceCount(source) {
|
|
368
179
|
const current = this.sourceCountCache.get(source);
|
|
369
180
|
if (current === undefined)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"inMemoryStorage.js","sourceRoot":"","sources":["../../src/memory/inMemoryStorage.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"inMemoryStorage.js","sourceRoot":"","sources":["../../src/memory/inMemoryStorage.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAEzC;;;GAGG;AACH,MAAM,OAAO,eAAe;IAC1B,wBAAwB;IAChB,QAAQ,GAAwB,IAAI,GAAG,EAAE,CAAC;IAClD,8DAA8D;IACtD,gBAAgB,GAAwB,IAAI,GAAG,EAAE,CAAC;IAE1D;;;OAGG;IACH,MAAM,CAAC,MAAc;QACnB,MAAM,MAAM,GAAG,cAAc,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC7C,IAAI,MAAM,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;YAChC,MAAM,WAAW,CAAC,kBAAkB,EAAE,MAAM,CAAC,OAAO,EAAE;gBACpD,qBAAqB;gBACrB,mBAAmB;aACpB,CAAC,CAAC;QACL,CAAC;QACD,IAAI,MAAM,CAAC,QAAQ,KAAK,MAAM,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACjD,MAAM,CAAC,IAAI,CACT,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,EACjE,aAAa,CACd,CAAC;QACJ,CAAC;QACD,2CAA2C;QAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAC9C,IAAI,QAAQ,IAAI,QAAQ,CAAC,SAAS,KAAK,SAAS,IAAI,MAAM,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;YACnF,MAAM,WAAW,CACf,sBAAsB,EACtB,MAAM,MAAM,CAAC,EAAE,oBAAoB,QAAQ,CAAC,SAAS,GAAG,EACxD;gBACE,+BAA+B;gBAC/B,yCAAyC;gBACzC,WAAW;aACZ,CACF,CAAC;QACJ,CAAC;QACD,gEAAgE;QAChE,IAAI,QAAQ,IAAI,QAAQ,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;YACjD,IAAI,CAAC,oBAAoB,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAC7C,CAAC;QACD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,GAAG,MAAM,EAAE,CAAC,CAAC;QAC5C,IAAI,MAAM,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;YACnC,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC3C,CAAC;IACH,CAAC;IAED,+DAA+D;IAC/D,MAAM,CAAC,EAAU;QACf,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACvC,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,SAAS,KAAK,SAAS;YAAE,OAAO;QAC1D,MAAM,WAAW,GAAW,EAAE,GAAG,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,CAAC;QACjE,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,EAAE,WAAW,CAAC,CAAC;QACnC,IAAI,CAAC,oBAAoB,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC7C,CAAC;IAED,oDAAoD;IACpD,OAAO,CAAC,EAAU;QAChB,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACvC,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,SAAS,KAAK,SAAS;YAAE,OAAO;QAC1D,MAAM,QAAQ,GAAW,EAAE,GAAG,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC;QAC/D,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;QAChC,IAAI,CAAC,oBAAoB,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC7C,CAAC;IAED,oDAAoD;IACpD,KAAK,CAAC,EAAU;QACd,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACvC,IAAI,CAAC,QAAQ;YAAE,OAAO;QACtB,IAAI,QAAQ,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;YACrC,IAAI,CAAC,oBAAoB,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAC7C,CAAC;QACD,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAC3B,CAAC;IAED,+DAA+D;IAC/D,WAAW,CAAC,KAAc;QACxB,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;aAC3C,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,SAAS,CAAC;aACxC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YACb,OAAO,CAAC,CAAC,SAAU,GAAG,CAAC,CAAC,SAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAU,GAAG,CAAC,CAAC,SAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAChF,CAAC,CAAC;aACD,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;QAC1B,OAAO,KAAK,KAAK,SAAS,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;IACtE,CAAC;IAED,yCAAyC;IACzC,cAAc,CAAC,EAAU;QACvB,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAClC,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,SAAS,KAAK,SAAS;YAAE,OAAO,IAAI,CAAC;QACrD,OAAO,EAAE,GAAG,GAAG,EAAE,CAAC;IACpB,CAAC;IAED,gEAAgE;IAChE,YAAY,CAAC,MAAY;QACvB,MAAM,SAAS,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;QACvC,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,KAAK,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YACpC,IAAI,CAAC,CAAC,SAAS,KAAK,SAAS,IAAI,CAAC,CAAC,SAAS,GAAG,SAAS,EAAE,CAAC;gBACzD,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;gBACzB,KAAK,EAAE,CAAC;YACV,CAAC;QACH,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,wCAAwC;IACxC,OAAO,CAAC,EAAU;QAChB,MAAM,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,KAAK,SAAS;YAAE,OAAO,IAAI,CAAC;QACjD,OAAO,EAAE,GAAG,CAAC,EAAE,CAAC;IAClB,CAAC;IAED,gDAAgD;IAChD,WAAW,CAAC,MAAc;QACxB,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;aACtC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,IAAI,CAAC,CAAC,SAAS,KAAK,SAAS,CAAC;aAC/D,IAAI,CAAC,cAAc,CAAC;aACpB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IAC5B,CAAC;IAED,wFAAwF;IACxF,MAAM,CAAC,KAAa,EAAE,KAAK,GAAG,EAAE;QAC9B,MAAM,cAAc,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAC9D,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,SAAS,CACjC,CAAC;QACF,kCAAkC;QAClC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;YAClB,OAAO,IAAI,CAAC,aAAa,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;QACnD,CAAC;QACD,MAAM,MAAM,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;QACnC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxB,OAAO,IAAI,CAAC,aAAa,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;QACnD,CAAC;QACD,MAAM,OAAO,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;YAC1C,MAAM,IAAI,GAAG,GAAG,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;YACpD,gBAAgB;YAChB,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9C,CAAC,CAAC,CAAC;QACH,OAAO,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IAC5C,CAAC;IAED,2CAA2C;IACnC,aAAa,CAAC,QAAkB,EAAE,KAAa;QACrD,OAAO,QAAQ;aACZ,IAAI,CAAC,cAAc,CAAC;aACpB,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC;aACf,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IAC5B,CAAC;IAED,0CAA0C;IAC1C,KAAK;QACH,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,gBAAgB,CAAC,MAAM,EAAE;YAAE,KAAK,IAAI,CAAC,CAAC;QAC3D,OAAO,KAAK,CAAC;IACf,CAAC;IAED,8CAA8C;IAC9C,aAAa,CAAC,MAAc;QAC1B,OAAO,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAChD,CAAC;IAED,mDAAmD;IACnD,KAAK,CAAC,EAAU,EAAE,GAAW;QAC3B,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACrC,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,SAAS,KAAK,SAAS;YAAE,OAAO,KAAK,CAAC;QAC5D,MAAM,CAAC,UAAU,GAAG,GAAG,CAAC;QACxB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,yCAAyC;IACzC,aAAa;QACX,OAAO,IAAI,GAAG,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;IACxC,CAAC;IAED,8CAA8C;IAC9C,KAAK;QACH,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;QACtB,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,CAAC;IAChC,CAAC;IAED,mBAAmB;IACX,oBAAoB,CAAC,MAAc;QACzC,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAClF,CAAC;IAED,6BAA6B;IACrB,oBAAoB,CAAC,MAAc;QACzC,MAAM,OAAO,GAAG,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAClD,IAAI,OAAO,KAAK,SAAS;YAAE,OAAO;QAClC,IAAI,OAAO,IAAI,CAAC,EAAE,CAAC;YACjB,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACvC,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,GAAG,CAAC,CAAC,CAAC;QACjD,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 记忆搜索后端工具 —— 关键词提取 / 访问轨迹刷新。
|
|
3
|
+
*
|
|
4
|
+
* 本模块两函数均为 search_memories / 项目搜索复用:
|
|
5
|
+
* - `extractKeywords`:内核分词 SSOT(`project-search/terms.ts` 用同源断言钉死,不另造分词器);
|
|
6
|
+
* - `touchScores`:命中后只刷 `accessedAt`(`storage.touch` 唯一写位)。
|
|
7
|
+
*/
|
|
8
|
+
import type { IMemoryStorage } from '../memory/storageInterface.js';
|
|
9
|
+
/**
|
|
10
|
+
* 从文本提取关键词:segmentText 精确分词 + 停用词过滤 + 英文词补充 + 去重。
|
|
11
|
+
*/
|
|
12
|
+
export declare function extractKeywords(input: string): string[];
|
|
13
|
+
/**
|
|
14
|
+
* 批量 touch(召回后 fire-and-forget 调用):只刷新 accessedAt。
|
|
15
|
+
*
|
|
16
|
+
* 只刷新 accessedAt:accessedAt 是「使用轨迹」唯一事实源(被想起即刷新),storage.touch 即唯一写位,
|
|
17
|
+
* 无 +score / clamp 语义。失败仅 log 不抛错,不阻塞读路径。
|
|
18
|
+
*/
|
|
19
|
+
export declare function touchScores(storage: IMemoryStorage, ids: string[], now?: string): Promise<void>;
|
|
20
|
+
//# sourceMappingURL=keywordsTouch.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keywordsTouch.d.ts","sourceRoot":"","sources":["../../src/memory/keywordsTouch.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAInE;;GAEG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CASvD;AAED;;;;;GAKG;AACH,wBAAsB,WAAW,CAC/B,OAAO,EAAE,cAAc,EACvB,GAAG,EAAE,MAAM,EAAE,EACb,GAAG,GAAE,MAAiB,GACrB,OAAO,CAAC,IAAI,CAAC,CAIf"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { segmentLower, STOPWORDS } from '../utils/segmenter.js';
|
|
2
|
+
import { nowIso } from '../utils/time.js';
|
|
3
|
+
/**
|
|
4
|
+
* 从文本提取关键词:segmentText 精确分词 + 停用词过滤 + 英文词补充 + 去重。
|
|
5
|
+
*/
|
|
6
|
+
export function extractKeywords(input) {
|
|
7
|
+
const words = segmentLower(input);
|
|
8
|
+
// 补充英文词(segmentText 可能遗漏连续英文大写缩写,如 APIKey → "apikey" 整词)
|
|
9
|
+
const englishWords = input.match(/[a-z]{2,}/gi) || [];
|
|
10
|
+
words.push(...englishWords.map((w) => w.toLowerCase()));
|
|
11
|
+
// 去重 + 停用词过滤 + 最短长度
|
|
12
|
+
return [...new Set(words)].filter((w) => w.length >= 2 && !STOPWORDS.has(w));
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* 批量 touch(召回后 fire-and-forget 调用):只刷新 accessedAt。
|
|
16
|
+
*
|
|
17
|
+
* 只刷新 accessedAt:accessedAt 是「使用轨迹」唯一事实源(被想起即刷新),storage.touch 即唯一写位,
|
|
18
|
+
* 无 +score / clamp 语义。失败仅 log 不抛错,不阻塞读路径。
|
|
19
|
+
*/
|
|
20
|
+
export async function touchScores(storage, ids, now = nowIso()) {
|
|
21
|
+
for (const id of ids) {
|
|
22
|
+
storage.touch(id, now);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=keywordsTouch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keywordsTouch.js","sourceRoot":"","sources":["../../src/memory/keywordsTouch.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAC/D,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAEzC;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,KAAa;IAC3C,MAAM,KAAK,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;IAElC,yDAAyD;IACzD,MAAM,YAAY,GAAG,KAAK,CAAC,KAAK,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC;IACtD,KAAK,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;IAExD,oBAAoB;IACpB,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AAC/E,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,OAAuB,EACvB,GAAa,EACb,MAAc,MAAM,EAAE;IAEtB,KAAK,MAAM,EAAE,IAAI,GAAG,EAAE,CAAC;QACrB,OAAO,CAAC,KAAK,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;IACzB,CAAC;AACH,CAAC"}
|
|
@@ -22,13 +22,13 @@ export declare class LockManager {
|
|
|
22
22
|
*/
|
|
23
23
|
acquire(memoraDir: string): Promise<void>;
|
|
24
24
|
/**
|
|
25
|
-
*
|
|
25
|
+
* 释放锁文件(双重保险——校验 PID 归属后再删除)
|
|
26
26
|
*
|
|
27
27
|
* 读取锁文件校验 PID 仍是本进程,匹配才删除;不匹配(锁已被其他进程覆盖)
|
|
28
28
|
* 则跳过删除保护他人锁。无论是否删除都重置内部状态(本进程不再持有引用)。
|
|
29
29
|
* 未持有锁时为 no-op。
|
|
30
30
|
*
|
|
31
|
-
*
|
|
31
|
+
* 设计依据(不可逆操作的双重保险):
|
|
32
32
|
* acquire 非阻塞(仅警告),两进程可同时持有「锁文件路径」。
|
|
33
33
|
* 若 release 不校验 PID,进程 A 会 unlink 进程 B 的锁——双重保险缺失。
|
|
34
34
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lockManager.d.ts","sourceRoot":"","sources":["../../src/memory/lockManager.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"lockManager.d.ts","sourceRoot":"","sources":["../../src/memory/lockManager.ts"],"names":[],"mappings":"AAgEA;;;;;GAKG;AACH,qBAAa,WAAW;IACtB,iBAAiB;IACjB,OAAO,CAAC,eAAe,CAAuB;IAE9C;;OAEG;IACH,IAAI,WAAW,IAAI,MAAM,GAAG,IAAI,CAE/B;IAED;;;;;;;;OAQG;IACG,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA4C/C;;;;;;;;;;OAUG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IA+B9B;;;;OAIG;YACW,UAAU;IAQxB;;;;;;;;OAQG;IACH,OAAO,CAAC,cAAc;CAWvB"}
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* - 获取锁(写入 PID + 时间戳 + 主机名)
|
|
6
6
|
* - 释放锁(删除锁文件)
|
|
7
7
|
* - 残留锁检测(进程存活判断 + 自动清理)
|
|
8
|
-
* -
|
|
8
|
+
* - 锁文件结构校验(类型守卫,替代 `as` 类型断言)
|
|
9
9
|
*
|
|
10
10
|
* 设计原则:
|
|
11
11
|
* - 跨平台兼容(process.kill(pid, 0) 在 POSIX + Windows 均有效)
|
|
@@ -17,11 +17,9 @@
|
|
|
17
17
|
* - 关闭/切换项目时删除 .lock 文件
|
|
18
18
|
* - 检测到残留锁时:判断进程是否存活 → 存活则警告 / 已死则清理
|
|
19
19
|
*
|
|
20
|
-
* 与 ProjectManager
|
|
20
|
+
* 与 ProjectManager 的分工:
|
|
21
21
|
* - LockManager:锁文件获取/释放 + 残留锁检测/清理
|
|
22
22
|
* - ProjectManager:项目生命周期编排(注册 + 资源加载 + 上下文构建)
|
|
23
|
-
*
|
|
24
|
-
* 详见 ADR-008 · 目录结构按"职责分层"
|
|
25
23
|
*/
|
|
26
24
|
import { join } from 'node:path';
|
|
27
25
|
import { hostname } from 'node:os';
|
|
@@ -30,7 +28,7 @@ import { logger } from '../logging/logger.js';
|
|
|
30
28
|
import { toError } from '../utils/toError.js';
|
|
31
29
|
import { nowIso } from '../utils/time.js';
|
|
32
30
|
import { isPlainObject } from '../utils/objects.js';
|
|
33
|
-
// ───
|
|
31
|
+
// ─── 类型守卫(对不可信磁盘 JSON 运行时校验) ─────
|
|
34
32
|
/**
|
|
35
33
|
* 判断值是否为 LockInfo(锁文件结构)
|
|
36
34
|
*
|
|
@@ -74,7 +72,7 @@ export class LockManager {
|
|
|
74
72
|
try {
|
|
75
73
|
// 尝试读取锁文件(存在时)
|
|
76
74
|
const raw = await readFile(lockPath, 'utf-8');
|
|
77
|
-
//
|
|
75
|
+
// 使用类型守卫校验 JSON.parse 结果,替代 `as LockInfo` 类型断言
|
|
78
76
|
const parsed = JSON.parse(raw);
|
|
79
77
|
if (isLockInfo(parsed)) {
|
|
80
78
|
// 合法锁文件:检查进程是否存活
|
|
@@ -110,13 +108,13 @@ export class LockManager {
|
|
|
110
108
|
this.currentLockPath = lockPath;
|
|
111
109
|
}
|
|
112
110
|
/**
|
|
113
|
-
*
|
|
111
|
+
* 释放锁文件(双重保险——校验 PID 归属后再删除)
|
|
114
112
|
*
|
|
115
113
|
* 读取锁文件校验 PID 仍是本进程,匹配才删除;不匹配(锁已被其他进程覆盖)
|
|
116
114
|
* 则跳过删除保护他人锁。无论是否删除都重置内部状态(本进程不再持有引用)。
|
|
117
115
|
* 未持有锁时为 no-op。
|
|
118
116
|
*
|
|
119
|
-
*
|
|
117
|
+
* 设计依据(不可逆操作的双重保险):
|
|
120
118
|
* acquire 非阻塞(仅警告),两进程可同时持有「锁文件路径」。
|
|
121
119
|
* 若 release 不校验 PID,进程 A 会 unlink 进程 B 的锁——双重保险缺失。
|
|
122
120
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lockManager.js","sourceRoot":"","sources":["../../src/memory/lockManager.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"lockManager.js","sourceRoot":"","sources":["../../src/memory/lockManager.ts"],"names":[],"mappings":"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"}
|