@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,24 +1,129 @@
|
|
|
1
|
-
# Memora 内核 API 参考手册(
|
|
1
|
+
# Memora 内核 API 参考手册(v3.0.0)
|
|
2
2
|
|
|
3
3
|
> **核心定位**:Memora 是一个**无法独立运行**的智能大脑内核——它只有接口,没有"形态"。CLI、WebUI、桌面精灵、小说生成器都是它的"宿主",宿主负责给它身体(UI)、血管(Provider)、神经网络(事件回路)。
|
|
4
4
|
>
|
|
5
|
-
>
|
|
5
|
+
> **本文件用途**:列出内核对外暴露的**全部公开接口**——从最基础的接入接口(〇),到 Agent 面类、对话、记忆、角色包、工具、各 Manager,再到类型导出与安全约束。
|
|
6
6
|
>
|
|
7
|
-
> **版本**:
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
>
|
|
14
|
-
>
|
|
15
|
-
> **v1.0.0 变更**:1.0 正式发布。P0 阻塞修复全量收敛:DEFAULT_CONFIG 由 `config/loader.ts` 常量声明单一真理源(不再维护独立 schema)、IVectorStore 接口提取(JsonVectorStore 为内置实现)、AbortSignal 合并工具(mergeSignals)、Logger 懒初始化(移除模块顶层 pino 副作用,改为首次日志调用时 maybeUpgradeToPino 懒触发)、评估框架结构化信号(AgentChunk.guardrailBlocked 替代中文文案匹配)、文档全量对齐(包名 @zooique/memora、config.example.json 补全 providers/embedding 段)。
|
|
16
|
-
>
|
|
17
|
-
> **v2.0.0 变更**:版本号提升(维护性质,无破坏性 API 变更)。
|
|
18
|
-
>
|
|
19
|
-
> **v2.0.1 变更**:文档版本号对齐(v1.0.2 → v2.0.1)。无 API 破坏性变更,仅同步文档与版本戳。
|
|
7
|
+
> **版本**:v3.0.0(对齐当前稳定版,纯净接口文档,不含历史变更流水)
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
## 〇、接入基础接口
|
|
12
|
+
|
|
13
|
+
> **定位**:一个新宿主接入 memora 的**最小接入面**。其余各章是 `Agent` 初始化后暴露的运行时能力;本章回答"接入前必须提供什么"。
|
|
20
14
|
>
|
|
21
|
-
>
|
|
15
|
+
> **一句话总结**:必做三件事——① 实现 `IMemoryStorage` + `ISessionStore` + `LlmProvider`;② 准备 `configDir`(含 `config.json` 模型表 + `role-packs/` + `skills/`);③ 传 `projectPath` / `dataDir` / `configDir` 构造 `Agent`。其余接口按需注入,缺省都有降级兜底。
|
|
16
|
+
|
|
17
|
+
### 〇.1 宿主实现的接口(注入)
|
|
18
|
+
|
|
19
|
+
| 接口 | 必选 | 声明位置 | 用途 |
|
|
20
|
+
|------|------|---------|------|
|
|
21
|
+
| `LlmProvider` | ✅ 必选 | `src/llm/provider.ts` | 前台 LLM 流式对话(`stream()`),宿主创建 |
|
|
22
|
+
| `IMemoryStorage` | ✅ 必选* | `src/memory/storageInterface.ts` | 记忆持久化,15 方法,同步语义(对齐 better-sqlite3);**后端由宿主自选** |
|
|
23
|
+
| `ISessionStore` | ✅ 必选* | `src/memory/sessionStore.ts` | 会话消息持久化,3 必需 + 6 可选方法 |
|
|
24
|
+
| `ITracer` | 可选 | `src/agent/tracer.ts` | 可观测性,不传用 `NoopTracer` |
|
|
25
|
+
| `IWebSearchProvider` | 可选 | `src/web-search/types.ts` | 网络搜索,不注入则不启用 |
|
|
26
|
+
| `IFetchProvider` | 可选 | `src/web-fetch/types.ts` | 网页抓取(搜索→抓取闭环第二段),不注入则不启用 |
|
|
27
|
+
| `ICodeExecutionProvider` | 可选 | `src/code-exec/types.ts` | 通用代码执行(沙箱由宿主提供),不注入则不启用 |
|
|
28
|
+
| `IProjectSearchProvider` | 可选 | `src/project-search/types.ts` | 项目内搜索(等价 IDE 全局搜索),不注入则不暴露 `search_project`(见 §8.6) |
|
|
29
|
+
| `ILogger` | 可选 | `src/logging/loggerInterface.ts` | 日志,默认内置 |
|
|
30
|
+
| `backgroundProvider` (`LlmProvider`) | 可选 | AgentOptions | 后台通道(归档/投影),不配复用前台 |
|
|
31
|
+
|
|
32
|
+
\* 不传则内核自动用 `InMemoryStorage` / 内存会话(仅内存不落盘);做产品必须实现。
|
|
33
|
+
|
|
34
|
+
### 〇.2 宿主提供的配置资源(`configDir` 下)
|
|
35
|
+
|
|
36
|
+
`configDir` 是唯一的配置目录入口(含角色包 / 全局技能 / 配置文件):
|
|
37
|
+
|
|
38
|
+
```
|
|
39
|
+
configDir/
|
|
40
|
+
├── config.json ← ★ LLM 配置真理源:providers + active + background + taskRouter
|
|
41
|
+
├── role-packs/ ← 角色包目录(每个包一个文件夹,含 manifest.json)
|
|
42
|
+
│ └── 工程师/
|
|
43
|
+
│ ├── manifest.json ← 必填:元数据 + strategy + capabilities
|
|
44
|
+
│ ├── persona.md ← 约定名,可省(身份设定)
|
|
45
|
+
│ ├── rules.md ← 约定名,可省(安全契约)
|
|
46
|
+
│ └── skills/ ← 角色包内嵌技能(目录动态扫描,可选)
|
|
47
|
+
│ └── ... ← 形式与全局技能池一致(见下)
|
|
48
|
+
├── skills/ ← 全局技能池(所有角色共享,可选)
|
|
49
|
+
│ ├── search.md ← 单文件形式
|
|
50
|
+
│ └── code-review/ ← 文件夹形式(统一大众公认的 Agent Skills 格式)
|
|
51
|
+
│ ├── SKILL.md ← 技能正文(frontmatter 声明 name/description)
|
|
52
|
+
│ ├── resources/ ← L3 参考资源(参考材料/规范)
|
|
53
|
+
│ ├── scripts/ ← L3 可执行脚本(运行时按需执行)
|
|
54
|
+
│ ├── references/ ← 技能内参考资料
|
|
55
|
+
│ └── assets/ ← 技能内资源(模板/图片/示例)
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
> **skills 两种形式(两级技能共用统一格式)**:全局技能池(`configDir/skills/`)与角色包内嵌技能(`role-packs/<名>/skills/`)采用**同一套**技能格式,仅激活条件不同(全局始终激活,角色包技能随角色激活)。每个技能为单文件 `*.md` **或** 文件夹 `SKILL.md` 两种形式之一;`references/` / `assets/` 属于**技能内部**的资源目录(文件夹形式的组成部分),非 configDir 或角色包顶层目录。渐进披露:L1 元数据常驻 / L2 `read_skill` 按需读正文 / L3 `read_resource` + `run_skill_script`。
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
**config.json 大模型列表**(不是独立目录,是配置文件中的映射表):
|
|
62
|
+
|
|
63
|
+
```jsonc
|
|
64
|
+
{
|
|
65
|
+
"llm": {
|
|
66
|
+
"providers": { "deepseek": { "baseUrl": "...", "model": "...", "apiKey": "" },
|
|
67
|
+
"openai": { "baseUrl": "...", "model": "...", "apiKey": "" } },
|
|
68
|
+
"active": "deepseek", // 激活别名,不配取第一个 key
|
|
69
|
+
"background": { ... }, // 可选后台通道,节省成本
|
|
70
|
+
"taskRouter": { "simple": "deepseek", "reasoning": "openai" }
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
- API Key **不写文件**,从环境变量读取。
|
|
76
|
+
- memora 内核仅内置 `mock` Provider(无 API Key 的测试/降级),其余厂商需宿主在 config.json 显式配置。
|
|
77
|
+
|
|
78
|
+
### 〇.3 `dataDir` vs `storage` 的区别
|
|
79
|
+
|
|
80
|
+
两个易混淆的参数:**`storage` 管"如何存取"(接口实例),`dataDir` 管"存到哪个目录"(路径字符串)**。
|
|
81
|
+
|
|
82
|
+
| | `storage`(IMemoryStorage) | `dataDir` |
|
|
83
|
+
|---|---|---|
|
|
84
|
+
| 本质 | 接口实例(宿主写的类) | 文件系统目录路径(字符串) |
|
|
85
|
+
| 内核怎么用它 | 调方法:`upsert` / `getById` / `search` / `getAllSources`… | 用它定位项目注册表(`projects.json`);记忆库落哪、叫什么名,由宿主自定,内核不参与 |
|
|
86
|
+
| 管什么 | "怎么存取记忆"(逻辑),内核不关心内部是 SQLite 还是内存 | "记忆库与项目注册表放哪个目录"(物理位置) |
|
|
87
|
+
| 谁实现 | 宿主实现(如 SqliteMemoryStorage) | 宿主传路径 |
|
|
88
|
+
| 关系 | `dataDir` 指向目录;宿主按自己的持久化形态构造 storage(JSON 文件 / SQLite 皆可) | 内核用 `dataDir` 推导注册表路径;**项目锁文件不由 `dataDir` 推导**,它固定落 `<projectPath>/.memora/.lock` |
|
|
89
|
+
| 缺省 | 不传 → `InMemoryStorage`(仅内存) | **必填,无默认值**(目录位置与层级语义是宿主的产品决策,内核不假设) |
|
|
90
|
+
|
|
91
|
+
一句话:`storage` 是宿主**怎么**存取的实现,`dataDir` 是存取内容**落在哪个目录**的配置——一个管"如何",一个管"何处"。
|
|
92
|
+
|
|
93
|
+
> **`config.json` 里的 `memory.dataDir` 内核不读**:它只是「宿主约定的载体」——宿主可自行从配置取出后传给
|
|
94
|
+
> `new Agent({ dataDir })`。内核不消费它,也没有任何默认值;`config.example.json` 里写 `~/.memora` 只是一个示例值,
|
|
95
|
+
> 不等于内核的缺省行为。
|
|
96
|
+
|
|
97
|
+
### 〇.4 多来源双路径编排(内置 + 用户)
|
|
98
|
+
|
|
99
|
+
内核**刻意保持"单 `configDir` 输入"**——`SkillManager`/`RolePackManager` 只扫 `<configDir>/skills/`、`<configDir>/role-packs/`,无"多来源"概念。宿主若想开放"内置(随插件打包)+ 用户自定义"双路径,由宿主在传入内核**之前**自行编排归一,两种形态:
|
|
100
|
+
|
|
101
|
+
| 形态 | 做法 | 适用 |
|
|
102
|
+
|------|------|------|
|
|
103
|
+
| **A. 宿主文件层汇总(推荐,零内核改动)** | 宿主在文件系统层把"内置目录 + 用户目录"合并/软链到**一个 `configDir`** 再传内核 | 角色包、全局技能均可;内容本质同构、希望同池匹配 |
|
|
104
|
+
| **B. 宿主多 Manager 实例聚合** | 宿主建多个 `RolePackManager(configDirA/B)` 各管一个来源,聚合 `listMeta()` 在 UI 层分组展示,激活仍逐个调用 | 来源语义需要区分(UI 分组、只读标记) |
|
|
105
|
+
|
|
106
|
+
选择依据:内容**不必区分来源**走 A(合并到同一 configDir);**必须区分来源**(只读/可编辑、分组)走 B(多实例聚合展示)。内核两种都支持。
|
|
107
|
+
|
|
108
|
+
### 〇.5 构造 `Agent` 的参数
|
|
109
|
+
|
|
110
|
+
```ts
|
|
111
|
+
new Agent({
|
|
112
|
+
projectPath, // ✅ 必选:工作区
|
|
113
|
+
provider, // ✅ 必选:前台 LLM
|
|
114
|
+
// 常用可选项
|
|
115
|
+
configDir, // 配置根目录(role-packs / skills;缺省用内置默认)
|
|
116
|
+
dataDir, // ✅ 必选:记忆数据落地目录(内核不提供默认值)
|
|
117
|
+
backgroundProvider, // 后台 LLM
|
|
118
|
+
storage, // IMemoryStorage 实现(缺省 InMemoryStorage)
|
|
119
|
+
sessionStore, // ISessionStore 实现(缺省仅内存保存)
|
|
120
|
+
webSearchProvider, // 网络搜索
|
|
121
|
+
tracer, // 可观测
|
|
122
|
+
maxContextTokens, // 默认 120000
|
|
123
|
+
permission, allowedPaths, confirmWrites, // 安全
|
|
124
|
+
activeRolePack, // 启动激活的角色包
|
|
125
|
+
})
|
|
126
|
+
```
|
|
22
127
|
|
|
23
128
|
---
|
|
24
129
|
|
|
@@ -37,14 +142,14 @@
|
|
|
37
142
|
│ │ ┌──────────────────────────────────────┐│ │
|
|
38
143
|
│ │ │ Agent 面类(编排层) ││ │
|
|
39
144
|
│ │ │ - init/close · chat · switchProject ││ │
|
|
40
|
-
│ │ │ - .
|
|
41
|
-
│ │ │ - .
|
|
145
|
+
│ │ │ - .rolePack / .tools / .skills ││ │
|
|
146
|
+
│ │ │ - .governance / .memory ││ │
|
|
42
147
|
│ │ └──────────┬───────────────────────────┘│ │
|
|
43
148
|
│ │ │ 委托 │ │
|
|
44
149
|
│ │ ┌──────────┼───────────────────────────┐│ │
|
|
45
|
-
│ │ │
|
|
46
|
-
│ │ │
|
|
47
|
-
│ │ │
|
|
150
|
+
│ │ │ RolePackManager / SkillManager ││ │
|
|
151
|
+
│ │ │ ToolExecutor / MemoryInspector ││ │
|
|
152
|
+
│ │ │ MemoryGovernance ││ │
|
|
48
153
|
│ │ └──────────────────────────────────────┘│ │
|
|
49
154
|
│ │ ⚠️ 不包含:UI / LLM 配置 / 用户配置模板 │ │
|
|
50
155
|
│ └──────────────────────────────────────────┘ │
|
|
@@ -52,8 +157,8 @@
|
|
|
52
157
|
```
|
|
53
158
|
|
|
54
159
|
**设计原则**:
|
|
55
|
-
- **零运行时依赖**(核心层零 npm
|
|
56
|
-
-
|
|
160
|
+
- **零运行时依赖**(核心层零 npm 运行时依赖、**零运行时模块解析**;日志默认内置 console fallback,宿主经 `setLogger()` 注入自定义实现;持久化由宿主通过 `IMemoryStorage` 接口注入)
|
|
161
|
+
- **内核模块不直接调用 `console.*`**(唯一日志出口是 `logging/` 单例 `logger`;默认实现为内置 console fallback,写 stderr)
|
|
57
162
|
- **零写用户文件**(配置文件是真理源,Agent 只读)
|
|
58
163
|
- **零 LLM 配置加载**(Agent 不知道 `apiKey`,宿主传入 `LlmProvider` 实例)
|
|
59
164
|
- **Manager 委托模式**:Agent 面类只做编排,领域操作委托给专职 Manager
|
|
@@ -69,25 +174,30 @@
|
|
|
69
174
|
| `projectPath` | `string` | ✅ | 项目路径(必须) |
|
|
70
175
|
| `provider` | `LlmProvider` | ✅ | 前台 LLM Provider(必须) |
|
|
71
176
|
| `backgroundProvider` | `LlmProvider` | ❌ | 后台 Provider(投影等后台操作) |
|
|
72
|
-
| `
|
|
73
|
-
| `
|
|
74
|
-
| `
|
|
177
|
+
| `providerRouter` | `ProviderRouter` | ❌ | 按任务类型返回 Provider 的路由器(不配时全部使用同一 Provider,向后兼容) |
|
|
178
|
+
| `configDir` | `string` | ❌ | 配置目录(role-packs / skills,设定记忆唯一归角色包) |
|
|
179
|
+
| `dataDir` | `string` | ✅ | 记忆数据目录(必填,内核不提供默认值;传项目级还是用户级目录由宿主决定) |
|
|
180
|
+
| `registryDir` | `string` | ❌ | 项目注册表目录(缺省与 dataDir 相同)。注册表用于**跨项目按名解析**,仅当多项目共用一份时才成立 |
|
|
75
181
|
| `maxContextTokens` | `number` | ❌ | 上下文窗口上限(默认 120000) |
|
|
76
|
-
| `
|
|
182
|
+
| `activeRolePack` | `string` | ❌ | 启动激活的角色包名(缺失/不存在回退默认激活首个) |
|
|
77
183
|
| `permission` | `'owner' \| 'guest'` | ❌ | 安全权限(默认 'owner') |
|
|
78
184
|
| `allowedPaths` | `string[]` | ❌ | 路径白名单(默认 [] = 全部允许) |
|
|
79
185
|
| `confirmWrites` | `boolean` | ❌ | 写入确认(默认 false) |
|
|
80
186
|
| `storage` | `IMemoryStorage` | ❌ | 存储层注入(默认 InMemoryStorage) |
|
|
81
|
-
|
|
|
82
|
-
|
|
|
187
|
+
| ~~`vectorStore`~~ | ~~`IVectorStore`~~ | — | **已删除(2026-09-18 B0 收编)**:向量语义召回通道此前**写端缺失、从未在生产生效**(`upsert` 零调用 → 库恒空 → 语义分支永不触发 = 僵尸能力)。经主流 agent 调研(Anthropic Memory/Claude Code/Librarian Pattern 实证「LLM 消费者 + 小语料」纯关键词足用)拍板收编:`IVectorStore` 接口、`JsonVectorStore`、`EmbeddingProvider` 及 `config.embedding` 段全链删除;`search_memories` 走纯关键词,未命中提示 LLM 换词重试 |
|
|
188
|
+
| ~~`recallExcludeSources`~~ | ~~`string[]`~~ | — | **已删除(2026-09-11)**:该配置随召回编排 `recall()` 退役后成为零消费者死配置,全链(AgentOptions → AgentConfig → AssembleInput → ContextPreparerDeps)物理删除。关联推荐的实际排除走 `Agent.governance.suggest(query, { excludeSources })` 显式参数 |
|
|
83
189
|
| `sessionStore` | `ISessionStore` | ❌ | 会话存储注入 |
|
|
84
|
-
| `relationStore` | `IMemoryRelationStore` | ❌ | 记忆关系存储(ADR-014 侧车,不传则跳过关系构建) |
|
|
85
190
|
| `tracer` | `ITracer` | ❌ | 可观测性 Tracer 注入(不传则使用 NoopTracer 静默丢弃所有 span) |
|
|
86
191
|
| `messages` | `UIMessages` | ❌ | 宿主可覆盖的 UI 消息文本(默认英文,宿主覆盖为中文等) |
|
|
87
192
|
| `enableContextSummary` | `boolean` | ❌ | 上下文超限时是否自动生成摘要(默认 true,开启后首次截断时增加 ~1-2s 延迟) |
|
|
88
|
-
| `archiveMode` | `ArchiveMode` | ❌ | 归档模式(ADR-015,默认 `'full'`)。`'full'
|
|
193
|
+
| `archiveMode` | `ArchiveMode` | ❌ | 归档模式(ADR-015,默认 `'full'`)。`'full'`:会话内容在会话切换前自动归档;`'manual'`:全部需手动触发(2026-08-14 洞察层移除后三态收敛为二态,原 `'insights-only'` 已移除) |
|
|
194
|
+
| `webSearchProvider` | `IWebSearchProvider` | ❌ | 网络搜索提供者注入(提供时自动暴露 `web_search` 工具给 LLM,不传则不暴露) |
|
|
195
|
+
| `fetchProvider` | `IFetchProvider` | ❌ | 网页抓取提供者注入(提供时自动暴露 `web_fetch` 工具给 LLM,与 `webSearchProvider` 成对构成「搜索→抓取」闭环,不传则不暴露) |
|
|
196
|
+
| `codeExecutionProvider` | `ICodeExecutionProvider` | ❌ | 代码执行提供者注入(提供时自动暴露 `run_code` 工具给 LLM,沙箱执行能力完全由宿主 provider 决定,内核零运行时依赖,不传则不暴露) |
|
|
197
|
+
| `fileConsistencyCheck` | `FileConsistencyCheck` | ❌ | 文件层前置条件断言回调(可选,未注入则完全降级为现状) |
|
|
198
|
+
| `preExecutionCheck` | `(name, args) => PreExecutionResult` | ❌ | 工具执行前检查回调(宿主审批/审计/参数改写通道;装配时与内部幂等检查组合为单点入口) |
|
|
89
199
|
|
|
90
|
-
> **Logger 注入方式**:v1.0 起 `AgentOptions` 不再含 `logger` 字段。日志通过全局 `setLogger(customLogger)` 注入(详见
|
|
200
|
+
> **Logger 注入方式**:v1.0 起 `AgentOptions` 不再含 `logger` 字段。日志通过全局 `setLogger(customLogger)` 注入(详见 §十七 类型导出);未注入时使用内核内置 console fallback(写 stderr,级别由 `MEMORA_LOG_LEVEL` 控制),内核不做任何运行时模块解析。注入即内核唯一日志出口,对**所有内核模块(含 utils 层)**生效。
|
|
91
201
|
|
|
92
202
|
### 2.2 生命周期方法
|
|
93
203
|
|
|
@@ -113,17 +223,15 @@ Agent 通过一组 getter 暴露专职 Manager 与组件。详见后续章节。
|
|
|
113
223
|
|
|
114
224
|
| 访问器 | 类型 | 职责 |
|
|
115
225
|
|--------|------|------|
|
|
116
|
-
| `agent.
|
|
226
|
+
| `agent.rolePack` | `RolePackManager \| null` | 角色包管理 |
|
|
117
227
|
| `agent.tools` | `ToolExecutor \| null` | 工具注册与执行 |
|
|
118
228
|
| `agent.skills` | `SkillManager \| null` | 技能匹配与注入 |
|
|
119
|
-
| `agent.
|
|
120
|
-
| `agent.insight` | `InsightExtractor \| null` | 输入分类 + 记忆提取 |
|
|
229
|
+
| `agent.governance` | `MemoryGovernance \| null` | 记忆治理(去重/冲突检测/建议) |
|
|
121
230
|
| `agent.memory` | `MemoryInspector \| null` | 记忆查询 + 写入(`writeXxx` 前缀) |
|
|
122
|
-
| `agent.userProfile` | `UserProfile \| null` | 用户画像管理(事实提取 + 确认/拒绝) |
|
|
123
231
|
| `agent.works` | `WorkProjectionManager \| null` | 作品投影(工作内容摘要) |
|
|
124
232
|
| `agent.polish` | `TextPolishManager \| null` | 文本润色(LLM 语法修正 + 表达优化) |
|
|
125
233
|
|
|
126
|
-
> **读写统一入口**:`agent.memory`(MemoryInspector)同时负责记忆的查询与写入——只读方法(snapshot/search/
|
|
234
|
+
> **读写统一入口**:`agent.memory`(MemoryInspector)同时负责记忆的查询与写入——只读方法(snapshot/search/searchByKeyword/stats/list/getById/getBySource/listDeleted 等)与写方法(`writeXxx` 前缀:writeUpsert/writeDelete/writeRestore/writePurge/writePurgeExpired。`writeBoost` 已随 score 字段退役删除,2026-09-09)。旧的 `memoryMutator`/`MemoryMutator` 拆分已在后续迭代中合并回 `MemoryInspector`,二者均不再存在。
|
|
127
235
|
|
|
128
236
|
### 2.5 内部组件访问器(高级)
|
|
129
237
|
|
|
@@ -139,12 +247,9 @@ Agent 通过一组 getter 暴露专职 Manager 与组件。详见后续章节。
|
|
|
139
247
|
| `projectPath` | `string` | 项目根目录的绝对路径 |
|
|
140
248
|
| `projectName` | `string` | 项目名称(从注册表读取,或取目录名) |
|
|
141
249
|
| `memoraDir` | `string` | `.memora/` 目录的绝对路径 |
|
|
142
|
-
| `dbPath` | `string` | memora.db 路径 |
|
|
143
|
-
| `fileStore` | `FileStore` | 文件存储 |
|
|
144
250
|
| `index` | `IMemoryStorage` | 记忆存储接口 |
|
|
145
251
|
| `security` | `SecurityGuard` | 安全守卫 |
|
|
146
252
|
| `bootstrapMemories` | `Memory[]` | 启动时加载的必召记忆 |
|
|
147
|
-
| `loadResult` | `LoadResult` | 加载结果(成功数 / 失败数) |
|
|
148
253
|
|
|
149
254
|
### 2.7 事件订阅(`agent.on()` / `agent.off()` / `agent.once()`)
|
|
150
255
|
|
|
@@ -158,21 +263,17 @@ agent.once<K extends AgentEventName>(event: K, handler: (payload: AgentEventMap[
|
|
|
158
263
|
|
|
159
264
|
| 事件名 | 载荷 | 触发时机 |
|
|
160
265
|
|--------|------|----------|
|
|
161
|
-
| `memoryAdded` | `{ id, source, name }` | 记忆被写入存储(
|
|
162
|
-
| `personaSwitched` | `{ from: string \| null, to }` |
|
|
163
|
-
| `decayCompleted` | `{ decayedCount }` | 记忆衰减完成(init 首次 + 每小时定时) |
|
|
266
|
+
| `memoryAdded` | `{ id, source, name }` | 记忆被写入存储(round-summary 沉淀等) |
|
|
267
|
+
| `personaSwitched` | `{ from: string \| null, to }` | 角色被切换(手动指定) |
|
|
164
268
|
| `memoryRecalled` | `{ count, query }` | 记忆被召回(用于 UI 展示) |
|
|
165
269
|
| `sessionForked` | `{ from, to, messageCount }` | 会话被分叉(创建新分支) |
|
|
166
|
-
| `insightExtracted` | `{ source: string; insight: string }` | 洞察被提取 |
|
|
167
|
-
| `conflictDetected` | `{ newMemoryId, newInsight, targetId, targetContent }` | 记忆冲突被检测到(`contradicts` 关系写入时触发,宿主可通知用户) |
|
|
168
270
|
| `projectSwitched` | `{ from: string \| null, to: string, projectName: string }` | 项目切换(宿主 UI 可据此刷新项目相关界面) |
|
|
169
271
|
| `skillMatched` | `{ skill: string, score: number }` | 技能被匹配(宿主 UI 可据此展示当前激活技能) |
|
|
170
|
-
| `archiveFailed` | `{ stage: '
|
|
272
|
+
| `archiveFailed` | `{ stage: 'content'; message: string }` | 归档操作失败(仅 content 阶段,fire-and-forget catch 分支发射,宿主可通知用户) |
|
|
171
273
|
|
|
172
274
|
```typescript
|
|
173
275
|
// 使用示例
|
|
174
276
|
agent.on('memoryAdded', (e) => console.log(`新记忆: ${e.source}:${e.name}`));
|
|
175
|
-
agent.on('decayCompleted', (e) => console.log(`衰减 ${e.decayedCount} 条记忆`));
|
|
176
277
|
```
|
|
177
278
|
|
|
178
279
|
> `close()` 自动移除所有事件监听器。
|
|
@@ -199,10 +300,10 @@ async *chat(input: string, signal?: AbortSignal): AsyncGenerator<AgentChunk, voi
|
|
|
199
300
|
|
|
200
301
|
```typescript
|
|
201
302
|
type AgentChunk =
|
|
202
|
-
| { type: 'recall'; memories: RecalledMemorySummary[] } // 记忆召回(携带摘要列表)
|
|
203
303
|
| { type: 'thinking'; phase: ThinkingPhase } // 推理阶段
|
|
204
|
-
| { type: 'text'; content: string
|
|
205
|
-
| { type: '
|
|
304
|
+
| { type: 'text'; content: string } // LLM 文本片段(流式输出内容)
|
|
305
|
+
| { type: 'thought'; content: string; stepIndex?: number } // 模型思考增量(不进正文/记忆);stepIndex = 所属 step 轮内序号(loop 打标)
|
|
306
|
+
| { type: 'tool_start'; toolCallId: string; name: string; args?: string; stepIndex?: number } // 工具调用开始(stepIndex 同 thought;tool_result 经 toolCallId 归属,不重复携带)
|
|
206
307
|
| { type: 'tool_result'; toolCallId: string; name: string; ok: boolean; summary?: string } // 工具调用结果
|
|
207
308
|
| { type: 'aborted'; reason: string } // 对话被取消
|
|
208
309
|
| { type: 'error'; message: string } // 流式过程中发生错误(LLM 超时/连接断开)
|
|
@@ -210,22 +311,11 @@ type AgentChunk =
|
|
|
210
311
|
| { type: 'done' }; // 结束标记
|
|
211
312
|
```
|
|
212
313
|
|
|
213
|
-
`
|
|
214
|
-
|
|
215
|
-
#### `RecalledMemorySummary` 类型(recall chunk 载荷)
|
|
314
|
+
> 上表为核心事件子集(含边界/提问等更多成员的 `AgentChunk` 全集以 [types.ts](../src/agent/types.ts) 为唯一真理源)。
|
|
216
315
|
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
```typescript
|
|
220
|
-
interface RecalledMemorySummary {
|
|
221
|
-
id: string; // 记忆唯一标识(source:name 格式,用于前端精准跳转详情)
|
|
222
|
-
name: string; // 记忆可读名称(点击跳转记忆详情用)
|
|
223
|
-
score: number; // 相似度分数(0-1)
|
|
224
|
-
source: string; // 来源标签(开放字符串,如 'rule'、'insight'、'profile')
|
|
225
|
-
}
|
|
226
|
-
```
|
|
316
|
+
> **记忆召回展示链已退役(2026-09-10)**:`recall` chunk 分支与 `RecalledMemorySummary` 类型已随自动注入退役**物理删除**。记忆纯工具化后,「召回了什么」由 `search_memories` 工具的 `tool_start` / `tool_result` 过程事件天然展示;检索命中含 `accessedAt` / 溯源字段(`sessionId`/`roundId`)。
|
|
227
317
|
|
|
228
|
-
|
|
318
|
+
`ThinkingPhase` 取值:`'recalling' | 'processing' | 'archiving'`
|
|
229
319
|
|
|
230
320
|
### 3.2 `chatSync(input, signal?)` — 同步版(仅供测试用)
|
|
231
321
|
|
|
@@ -253,7 +343,7 @@ agent.memory.snapshot(): MemorySnapshot
|
|
|
253
343
|
|----|-----|------|
|
|
254
344
|
| 第 1 层 | `snapshot.working` | `WorkingMemorySnapshot` — 当前 AgentLoop 消息(最近 5 条预览 + 总数) |
|
|
255
345
|
| 第 2 层 | `snapshot.bootstrap` | `BootstrapSnapshot` — 规则记忆(名称 + 来源 + 权重,Persona/Skill 已解耦为设定记忆,不进 bootstrap) |
|
|
256
|
-
| 第 3 层 | `snapshot.archive` | `ArchiveSnapshot` — 归档记忆计数(
|
|
346
|
+
| 第 3 层 | `snapshot.archive` | `ArchiveSnapshot` — 归档记忆计数(round-summary)+ 当前会话信息 |
|
|
257
347
|
|
|
258
348
|
```typescript
|
|
259
349
|
interface MemorySnapshot {
|
|
@@ -266,6 +356,7 @@ interface MemorySnapshot {
|
|
|
266
356
|
### 4.2 `search(query, limit?)` — 记忆搜索
|
|
267
357
|
|
|
268
358
|
```typescript
|
|
359
|
+
// ⚠️ @deprecated 同步通道已退役(2026-09-20),改用 searchByKeyword()。实证无生产/宿主消费方。
|
|
269
360
|
agent.memory.search(query: string, limit?: number): AgentSearchHit[]
|
|
270
361
|
```
|
|
271
362
|
|
|
@@ -274,9 +365,7 @@ interface AgentSearchHit {
|
|
|
274
365
|
id: string; // 记忆唯一标识(source:name 格式,供 showMemory/deleteMemory 等操作使用)
|
|
275
366
|
name: string; // 记忆名称
|
|
276
367
|
source: string; // 来源标签
|
|
277
|
-
score: number; // 权重(0-1)
|
|
278
368
|
contentPreview: string; // 内容预览(截断到 120 字符)
|
|
279
|
-
similarity?: number; // 语义相似度(0-1,仅 searchHybrid 返回;纯关键词搜索时无此字段)
|
|
280
369
|
createdAt?: string; // 创建时间(ISO 8601,供 UI 层时间筛选/排序使用)
|
|
281
370
|
}
|
|
282
371
|
```
|
|
@@ -291,7 +380,6 @@ agent.memory.stats(): AgentStats
|
|
|
291
380
|
interface AgentStats {
|
|
292
381
|
bySource: Record<string, number>; // 按来源标签分组的记忆数量
|
|
293
382
|
total: number; // 记忆总数
|
|
294
|
-
relationCount: number; // 关系边总数(relationStore 未注入时为 0)
|
|
295
383
|
}
|
|
296
384
|
```
|
|
297
385
|
|
|
@@ -301,38 +389,28 @@ interface AgentStats {
|
|
|
301
389
|
agent.agentLoop.getMessages(): readonly Message[]
|
|
302
390
|
```
|
|
303
391
|
|
|
304
|
-
### 4.5
|
|
392
|
+
### 4.5 写入方法
|
|
305
393
|
|
|
306
|
-
|
|
394
|
+
记忆的写入统一收口在 `agent.memory`,写方法以 `writeXxx` 前缀命名(同步返回、不调 LLM、不触发异步 IO):
|
|
307
395
|
|
|
308
396
|
```typescript
|
|
309
397
|
// ─── 写入(writeXxx 前缀) ───
|
|
310
398
|
agent.memory.writeUpsert(memory: Memory): void; // 插入或更新记忆
|
|
311
|
-
agent.memory.writeBoost(id: string, increment?: number): boolean; // 提升 score(用户采纳反哺,默认 +0.05)
|
|
312
399
|
agent.memory.writeDelete(id: string): void; // 软删除(写入 deletedAt)
|
|
313
400
|
agent.memory.writeRestore(id: string): void; // 恢复软删除
|
|
314
401
|
agent.memory.writePurge(id: string): void; // 物理删除(不可恢复)
|
|
315
|
-
agent.memory.writePurgeExpired(before: Date): number; //
|
|
316
|
-
agent.memory.writeAddRelation(relation: MemoryRelation): void; // 添加关系边
|
|
317
|
-
agent.memory.writeRemoveRelation(sourceId: string, targetId: string, type: string): void;
|
|
318
|
-
agent.memory.writeRemoveRelationsByMemoryId(memoryId: string): number; // 删除某记忆的所有关系边
|
|
402
|
+
agent.memory.writePurgeExpired(before: Date): number; // 清理过期回收站
|
|
319
403
|
|
|
320
404
|
// ─── 只读扩展查询 ───
|
|
321
|
-
agent.memory.list(limit?: number): Memory[]; // 列出所有记忆(按 score
|
|
405
|
+
agent.memory.list(limit?: number): Memory[]; // 列出所有记忆(按 accessedAt 降序;score 已随 2026-09-09 退役)
|
|
322
406
|
agent.memory.getById(id: string): Memory | null; // 按 ID 获取活跃记忆
|
|
323
407
|
agent.memory.getBySource(source: string): Memory[]; // 按 source 获取
|
|
324
408
|
agent.memory.listDeleted(limit?: number): Memory[]; // 回收站(软删除记忆)
|
|
325
409
|
agent.memory.getDeletedById(id: string): Memory | null;
|
|
326
|
-
agent.memory.
|
|
327
|
-
|
|
328
|
-
// ─── 关系查询(relationStore 未注入时静默返回空/0) ───
|
|
329
|
-
agent.memory.getRelations(memoryId: string, direction?: RelationDirection): MemoryRelation[];
|
|
330
|
-
agent.memory.getAllRelations(): MemoryRelation[];
|
|
331
|
-
agent.memory.getRelationPath(memoryId: string, maxDepth?: number, direction?: RelationDirection): RelationPath[];
|
|
332
|
-
agent.memory.getRelationNeighbors(memoryId: string, limit?: number): RelationNeighbor[];
|
|
410
|
+
agent.memory.searchByKeyword(query: string, limit?: number): Promise<AgentSearchHit[]>; // 纯关键词通道
|
|
333
411
|
```
|
|
334
412
|
|
|
335
|
-
> **注意**:`suggest()` / `sourceHealth()`
|
|
413
|
+
> **注意**:`suggest()` / `sourceHealth()` 经 `agent.governance` 暴露(`.suggest()` / `.sourceHealth()`),不挂在 `agent.memory` 下,避免经 MemoryInspector 转发产生多余代理层。
|
|
336
414
|
|
|
337
415
|
---
|
|
338
416
|
|
|
@@ -346,31 +424,34 @@ interface Memory {
|
|
|
346
424
|
name: string; // 可读名称
|
|
347
425
|
createdAt: string; // 创建时间(ISO 8601)
|
|
348
426
|
accessedAt: string; // 最后访问时间(每次召回时刷新)
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
427
|
+
deletedAt?: string; // 软删除时间(ISO 8601,可选;非 undefined 表示已软删除。回收站**无自动清理**:保留期清理由宿主入口显式触发,见 writePurgeExpired)
|
|
428
|
+
metadata?: Record<string, string>; // 配置文件 frontmatter 额外元数据(仅配置文件写入路径使用,不进记忆库)
|
|
429
|
+
summaryType?: SummaryType; // round-summary 摘要类型(preference/fact/decision/intent/general;顶层持久化字段)
|
|
430
|
+
sessionName?: string; // round-summary 归属会话标识(顶层持久化字段,仅 round-summary 有意义)
|
|
431
|
+
roundId?: string; // round-summary 归属轮次标识(顶层持久化字段,仅 round-summary 有意义)
|
|
432
|
+
isModified?: boolean; // 摘要是否已被人工修改(仅 round-summary 有意义)
|
|
433
|
+
supersededBy?: string; // 写路径取代标记:非 undefined 表示已被更新的摘要覆盖,召回时确定性过滤
|
|
352
434
|
}
|
|
353
435
|
```
|
|
354
436
|
|
|
355
|
-
>
|
|
437
|
+
> **字段基线**(score 已退役):`score` 字段已随 2026-09-09 阶段3 物理删除(无持久化排序分字段,使用轨迹唯一事实源为 `accessedAt`);向量语义通道已随 2026-09-18 B0 收编(检索为纯关键词单通道)。round-summary 溯源/分类字段(summaryType/sessionName/roundId)已提升为顶层持久化字段(metadata 不进记忆库)。所有查询方法(getById/getBySource/search/count/countBySource/getAllSources)自动过滤 `deletedAt != undefined` 的记忆。详见 ADR-004 GAP-6 + ADR-002 §IMemoryStorage。
|
|
356
438
|
|
|
357
439
|
**常用 source 标签(`SOURCE_LABELS` 常量):**
|
|
358
440
|
|
|
359
441
|
| 常量 | 值 | 用途 |
|
|
360
442
|
|------|----|------|
|
|
361
|
-
| `SOURCE_LABELS.PERSONA` | `'persona'` |
|
|
362
|
-
| `SOURCE_LABELS.RULE` | `'rule'` |
|
|
363
|
-
| `SOURCE_LABELS.SKILL` | `'skill'` |
|
|
364
|
-
| `SOURCE_LABELS.
|
|
365
|
-
| `SOURCE_LABELS.
|
|
366
|
-
| `SOURCE_LABELS.
|
|
367
|
-
| `SOURCE_LABELS.GUARDRAIL` | `'guardrail'` | 内容护栏规则 |
|
|
443
|
+
| `SOURCE_LABELS.PERSONA` | `'persona'` | 角色人格(残留兼容标签,已随 ADR-025 归角色包、不进记忆库) |
|
|
444
|
+
| `SOURCE_LABELS.RULE` | `'rule'` | 创作规则(残留兼容标签,已随 ADR-025 归角色包、不进记忆库) |
|
|
445
|
+
| `SOURCE_LABELS.SKILL` | `'skill'` | 技能定义(残留兼容标签,已随 ADR-025 归角色包、不进记忆库) |
|
|
446
|
+
| `SOURCE_LABELS.WORK_PROJECTION` | `'work-projection'` | 作品投影(已移出记忆库,2026-08-20 落项目目录 projections/) |
|
|
447
|
+
| `SOURCE_LABELS.ROUND_SUMMARY` | `'round-summary'` | 轮次摘要(当前实际写入记忆库的主要 source) |
|
|
448
|
+
| `SOURCE_LABELS.UNKNOWN` | `'unknown'` | 未知来源(未被已知标签覆盖时的兜底值) |
|
|
368
449
|
|
|
369
|
-
> source 是开放字符串,宿主可自定义新标签。`validateSource()` 可检测常见 typo(基于 Levenshtein 距离)。
|
|
450
|
+
> source 是开放字符串,宿主可自定义新标签。`validateSource()` 可检测常见 typo(基于 Levenshtein 距离)。PERSONA/RULE/SKILL/WORK_PROJECTION 四标签**仅作历史兼容与 typo 检测**保留,已不进入治理范围(`GOVERNANCE_SOURCES`)——当前写入记忆库的主要 source 为 `round-summary`。
|
|
370
451
|
|
|
371
452
|
### 5.2 `IMemoryStorage` 接口
|
|
372
453
|
|
|
373
|
-
宿主实现此接口注入 Agent,替代默认的 `InMemoryStorage`。共 **15
|
|
454
|
+
宿主实现此接口注入 Agent,替代默认的 `InMemoryStorage`。共 **15 方法**(14 必需 + 可选 `close`),所有方法同步(与 better-sqlite3 API 对齐,`await` 同步值安全)。所有查询方法自动过滤已软删除的记忆(`deletedAt != undefined`)。
|
|
374
455
|
|
|
375
456
|
```typescript
|
|
376
457
|
interface IMemoryStorage {
|
|
@@ -386,20 +467,20 @@ interface IMemoryStorage {
|
|
|
386
467
|
delete(id: string): void; // 软删除(写入 deletedAt,不物理移除;对已软删除的 no-op)
|
|
387
468
|
restore(id: string): void; // 恢复软删除记忆(清除 deletedAt;对活跃记忆 no-op)
|
|
388
469
|
purge(id: string): void; // 物理删除(不可恢复,用于回收站"彻底删除")
|
|
389
|
-
listDeleted(limit?: number): Memory[]; // 列出回收站(按 deletedAt
|
|
470
|
+
listDeleted(limit?: number): Memory[]; // 列出回收站(按 deletedAt 降序;limit 缺省/≤0 = 全部,正整数 = 最近 N 条)
|
|
390
471
|
getDeletedById(id: string): Memory | null; // 按 ID 获取单条软删除记忆(restore/purge 前存在性校验)
|
|
391
472
|
purgeExpired(before: Date): number; // 清理过期回收站(物理删除 deletedAt 早于 before 的,返回清理数量)
|
|
392
473
|
|
|
393
474
|
// ─── 统计与维护(2 方法) ───
|
|
394
|
-
|
|
395
|
-
getAllSources(): Map<string, number>;
|
|
475
|
+
touch(id: string, now: string): boolean; // 刷新 accessedAt(score 退役后唯一写位;不写 score、无 clamp 语义)
|
|
476
|
+
getAllSources(): Map<string, number>; // 获取所有 source 标签及其活跃记忆数量
|
|
396
477
|
|
|
397
478
|
// ─── 可选(1 方法) ───
|
|
398
479
|
close?(): void;
|
|
399
480
|
}
|
|
400
481
|
```
|
|
401
482
|
|
|
402
|
-
> 宿主实现应使用 `COUNT(*)` / `UPDATE ... WHERE` 等数据库原生操作,避免全量加载数据。`
|
|
483
|
+
> 宿主实现应使用 `COUNT(*)` / `UPDATE ... WHERE` 等数据库原生操作,避免全量加载数据。`getAllSources` 是性能优化方法,避免逐条遍历。详见 ADR-002 §IMemoryStorage 接口方法。
|
|
403
484
|
|
|
404
485
|
### 5.3 `ISessionStore` 接口
|
|
405
486
|
|
|
@@ -410,105 +491,18 @@ interface ISessionStore {
|
|
|
410
491
|
appendMessage(date: string, session: string, message: SessionMessage): void;
|
|
411
492
|
loadMessages(date: string, session: string): SessionMessage[];
|
|
412
493
|
listSessions(): string[];
|
|
413
|
-
copySession?(sourceDate: string, sourceSession: string, targetDate: string, targetSession: string): void;
|
|
414
|
-
}
|
|
415
|
-
```
|
|
416
|
-
|
|
417
|
-
**`copySession` 实现要求**:
|
|
418
|
-
- 原子操作:要么全部复制成功,要么不产生副作用
|
|
419
|
-
- 保留时间戳:消息的 timestamp 不修改
|
|
420
|
-
- 幂等:若目标会话已存在,覆盖(而非追加)
|
|
421
|
-
- 若源会话不存在,静默返回(不抛出)
|
|
422
|
-
|
|
423
|
-
### 5.4 记忆关系图谱(ADR-014 侧车模型)
|
|
424
|
-
|
|
425
|
-
记忆关系是独立的侧车数据结构,与 Memory 平行存在,互不侵入。关系类型是开放字符串(非枚举),遵循 ADR-004 基元驱动原则。
|
|
426
|
-
|
|
427
|
-
#### `MemoryRelation` 类型
|
|
428
|
-
|
|
429
|
-
```typescript
|
|
430
|
-
interface MemoryRelation {
|
|
431
|
-
sourceId: string; // 关系起点(Memory.id)
|
|
432
|
-
targetId: string; // 关系终点(Memory.id)
|
|
433
|
-
type: string; // 关系类型(开放字符串,非枚举)
|
|
434
|
-
weight: number; // 关系强度 0-1
|
|
435
|
-
createdAt: string; // 创建时间(ISO 8601)
|
|
436
|
-
}
|
|
437
|
-
```
|
|
438
|
-
|
|
439
|
-
#### 预设关系类型常量(`RELATION_TYPES`)
|
|
440
|
-
|
|
441
|
-
| 常量 | 值 | 方向 | 说明 |
|
|
442
|
-
|------|------|------|------|
|
|
443
|
-
| `CONTRADICTS` | `'contradicts'` | 双向对称 | 矛盾关系 |
|
|
444
|
-
| `SUPPORTS` | `'supports'` | 有向 | 支持关系 |
|
|
445
|
-
| `FOLLOWS` | `'follows'` | 有向 | 时间先后 |
|
|
446
|
-
| `REFINES` | `'refines'` | 有向 | 细化/演化 |
|
|
447
|
-
| `CAUSED` | `'caused'` | 有向 | 因果关系 |
|
|
448
|
-
| `RELATED` | `'related'` | 双向对称 | 泛相关 |
|
|
449
|
-
|
|
450
|
-
#### 关系强度常量(`RELATION_WEIGHTS`)
|
|
451
|
-
|
|
452
|
-
| 常量 | 值 | 说明 |
|
|
453
|
-
|------|------|------|
|
|
454
|
-
| `NONE` | 0.0 | 几乎无关 |
|
|
455
|
-
| `WEAK` | 0.3 | 弱相关 |
|
|
456
|
-
| `UNDEFINED` | 0.5 | 未判断(代码默认兜底) |
|
|
457
|
-
| `STRONG` | 0.7 | 强相关 |
|
|
458
|
-
| `CERTAIN` | 1.0 | 确定关系(矛盾/等价) |
|
|
459
|
-
|
|
460
|
-
#### `IMemoryRelationStore` 接口
|
|
461
|
-
|
|
462
|
-
```typescript
|
|
463
|
-
interface IMemoryRelationStore {
|
|
464
|
-
/** 添加关系(三元组 sourceId+targetId+type 唯一约束,重复添加幂等更新 weight/createdAt) */
|
|
465
|
-
addRelation(relation: MemoryRelation): void;
|
|
466
|
-
/** 查询关系(direction 默认 'both',合并两方向并去重) */
|
|
467
|
-
getRelations(memoryId: string, direction?: RelationDirection): MemoryRelation[];
|
|
468
|
-
/** 按类型查询(如 getRelationsByType('contradicts') 获取所有矛盾关系) */
|
|
469
|
-
getRelationsByType(type: string): MemoryRelation[];
|
|
470
|
-
/** 获取全部关系(用于拓扑可视化构建节点+边图谱) */
|
|
471
|
-
getAllRelations(): MemoryRelation[];
|
|
472
|
-
/** 删除关系(用于关系修正,用户确认冲突后删除误判关系) */
|
|
473
|
-
removeRelation(sourceId: string, targetId: string, type: string): void;
|
|
474
|
-
/** 删除某记忆的所有关系边(不论方向,用于记忆删除/物理清除场景,防止孤儿边残留) */
|
|
475
|
-
removeRelationsByMemoryId(memoryId: string): number;
|
|
476
494
|
}
|
|
477
495
|
```
|
|
478
496
|
|
|
479
|
-
**`RelationDirection` 类型**:`'outgoing' | 'incoming' | 'both'`
|
|
480
|
-
|
|
481
|
-
#### 注入方式
|
|
482
|
-
|
|
483
|
-
```typescript
|
|
484
|
-
import { Agent, InMemoryRelationStore } from '@zooique/memora';
|
|
485
|
-
import type { IMemoryRelationStore } from '@zooique/memora';
|
|
486
|
-
|
|
487
|
-
// 测试用:InMemoryRelationStore(纯内存,零 IO)
|
|
488
|
-
const relationStore: IMemoryRelationStore = new InMemoryRelationStore();
|
|
489
|
-
|
|
490
|
-
// 生产用:宿主实现 SqliteRelationStore
|
|
491
|
-
const agent = new Agent({
|
|
492
|
-
// ...其他配置
|
|
493
|
-
relationStore,
|
|
494
|
-
});
|
|
495
|
-
```
|
|
496
|
-
|
|
497
|
-
> **不注入时**:跳过关系构建,InsightExtractor 不会检测冲突,不生成关系数据。
|
|
498
|
-
|
|
499
|
-
#### `InMemoryRelationStore` 测试实现
|
|
500
|
-
|
|
501
|
-
纯内存实现,零 IO,所有方法返回深拷贝(防止外部篡改内部状态)。供单元测试使用,生产环境宿主应实现 `SqliteRelationStore` 等持久化实现。
|
|
502
|
-
|
|
503
497
|
---
|
|
504
498
|
|
|
505
499
|
## 六、项目 / 会话管理
|
|
506
500
|
|
|
507
|
-
>
|
|
501
|
+
> **方法归属**:项目相关方法在 `agent.projects`(ProjectManager),会话相关方法在 `agent.sessionManager`(SessionManager),仅 `switchProject` / `rebuildComponents` / `forkSession` 保留在 Agent 面类作为常用入口。
|
|
508
502
|
|
|
509
503
|
> **switch* 返回值约定**:各 switch 操作返回与其操作语义最匹配的值 ——
|
|
510
504
|
> `switchSession` 返回新会话名(string)、`switchProject` 返回完整项目上下文(AgentContext,含 bootstrap 记忆等)、
|
|
511
|
-
> `
|
|
505
|
+
> `agent.switchRolePack` 返回布尔值(是否切换成功)。这是设计性差异,非 bug。
|
|
512
506
|
|
|
513
507
|
### 6.1 Agent 面类方法(项目/会话入口)
|
|
514
508
|
|
|
@@ -532,8 +526,11 @@ const agent = new Agent({
|
|
|
532
526
|
| `sessionManager.switchSession(newName)` → `string` | 切换到指定会话(chatBusy 时抛 configError) |
|
|
533
527
|
| `sessionManager.forkSession(targetSession?)` → `AgentForkResult` | 分叉当前会话 |
|
|
534
528
|
| `sessionManager.loadSessionMessages(date, session)` → `Promise<SessionMessage[]>` | 加载指定日期/会话的消息(含时间戳) |
|
|
535
|
-
| `sessionManager.restoreMostRecentSession(
|
|
529
|
+
| `sessionManager.restoreMostRecentSession()` → `Promise<number>` | 恢复最近活跃会话(SSOT:listSessionMetas[0],updatedAt 降序;绝不隐式创建——新建会话唯一入口为宿主手动按钮) |
|
|
536
530
|
| `sessionManager.restoreSession(date, session)` → `Promise<number>` | 恢复指定日期/会话 |
|
|
531
|
+
| `sessionManager.createCheckpoint(mainGoal?)` → `SessionCheckpoint \| null` | 创建当前会话检查点(含热记忆、目标、计划、状态机快照),首次调用返回完整检查点,后续调用合并增量。**同进程内存态**(2026-09-10 减法后不落盘) |
|
|
532
|
+
| `sessionManager.getCheckpoint()` → `SessionCheckpoint \| null` | 获取当前检查点(只读,不修改状态) |
|
|
533
|
+
| `sessionManager.discardCheckpoint()` → `boolean` | **Phase 4 新增**:放弃当前暂停检查点(对称 pause 创建,宿主 handleStop paused 态调之;停定时器 + 清内存 + resetToRunning;无检查点返回 false) |
|
|
537
534
|
|
|
538
535
|
```typescript
|
|
539
536
|
// 项目列表
|
|
@@ -569,42 +566,50 @@ export interface ForkResult {
|
|
|
569
566
|
|
|
570
567
|
---
|
|
571
568
|
|
|
572
|
-
##
|
|
569
|
+
## 七、角色包管理(`agent.rolePack` · RolePackManager)
|
|
573
570
|
|
|
574
|
-
> Manager 访问路径:`agent.
|
|
571
|
+
> Manager 访问路径:`agent.rolePack`(RolePackManager,`init()` 前返回 `null`)。角色包是「设定记忆唯一载体」(persona/rules/skills 归属角色包,见 memory-role-pack-boundary 纪律)。
|
|
575
572
|
|
|
576
573
|
| 成员 | 类型 | 说明 |
|
|
577
574
|
|------|------|------|
|
|
578
|
-
| `
|
|
579
|
-
| `
|
|
580
|
-
| `
|
|
581
|
-
| `
|
|
582
|
-
| `
|
|
583
|
-
| `
|
|
575
|
+
| `rolePack.listMeta()` | `RolePackMeta[]` | 所有角色包元数据(name / displayName / description / version / ...) |
|
|
576
|
+
| `rolePack.activeName` | `string \| null`(getter) | 当前激活的角色包名(null = 未激活) |
|
|
577
|
+
| `rolePack.getActive()` | `RolePackAssembly \| null` | 当前激活的完整角色包对象(含合并后策略) |
|
|
578
|
+
| `rolePack.getActiveRules()` | `string[]` | 当前激活角色包的规则列表 |
|
|
579
|
+
| `rolePack.getActiveTraits()` | `Record<string, number> \| undefined` | 当前激活角色包的 traits(clamp 0-1) |
|
|
580
|
+
| `rolePack.activate(name)` | 方法 → `boolean` | 手动切换到指定角色包(30s 内超 5 次切换后锁 2 分钟防抖) |
|
|
581
|
+
| `rolePack.getSwitchLockStatus()` | 方法 → `{ locked, unlockAt }` | 切换防抖锁定状态 |
|
|
582
|
+
| `rolePack.onRolePackActivated(handler)` | 方法 | 注册激活变更回调(`(from, to)`) |
|
|
584
583
|
|
|
585
584
|
```typescript
|
|
586
585
|
// 使用示例
|
|
587
|
-
const
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
console.log(
|
|
586
|
+
const rp = agent.rolePack;
|
|
587
|
+
if (!rp) throw new Error('rolePack 未就绪');
|
|
588
|
+
const metas = rp.listMeta(); // 列出所有角色包
|
|
589
|
+
rp.activate('作家'); // 切换角色包
|
|
590
|
+
console.log(rp.activeName); // 当前角色包名
|
|
591
|
+
const lock = rp.getSwitchLockStatus(); // 切换防抖状态
|
|
592
592
|
```
|
|
593
593
|
|
|
594
594
|
---
|
|
595
595
|
|
|
596
|
-
## 八、工具注册(`agent.tools` · ToolExecutor
|
|
596
|
+
## 八、工具注册(`agent.tools` · ToolExecutor)
|
|
597
597
|
|
|
598
|
-
> 工具注册/执行走 `agent.tools.xxx()
|
|
598
|
+
> 工具注册/执行走 `agent.tools.xxx()`。
|
|
599
599
|
|
|
600
|
-
### 8.1
|
|
600
|
+
### 8.1 内置工具(核心摘要:默认常驻 + 条件暴露,非全集)
|
|
601
601
|
|
|
602
|
-
| 工具名 | 用途 | 参数 |
|
|
603
|
-
|
|
604
|
-
| `read_file` |
|
|
605
|
-
| `write_file` | 写入/创建文件(支持 overwrite/append/insert
|
|
606
|
-
| `list_dir` | 列出目录内容(递归深度 ≤ 3) | `path?`, `recursive?`, `maxDepth?` |
|
|
607
|
-
| `search_memories` | 在记忆索引中搜索(支持 match/near 两种模式) | `query`, `limit?`, `mode?` |
|
|
602
|
+
| 工具名 | 用途 | 参数 | 暴露条件 |
|
|
603
|
+
|--------|------|------|------|
|
|
604
|
+
| `read_file` | 读取项目内文件内容(**按行分段返回**:单次输出 token 数 ≤ `LOOP_CONSTANTS.SINGLE_TOOL_RESULT_MAX_TOKENS`=6000;未读到末尾时附「[read_file 分段]」脚注,给出已显示行号区间、总行数与续读 offset) | `path`, `offset?`, `limit?` | 默认常驻 |
|
|
605
|
+
| `write_file` | 写入/创建文件(支持 overwrite/append/insert/replace 四种模式) | `path`, `content`, `mode?`, `insert_line?`, `old_string?` | 默认常驻 |
|
|
606
|
+
| `list_dir` | 列出目录内容(递归深度 ≤ 3) | `path?`, `recursive?`, `maxDepth?` | 默认常驻 |
|
|
607
|
+
| `search_memories` | 在记忆索引中搜索(支持 match/near 两种模式) | `query`, `limit?`, `mode?` | 默认常驻 |
|
|
608
|
+
| `run_project_script` | 运行**项目内既有**脚本(内核子进程,cwd=项目根;路径白名单越界拒绝;扩展名推断 node/python/shell;超时 30s 上限 120s) | `script_path`, `args?` | 默认常驻(零注入) |
|
|
609
|
+
| `run_skill_script` | 执行技能目录下的脚本(渐进披露 L3) | `skill_name`, `script_path`, `args?` | 默认常驻(来源=技能作者) |
|
|
610
|
+
| `web_search` | 搜索互联网 | `query`, `limit?` | 条件暴露(注入 `IWebSearchProvider`) |
|
|
611
|
+
| `web_fetch` | 抓取网页正文(与 `web_search` 成对闭环) | `url`, `limit?` | 条件暴露(注入 `IFetchProvider`) |
|
|
612
|
+
| `run_code` | LLM 现写代码执行(特权:`code:execute` 声明 + 宿主沙箱注入) | `language`, `code` 或 `script_path` | 条件暴露(注入 `ICodeExecutionProvider` 且角色包声明特权) |
|
|
608
613
|
|
|
609
614
|
### 8.2 `agent.tools` — ToolExecutor
|
|
610
615
|
|
|
@@ -647,200 +652,180 @@ agent.tools.registerTool(
|
|
|
647
652
|
);
|
|
648
653
|
```
|
|
649
654
|
|
|
650
|
-
### 8.3 `
|
|
655
|
+
### 8.3 `IWebSearchProvider` — 网络搜索注入接口
|
|
651
656
|
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
| `insight.classify(input)` → `'skip' \| 'extract'` | 输入分类(判断是否需要提取记忆) |
|
|
657
|
-
| `insight.extract(userInput, assistantContent)` | 异步提取对话 insight(fire-and-forget) |
|
|
657
|
+
> 宿主实现此接口并注入 `AgentOptions.webSearchProvider`,即可让 Agent 拥有网络搜索能力。
|
|
658
|
+
> 未注入时,Agent 不会暴露 `web_search` 工具给 LLM,LLM 被告知搜索不可用。
|
|
659
|
+
> 内核提供 `FetchWebSearchProvider` 作为零依赖默认实现(`buildSearchEndpoints` 构建内置 Bing/DuckDuckGo 等预设降级链)。
|
|
660
|
+
> **主推宿主自建 `SearchEndpoint` 注入**(自带 URL+解析),内核预设仅作零配置保底。
|
|
658
661
|
|
|
659
662
|
```typescript
|
|
660
|
-
//
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
}
|
|
667
|
-
|
|
668
|
-
// 记忆关键词(用于输入分类 Layer 2)
|
|
669
|
-
agent.insight.setKeywords({
|
|
670
|
-
domain: ['主角', '角色', '情节', '设定'], // 领域关键词
|
|
671
|
-
personal: ['我', '我的', '记住', '帮我'], // 用户专属关键词
|
|
672
|
-
});
|
|
673
|
-
```
|
|
674
|
-
|
|
675
|
-
---
|
|
663
|
+
// 搜索结果
|
|
664
|
+
interface SearchResult {
|
|
665
|
+
title: string;
|
|
666
|
+
url: string;
|
|
667
|
+
snippet: string;
|
|
668
|
+
endpoint?: string; // 实际后端名(降级打标用,自定义实现可省略)
|
|
669
|
+
}
|
|
676
670
|
|
|
677
|
-
|
|
671
|
+
// 搜索选项
|
|
672
|
+
interface WebSearchOptions {
|
|
673
|
+
limit?: number; // 返回结果数量上限(默认 5)
|
|
674
|
+
}
|
|
678
675
|
|
|
679
|
-
|
|
676
|
+
// 搜索端点契约:宿主可自建(自带 URL+解析)覆盖内核预设
|
|
677
|
+
interface SearchEndpoint {
|
|
678
|
+
name: string; // 端点名(降级打标 / 结果透出)
|
|
679
|
+
buildUrl(query: string): string; // 由查询构造请求 URL
|
|
680
|
+
parse(html: string, limit: number): SearchResult[]; // 解析结果页
|
|
681
|
+
}
|
|
680
682
|
|
|
681
|
-
|
|
683
|
+
// 网络搜索提供者接口
|
|
684
|
+
interface IWebSearchProvider {
|
|
685
|
+
search(query: string, options?: WebSearchOptions): Promise<SearchResult[]>;
|
|
686
|
+
}
|
|
682
687
|
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
688
|
+
// 注入方式
|
|
689
|
+
const agent = new Agent({
|
|
690
|
+
// ... 其他选项
|
|
691
|
+
// 方案 1(保底):内置默认实现(Bing→DuckDuckGo 零配置开箱即用)
|
|
692
|
+
webSearchProvider: new FetchWebSearchProvider(),
|
|
693
|
+
// 方案 2(主推):宿主自建端点注入,URL/解析完全由宿主掌控
|
|
694
|
+
// webSearchProvider: new FetchWebSearchProvider([
|
|
695
|
+
// { name: 'MyEngine', buildUrl: (q) => `https://my.engine/s?q=${q}`, parse: myParse },
|
|
696
|
+
// ]),
|
|
697
|
+
});
|
|
687
698
|
|
|
688
|
-
|
|
689
|
-
//
|
|
690
|
-
await agent.config.addSimpleRule(
|
|
691
|
-
'世界观规则',
|
|
692
|
-
'这是一个东方玄幻世界,修真等级分为炼气、筑基、金丹……',
|
|
693
|
-
);
|
|
699
|
+
// buildSearchEndpoints:预设名与自定义端点混排,内核预设仅作保底
|
|
700
|
+
// buildSearchEndpoints(['bing', myEndpoint]) // 自定义端点优先,未知名忽略
|
|
694
701
|
```
|
|
695
702
|
|
|
696
|
-
###
|
|
703
|
+
### 8.4 `IFetchProvider` — 网页抓取注入接口(搜索→抓取闭环第二段)
|
|
697
704
|
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
| `config.addSimpleSkill(name, content, keywords?)` | 同上,简化版(session-only) | SQLite + SkillManager |
|
|
705
|
+
> 宿主实现此接口并注入 `AgentOptions.fetchProvider`,即可让 Agent 读取 `web_search` 找到的候选链接正文。
|
|
706
|
+
> 未注入时,Agent 不会暴露 `web_fetch` 工具给 LLM。
|
|
707
|
+
> 内核提供 `FetchWebFetchProvider` 作为基于内置 `fetch` + 正则清洗 HTML 的零依赖默认实现;`safeFetch` 为带 30s 超时保护的包装(抓取失败/超时降级返回友好提示,不中断主流程)。
|
|
702
708
|
|
|
703
709
|
```typescript
|
|
704
|
-
//
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
710
|
+
// 抓取结果
|
|
711
|
+
interface FetchedPage {
|
|
712
|
+
url: string;
|
|
713
|
+
title: string;
|
|
714
|
+
content: string;
|
|
715
|
+
contentType?: string;
|
|
716
|
+
}
|
|
710
717
|
|
|
711
|
-
//
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
|
|
718
|
+
// 抓取选项
|
|
719
|
+
interface FetchOptions {
|
|
720
|
+
maxChars?: number; // 正文截断字符数上限
|
|
721
|
+
}
|
|
722
|
+
|
|
723
|
+
// 网页抓取提供者接口
|
|
724
|
+
interface IFetchProvider {
|
|
725
|
+
fetch(url: string, options?: FetchOptions): Promise<FetchedPage>;
|
|
726
|
+
}
|
|
727
|
+
|
|
728
|
+
// 注入方式
|
|
729
|
+
const agent = new Agent({
|
|
730
|
+
// ... 其他选项
|
|
731
|
+
fetchProvider: new FetchWebFetchProvider(), // 使用内置默认实现
|
|
717
732
|
});
|
|
718
733
|
```
|
|
719
734
|
|
|
720
|
-
###
|
|
735
|
+
### 8.5 `ICodeExecutionProvider` — 代码执行注入接口
|
|
721
736
|
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
|
|
737
|
+
> 宿主实现此接口并注入 `AgentOptions.codeExecutionProvider`,即可让 Agent 拥有通用代码执行能力(计算 / 数据处理 / 验证)。
|
|
738
|
+
> 未注入时,Agent 不会暴露 `run_code` 工具给 LLM。
|
|
739
|
+
> **内核零运行时依赖**:沙箱执行(语言白名单 / 资源限制 / 网络隔离)完全由宿主 provider 决定;`safeExecuteCode` 为带 120s 超时保护的包装(执行失败/超时降级返回错误结果,不中断主流程)。
|
|
725
740
|
|
|
726
741
|
```typescript
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
|
|
742
|
+
// 执行结果
|
|
743
|
+
interface CodeExecutionResult {
|
|
744
|
+
stdout: string;
|
|
745
|
+
stderr: string;
|
|
746
|
+
exitCode: number;
|
|
747
|
+
timedOut: boolean;
|
|
730
748
|
}
|
|
731
|
-
```
|
|
732
749
|
|
|
733
|
-
|
|
750
|
+
// 执行选项
|
|
751
|
+
interface CodeExecutionOptions {
|
|
752
|
+
timeoutMs?: number; // 单次执行超时上限
|
|
753
|
+
}
|
|
734
754
|
|
|
735
|
-
|
|
736
|
-
|
|
737
|
-
|
|
738
|
-
|
|
739
|
-
→ 短对话(<20 字)跳过
|
|
740
|
-
→ 通过 onConfigSuggestion 回调通知 ConfigManager
|
|
741
|
-
→ ConfigManager 转发给宿主注册的 handler
|
|
742
|
-
→ 宿主 UI 展示建议卡片
|
|
743
|
-
→ 用户确认 → config.confirmConfigSuggestion() 写入配置文件
|
|
744
|
-
```
|
|
755
|
+
// 代码执行提供者接口
|
|
756
|
+
interface ICodeExecutionProvider {
|
|
757
|
+
execute(code: string, language: string, options?: CodeExecutionOptions): Promise<CodeExecutionResult>;
|
|
758
|
+
}
|
|
745
759
|
|
|
746
|
-
|
|
760
|
+
// 注入方式(沙箱实现由宿主提供)
|
|
761
|
+
const agent = new Agent({
|
|
762
|
+
// ... 其他选项
|
|
763
|
+
codeExecutionProvider: mySandboxProvider,
|
|
764
|
+
});
|
|
765
|
+
```
|
|
747
766
|
|
|
748
|
-
|
|
749
|
-
|------|------|
|
|
750
|
-
| `config.onConfigSuggestion(handler)` | 注册配置建议回调(宿主 UI 展示建议卡片) |
|
|
751
|
-
| `config.confirmConfigSuggestion(suggestion)` | 确认建议,写入配置文件(持久化) |
|
|
767
|
+
### 8.6 `IProjectSearchProvider` — 项目内搜索注入接口
|
|
752
768
|
|
|
753
|
-
|
|
769
|
+
> 宿主实现此接口并注入 `AgentOptions.projectSearchProvider`,即可让 Agent 具备「在当前项目(工作区)中搜索」能力(等价 IDE 全局搜索 `Ctrl+Shift+F`)。
|
|
770
|
+
> 未注入时,Agent 不会暴露 `search_project` 工具给 LLM。
|
|
771
|
+
> **内核零依赖**:目录遍历 / 忽略规则 / 扫描与结果上限全由宿主决定;内核提供 `safeSearchProjectFiles` / `safeSearchProjectText` 两个带 30s 超时保护的包装,并内置由分词 SSOT 产出的**放宽词表**(`buildSearchTerms`)。
|
|
754
772
|
|
|
755
773
|
```typescript
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
|
|
759
|
-
content: string;
|
|
760
|
-
confidence: number; // 0-1
|
|
761
|
-
source: string; // 建议来源描述
|
|
774
|
+
// 文件名命中
|
|
775
|
+
interface ProjectFileMatch {
|
|
776
|
+
path: string; // 相对项目根的 posix 路径
|
|
762
777
|
}
|
|
763
|
-
```
|
|
764
778
|
|
|
765
|
-
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
|
|
770
|
-
|
|
771
|
-
|
|
772
|
-
---
|
|
773
|
-
|
|
774
|
-
## 十、用户画像(`agent.userProfile` · UserProfile)
|
|
775
|
-
|
|
776
|
-
用户画像从对话中自动提取用户事实(姓名、偏好、技能等),用于个性化 system prompt 注入。高置信度事实直接归档,低置信度事实标记为待确认,由宿主 UI 展示给用户确认。
|
|
779
|
+
// 内容命中
|
|
780
|
+
interface ProjectTextMatch {
|
|
781
|
+
path: string;
|
|
782
|
+
line?: number; // 命中行号(1 起)
|
|
783
|
+
preview?: string; // 命中行预览(去控制字符 + 限长,防上下文注入)
|
|
784
|
+
}
|
|
777
785
|
|
|
778
|
-
|
|
786
|
+
// 内容搜索的**结果对象**(含本次检索的元信息)
|
|
787
|
+
interface ProjectTextSearchResult {
|
|
788
|
+
matches: ProjectTextMatch[];
|
|
789
|
+
truncated: boolean; // 检索被截断(零命中时也须如实回报)
|
|
790
|
+
truncatedBy?: 'results' | 'files'; // 截断主因:结果达上限 / 扫描达文件上限
|
|
791
|
+
scannedFiles?: number; // 实际参与匹配的文件数(宿主上报的数据)
|
|
792
|
+
partialReadFiles?: number; // 只检索了前一部分(过大)的文件数(**参与了**检索,非跳过)
|
|
793
|
+
unreadableSkipped?: number; // 读取失败(权限/被删/悬空链接)完全未参与检索的文件数
|
|
794
|
+
perFileCapped?: boolean; // 有文件的命中被单文件上限截断
|
|
795
|
+
failed?: boolean; // 检索自身失败(超时/抛错)≠ 真零命中
|
|
796
|
+
relaxed?: boolean; // 已放宽为分词匹配 → 结果**非精确**命中
|
|
797
|
+
termsUsed?: string[]; // 放宽时实际使用的词(文案的唯一取值来源)
|
|
798
|
+
}
|
|
779
799
|
|
|
780
|
-
|
|
781
|
-
|
|
782
|
-
|
|
783
|
-
|
|
784
|
-
/** 用户画像条目 */
|
|
785
|
-
interface UserProfileEntry {
|
|
786
|
-
id: string; // 画像唯一 ID(格式:profile:user-profile-{category}-{slug})
|
|
787
|
-
category: ProfileCategory;
|
|
788
|
-
fieldName: string; // 显式字段名(如 "姓名"/"住址",冲突检测基于 category+fieldName)
|
|
789
|
-
value: string; // 事实值(如 "姓名: 张三")
|
|
790
|
-
source: string; // 来源(哪一轮对话提到)
|
|
791
|
-
weight: number; // 权重(0-1)
|
|
792
|
-
confirmed: boolean; // 是否已确认(false 表示首次召回时需用户确认)
|
|
793
|
-
updatedAt: string; // 最后更新时间(ISO 8601)
|
|
800
|
+
interface ProjectTextSearchOptions extends ProjectFileSearchOptions {
|
|
801
|
+
pattern: string; // 内容关键词(**字面量**语义,宿主自行转义,内核不假定正则)
|
|
802
|
+
terms?: string[]; // 内核下发的放宽词表;宿主**仅在整串零命中时**才启用
|
|
794
803
|
}
|
|
795
804
|
|
|
796
|
-
|
|
797
|
-
|
|
798
|
-
|
|
799
|
-
fieldName: string; // 显式字段名(由提取器填充,冲突检测基于 category+fieldName)
|
|
800
|
-
value: string;
|
|
801
|
-
sourceTurn: string;
|
|
802
|
-
confidence: number; // 置信度 0-1(≥0.8 直接归档,否则标记待确认)
|
|
805
|
+
interface IProjectSearchProvider {
|
|
806
|
+
searchFiles(options?: ProjectFileSearchOptions): Promise<ProjectFileMatch[]>;
|
|
807
|
+
searchText(options: ProjectTextSearchOptions): Promise<ProjectTextSearchResult>;
|
|
803
808
|
}
|
|
804
809
|
```
|
|
805
810
|
|
|
806
|
-
|
|
811
|
+
**实现约定(宿主侧,三条都是契约而非建议)**:
|
|
807
812
|
|
|
808
|
-
|
|
809
|
-
|
|
810
|
-
|
|
811
|
-
|
|
812
|
-
| `agent.userProfile.getConfirmed()` | 获取所有已确认的画像条目(system prompt 注入用) |
|
|
813
|
-
| `agent.userProfile.getPending()` | 获取所有待确认的画像条目(供宿主 UI 展示确认/拒绝操作) |
|
|
814
|
-
| `agent.userProfile.buildSystemPrompt()` | 构建 system prompt 中的用户画像段 |
|
|
815
|
-
| `agent.userProfile.confirm(id)` | 确认待确认条目(确认后写入存储) |
|
|
816
|
-
| `agent.userProfile.reject(id)` | 拒绝待确认条目(从缓存和存储中删除) |
|
|
813
|
+
1. **精确优先 + 零命中回退**:先按 `pattern` 整串字面量匹配;整串零命中**且** `terms` 非空时,才用 `terms` 做一次 OR 放宽,并置 `relaxed` + 回填 `termsUsed`(多词无需拆开传,**任一分词命中即算**,不是"全部包含")。整串已命中时不得放宽——否则精确命中会退化成"可能不是精确命中"。
|
|
814
|
+
2. **三态必须可区分**:`failed`(没搜完/搜坏了)/ `truncated`(没搜全)/ 真零命中,三者不得再压成同一个空数组——`[]` 承载不了任何元信息,会把"没搜到"与"没搜完"变成逐字同形。失败**不要**返回工具错误("no results is not an error"),如实回报 `failed` 即可,由内核分流文案。
|
|
815
|
+
3. **预算量以数据上报,不提升为内核常量**:`scannedFiles` / `partialReadFiles` / `unreadableSkipped` / `perFileCapped` 是宿主内部预算(扫描文件数 / 单文件字节 / 单文件命中数)与**读取结果**的事实;内核从不扫描,因此不持有这些常量,只把它们写进给 LLM 的文案。同理,`truncatedBy` 由宿主判定(只有宿主知道自己是因何停下)。
|
|
816
|
+
⚠️ `partialReadFiles`(看了但没看全)与 `unreadableSkipped`(根本没看上)**必须分开上报**:两者都是「零命中 ≠ 不存在」的依据,但补救动作不同——前者换更具体的关键词或 `read_file` 精读,后者可重试。
|
|
817
817
|
|
|
818
|
-
|
|
818
|
+
**放宽词表(内核侧)**:`buildSearchTerms(query)` 采用「显式片段优先」——空白分隔的片段是一等公民,不含 CJK 的片段原样保留(`Next.js` 不会被切成 `next` + `js`),含 CJK 的片段交给分词 SSOT。调用方(内核 `ToolExecutor`)会剔除与整串等价的词,因此单段查询通常不会触发放宽轮。
|
|
819
819
|
|
|
820
|
-
|
|
821
|
-
|
|
822
|
-
```typescript
|
|
823
|
-
// 启动后查询待确认条目,展示给用户
|
|
824
|
-
const pending = agent.userProfile?.getPending() ?? [];
|
|
825
|
-
for (const entry of pending) {
|
|
826
|
-
// 宿主 UI 展示确认对话框
|
|
827
|
-
const confirmed = await showConfirmDialog({
|
|
828
|
-
title: '确认用户画像',
|
|
829
|
-
message: `检测到:${entry.value}(${entry.category})`,
|
|
830
|
-
});
|
|
831
|
-
if (confirmed) {
|
|
832
|
-
await agent.userProfile?.confirm(entry.id);
|
|
833
|
-
} else {
|
|
834
|
-
await agent.userProfile?.reject(entry.id);
|
|
835
|
-
}
|
|
836
|
-
}
|
|
837
|
-
```
|
|
820
|
+
> 参考实现:VS Code 宿主 `hosts/memora-vscode/src/extension/host/projectSearchProvider.ts`(`mode=name` 走 `workspace.findFiles`;`mode=content` 走受限 fs 递归扫描,忽略 `IGNORED_DIR_NAMES`)。
|
|
838
821
|
|
|
839
822
|
---
|
|
840
823
|
|
|
841
|
-
##
|
|
824
|
+
## 九、作品投影(`agent.works` · WorkProjectionManager)
|
|
842
825
|
|
|
843
|
-
作品投影是文件内容的轻量级摘要(50-100 字概要 + 结构 +
|
|
826
|
+
作品投影是文件内容的轻量级摘要(50-100 字概要 + 结构 + 关键决策),存储在**项目级目录** `<memoraDir>/projections/<slug>.json`(不进入记忆库)。原始文件内容不进投影,Agent 通过工具按需读取。
|
|
827
|
+
|
|
828
|
+
> **与记忆系统的边界**:作品投影是"作品感知"而非"对话记忆"(对话记忆唯一为 round-summary,沉淀在记忆库)。它**不参与记忆召回、不参与记忆治理**(去重/冲突检测不覆盖),随项目隔离——换项目即消失。宿主如需让模型感知投影,可显式经 `agent.works.loadAll()` 注入。
|
|
844
829
|
|
|
845
830
|
### 类型定义
|
|
846
831
|
|
|
@@ -862,7 +847,7 @@ interface WorkProjectionEntry {
|
|
|
862
847
|
|------|------|
|
|
863
848
|
| `agent.works.ensureProjection(filePath, content, fileName?)` | 检查并更新作品投影(核心方法)。计算 hash → 查询已有投影 → 无则生成 / hash 变则重新生成 / hash 同则跳过。同文件并发调用时复用 in-flight Promise,避免重复 LLM 调用 |
|
|
864
849
|
| `agent.works.getProjection(filePath)` | 获取已有的作品投影(不触发生成) |
|
|
865
|
-
| `agent.works.loadAll()` |
|
|
850
|
+
| `agent.works.loadAll()` | 加载所有作品投影(扫描项目目录 `<memoraDir>/projections/`,非记忆召回) |
|
|
866
851
|
|
|
867
852
|
> **注意**:`agent.works` 在 `init()` 前返回 `null`。`ensureProjection` 依赖后台 LLM Provider 生成摘要,未注入 `backgroundProvider` 时使用前台 Provider。
|
|
868
853
|
|
|
@@ -887,7 +872,7 @@ agent.tools.registerTool(
|
|
|
887
872
|
|
|
888
873
|
---
|
|
889
874
|
|
|
890
|
-
##
|
|
875
|
+
## 十、Provider 管理
|
|
891
876
|
|
|
892
877
|
| 方法 | 用途 |
|
|
893
878
|
|------|------|
|
|
@@ -898,62 +883,61 @@ Agent 不再管理 Provider 映射表,宿主自行管理。
|
|
|
898
883
|
|
|
899
884
|
---
|
|
900
885
|
|
|
901
|
-
##
|
|
886
|
+
## 十一、内部调试
|
|
902
887
|
|
|
903
888
|
> v1.0 起已移除 `getBuildCtx()` 和 `inspect()` 方法。宿主项目可通过以下渠道观察内核状态:
|
|
904
889
|
>
|
|
905
890
|
> - **事件系统**(§2.7):订阅 `memoryAdded` / `memoryRecalled` / `skillMatched` 等事件获取运行时动态
|
|
906
|
-
> - **可观测性 Tracer
|
|
891
|
+
> - **可观测性 Tracer**(§十四):注入 `ITracer` 实现获取 AgentLoop 关键 span(RECALL / LLM_CALL / TOOL_EXEC / RESPONSE)
|
|
907
892
|
> - **`agent.memory.snapshot()`**(§4.1):获取 3 层记忆快照(working / bootstrap / archive)
|
|
908
893
|
> - **`agent.agentLoop.getMessages()`**(§4.4):获取工作记忆原始消息列表
|
|
909
894
|
|
|
910
895
|
---
|
|
911
896
|
|
|
912
|
-
##
|
|
897
|
+
## 十二、完整 API 一览
|
|
913
898
|
|
|
914
899
|
### Agent 面类直接方法
|
|
915
900
|
|
|
916
901
|
| 分组 | 方法 |
|
|
917
902
|
|------|------|
|
|
918
903
|
| 生命周期 | `init(projectPathOverride?)` / `close()` |
|
|
919
|
-
| 对话 | `chat(input, signal?)` / `chatSync(input, signal?)` / `forceReleaseChatLock()` |
|
|
904
|
+
| 对话 | `chat(input, signal?)` / `chatSync(input, signal?)` / `processEvent(event)` / `resumeExecution()` / `forceReleaseChatLock()` |
|
|
920
905
|
| 事件 | `on()` / `off()` / `once()`(继承自 TypedEventEmitter) |
|
|
921
|
-
|
|
|
906
|
+
| 暂停/继续 | `pause(reason, source?, lowRisk?)` / `resume()` / `requestPause(reason, source?)` / `cancelPauseRequest()` / `isPausePending()` / `interject(content)` / `removePendingInterject(index)` / `clearPendingInterjections()` / `getPendingInterjections()` / `discardCurrentCheckpoint()` / `canContinueWithoutInput()` |
|
|
907
|
+
| 项目 / 会话 | `switchProject(nameOrPath)` / `rebuildComponents()` / `forkSession(targetSession?)` / `createCheckpoint(mainGoal?, role?, standard?)` / `getCheckpoint()` |
|
|
922
908
|
| Provider | `setProvider(provider)` / `setBackgroundProvider(provider)` |
|
|
923
909
|
| 归档模式 | `setArchiveMode(mode)` / `getArchiveMode()` |
|
|
924
|
-
| 角色 | `
|
|
925
|
-
| 手动归档 | `
|
|
910
|
+
| 角色 | `switchRolePack(name)` / `getRolePackSwitchLockStatus()` / `getActiveTraits()` / `injectAffect(affectString)` |
|
|
911
|
+
| 手动归档 | `archiveSession(...)` |
|
|
926
912
|
| 配置热更新 | `reloadConfig(source?)` |
|
|
927
|
-
| 记忆治理 | `
|
|
913
|
+
| 记忆治理 | 经 `agent.governance` 暴露(`.deduplicate()` / `.detectConflicts()` / `.sourceHealth()` / `.suggest()`,见下方 Manager 成员) |
|
|
928
914
|
| 指标 | `getMetrics()` |
|
|
929
915
|
|
|
930
916
|
### Agent 面类只读访问器
|
|
931
917
|
|
|
932
|
-
`initialized` / `context` / `provider` / `isBusy` / `lastInteractionAt` / `agentLoop` / `agentHistory` / `projects` / `security` / `sessionManager` / `
|
|
918
|
+
`initialized` / `context` / `provider` / `isBusy` / `lastInteractionAt` / `agentLoop` / `agentHistory` / `projects` / `security` / `sessionManager` / `rolePack` / `tools` / `skills` / `governance` / `memory` / `works` / `polish`
|
|
933
919
|
|
|
934
920
|
### 各 Manager / 组件公开成员
|
|
935
921
|
|
|
936
922
|
| 访问器 | 类型 | 公开成员 |
|
|
937
923
|
|---------|---------|---------|
|
|
938
|
-
| `agent.
|
|
924
|
+
| `agent.rolePack` | `RolePackManager` | `.listMeta()` / `.activeName` / `.getActive()` / `.getActiveRules()` / `.activate()` / `.getSwitchLockStatus()` / `.getActiveTraits()` |
|
|
939
925
|
| `agent.tools` | `ToolExecutor` | `.list` / `.registerTool()` / `.execute()` |
|
|
940
926
|
| `agent.skills` | `SkillManager` | `.list` / `.match()` / `.register()` / `.buildSystemPrompt()` |
|
|
941
|
-
| `agent.
|
|
942
|
-
| `agent.
|
|
943
|
-
| `agent.memory` | `MemoryInspector` | 读:`.snapshot()` / `.search()` / `.searchHybrid()` / `.stats()` / `.list()` / `.getById()` / `.getBySource()` / `.listDeleted()` / `.getRelations()` / `.getAllRelations()` / `.getRelationPath()` / `.getRelationNeighbors()`;写:`.writeUpsert()` / `.writeBoost()` / `.writeDelete()` / `.writeRestore()` / `.writePurge()` / `.writePurgeExpired()` / `.writeAddRelation()` / `.writeRemoveRelation()` / `.writeRemoveRelationsByMemoryId()` |
|
|
944
|
-
| `agent.userProfile` | `UserProfile` | `.load()` / `.archiveFacts(facts)` / `.getConfirmed()` / `.getPending()` / `.buildSystemPrompt()` / `.confirm(id)` / `.reject(id)` |
|
|
927
|
+
| `agent.governance` | `MemoryGovernance` | `.deduplicate()` / `.detectConflicts()` / `.sourceHealth()` / `.suggest()` |
|
|
928
|
+
| `agent.memory` | `MemoryInspector` | 读:`.snapshot()` / `.search()` / `.searchByKeyword()` / `.stats()` / `.list()` / `.getById()` / `.getBySource()` / `.listDeleted()`;写:`.writeUpsert()` / `.writeDelete()` / `.writeRestore()` / `.writePurge()` / `.writePurgeExpired()` |
|
|
945
929
|
| `agent.works` | `WorkProjectionManager` | `.ensureProjection(filePath, content, fileName?)` / `.getProjection(filePath)` / `.loadAll()` |
|
|
946
930
|
| `agent.polish` | `TextPolishManager` | `.polish(...)`(文本润色:LLM 语法修正 + 表达优化) |
|
|
947
931
|
|
|
948
|
-
> **说明**:`suggest()` / `sourceHealth()`
|
|
932
|
+
> **说明**:`suggest()` / `sourceHealth()` 经 `agent.governance` 暴露,不挂在 `agent.memory` 下。旧的 `memoryMutator` 访问器与 `MemoryMutator` 类已合并回 `MemoryInspector`,请勿再使用。
|
|
949
933
|
|
|
950
934
|
---
|
|
951
935
|
|
|
952
|
-
##
|
|
936
|
+
## 十三、可观测性(ITracer / ISpan)
|
|
953
937
|
|
|
954
938
|
Memora 内置轻量 Span/Trace 抽象,宿主注入实现后可观测 AgentLoop 行为。
|
|
955
939
|
|
|
956
|
-
###
|
|
940
|
+
### 13.1 ITracer 接口
|
|
957
941
|
|
|
958
942
|
```typescript
|
|
959
943
|
interface ITracer {
|
|
@@ -961,7 +945,7 @@ interface ITracer {
|
|
|
961
945
|
}
|
|
962
946
|
```
|
|
963
947
|
|
|
964
|
-
###
|
|
948
|
+
### 13.2 ISpan 接口
|
|
965
949
|
|
|
966
950
|
```typescript
|
|
967
951
|
interface ISpan {
|
|
@@ -971,7 +955,7 @@ interface ISpan {
|
|
|
971
955
|
}
|
|
972
956
|
```
|
|
973
957
|
|
|
974
|
-
###
|
|
958
|
+
### 13.3 NoopTracer(默认实现)
|
|
975
959
|
|
|
976
960
|
```typescript
|
|
977
961
|
import { NOOP_TRACER } from '@zooique/memora';
|
|
@@ -980,24 +964,33 @@ import { NOOP_TRACER } from '@zooique/memora';
|
|
|
980
964
|
// NOOP_TRACER.startSpan() 返回共享的 NoopSpan 单例,所有方法为空操作
|
|
981
965
|
```
|
|
982
966
|
|
|
983
|
-
###
|
|
967
|
+
### 13.4 TRACE_SPANS 常量
|
|
984
968
|
|
|
985
969
|
```typescript
|
|
986
970
|
import { TRACE_SPANS } from '@zooique/memora';
|
|
987
971
|
|
|
988
|
-
TRACE_SPANS.
|
|
989
|
-
TRACE_SPANS.
|
|
990
|
-
TRACE_SPANS.
|
|
991
|
-
TRACE_SPANS.
|
|
972
|
+
TRACE_SPANS.LLM_CALL // 'llm.call' — LLM API 调用
|
|
973
|
+
TRACE_SPANS.TOOL_EXEC // 'tool.execute' — 工具执行
|
|
974
|
+
TRACE_SPANS.RESPONSE // 'response.generate' — 整轮响应
|
|
975
|
+
TRACE_SPANS.CONTEXT_SUMMARY // 'context.summary' — 上下文摘要生成(消息超窗触发截断时)
|
|
976
|
+
TRACE_SPANS.POST_PROCESS // 'archive.postProcess' — 每轮 chat() 后的归档处理
|
|
977
|
+
TRACE_SPANS.DIFFICULTY // 'round.difficulty' — 难度分级(预留名)
|
|
978
|
+
TRACE_SPANS.REPORT // 'round.report' — 汇报闭环(预留名)
|
|
992
979
|
```
|
|
993
980
|
|
|
981
|
+
> 共 **7** 个常量(数量由 `src/agent/__tests__/tracer.test.ts` 锁定)。
|
|
982
|
+
>
|
|
983
|
+
> **预留名**:`DIFFICULTY` / `REPORT` 内核当前**零 emit 点**——宿主按名建监控面板暂时收不到这两个 span 的数据,不要据此判定链路异常。
|
|
984
|
+
>
|
|
985
|
+
> **已删除**:`TRACE_SPANS.RECALL`(`'recall.recall'`)与 `TRACE_SPANS.RECALL_ACTUAL`(`'recall.actual'`)已于 **2026-09-11 物理删除**(自动记忆召回退役后无 emit 点,不留幽灵契约);现行记忆检索耗时看 `TOOL_EXEC`(`search_memories` 工具)。
|
|
986
|
+
|
|
994
987
|
---
|
|
995
988
|
|
|
996
|
-
##
|
|
989
|
+
## 十四、工具错误码(ToolErrorCode)
|
|
997
990
|
|
|
998
991
|
工具执行失败时,错误结果包含 `[ERR:TOOL:code]` 前缀,供 Reflection 逻辑和宿主项目解析。
|
|
999
992
|
|
|
1000
|
-
###
|
|
993
|
+
### 14.1 错误码枚举
|
|
1001
994
|
|
|
1002
995
|
| 错误码 | 可重试 | 说明 |
|
|
1003
996
|
|--------|--------|------|
|
|
@@ -1012,7 +1005,7 @@ TRACE_SPANS.RESPONSE // 'response.generate' — 整轮响应
|
|
|
1012
1005
|
| `CUSTOM_TOOL_FAILED` | ✅ | 自定义工具执行失败 |
|
|
1013
1006
|
| `UNKNOWN` | ❌ | 通用错误 |
|
|
1014
1007
|
|
|
1015
|
-
###
|
|
1008
|
+
### 14.2 isRetryableErrorCode()
|
|
1016
1009
|
|
|
1017
1010
|
```typescript
|
|
1018
1011
|
import { ToolErrorCode, isRetryableErrorCode } from '@zooique/memora';
|
|
@@ -1023,37 +1016,17 @@ isRetryableErrorCode(ToolErrorCode.PATH_NOT_ALLOWED); // false
|
|
|
1023
1016
|
|
|
1024
1017
|
---
|
|
1025
1018
|
|
|
1026
|
-
##
|
|
1027
|
-
|
|
1028
|
-
### 17.1 护栏规则格式
|
|
1029
|
-
|
|
1030
|
-
护栏规则以 `source: "guardrail"` 记忆形式存储,放在 `configDir/rules/guardrails/` 目录下:
|
|
1031
|
-
|
|
1032
|
-
```markdown
|
|
1033
|
-
---
|
|
1034
|
-
name: 禁止执行代码
|
|
1035
|
-
source: guardrail
|
|
1036
|
-
---
|
|
1037
|
-
|
|
1038
|
-
pattern: /执行|运行|eval|exec/
|
|
1039
|
-
action: block
|
|
1040
|
-
```
|
|
1041
|
-
|
|
1042
|
-
### 17.2 护栏行为
|
|
1019
|
+
## 十五、工具错误反思(Reflection)
|
|
1043
1020
|
|
|
1044
|
-
-
|
|
1045
|
-
- **输出护栏**:LLM 响应返回用户前检查,命中 `block` 时替换输出
|
|
1046
|
-
- **降级策略**:护栏自身异常时降级为"放行 + 记日志",永远不阻断对话
|
|
1047
|
-
|
|
1048
|
-
### 17.3 工具错误反思(Reflection)
|
|
1021
|
+
> 注:原「内容护栏(Guardrails)」章节已移除——guardrail 是「零规则、无扫描映射、无消费者」的空转链,已随内核摘除(2026-08-17,见 memory-role-pack-boundary.md §4.4)。本章仅保留原 15.3 的有效内容。
|
|
1049
1022
|
|
|
1050
1023
|
当工具执行失败且错误码为 retryable 时,AgentLoop 自动注入 `[REFLECTION_HINT]` 系统消息,引导 LLM 修正参数后重试。默认最多重试 2 次(`maxReflectionRetries`)。
|
|
1051
1024
|
|
|
1052
1025
|
---
|
|
1053
1026
|
|
|
1054
|
-
##
|
|
1027
|
+
## 十六、类型导出
|
|
1055
1028
|
|
|
1056
|
-
>
|
|
1029
|
+
> 以下**精选子集**为宿主最常用的公开导出,全部经 `@zooique/memora` 再导出(无幻影);未在清单中的其他导出(如 `DuplicateCallInterceptor` / `SessionManager` / `ProviderRouter` / `SummaryType` 等)以 `src/index.ts` 为准。治理报告类型(`DedupReport` / `SourceHealthReport` 等)经方法返回推断,不列为显式导出。
|
|
1057
1030
|
|
|
1058
1031
|
```typescript
|
|
1059
1032
|
// Agent 与流式事件
|
|
@@ -1070,7 +1043,7 @@ export type {
|
|
|
1070
1043
|
AgentProjectEntry,
|
|
1071
1044
|
} from '@zooique/memora';
|
|
1072
1045
|
export { type AgentForkResult } from '@zooique/memora';
|
|
1073
|
-
export type {
|
|
1046
|
+
export type { SessionCheckpoint } from '@zooique/memora';
|
|
1074
1047
|
|
|
1075
1048
|
// 记忆快照与搜索(MemoryInspector)
|
|
1076
1049
|
export type {
|
|
@@ -1080,17 +1053,8 @@ export type {
|
|
|
1080
1053
|
ArchiveSnapshot,
|
|
1081
1054
|
AgentSearchHit,
|
|
1082
1055
|
AgentStats,
|
|
1083
|
-
SuggestOptions,
|
|
1084
|
-
SuggestHit,
|
|
1085
|
-
SourceHealthStatus,
|
|
1086
|
-
SourceHealthEntry,
|
|
1087
|
-
SourceHealthReport,
|
|
1088
1056
|
} from '@zooique/memora';
|
|
1089
|
-
//
|
|
1090
|
-
export type { DedupPair, DedupVerdict, DedupVerdictSummary, DedupReport } from '@zooique/memora';
|
|
1091
|
-
export type { TimelinessVerdict, TimelinessReport } from '@zooique/memora';
|
|
1092
|
-
export type { ConflictVerdict, ConflictReport } from '@zooique/memora';
|
|
1093
|
-
// 记忆治理统一门面
|
|
1057
|
+
// 记忆治理统一门面(治理 / 健康度报告类型经方法返回推断,未列为公开显式导出)
|
|
1094
1058
|
export { MemoryGovernance } from '@zooique/memora';
|
|
1095
1059
|
// 文本润色
|
|
1096
1060
|
export type { PolishResult } from '@zooique/memora';
|
|
@@ -1098,55 +1062,33 @@ export { AGENT_CONSTANTS, LOOP_CONSTANTS } from '@zooique/memora';
|
|
|
1098
1062
|
|
|
1099
1063
|
// 工具
|
|
1100
1064
|
export type { ToolDefinition, ToolHandler, ToolContext, WriteExtensions } from '@zooique/memora';
|
|
1065
|
+
// 网页抓取(搜索→抓取闭环第二段)
|
|
1066
|
+
export type { IFetchProvider, FetchedPage, FetchOptions } from '@zooique/memora';
|
|
1067
|
+
export { FetchWebFetchProvider, safeFetch } from '@zooique/memora';
|
|
1068
|
+
// 代码执行(通用计算底座)
|
|
1069
|
+
export type { ICodeExecutionProvider, CodeExecutionResult, CodeExecutionOptions } from '@zooique/memora';
|
|
1070
|
+
export { safeExecuteCode } from '@zooique/memora';
|
|
1101
1071
|
|
|
1102
|
-
// 配置建议
|
|
1103
|
-
export type { ConfigSuggestion, ConfigSuggestionHandler } from '@zooique/memora';
|
|
1104
|
-
|
|
1105
|
-
// Insight
|
|
1106
|
-
export type { MemoryKeywords } from '@zooique/memora';
|
|
1107
|
-
// RelationBuilder(P1-3 拆分,封装 ADR-014 关系构建逻辑)
|
|
1108
|
-
export { RelationBuilder } from '@zooique/memora';
|
|
1109
|
-
export type { ConflictInfo } from '@zooique/memora';
|
|
1110
|
-
|
|
1111
|
-
// 会话归档
|
|
1112
|
-
export type { SessionArchiveResult } from '@zooique/memora';
|
|
1113
1072
|
// 作品投影
|
|
1114
1073
|
export type { WorkProjectionEntry } from '@zooique/memora';
|
|
1115
|
-
// AutoConfigRefiner
|
|
1116
|
-
export type { AutoConfigRefinerOptions } from '@zooique/memora';
|
|
1117
1074
|
|
|
1118
1075
|
// 记忆
|
|
1119
1076
|
export { SOURCE_LABELS } from '@zooique/memora';
|
|
1120
1077
|
export type { Memory } from '@zooique/memora';
|
|
1121
|
-
export {
|
|
1078
|
+
export { escapeLike, escapeLikeSnippet, validateSource } from '@zooique/memora';
|
|
1122
1079
|
export type { SourceValidationSeverity } from '@zooique/memora';
|
|
1123
1080
|
export type { IMemoryStorage } from '@zooique/memora';
|
|
1124
1081
|
export { InMemoryStorage } from '@zooique/memora';
|
|
1125
|
-
//
|
|
1126
|
-
export { BOOST_INCREMENT, SCORE_CEILING,
|
|
1082
|
+
// 治理共享常量(提升/上限/下限)
|
|
1083
|
+
export { BOOST_INCREMENT, SCORE_CEILING, SCORE_FLOOR } from '@zooique/memora';
|
|
1127
1084
|
export type { ISessionStore, SessionMessage } from '@zooique/memora';
|
|
1128
1085
|
export type { ForkResult } from '@zooique/memora';
|
|
1129
1086
|
|
|
1130
|
-
//
|
|
1131
|
-
export { RELATION_TYPES, RELATION_WEIGHTS } from '@zooique/memora';
|
|
1132
|
-
export type { MemoryRelation, RelationDirection, RelationPath, RelationNeighbor } from '@zooique/memora';
|
|
1133
|
-
export type { IMemoryRelationStore } from '@zooique/memora';
|
|
1134
|
-
export { InMemoryRelationStore } from '@zooique/memora';
|
|
1135
|
-
|
|
1136
|
-
// 项目注册表 + 锁文件管理(P1-4 拆分)
|
|
1087
|
+
// 项目注册表 + 锁文件管理
|
|
1137
1088
|
export { ProjectRegistry } from '@zooique/memora';
|
|
1138
1089
|
export type { ProjectEntry } from '@zooique/memora';
|
|
1139
1090
|
export { LockManager } from '@zooique/memora';
|
|
1140
1091
|
|
|
1141
|
-
// 用户画像
|
|
1142
|
-
export type { UserProfileEntry, ProfileCategory, ExtractedFact } from '@zooique/memora';
|
|
1143
|
-
|
|
1144
|
-
// 向量存储
|
|
1145
|
-
export { JsonVectorStore } from '@zooique/memora';
|
|
1146
|
-
export type { IVectorStore, EmbeddingService } from '@zooique/memora';
|
|
1147
|
-
export { EmbeddingProvider } from '@zooique/memora';
|
|
1148
|
-
export type { EmbeddingConfig, EmbeddingResult, EmbeddingOptions } from '@zooique/memora';
|
|
1149
|
-
|
|
1150
1092
|
// 事件系统
|
|
1151
1093
|
export { TypedEventEmitter } from '@zooique/memora';
|
|
1152
1094
|
export type { AgentEventMap, AgentEventName, AgentEventHandler } from '@zooique/memora';
|
|
@@ -1164,12 +1106,16 @@ export type { ToolErrorCodeValue } from '@zooique/memora';
|
|
|
1164
1106
|
export type { ILogger } from '@zooique/memora';
|
|
1165
1107
|
export { setLogger, logger } from '@zooique/memora';
|
|
1166
1108
|
|
|
1167
|
-
//
|
|
1168
|
-
|
|
1169
|
-
export
|
|
1109
|
+
// 召回(2026-09-10 减法:`recall()` 召回编排 + `RecallOptions` 已退役——
|
|
1110
|
+
// 唯一消费者是跨重启恢复链的 warmRecall,随之整体下线;记忆检索走 `search_memories` 工具 → `searchByKeyword`)
|
|
1111
|
+
export { extractKeywords } from '@zooique/memora';
|
|
1112
|
+
|
|
1113
|
+
// 网络搜索
|
|
1114
|
+
export type { IWebSearchProvider, SearchResult, WebSearchOptions, SearchEndpoint } from '@zooique/memora';
|
|
1115
|
+
export { FetchWebSearchProvider } from '@zooique/memora';
|
|
1170
1116
|
|
|
1171
|
-
//
|
|
1172
|
-
export type {
|
|
1117
|
+
// 角色包
|
|
1118
|
+
export type { RolePackMeta } from '@zooique/memora';
|
|
1173
1119
|
|
|
1174
1120
|
// 技能
|
|
1175
1121
|
export type { SkillEntry, SkillMatch } from '@zooique/memora';
|
|
@@ -1179,8 +1125,6 @@ export { createLlmProvider, createProviderFromConfig } from '@zooique/memora';
|
|
|
1179
1125
|
export type { ProviderConfig } from '@zooique/memora';
|
|
1180
1126
|
export type { LlmProvider, ChatOptions } from '@zooique/memora';
|
|
1181
1127
|
export type { LlmChunk } from '@zooique/memora';
|
|
1182
|
-
export { OpenAICompatibleProvider } from '@zooique/memora';
|
|
1183
|
-
export type { OpenAICompatibleConfig } from '@zooique/memora';
|
|
1184
1128
|
|
|
1185
1129
|
// 配置
|
|
1186
1130
|
export { loadConfig } from '@zooique/memora';
|
|
@@ -1203,17 +1147,11 @@ export type {
|
|
|
1203
1147
|
WriteConfirmationInfo,
|
|
1204
1148
|
WriteConfirmationRequest,
|
|
1205
1149
|
} from '@zooique/memora';
|
|
1206
|
-
|
|
1207
|
-
// 评估
|
|
1208
|
-
export type { EvalScenario, EvalExpectation, EvalResult } from '@zooique/memora';
|
|
1209
|
-
export { collectAgentChunks, evaluateResult } from '@zooique/memora';
|
|
1210
|
-
export { EVAL_SCENARIOS, EvalRunner } from '@zooique/memora';
|
|
1211
|
-
export type { EvalRunnerOptions, EvalSummary } from '@zooique/memora';
|
|
1212
1150
|
```
|
|
1213
1151
|
|
|
1214
1152
|
---
|
|
1215
1153
|
|
|
1216
|
-
##
|
|
1154
|
+
## 十七、安全与约束
|
|
1217
1155
|
|
|
1218
1156
|
### 核心库零越界
|
|
1219
1157
|
|
|
@@ -1226,10 +1164,12 @@ export type { EvalRunnerOptions, EvalSummary } from '@zooique/memora';
|
|
|
1226
1164
|
|
|
1227
1165
|
### 内部数据写入(不越界)
|
|
1228
1166
|
|
|
1229
|
-
Agent
|
|
1167
|
+
Agent 内部只维护两个状态文件,路径全部由宿主传入的路径推导,内核不假设 `~/.memora/` 一类的用户级默认位置:
|
|
1168
|
+
|
|
1169
|
+
- `projects.json`(项目注册表)——落 `dataDir` 内;若显式传了 `registryDir` 则落那里
|
|
1170
|
+
- `.lock`(项目锁)——固定落 `<projectPath>/.memora/.lock`,**不由 `dataDir` 推导**
|
|
1230
1171
|
|
|
1231
1172
|
---
|
|
1232
1173
|
|
|
1233
|
-
**版本**:
|
|
1234
|
-
**最后更新**:2026-08-01
|
|
1174
|
+
**版本**:v3.0.0
|
|
1235
1175
|
**配套文档**:[memora-接入指南.md](./memora-接入指南.md)(步骤式教程)
|