@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,182 +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
7
|
/**
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
* 使用 Map 存储记忆,核心操作 O(1)~O(log n)。
|
|
12
|
-
* 优化:维护 source→count 增量缓存,stats()/sourceHealth() 无需全量遍历。
|
|
8
|
+
* 内存存储:Map 存储,核心操作 O(1)~O(log n)。
|
|
9
|
+
* 维护 source→count 增量缓存,stats()/sourceHealth() 无需全量遍历。
|
|
13
10
|
*/
|
|
14
11
|
export class InMemoryStorage {
|
|
15
12
|
/** 记忆存储(id → Memory) */
|
|
16
13
|
memories = new Map();
|
|
17
|
-
/** source→count 增量缓存(upsert/delete 时维护,getAllSources
|
|
14
|
+
/** source→count 增量缓存(upsert/delete 时维护,getAllSources 直接读取) */
|
|
18
15
|
sourceCountCache = new Map();
|
|
19
16
|
/**
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
* 自动校验 source 字段,对疑似 typo 发出警告日志。
|
|
23
|
-
* 增量维护 sourceCountCache(仅统计活跃记忆):
|
|
24
|
-
* - 新增活跃记忆:source 计数 +1
|
|
25
|
-
* - 更新同 source 同活跃态:计数不变
|
|
26
|
-
* - 更新换 source:旧 source -1、新 source +1
|
|
27
|
-
* 软删除状态转换维护:
|
|
28
|
-
* - 活跃 → 软删除:source 计数 -1
|
|
29
|
-
* - 软删除 → 活跃:source 计数 +1
|
|
30
|
-
*
|
|
31
|
-
* 软删除校验:
|
|
32
|
-
* 若 existing 已软删除(deletedAt !== undefined)且 newMemory 为活跃态
|
|
33
|
-
* (deletedAt === undefined),抛出错误阻止"通过 upsert 复活软删除记忆"。
|
|
34
|
-
* 调用方必须先显式 restore(id) 恢复记忆后再 upsert。
|
|
35
|
-
* 例外:newMemory 显式带 deletedAt(如测试场景篡改 deletedAt)允许通过,
|
|
36
|
-
* 因为此时调用方明确意图是覆盖软删除状态而非"复活"。
|
|
37
|
-
*
|
|
38
|
-
* 采用 delta 方式:先扣除 existing 的活跃贡献,再加回 newMemory 的活跃贡献。
|
|
39
|
-
* 该方式可统一处理 source 变更 + 软删除状态变更的所有组合,避免分支爆炸。
|
|
17
|
+
* upsert:校验 source + 软删除复活拦截 + delta 维护 sourceCountCache。
|
|
18
|
+
* 增量按 source/软删态加减活跃计数;软删除记忆不能经 upsert 静默复活(须先 restore)。
|
|
40
19
|
*/
|
|
41
20
|
upsert(memory) {
|
|
42
21
|
const result = validateSource(memory.source);
|
|
43
22
|
if (result.severity === 'block') {
|
|
44
|
-
|
|
45
|
-
|
|
23
|
+
throw configError('source 校验失败,拒绝写入', result.warning, [
|
|
24
|
+
'请检查 source 字段是否拼写正确',
|
|
25
|
+
'参考 source 开放字符串规范',
|
|
26
|
+
]);
|
|
46
27
|
}
|
|
47
28
|
if (result.severity === 'warn' && result.warning) {
|
|
48
29
|
logger.warn({ id: memory.id, source: memory.source, warning: result.warning }, 'source 校验警告');
|
|
49
30
|
}
|
|
50
|
-
//
|
|
31
|
+
// 软删除校验:阻止经 upsert 静默复活软删除记忆(须先显式 restore)
|
|
51
32
|
const existing = this.memories.get(memory.id);
|
|
52
33
|
if (existing && existing.deletedAt !== undefined && memory.deletedAt === undefined) {
|
|
53
|
-
// existing 已软删除,但 newMemory 试图以活跃态覆盖 → 拒绝
|
|
54
|
-
// 调用方应先 restore(id) 再 upsert,或显式在 newMemory 中带 deletedAt
|
|
55
34
|
throw configError('不允许通过 upsert 复活软删除记忆', `id=${memory.id} 已被软删除(deletedAt=${existing.deletedAt})`, [
|
|
56
35
|
'若需恢复:先调用 restore(id),再 upsert',
|
|
57
36
|
'若需覆盖软删除态:在 newMemory 中显式传入 deletedAt 字段',
|
|
58
37
|
'参考软删除机制设计',
|
|
59
38
|
]);
|
|
60
39
|
}
|
|
61
|
-
// delta
|
|
62
|
-
// 先扣除 existing 的活跃贡献(若 existing 存在且为活跃态)
|
|
40
|
+
// delta 维护 sourceCountCache:先扣 existing 活跃贡献,再加回 newMemory 活跃贡献
|
|
63
41
|
if (existing && existing.deletedAt === undefined) {
|
|
64
42
|
this.decrementSourceCount(existing.source);
|
|
65
43
|
}
|
|
66
44
|
this.memories.set(memory.id, { ...memory });
|
|
67
|
-
// 再加回 newMemory 的活跃贡献(若 newMemory 为活跃态)
|
|
68
45
|
if (memory.deletedAt === undefined) {
|
|
69
46
|
this.incrementSourceCount(memory.source);
|
|
70
47
|
}
|
|
71
48
|
}
|
|
72
|
-
/**
|
|
73
|
-
* 软删除记忆
|
|
74
|
-
*
|
|
75
|
-
* 写入 deletedAt 时间戳,不物理移除 Map 条目。
|
|
76
|
-
* - 召回/搜索/列表/统计自动过滤已软删除的记忆
|
|
77
|
-
* - 可通过 restore(id) 恢复
|
|
78
|
-
* - 回收站保留期过后由 purgeExpired(before) 物理清理
|
|
79
|
-
*
|
|
80
|
-
* 对已软删除的记忆调用为 no-op。
|
|
81
|
-
* 增量维护 sourceCountCache:软删除时对应 source 减 1。
|
|
82
|
-
*/
|
|
49
|
+
/** 软删除:写 deletedAt 标记不物理移除;可 restore 恢复,过期由 purgeExpired 清理 */
|
|
83
50
|
delete(id) {
|
|
84
51
|
const existing = this.memories.get(id);
|
|
85
|
-
// 不存在或已软删除:no-op
|
|
86
52
|
if (!existing || existing.deletedAt !== undefined)
|
|
87
53
|
return;
|
|
88
|
-
// 写入 deletedAt,标记为软删除
|
|
89
54
|
const softDeleted = { ...existing, deletedAt: nowIso() };
|
|
90
55
|
this.memories.set(id, softDeleted);
|
|
91
|
-
// 活跃 → 软删除:source 计数 -1
|
|
92
56
|
this.decrementSourceCount(existing.source);
|
|
93
57
|
}
|
|
94
|
-
/**
|
|
95
|
-
* 恢复软删除的记忆
|
|
96
|
-
*
|
|
97
|
-
* 清除 deletedAt 字段,使记忆重新出现在召回/搜索/列表中。
|
|
98
|
-
* 对活跃记忆调用为 no-op。
|
|
99
|
-
* 增量维护 sourceCountCache:恢复时对应 source 加 1。
|
|
100
|
-
*/
|
|
58
|
+
/** 恢复软删除:清除 deletedAt 使记忆重回召回/搜索/列表;活跃态调用为 no-op */
|
|
101
59
|
restore(id) {
|
|
102
60
|
const existing = this.memories.get(id);
|
|
103
|
-
// 不存在或已为活跃态:no-op
|
|
104
61
|
if (!existing || existing.deletedAt === undefined)
|
|
105
62
|
return;
|
|
106
|
-
// 清除 deletedAt,恢复为活跃态
|
|
107
63
|
const restored = { ...existing, deletedAt: undefined };
|
|
108
64
|
this.memories.set(id, restored);
|
|
109
|
-
// 软删除 → 活跃:source 计数 +1
|
|
110
65
|
this.incrementSourceCount(existing.source);
|
|
111
66
|
}
|
|
112
|
-
/**
|
|
113
|
-
* 物理删除记忆
|
|
114
|
-
*
|
|
115
|
-
* 从 Map 中彻底移除,不可恢复。
|
|
116
|
-
* 用于回收站的"彻底删除"操作,或测试环境的强制清理。
|
|
117
|
-
*
|
|
118
|
-
* 注意:若记忆为活跃态(未软删除),purge 也会减 1 计数,
|
|
119
|
-
* 但正常流程应先软删除再 purge,此时计数已在 delete() 中扣除。
|
|
120
|
-
*/
|
|
67
|
+
/** 物理删除:从 Map 彻底移除不可恢复;活跃态亦扣减计数(正常流程先 delete 已扣) */
|
|
121
68
|
purge(id) {
|
|
122
69
|
const existing = this.memories.get(id);
|
|
123
70
|
if (!existing)
|
|
124
71
|
return;
|
|
125
|
-
// 若为活跃态,扣除计数(软删除态的计数已在 delete() 中扣除)
|
|
126
72
|
if (existing.deletedAt === undefined) {
|
|
127
73
|
this.decrementSourceCount(existing.source);
|
|
128
74
|
}
|
|
129
75
|
this.memories.delete(id);
|
|
130
76
|
}
|
|
131
|
-
/**
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
* 按 deletedAt 降序(最近删除的在前),便于回收站 UI 展示。
|
|
135
|
-
* 返回浅拷贝,避免调用方修改污染存储内部对象。
|
|
136
|
-
*
|
|
137
|
-
* @param limit - 返回数量上限(默认 50)
|
|
138
|
-
* @returns 软删除记忆列表(副本)
|
|
139
|
-
*/
|
|
140
|
-
listDeleted(limit = 50) {
|
|
141
|
-
return Array.from(this.memories.values())
|
|
77
|
+
/** 列出软删除记忆,按 deletedAt 降序;limit<=0 或 undefined 表示不设上限(返回全部) */
|
|
78
|
+
listDeleted(limit) {
|
|
79
|
+
const all = Array.from(this.memories.values())
|
|
142
80
|
.filter((m) => m.deletedAt !== undefined)
|
|
143
81
|
.sort((a, b) => {
|
|
144
|
-
// deletedAt 非 undefined 已由 filter 保证,降序排列(最近在前)
|
|
145
82
|
return b.deletedAt > a.deletedAt ? 1 : b.deletedAt < a.deletedAt ? -1 : 0;
|
|
146
83
|
})
|
|
147
|
-
.slice(0, limit)
|
|
148
84
|
.map((m) => ({ ...m }));
|
|
85
|
+
return limit !== undefined && limit > 0 ? all.slice(0, limit) : all;
|
|
149
86
|
}
|
|
150
|
-
/**
|
|
151
|
-
* 按 ID 获取单条软删除记忆
|
|
152
|
-
*
|
|
153
|
-
* 用于 restore/purge 操作前的存在性校验,避免 listDeleted 默认 50 上限
|
|
154
|
-
* 导致回收站超量时操作失效。
|
|
155
|
-
*
|
|
156
|
-
* @param id 记忆唯一标识
|
|
157
|
-
* @returns 软删除记忆(浅拷贝),不存在或未软删除时返回 null
|
|
158
|
-
*/
|
|
87
|
+
/** 按 ID 取单条软删除记忆(浅拷贝);不存在或未软删除返回 null */
|
|
159
88
|
getDeletedById(id) {
|
|
160
89
|
const mem = this.memories.get(id);
|
|
161
|
-
// 不存在或未软删除(deletedAt 为 undefined)均返回 null
|
|
162
90
|
if (!mem || mem.deletedAt === undefined)
|
|
163
91
|
return null;
|
|
164
92
|
return { ...mem };
|
|
165
93
|
}
|
|
166
|
-
/**
|
|
167
|
-
* 清理过期的软删除记忆
|
|
168
|
-
*
|
|
169
|
-
* 物理删除所有 deletedAt 早于 before 的记忆。
|
|
170
|
-
* 由宿主项目的定时器调用(默认 30 天保留期)。
|
|
171
|
-
*
|
|
172
|
-
* @param before - 时间阈值,deletedAt 早于此值的记忆将被物理删除
|
|
173
|
-
* @returns 被清理的记忆数量
|
|
174
|
-
*/
|
|
94
|
+
/** 物理删除 deletedAt 早于 before 的软删除记忆,返回清理数量(宿主定时器默认 30 天保留期调用) */
|
|
175
95
|
purgeExpired(before) {
|
|
176
96
|
const beforeIso = before.toISOString();
|
|
177
97
|
let count = 0;
|
|
178
98
|
for (const [id, m] of this.memories) {
|
|
179
|
-
// 仅清理已软删除且早于阈值的记忆
|
|
180
99
|
if (m.deletedAt !== undefined && m.deletedAt < beforeIso) {
|
|
181
100
|
this.memories.delete(id);
|
|
182
101
|
count++;
|
|
@@ -184,136 +103,78 @@ export class InMemoryStorage {
|
|
|
184
103
|
}
|
|
185
104
|
return count;
|
|
186
105
|
}
|
|
187
|
-
/**
|
|
188
|
-
* 按 ID 获取单条活跃记忆(已软删除的返回 null)
|
|
189
|
-
*
|
|
190
|
-
* 返回浅拷贝,避免调用方修改污染存储内部对象(接口契约:读取隔离)
|
|
191
|
-
*/
|
|
106
|
+
/** 按 ID 取活跃记忆(浅拷贝,软删除返回 null,读取隔离契约) */
|
|
192
107
|
getById(id) {
|
|
193
108
|
const m = this.memories.get(id);
|
|
194
|
-
// 已软删除的记忆返回 null(活跃态过滤)
|
|
195
109
|
if (!m || m.deletedAt !== undefined)
|
|
196
110
|
return null;
|
|
197
111
|
return { ...m };
|
|
198
112
|
}
|
|
199
|
-
/**
|
|
200
|
-
* 按来源标签获取活跃记忆(自动过滤已软删除的)
|
|
201
|
-
*
|
|
202
|
-
* 返回浅拷贝数组,避免调用方修改污染存储内部对象。
|
|
203
|
-
*
|
|
204
|
-
* @param source - 来源标签(如 'persona'、'rule'、'insight')
|
|
205
|
-
* @returns 该来源的所有活跃记忆(副本),按 score 降序排列
|
|
206
|
-
*/
|
|
113
|
+
/** 按 source 取活跃记忆(浅拷贝,自动过滤软删除,accessedAt 降序) */
|
|
207
114
|
getBySource(source) {
|
|
208
115
|
return Array.from(this.memories.values())
|
|
209
116
|
.filter((m) => m.source === source && m.deletedAt === undefined)
|
|
210
|
-
.sort(
|
|
117
|
+
.sort(byAccessedDesc)
|
|
211
118
|
.map((m) => ({ ...m }));
|
|
212
119
|
}
|
|
213
|
-
/**
|
|
214
|
-
* 文本搜索活跃记忆(自动过滤已软删除的,内存版)
|
|
215
|
-
*
|
|
216
|
-
* 使用 segmentText() 规范分词,与 SqliteStorage 行为一致。
|
|
217
|
-
* 搜索 content 和 name 字段,按 score 降序排列。
|
|
218
|
-
*
|
|
219
|
-
* @param query - 搜索查询文本
|
|
220
|
-
* @param limit - 返回数量上限(默认 10)
|
|
221
|
-
* @returns 匹配的活跃记忆列表
|
|
222
|
-
*/
|
|
120
|
+
/** 文本搜索活跃记忆(segmentLower 与 SqliteStorage/keywordsTouch 一致),accessedAt 降序,limit 默认 10 */
|
|
223
121
|
search(query, limit = 10) {
|
|
224
|
-
// 仅搜索活跃记忆(deletedAt === undefined)
|
|
225
122
|
const activeMemories = Array.from(this.memories.values()).filter((m) => m.deletedAt === undefined);
|
|
226
|
-
//
|
|
123
|
+
// 空查询或分词无有效 token:按 accessedAt 返回
|
|
227
124
|
if (!query.trim()) {
|
|
228
|
-
return activeMemories
|
|
229
|
-
.sort(byScoreDesc)
|
|
230
|
-
.slice(0, limit)
|
|
231
|
-
.map((m) => ({ ...m }));
|
|
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
|
-
return activeMemories
|
|
238
|
-
.sort(byScoreDesc)
|
|
239
|
-
.slice(0, limit)
|
|
240
|
-
.map((m) => ({ ...m }));
|
|
129
|
+
return this.sortCopyLimit(activeMemories, limit);
|
|
241
130
|
}
|
|
242
131
|
const results = activeMemories.filter((m) => {
|
|
243
132
|
const text = `${m.content} ${m.name}`.toLowerCase();
|
|
244
133
|
// 任一 token 命中即可
|
|
245
134
|
return tokens.some((t) => text.includes(t));
|
|
246
135
|
});
|
|
247
|
-
|
|
248
|
-
results.sort(byScoreDesc);
|
|
249
|
-
// 返回浅拷贝,避免调用方修改污染存储内部对象
|
|
250
|
-
return results.slice(0, limit).map((m) => ({ ...m }));
|
|
136
|
+
return this.sortCopyLimit(results, limit);
|
|
251
137
|
}
|
|
252
|
-
/**
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
138
|
+
/** 排序 + 截断 + 浅拷贝,消除 search 内重复的 pattern */
|
|
139
|
+
sortCopyLimit(memories, limit) {
|
|
140
|
+
return memories
|
|
141
|
+
.sort(byAccessedDesc)
|
|
142
|
+
.slice(0, limit)
|
|
143
|
+
.map((m) => ({ ...m }));
|
|
144
|
+
}
|
|
145
|
+
/** 活跃记忆总数:累加 sourceCountCache(仅维护活跃计数) */
|
|
258
146
|
count() {
|
|
259
147
|
let total = 0;
|
|
260
148
|
for (const c of this.sourceCountCache.values())
|
|
261
149
|
total += c;
|
|
262
150
|
return total;
|
|
263
151
|
}
|
|
264
|
-
/**
|
|
265
|
-
* 按来源标签统计记忆数量
|
|
266
|
-
*
|
|
267
|
-
* 优化:直接读取 sourceCountCache,O(1) 复杂度
|
|
268
|
-
* (getAllSources 为 O(sources),因需拷贝 Map,二者复杂度不同)
|
|
269
|
-
* 原实现 O(n) 遍历所有记忆,与增量缓存设计不一致
|
|
270
|
-
*/
|
|
152
|
+
/** 按 source 统计活跃数量,O(1) 读 sourceCountCache */
|
|
271
153
|
countBySource(source) {
|
|
272
154
|
return this.sourceCountCache.get(source) ?? 0;
|
|
273
155
|
}
|
|
274
|
-
/**
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
let count = 0;
|
|
282
|
-
for (const m of this.memories.values()) {
|
|
283
|
-
// 跳过已软删除的记忆
|
|
284
|
-
if (m.deletedAt !== undefined)
|
|
285
|
-
continue;
|
|
286
|
-
if (!sources.includes(m.source))
|
|
287
|
-
continue;
|
|
288
|
-
if (applyDecayToMemory(m, now)) {
|
|
289
|
-
count++;
|
|
290
|
-
}
|
|
291
|
-
}
|
|
292
|
-
return count;
|
|
156
|
+
/** 刷新 accessedAt(score 退役后的唯一写位);不存在/软删返回 false */
|
|
157
|
+
touch(id, now) {
|
|
158
|
+
const memory = this.memories.get(id);
|
|
159
|
+
if (!memory || memory.deletedAt !== undefined)
|
|
160
|
+
return false;
|
|
161
|
+
memory.accessedAt = now;
|
|
162
|
+
return true;
|
|
293
163
|
}
|
|
294
|
-
/**
|
|
295
|
-
* 获取所有 source 标签及其记忆数量
|
|
296
|
-
*
|
|
297
|
-
* 优化:直接读取增量维护的 sourceCountCache。
|
|
298
|
-
* 复杂度为 O(sources)(拷贝 Map),相比全量遍历 O(n) 仍有显著优化。
|
|
299
|
-
*/
|
|
164
|
+
/** 全部 source 及活跃计数(拷贝 Map,O(sources)) */
|
|
300
165
|
getAllSources() {
|
|
301
166
|
return new Map(this.sourceCountCache);
|
|
302
167
|
}
|
|
303
|
-
/**
|
|
304
|
-
* 关闭(内存实现无需关闭)
|
|
305
|
-
*/
|
|
168
|
+
/** 关闭即丢弃全部记忆(终结操作不可逆);勿在会话暂停/检查点恢复等状态层动作调用 */
|
|
306
169
|
close() {
|
|
307
|
-
// 内存实现无需关闭,清空数据即可
|
|
308
170
|
this.memories.clear();
|
|
309
171
|
this.sourceCountCache.clear();
|
|
310
172
|
}
|
|
311
|
-
// ─── source 缓存辅助方法 ─────────────────────────────
|
|
312
173
|
/** source 计数 +1 */
|
|
313
174
|
incrementSourceCount(source) {
|
|
314
175
|
this.sourceCountCache.set(source, (this.sourceCountCache.get(source) ?? 0) + 1);
|
|
315
176
|
}
|
|
316
|
-
/** source 计数 -1(减至 0
|
|
177
|
+
/** source 计数 -1(减至 0 移除键) */
|
|
317
178
|
decrementSourceCount(source) {
|
|
318
179
|
const current = this.sourceCountCache.get(source);
|
|
319
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":"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"}
|
|
@@ -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,10 +22,15 @@ 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
|
* 未持有锁时为 no-op。
|
|
30
|
+
*
|
|
31
|
+
* 设计依据(不可逆操作的双重保险):
|
|
32
|
+
* acquire 非阻塞(仅警告),两进程可同时持有「锁文件路径」。
|
|
33
|
+
* 若 release 不校验 PID,进程 A 会 unlink 进程 B 的锁——双重保险缺失。
|
|
29
34
|
*/
|
|
30
35
|
release(): Promise<void>;
|
|
31
36
|
/**
|
|
@@ -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,15 +108,41 @@ export class LockManager {
|
|
|
110
108
|
this.currentLockPath = lockPath;
|
|
111
109
|
}
|
|
112
110
|
/**
|
|
113
|
-
*
|
|
111
|
+
* 释放锁文件(双重保险——校验 PID 归属后再删除)
|
|
114
112
|
*
|
|
115
|
-
*
|
|
113
|
+
* 读取锁文件校验 PID 仍是本进程,匹配才删除;不匹配(锁已被其他进程覆盖)
|
|
114
|
+
* 则跳过删除保护他人锁。无论是否删除都重置内部状态(本进程不再持有引用)。
|
|
116
115
|
* 未持有锁时为 no-op。
|
|
116
|
+
*
|
|
117
|
+
* 设计依据(不可逆操作的双重保险):
|
|
118
|
+
* acquire 非阻塞(仅警告),两进程可同时持有「锁文件路径」。
|
|
119
|
+
* 若 release 不校验 PID,进程 A 会 unlink 进程 B 的锁——双重保险缺失。
|
|
117
120
|
*/
|
|
118
121
|
async release() {
|
|
119
|
-
if (this.currentLockPath)
|
|
120
|
-
|
|
121
|
-
|
|
122
|
+
if (!this.currentLockPath)
|
|
123
|
+
return;
|
|
124
|
+
const lockPath = this.currentLockPath;
|
|
125
|
+
// 无论后续校验结果如何,本进程不再持有该路径引用(先重置避免异常时残留)
|
|
126
|
+
this.currentLockPath = null;
|
|
127
|
+
try {
|
|
128
|
+
const raw = await readFile(lockPath, 'utf-8');
|
|
129
|
+
const parsed = JSON.parse(raw);
|
|
130
|
+
if (isLockInfo(parsed) && parsed.pid === process.pid) {
|
|
131
|
+
// PID 匹配——本进程持有的锁,安全删除
|
|
132
|
+
await this.safeUnlink(lockPath);
|
|
133
|
+
}
|
|
134
|
+
else {
|
|
135
|
+
// PID 不匹配或锁文件结构改变——锁已被其他进程覆盖,不删除他人锁
|
|
136
|
+
logger.warn({
|
|
137
|
+
path: lockPath,
|
|
138
|
+
expectedPid: process.pid,
|
|
139
|
+
actualPid: parsed && typeof parsed === 'object' && 'pid' in parsed ? parsed.pid : null,
|
|
140
|
+
}, '锁文件已被其他进程覆盖,release 跳过删除(保护他人锁)');
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
catch (err) {
|
|
144
|
+
// 锁文件不存在或损坏——视为已释放,仅 debug 记录
|
|
145
|
+
logger.debug({ path: lockPath, err: toError(err).message }, 'release 读取锁文件失败,视为已释放');
|
|
122
146
|
}
|
|
123
147
|
}
|
|
124
148
|
/**
|
|
@@ -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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"}
|