@zooique/memora 2.0.0 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +1028 -0
- package/README.en.md +305 -0
- package/README.md +303 -148
- package/config.example.json +43 -0
- package/dist/agent/agent.d.ts +438 -295
- package/dist/agent/agent.d.ts.map +1 -1
- package/dist/agent/agent.js +1368 -836
- package/dist/agent/agent.js.map +1 -1
- package/dist/agent/assembler.d.ts +117 -39
- package/dist/agent/assembler.d.ts.map +1 -1
- package/dist/agent/assembler.js +574 -71
- package/dist/agent/assembler.js.map +1 -1
- package/dist/agent/budget.d.ts +131 -0
- package/dist/agent/budget.d.ts.map +1 -0
- package/dist/agent/budget.js +128 -0
- package/dist/agent/budget.js.map +1 -0
- package/dist/agent/builtinToolHandlers.d.ts +229 -17
- package/dist/agent/builtinToolHandlers.d.ts.map +1 -1
- package/dist/agent/builtinToolHandlers.js +758 -70
- package/dist/agent/builtinToolHandlers.js.map +1 -1
- package/dist/agent/builtinTools.d.ts +198 -7
- package/dist/agent/builtinTools.d.ts.map +1 -1
- package/dist/agent/builtinTools.js +646 -14
- package/dist/agent/builtinTools.js.map +1 -1
- package/dist/agent/compaction.d.ts +93 -0
- package/dist/agent/compaction.d.ts.map +1 -0
- package/dist/agent/compaction.js +192 -0
- package/dist/agent/compaction.js.map +1 -0
- package/dist/agent/constants.d.ts +139 -18
- package/dist/agent/constants.d.ts.map +1 -1
- package/dist/agent/constants.js +154 -18
- package/dist/agent/constants.js.map +1 -1
- package/dist/agent/contextManager.d.ts +126 -76
- package/dist/agent/contextManager.d.ts.map +1 -1
- package/dist/agent/contextManager.js +197 -135
- package/dist/agent/contextManager.js.map +1 -1
- package/dist/agent/contextPreparer.d.ts +78 -0
- package/dist/agent/contextPreparer.d.ts.map +1 -0
- package/dist/agent/contextPreparer.js +128 -0
- package/dist/agent/contextPreparer.js.map +1 -0
- package/dist/agent/duplicateInterceptor.d.ts +67 -0
- package/dist/agent/duplicateInterceptor.d.ts.map +1 -0
- package/dist/agent/duplicateInterceptor.js +82 -0
- package/dist/agent/duplicateInterceptor.js.map +1 -0
- package/dist/agent/guardRail.d.ts +166 -0
- package/dist/agent/guardRail.d.ts.map +1 -0
- package/dist/agent/guardRail.js +333 -0
- package/dist/agent/guardRail.js.map +1 -0
- package/dist/agent/loop.d.ts +718 -253
- package/dist/agent/loop.d.ts.map +1 -1
- package/dist/agent/loop.js +2215 -648
- package/dist/agent/loop.js.map +1 -1
- package/dist/agent/managers/archiveCoordinator.d.ts +21 -74
- package/dist/agent/managers/archiveCoordinator.d.ts.map +1 -1
- package/dist/agent/managers/archiveCoordinator.js +32 -105
- package/dist/agent/managers/archiveCoordinator.js.map +1 -1
- package/dist/agent/managers/chatLockManager.d.ts +20 -88
- package/dist/agent/managers/chatLockManager.d.ts.map +1 -1
- package/dist/agent/managers/chatLockManager.js +31 -103
- package/dist/agent/managers/chatLockManager.js.map +1 -1
- package/dist/agent/managers/dedupManager.d.ts +85 -0
- package/dist/agent/managers/dedupManager.d.ts.map +1 -0
- package/dist/agent/managers/dedupManager.js +248 -0
- package/dist/agent/managers/dedupManager.js.map +1 -0
- package/dist/agent/managers/goalConsistencyChecker.d.ts +42 -0
- package/dist/agent/managers/goalConsistencyChecker.d.ts.map +1 -0
- package/dist/agent/managers/goalConsistencyChecker.js +178 -0
- package/dist/agent/managers/goalConsistencyChecker.js.map +1 -0
- package/dist/agent/managers/llmCaller.d.ts +124 -0
- package/dist/agent/managers/llmCaller.d.ts.map +1 -0
- package/dist/agent/managers/llmCaller.js +417 -0
- package/dist/agent/managers/llmCaller.js.map +1 -0
- package/dist/agent/managers/llmJudgeHelper.d.ts +21 -0
- package/dist/agent/managers/llmJudgeHelper.d.ts.map +1 -0
- package/dist/agent/managers/llmJudgeHelper.js +32 -0
- package/dist/agent/managers/llmJudgeHelper.js.map +1 -0
- package/dist/agent/managers/loopMetrics.d.ts +58 -0
- package/dist/agent/managers/loopMetrics.d.ts.map +1 -0
- package/dist/agent/managers/loopMetrics.js +68 -0
- package/dist/agent/managers/loopMetrics.js.map +1 -0
- package/dist/agent/managers/memoryAdvisor.d.ts +27 -120
- package/dist/agent/managers/memoryAdvisor.d.ts.map +1 -1
- package/dist/agent/managers/memoryAdvisor.js +56 -192
- package/dist/agent/managers/memoryAdvisor.js.map +1 -1
- package/dist/agent/managers/memoryGovernance.d.ts +24 -0
- package/dist/agent/managers/memoryGovernance.d.ts.map +1 -0
- package/dist/agent/managers/memoryGovernance.js +46 -0
- package/dist/agent/managers/memoryGovernance.js.map +1 -0
- package/dist/agent/managers/memoryInspector.d.ts +59 -393
- package/dist/agent/managers/memoryInspector.d.ts.map +1 -1
- package/dist/agent/managers/memoryInspector.js +92 -736
- package/dist/agent/managers/memoryInspector.js.map +1 -1
- package/dist/agent/managers/roundSummaryGenerator.d.ts +56 -0
- package/dist/agent/managers/roundSummaryGenerator.d.ts.map +1 -0
- package/dist/agent/managers/roundSummaryGenerator.js +201 -0
- package/dist/agent/managers/roundSummaryGenerator.js.map +1 -0
- package/dist/agent/managers/sessionArchiver.d.ts +19 -63
- package/dist/agent/managers/sessionArchiver.d.ts.map +1 -1
- package/dist/agent/managers/sessionArchiver.js +83 -157
- package/dist/agent/managers/sessionArchiver.js.map +1 -1
- package/dist/agent/managers/sessionManager.d.ts +286 -57
- package/dist/agent/managers/sessionManager.d.ts.map +1 -1
- package/dist/agent/managers/sessionManager.js +846 -85
- package/dist/agent/managers/sessionManager.js.map +1 -1
- package/dist/agent/managers/sessionNamer.d.ts +35 -0
- package/dist/agent/managers/sessionNamer.d.ts.map +1 -0
- package/dist/agent/managers/sessionNamer.js +104 -0
- package/dist/agent/managers/sessionNamer.js.map +1 -0
- package/dist/agent/managers/streamAccumulator.d.ts +20 -0
- package/dist/agent/managers/streamAccumulator.d.ts.map +1 -0
- package/dist/agent/managers/streamAccumulator.js +15 -0
- package/dist/agent/managers/streamAccumulator.js.map +1 -0
- package/dist/agent/managers/textPolishManager.d.ts +8 -44
- package/dist/agent/managers/textPolishManager.d.ts.map +1 -1
- package/dist/agent/managers/textPolishManager.js +12 -47
- package/dist/agent/managers/textPolishManager.js.map +1 -1
- package/dist/agent/managers/toolCallHelpers.d.ts +105 -0
- package/dist/agent/managers/toolCallHelpers.d.ts.map +1 -0
- package/dist/agent/managers/toolCallHelpers.js +161 -0
- package/dist/agent/managers/toolCallHelpers.js.map +1 -0
- package/dist/agent/managers/workProjection.d.ts +57 -87
- package/dist/agent/managers/workProjection.d.ts.map +1 -1
- package/dist/agent/managers/workProjection.js +166 -246
- package/dist/agent/managers/workProjection.js.map +1 -1
- package/dist/agent/messageHistory.d.ts +134 -84
- package/dist/agent/messageHistory.d.ts.map +1 -1
- package/dist/agent/messageHistory.js +419 -133
- package/dist/agent/messageHistory.js.map +1 -1
- package/dist/agent/needsPlanning.d.ts +28 -0
- package/dist/agent/needsPlanning.d.ts.map +1 -0
- package/dist/agent/needsPlanning.js +68 -0
- package/dist/agent/needsPlanning.js.map +1 -0
- package/dist/agent/seed/index.d.ts +11 -0
- package/dist/agent/seed/index.d.ts.map +1 -0
- package/dist/agent/seed/index.js +10 -0
- package/dist/agent/seed/index.js.map +1 -0
- package/dist/agent/seed/orchestrator.d.ts +83 -0
- package/dist/agent/seed/orchestrator.d.ts.map +1 -0
- package/dist/agent/seed/orchestrator.js +260 -0
- package/dist/agent/seed/orchestrator.js.map +1 -0
- package/dist/agent/seed/prepare.d.ts +49 -0
- package/dist/agent/seed/prepare.d.ts.map +1 -0
- package/dist/agent/seed/prepare.js +107 -0
- package/dist/agent/seed/prepare.js.map +1 -0
- package/dist/agent/seed/types.d.ts +115 -0
- package/dist/agent/seed/types.d.ts.map +1 -0
- package/dist/agent/seed/types.js +15 -0
- package/dist/agent/seed/types.js.map +1 -0
- package/dist/agent/sessionStateMachine.d.ts +78 -0
- package/dist/agent/sessionStateMachine.d.ts.map +1 -0
- package/dist/agent/sessionStateMachine.js +182 -0
- package/dist/agent/sessionStateMachine.js.map +1 -0
- package/dist/agent/taskTableRenderer.d.ts +51 -0
- package/dist/agent/taskTableRenderer.d.ts.map +1 -0
- package/dist/agent/taskTableRenderer.js +115 -0
- package/dist/agent/taskTableRenderer.js.map +1 -0
- package/dist/agent/toolExecutor.d.ts +255 -9
- package/dist/agent/toolExecutor.d.ts.map +1 -1
- package/dist/agent/toolExecutor.js +956 -20
- package/dist/agent/toolExecutor.js.map +1 -1
- package/dist/agent/toolLedger.d.ts +120 -0
- package/dist/agent/toolLedger.d.ts.map +1 -0
- package/dist/agent/toolLedger.js +149 -0
- package/dist/agent/toolLedger.js.map +1 -0
- package/dist/agent/toolResultCache.d.ts +134 -0
- package/dist/agent/toolResultCache.d.ts.map +1 -0
- package/dist/agent/toolResultCache.js +243 -0
- package/dist/agent/toolResultCache.js.map +1 -0
- package/dist/agent/toolResultOffload.d.ts +59 -0
- package/dist/agent/toolResultOffload.d.ts.map +1 -0
- package/dist/agent/toolResultOffload.js +70 -0
- package/dist/agent/toolResultOffload.js.map +1 -0
- package/dist/agent/toolRunner.d.ts +59 -0
- package/dist/agent/toolRunner.d.ts.map +1 -0
- package/dist/agent/toolRunner.js +147 -0
- package/dist/agent/toolRunner.js.map +1 -0
- package/dist/agent/tracer.d.ts +99 -107
- package/dist/agent/tracer.d.ts.map +1 -1
- package/dist/agent/tracer.js +24 -69
- package/dist/agent/tracer.js.map +1 -1
- package/dist/agent/types.d.ts +512 -162
- package/dist/agent/types.d.ts.map +1 -1
- package/dist/agent/types.js +2 -51
- package/dist/agent/types.js.map +1 -1
- package/dist/code-exec/codeExecutionProvider.d.ts +16 -0
- package/dist/code-exec/codeExecutionProvider.d.ts.map +1 -0
- package/dist/code-exec/codeExecutionProvider.js +57 -0
- package/dist/code-exec/codeExecutionProvider.js.map +1 -0
- package/dist/code-exec/types.d.ts +37 -0
- package/dist/code-exec/types.d.ts.map +1 -0
- package/dist/code-exec/types.js +12 -0
- package/dist/code-exec/types.js.map +1 -0
- package/dist/config/expandEnvVars.d.ts +22 -0
- package/dist/config/expandEnvVars.d.ts.map +1 -0
- package/dist/config/expandEnvVars.js +38 -0
- package/dist/config/expandEnvVars.js.map +1 -0
- package/dist/config/loader.d.ts +59 -242
- package/dist/config/loader.d.ts.map +1 -1
- package/dist/config/loader.js +237 -194
- package/dist/config/loader.js.map +1 -1
- package/dist/index.d.ts +69 -74
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +93 -63
- package/dist/index.js.map +1 -1
- package/dist/llm/abortSignal.d.ts +2 -3
- package/dist/llm/abortSignal.d.ts.map +1 -1
- package/dist/llm/abortSignal.js +2 -3
- package/dist/llm/abortSignal.js.map +1 -1
- package/dist/llm/factory.d.ts +29 -25
- package/dist/llm/factory.d.ts.map +1 -1
- package/dist/llm/factory.js +34 -69
- package/dist/llm/factory.js.map +1 -1
- package/dist/llm/openaiCompatible.d.ts +25 -40
- package/dist/llm/openaiCompatible.d.ts.map +1 -1
- package/dist/llm/openaiCompatible.js +181 -129
- package/dist/llm/openaiCompatible.js.map +1 -1
- package/dist/llm/provider.d.ts +29 -42
- package/dist/llm/provider.d.ts.map +1 -1
- package/dist/llm/provider.js +11 -10
- package/dist/llm/provider.js.map +1 -1
- package/dist/llm/types.d.ts +54 -11
- package/dist/llm/types.d.ts.map +1 -1
- package/dist/llm/types.js +0 -5
- package/dist/llm/types.js.map +1 -1
- package/dist/logging/logger.d.ts +8 -29
- package/dist/logging/logger.d.ts.map +1 -1
- package/dist/logging/logger.js +43 -233
- package/dist/logging/logger.js.map +1 -1
- package/dist/logging/loggerInterface.d.ts +9 -8
- package/dist/logging/loggerInterface.d.ts.map +1 -1
- package/dist/memory/gcService.d.ts +164 -0
- package/dist/memory/gcService.d.ts.map +1 -0
- package/dist/memory/gcService.js +215 -0
- package/dist/memory/gcService.js.map +1 -0
- package/dist/memory/governance.d.ts +17 -0
- package/dist/memory/governance.d.ts.map +1 -0
- package/dist/memory/governance.js +17 -0
- package/dist/memory/governance.js.map +1 -0
- package/dist/memory/inMemoryRoundStore.d.ts +124 -0
- package/dist/memory/inMemoryRoundStore.d.ts.map +1 -0
- package/dist/memory/inMemoryRoundStore.js +216 -0
- package/dist/memory/inMemoryRoundStore.js.map +1 -0
- package/dist/memory/inMemorySessionStore.d.ts +92 -0
- package/dist/memory/inMemorySessionStore.d.ts.map +1 -0
- package/dist/memory/inMemorySessionStore.js +219 -0
- package/dist/memory/inMemorySessionStore.js.map +1 -0
- package/dist/memory/inMemorySessionViewLoader.d.ts +89 -0
- package/dist/memory/inMemorySessionViewLoader.d.ts.map +1 -0
- package/dist/memory/inMemorySessionViewLoader.js +183 -0
- package/dist/memory/inMemorySessionViewLoader.js.map +1 -0
- package/dist/memory/inMemoryStorage.d.ts +26 -141
- package/dist/memory/inMemoryStorage.d.ts.map +1 -1
- package/dist/memory/inMemoryStorage.js +48 -187
- package/dist/memory/inMemoryStorage.js.map +1 -1
- package/dist/memory/keywordsTouch.d.ts +20 -0
- package/dist/memory/keywordsTouch.d.ts.map +1 -0
- package/dist/memory/keywordsTouch.js +25 -0
- package/dist/memory/keywordsTouch.js.map +1 -0
- package/dist/memory/lockManager.d.ts +7 -2
- package/dist/memory/lockManager.d.ts.map +1 -1
- package/dist/memory/lockManager.js +35 -11
- package/dist/memory/lockManager.js.map +1 -1
- package/dist/memory/projectManager.d.ts +30 -128
- package/dist/memory/projectManager.d.ts.map +1 -1
- package/dist/memory/projectManager.js +39 -171
- package/dist/memory/projectManager.js.map +1 -1
- package/dist/memory/projectRegistry.d.ts +22 -37
- package/dist/memory/projectRegistry.d.ts.map +1 -1
- package/dist/memory/projectRegistry.js +78 -85
- package/dist/memory/projectRegistry.js.map +1 -1
- package/dist/memory/roundStore.d.ts +629 -0
- package/dist/memory/roundStore.d.ts.map +1 -0
- package/dist/memory/roundStore.js +116 -0
- package/dist/memory/roundStore.js.map +1 -0
- package/dist/memory/sessionStore.d.ts +70 -61
- package/dist/memory/sessionStore.d.ts.map +1 -1
- package/dist/memory/sessionStore.js +23 -1
- package/dist/memory/sessionStore.js.map +1 -1
- package/dist/memory/sessionViewLoader.d.ts +141 -0
- package/dist/memory/sessionViewLoader.d.ts.map +1 -0
- package/dist/memory/sessionViewLoader.js +65 -0
- package/dist/memory/sessionViewLoader.js.map +1 -0
- package/dist/memory/sourceValidation.d.ts +18 -9
- package/dist/memory/sourceValidation.d.ts.map +1 -1
- package/dist/memory/sourceValidation.js +35 -29
- package/dist/memory/sourceValidation.js.map +1 -1
- package/dist/memory/storageInterface.d.ts +45 -126
- package/dist/memory/storageInterface.d.ts.map +1 -1
- package/dist/memory/types.d.ts +82 -168
- package/dist/memory/types.d.ts.map +1 -1
- package/dist/memory/types.js +116 -79
- package/dist/memory/types.js.map +1 -1
- package/dist/project-search/projectSearchProvider.d.ts +29 -0
- package/dist/project-search/projectSearchProvider.d.ts.map +1 -0
- package/dist/project-search/projectSearchProvider.js +57 -0
- package/dist/project-search/projectSearchProvider.js.map +1 -0
- package/dist/project-search/terms.d.ts +14 -0
- package/dist/project-search/terms.d.ts.map +1 -0
- package/dist/project-search/terms.js +68 -0
- package/dist/project-search/terms.js.map +1 -0
- package/dist/project-search/types.d.ts +139 -0
- package/dist/project-search/types.d.ts.map +1 -0
- package/dist/project-search/types.js +8 -0
- package/dist/project-search/types.js.map +1 -0
- package/dist/role-pack/capabilityMap.d.ts +28 -0
- package/dist/role-pack/capabilityMap.d.ts.map +1 -0
- package/dist/role-pack/capabilityMap.js +56 -0
- package/dist/role-pack/capabilityMap.js.map +1 -0
- package/dist/role-pack/constants.d.ts +21 -0
- package/dist/role-pack/constants.d.ts.map +1 -0
- package/dist/role-pack/constants.js +21 -0
- package/dist/role-pack/constants.js.map +1 -0
- package/dist/role-pack/rolePackManager.d.ts +269 -0
- package/dist/role-pack/rolePackManager.d.ts.map +1 -0
- package/dist/role-pack/rolePackManager.js +1082 -0
- package/dist/role-pack/rolePackManager.js.map +1 -0
- package/dist/role-pack/strategyKeys.d.ts +100 -0
- package/dist/role-pack/strategyKeys.d.ts.map +1 -0
- package/dist/role-pack/strategyKeys.js +184 -0
- package/dist/role-pack/strategyKeys.js.map +1 -0
- package/dist/role-pack/strategyResolver.d.ts +109 -0
- package/dist/role-pack/strategyResolver.d.ts.map +1 -0
- package/dist/role-pack/strategyResolver.js +304 -0
- package/dist/role-pack/strategyResolver.js.map +1 -0
- package/dist/role-pack/types.d.ts +237 -0
- package/dist/role-pack/types.d.ts.map +1 -0
- package/dist/role-pack/types.js +8 -0
- package/dist/role-pack/types.js.map +1 -0
- package/dist/role-pack/validator.d.ts +38 -0
- package/dist/role-pack/validator.d.ts.map +1 -0
- package/dist/role-pack/validator.js +436 -0
- package/dist/role-pack/validator.js.map +1 -0
- package/dist/security/pathGuard.d.ts +69 -72
- package/dist/security/pathGuard.d.ts.map +1 -1
- package/dist/security/pathGuard.js +151 -131
- package/dist/security/pathGuard.js.map +1 -1
- package/dist/skill/skillLayer3.d.ts +91 -0
- package/dist/skill/skillLayer3.d.ts.map +1 -0
- package/dist/skill/skillLayer3.js +104 -0
- package/dist/skill/skillLayer3.js.map +1 -0
- package/dist/skill/skillManager.d.ts +127 -56
- package/dist/skill/skillManager.d.ts.map +1 -1
- package/dist/skill/skillManager.js +318 -163
- package/dist/skill/skillManager.js.map +1 -1
- package/dist/skill/skillScriptRunner.d.ts +97 -0
- package/dist/skill/skillScriptRunner.d.ts.map +1 -0
- package/dist/skill/skillScriptRunner.js +271 -0
- package/dist/skill/skillScriptRunner.js.map +1 -0
- package/dist/skill/types.d.ts +73 -17
- package/dist/skill/types.d.ts.map +1 -1
- package/dist/skill/types.js +5 -1
- package/dist/skill/types.js.map +1 -1
- package/dist/utils/array.d.ts +5 -6
- package/dist/utils/array.d.ts.map +1 -1
- package/dist/utils/array.js +6 -6
- package/dist/utils/array.js.map +1 -1
- package/dist/utils/atomicWrite.d.ts +8 -0
- package/dist/utils/atomicWrite.d.ts.map +1 -0
- package/dist/utils/atomicWrite.js +31 -0
- package/dist/utils/atomicWrite.js.map +1 -0
- package/dist/utils/backgroundTask.d.ts +38 -0
- package/dist/utils/backgroundTask.d.ts.map +1 -0
- package/dist/utils/backgroundTask.js +117 -0
- package/dist/utils/backgroundTask.js.map +1 -0
- package/dist/utils/configResourceManager.d.ts +79 -0
- package/dist/utils/configResourceManager.d.ts.map +1 -0
- package/dist/utils/configResourceManager.js +150 -0
- package/dist/utils/configResourceManager.js.map +1 -0
- package/dist/utils/errors.d.ts +48 -56
- package/dist/utils/errors.d.ts.map +1 -1
- package/dist/utils/errors.js +60 -58
- package/dist/utils/errors.js.map +1 -1
- package/dist/utils/eventEmitter.d.ts +141 -63
- package/dist/utils/eventEmitter.d.ts.map +1 -1
- package/dist/utils/eventEmitter.js +50 -35
- package/dist/utils/eventEmitter.js.map +1 -1
- package/dist/utils/fileSafe.d.ts +20 -0
- package/dist/utils/fileSafe.d.ts.map +1 -0
- package/dist/utils/fileSafe.js +56 -0
- package/dist/utils/fileSafe.js.map +1 -0
- package/dist/utils/frontmatter.d.ts +2 -3
- package/dist/utils/frontmatter.d.ts.map +1 -1
- package/dist/utils/frontmatter.js +6 -5
- package/dist/utils/frontmatter.js.map +1 -1
- package/dist/utils/hash.d.ts +12 -0
- package/dist/utils/hash.d.ts.map +1 -0
- package/dist/utils/hash.js +27 -0
- package/dist/utils/hash.js.map +1 -0
- package/dist/utils/http.d.ts +17 -0
- package/dist/utils/http.d.ts.map +1 -0
- package/dist/utils/http.js +29 -0
- package/dist/utils/http.js.map +1 -0
- package/dist/utils/json.d.ts +1 -1
- package/dist/utils/json.js +1 -1
- package/dist/utils/math.d.ts +34 -1
- package/dist/utils/math.d.ts.map +1 -1
- package/dist/utils/math.js +47 -14
- package/dist/utils/math.js.map +1 -1
- package/dist/utils/objects.d.ts +2 -3
- package/dist/utils/objects.d.ts.map +1 -1
- package/dist/utils/objects.js +2 -3
- package/dist/utils/objects.js.map +1 -1
- package/dist/utils/recallDefaults.d.ts +16 -0
- package/dist/utils/recallDefaults.d.ts.map +1 -0
- package/dist/utils/recallDefaults.js +16 -0
- package/dist/utils/recallDefaults.js.map +1 -0
- package/dist/utils/safeTimer.d.ts +8 -36
- package/dist/utils/safeTimer.d.ts.map +1 -1
- package/dist/utils/safeTimer.js +9 -37
- package/dist/utils/safeTimer.js.map +1 -1
- package/dist/utils/scanner.d.ts +97 -17
- package/dist/utils/scanner.d.ts.map +1 -1
- package/dist/utils/scanner.js +269 -47
- package/dist/utils/scanner.js.map +1 -1
- package/dist/utils/segmenter.d.ts +20 -29
- package/dist/utils/segmenter.d.ts.map +1 -1
- package/dist/utils/segmenter.js +230 -88
- package/dist/utils/segmenter.js.map +1 -1
- package/dist/utils/strings.d.ts +15 -32
- package/dist/utils/strings.d.ts.map +1 -1
- package/dist/utils/strings.js +25 -44
- package/dist/utils/strings.js.map +1 -1
- package/dist/utils/time.d.ts +37 -0
- package/dist/utils/time.d.ts.map +1 -1
- package/dist/utils/time.js +56 -0
- package/dist/utils/time.js.map +1 -1
- package/dist/utils/toError.d.ts +13 -1
- package/dist/utils/toError.d.ts.map +1 -1
- package/dist/utils/toError.js +18 -1
- package/dist/utils/toError.js.map +1 -1
- package/dist/web-fetch/fetchWebFetchProvider.d.ts +14 -0
- package/dist/web-fetch/fetchWebFetchProvider.d.ts.map +1 -0
- package/dist/web-fetch/fetchWebFetchProvider.js +69 -0
- package/dist/web-fetch/fetchWebFetchProvider.js.map +1 -0
- package/dist/web-fetch/types.d.ts +30 -0
- package/dist/web-fetch/types.d.ts.map +1 -0
- package/dist/web-fetch/types.js +7 -0
- package/dist/web-fetch/types.js.map +1 -0
- package/dist/web-fetch/webFetchProvider.d.ts +10 -0
- package/dist/web-fetch/webFetchProvider.d.ts.map +1 -0
- package/dist/web-fetch/webFetchProvider.js +28 -0
- package/dist/web-fetch/webFetchProvider.js.map +1 -0
- package/dist/web-search/fetchWebSearchProvider.d.ts +27 -0
- package/dist/web-search/fetchWebSearchProvider.d.ts.map +1 -0
- package/dist/web-search/fetchWebSearchProvider.js +199 -0
- package/dist/web-search/fetchWebSearchProvider.js.map +1 -0
- package/dist/web-search/types.d.ts +46 -0
- package/dist/web-search/types.d.ts.map +1 -0
- package/dist/web-search/types.js +2 -0
- package/dist/{persona → web-search}/types.js.map +1 -1
- package/dist/web-search/webSearchProvider.d.ts +10 -0
- package/dist/web-search/webSearchProvider.d.ts.map +1 -0
- package/dist/web-search/webSearchProvider.js +30 -0
- package/dist/web-search/webSearchProvider.js.map +1 -0
- package/docs/architecture/role-pack-authoring-guide.md +243 -0
- package/docs/architecture/role-pack-spec.md +767 -0
- package/docs/memora-api-reference.md +1175 -0
- package/docs/memora-/346/216/245/345/205/245/346/214/207/345/215/227.md +843 -0
- package/docs/role-pack-/345/274/200/346/224/276/351/224/256/346/214/207/345/215/227.md +148 -0
- package/package.json +105 -83
- package/role-packs/README.md +41 -0
- package/role-packs/memora/345/212/251/346/211/213/manifest.json +12 -0
- package/role-packs/memora/345/212/251/346/211/213/persona.md +12 -0
- package/role-packs/memora/345/212/251/346/211/213/rules.md +4 -0
- package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/manifest.json +44 -0
- package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/persona.md +46 -0
- package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/rules.md +15 -0
- package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/character-sheet.md +34 -0
- package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/core-extractor.md +37 -0
- package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/craft-review.md +69 -0
- package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/dialogue-craft.md +45 -0
- package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/emotion-wave.md +46 -0
- package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/empathy-craft.md +79 -0
- package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/foreshadow.md +29 -0
- package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/hotspot-mapping.md +121 -0
- package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/idea-lever.md +42 -0
- package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/logline-craft.md +47 -0
- package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/longform-guard.md +64 -0
- package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/need-finder.md +40 -0
- package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/outline-expand.md +46 -0
- package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/pacing-hook.md +34 -0
- package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/polish-method.md +113 -0
- package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/pov-discipline.md +79 -0
- package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/project-init/SKILL.md +112 -0
- package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/project-init/scripts/init-novel-project.mjs +441 -0
- package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/relationship-web.md +47 -0
- package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/scene-craft.md +46 -0
- package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/story-bible.md +60 -0
- package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/story-structure.md +36 -0
- package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/style-weaver.md +109 -0
- package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/three-layer-check.md +27 -0
- package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/world-builder.md +41 -0
- package/role-packs//347/231/275/350/257/235/346/226/271/346/241/210/350/256/276/350/256/241/345/270/210/manifest.json +48 -0
- package/role-packs//347/231/275/350/257/235/346/226/271/346/241/210/350/256/276/350/256/241/345/270/210/persona.md +73 -0
- package/role-packs//347/231/275/350/257/235/346/226/271/346/241/210/350/256/276/350/256/241/345/270/210/rules.md +19 -0
- package/role-packs//347/231/275/350/257/235/346/226/271/346/241/210/350/256/276/350/256/241/345/270/210/skills/api-doc-writer.md +40 -0
- package/role-packs//347/231/275/350/257/235/346/226/271/346/241/210/350/256/276/350/256/241/345/270/210/skills/doc-planner.md +42 -0
- package/role-packs//347/231/275/350/257/235/346/226/271/346/241/210/350/256/276/350/256/241/345/270/210/skills/nutrient-search.md +28 -0
- package/role-packs//347/231/275/350/257/235/346/226/271/346/241/210/350/256/276/350/256/241/345/270/210/skills/seed-finder.md +28 -0
- package/role-packs//347/231/275/350/257/235/346/226/271/346/241/210/350/256/276/350/256/241/345/270/210/skills/ssot-audit.md +34 -0
- package/role-packs//347/231/275/350/257/235/346/226/271/346/241/210/350/256/276/350/256/241/345/270/210/skills/style-guide.md +40 -0
- package/dist/agent/guardrail.d.ts +0 -47
- package/dist/agent/guardrail.d.ts.map +0 -1
- package/dist/agent/guardrail.js +0 -51
- package/dist/agent/guardrail.js.map +0 -1
- package/dist/agent/managers/autoConfigRefiner.d.ts +0 -39
- package/dist/agent/managers/autoConfigRefiner.d.ts.map +0 -1
- package/dist/agent/managers/autoConfigRefiner.js +0 -150
- package/dist/agent/managers/autoConfigRefiner.js.map +0 -1
- package/dist/agent/managers/configManager.d.ts +0 -125
- package/dist/agent/managers/configManager.d.ts.map +0 -1
- package/dist/agent/managers/configManager.js +0 -194
- package/dist/agent/managers/configManager.js.map +0 -1
- package/dist/agent/managers/insightExtractor.d.ts +0 -139
- package/dist/agent/managers/insightExtractor.d.ts.map +0 -1
- package/dist/agent/managers/insightExtractor.js +0 -401
- package/dist/agent/managers/insightExtractor.js.map +0 -1
- package/dist/agent/managers/memoryDecayScheduler.d.ts +0 -198
- package/dist/agent/managers/memoryDecayScheduler.d.ts.map +0 -1
- package/dist/agent/managers/memoryDecayScheduler.js +0 -349
- package/dist/agent/managers/memoryDecayScheduler.js.map +0 -1
- package/dist/agent/managers/relationBuilder.d.ts +0 -131
- package/dist/agent/managers/relationBuilder.d.ts.map +0 -1
- package/dist/agent/managers/relationBuilder.js +0 -192
- package/dist/agent/managers/relationBuilder.js.map +0 -1
- package/dist/agent/personaMatcher.d.ts +0 -29
- package/dist/agent/personaMatcher.d.ts.map +0 -1
- package/dist/agent/personaMatcher.js +0 -60
- package/dist/agent/personaMatcher.js.map +0 -1
- package/dist/agent/userFactExtractor.d.ts +0 -25
- package/dist/agent/userFactExtractor.d.ts.map +0 -1
- package/dist/agent/userFactExtractor.js +0 -81
- package/dist/agent/userFactExtractor.js.map +0 -1
- package/dist/eval/evalRunner.d.ts +0 -94
- package/dist/eval/evalRunner.d.ts.map +0 -1
- package/dist/eval/evalRunner.js +0 -141
- package/dist/eval/evalRunner.js.map +0 -1
- package/dist/eval/evalTypes.d.ts +0 -148
- package/dist/eval/evalTypes.d.ts.map +0 -1
- package/dist/eval/evalTypes.js +0 -118
- package/dist/eval/evalTypes.js.map +0 -1
- package/dist/eval/scenarios.d.ts +0 -33
- package/dist/eval/scenarios.d.ts.map +0 -1
- package/dist/eval/scenarios.js +0 -109
- package/dist/eval/scenarios.js.map +0 -1
- package/dist/llm/embedding.d.ts +0 -67
- package/dist/llm/embedding.d.ts.map +0 -1
- package/dist/llm/embedding.js +0 -184
- package/dist/llm/embedding.js.map +0 -1
- package/dist/memory/hybridMerge.d.ts +0 -54
- package/dist/memory/hybridMerge.d.ts.map +0 -1
- package/dist/memory/hybridMerge.js +0 -36
- package/dist/memory/hybridMerge.js.map +0 -1
- package/dist/memory/inMemoryRelationStore.d.ts +0 -51
- package/dist/memory/inMemoryRelationStore.d.ts.map +0 -1
- package/dist/memory/inMemoryRelationStore.js +0 -65
- package/dist/memory/inMemoryRelationStore.js.map +0 -1
- package/dist/memory/loader.d.ts +0 -49
- package/dist/memory/loader.d.ts.map +0 -1
- package/dist/memory/loader.js +0 -93
- package/dist/memory/loader.js.map +0 -1
- package/dist/memory/recall.d.ts +0 -66
- package/dist/memory/recall.d.ts.map +0 -1
- package/dist/memory/recall.js +0 -142
- package/dist/memory/recall.js.map +0 -1
- package/dist/memory/relationStore.d.ts +0 -78
- package/dist/memory/relationStore.d.ts.map +0 -1
- package/dist/memory/relationStore.js +0 -2
- package/dist/memory/relationStore.js.map +0 -1
- package/dist/memory/store.d.ts +0 -50
- package/dist/memory/store.d.ts.map +0 -1
- package/dist/memory/store.js +0 -161
- package/dist/memory/store.js.map +0 -1
- package/dist/memory/userProfile.d.ts +0 -156
- package/dist/memory/userProfile.d.ts.map +0 -1
- package/dist/memory/userProfile.js +0 -320
- package/dist/memory/userProfile.js.map +0 -1
- package/dist/memory/vectorStore.d.ts +0 -185
- package/dist/memory/vectorStore.d.ts.map +0 -1
- package/dist/memory/vectorStore.js +0 -257
- package/dist/memory/vectorStore.js.map +0 -1
- package/dist/persona/personaManager.d.ts +0 -160
- package/dist/persona/personaManager.d.ts.map +0 -1
- package/dist/persona/personaManager.js +0 -414
- package/dist/persona/personaManager.js.map +0 -1
- package/dist/persona/types.d.ts +0 -32
- package/dist/persona/types.d.ts.map +0 -1
- package/dist/persona/types.js +0 -5
|
@@ -0,0 +1,1175 @@
|
|
|
1
|
+
# Memora 内核 API 参考手册(v3.0.0)
|
|
2
|
+
|
|
3
|
+
> **核心定位**:Memora 是一个**无法独立运行**的智能大脑内核——它只有接口,没有"形态"。CLI、WebUI、桌面精灵、小说生成器都是它的"宿主",宿主负责给它身体(UI)、血管(Provider)、神经网络(事件回路)。
|
|
4
|
+
>
|
|
5
|
+
> **本文件用途**:列出内核对外暴露的**全部公开接口**——从最基础的接入接口(〇),到 Agent 面类、对话、记忆、角色包、工具、各 Manager,再到类型导出与安全约束。
|
|
6
|
+
>
|
|
7
|
+
> **版本**:v3.0.0(对齐当前稳定版,纯净接口文档,不含历史变更流水)
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
## 〇、接入基础接口
|
|
12
|
+
|
|
13
|
+
> **定位**:一个新宿主接入 memora 的**最小接入面**。其余各章是 `Agent` 初始化后暴露的运行时能力;本章回答"接入前必须提供什么"。
|
|
14
|
+
>
|
|
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
|
+
```
|
|
127
|
+
|
|
128
|
+
---
|
|
129
|
+
|
|
130
|
+
## 一、设计哲学
|
|
131
|
+
|
|
132
|
+
```
|
|
133
|
+
┌────────────────────────────────────────────────────────────┐
|
|
134
|
+
│ 宿主程序(CLI / 桌面精灵 / 小说生成器 / WebUI) │
|
|
135
|
+
│ ┌─────────────────┐ ┌──────────────────┐ │
|
|
136
|
+
│ │ LLM Provider 实例 │◄───│ API Key / baseUrl │ ← 宿主职责 │
|
|
137
|
+
│ └────────┬────────┘ └──────────────────┘ │
|
|
138
|
+
│ │ 注入 │
|
|
139
|
+
│ ▼ │
|
|
140
|
+
│ ┌──────────────────────────────────────────┐ │
|
|
141
|
+
│ │ Memora 内核(Agent) │ │
|
|
142
|
+
│ │ ┌──────────────────────────────────────┐│ │
|
|
143
|
+
│ │ │ Agent 面类(编排层) ││ │
|
|
144
|
+
│ │ │ - init/close · chat · switchProject ││ │
|
|
145
|
+
│ │ │ - .rolePack / .tools / .skills ││ │
|
|
146
|
+
│ │ │ - .governance / .memory ││ │
|
|
147
|
+
│ │ └──────────┬───────────────────────────┘│ │
|
|
148
|
+
│ │ │ 委托 │ │
|
|
149
|
+
│ │ ┌──────────┼───────────────────────────┐│ │
|
|
150
|
+
│ │ │ RolePackManager / SkillManager ││ │
|
|
151
|
+
│ │ │ ToolExecutor / MemoryInspector ││ │
|
|
152
|
+
│ │ │ MemoryGovernance ││ │
|
|
153
|
+
│ │ └──────────────────────────────────────┘│ │
|
|
154
|
+
│ │ ⚠️ 不包含:UI / LLM 配置 / 用户配置模板 │ │
|
|
155
|
+
│ └──────────────────────────────────────────┘ │
|
|
156
|
+
└────────────────────────────────────────────────────────────┘
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
**设计原则**:
|
|
160
|
+
- **零运行时依赖**(核心层零 npm 运行时依赖、**零运行时模块解析**;日志默认内置 console fallback,宿主经 `setLogger()` 注入自定义实现;持久化由宿主通过 `IMemoryStorage` 接口注入)
|
|
161
|
+
- **内核模块不直接调用 `console.*`**(唯一日志出口是 `logging/` 单例 `logger`;默认实现为内置 console fallback,写 stderr)
|
|
162
|
+
- **零写用户文件**(配置文件是真理源,Agent 只读)
|
|
163
|
+
- **零 LLM 配置加载**(Agent 不知道 `apiKey`,宿主传入 `LlmProvider` 实例)
|
|
164
|
+
- **Manager 委托模式**:Agent 面类只做编排,领域操作委托给专职 Manager
|
|
165
|
+
|
|
166
|
+
---
|
|
167
|
+
|
|
168
|
+
## 二、构造与生命周期
|
|
169
|
+
|
|
170
|
+
### 2.1 构造选项 `AgentOptions`
|
|
171
|
+
|
|
172
|
+
| 字段 | 类型 | 必须 | 说明 |
|
|
173
|
+
|------|------|------|------|
|
|
174
|
+
| `projectPath` | `string` | ✅ | 项目路径(必须) |
|
|
175
|
+
| `provider` | `LlmProvider` | ✅ | 前台 LLM Provider(必须) |
|
|
176
|
+
| `backgroundProvider` | `LlmProvider` | ❌ | 后台 Provider(投影等后台操作) |
|
|
177
|
+
| `providerRouter` | `ProviderRouter` | ❌ | 按任务类型返回 Provider 的路由器(不配时全部使用同一 Provider,向后兼容) |
|
|
178
|
+
| `configDir` | `string` | ❌ | 配置目录(role-packs / skills,设定记忆唯一归角色包) |
|
|
179
|
+
| `dataDir` | `string` | ✅ | 记忆数据目录(必填,内核不提供默认值;传项目级还是用户级目录由宿主决定) |
|
|
180
|
+
| `registryDir` | `string` | ❌ | 项目注册表目录(缺省与 dataDir 相同)。注册表用于**跨项目按名解析**,仅当多项目共用一份时才成立 |
|
|
181
|
+
| `maxContextTokens` | `number` | ❌ | 上下文窗口上限(默认 120000) |
|
|
182
|
+
| `activeRolePack` | `string` | ❌ | 启动激活的角色包名(缺失/不存在回退默认激活首个) |
|
|
183
|
+
| `permission` | `'owner' \| 'guest'` | ❌ | 安全权限(默认 'owner') |
|
|
184
|
+
| `allowedPaths` | `string[]` | ❌ | 路径白名单(默认 [] = 全部允许) |
|
|
185
|
+
| `confirmWrites` | `boolean` | ❌ | 写入确认(默认 false) |
|
|
186
|
+
| `storage` | `IMemoryStorage` | ❌ | 存储层注入(默认 InMemoryStorage) |
|
|
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 })` 显式参数 |
|
|
189
|
+
| `sessionStore` | `ISessionStore` | ❌ | 会话存储注入 |
|
|
190
|
+
| `tracer` | `ITracer` | ❌ | 可观测性 Tracer 注入(不传则使用 NoopTracer 静默丢弃所有 span) |
|
|
191
|
+
| `messages` | `UIMessages` | ❌ | 宿主可覆盖的 UI 消息文本(默认英文,宿主覆盖为中文等) |
|
|
192
|
+
| `enableContextSummary` | `boolean` | ❌ | 上下文超限时是否自动生成摘要(默认 true,开启后首次截断时增加 ~1-2s 延迟) |
|
|
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` | ❌ | 工具执行前检查回调(宿主审批/审计/参数改写通道;装配时与内部幂等检查组合为单点入口) |
|
|
199
|
+
|
|
200
|
+
> **Logger 注入方式**:v1.0 起 `AgentOptions` 不再含 `logger` 字段。日志通过全局 `setLogger(customLogger)` 注入(详见 §十七 类型导出);未注入时使用内核内置 console fallback(写 stderr,级别由 `MEMORA_LOG_LEVEL` 控制),内核不做任何运行时模块解析。注入即内核唯一日志出口,对**所有内核模块(含 utils 层)**生效。
|
|
201
|
+
|
|
202
|
+
### 2.2 生命周期方法
|
|
203
|
+
|
|
204
|
+
| 方法 | 用途 |
|
|
205
|
+
|------|------|
|
|
206
|
+
| `new Agent(opts)` | 构造函数(无副作用,不连接 LLM) |
|
|
207
|
+
| `init(projectPathOverride?)` → `Promise<ProjectContext>` | 初始化:建立存储、加载配置、组装组件 |
|
|
208
|
+
| `close()` → `Promise<void>` | 关闭:释放项目锁、关闭数据库 |
|
|
209
|
+
|
|
210
|
+
### 2.3 Agent 只读访问器
|
|
211
|
+
|
|
212
|
+
| 访问器 | 类型 | 说明 |
|
|
213
|
+
|--------|------|------|
|
|
214
|
+
| `agent.initialized` | `boolean` | 是否已初始化 |
|
|
215
|
+
| `agent.context` | `AgentContext \| null` | 当前项目上下文 |
|
|
216
|
+
| `agent.provider` | `LlmProvider` | 当前前台 Provider |
|
|
217
|
+
| `agent.isBusy` | `boolean` | 是否正在对话中 |
|
|
218
|
+
| `agent.lastInteractionAt` | `Date \| null` | 最近一次 `chat()` 调用时间 |
|
|
219
|
+
|
|
220
|
+
### 2.4 Manager 访问器(委托模式)
|
|
221
|
+
|
|
222
|
+
Agent 通过一组 getter 暴露专职 Manager 与组件。详见后续章节。
|
|
223
|
+
|
|
224
|
+
| 访问器 | 类型 | 职责 |
|
|
225
|
+
|--------|------|------|
|
|
226
|
+
| `agent.rolePack` | `RolePackManager \| null` | 角色包管理 |
|
|
227
|
+
| `agent.tools` | `ToolExecutor \| null` | 工具注册与执行 |
|
|
228
|
+
| `agent.skills` | `SkillManager \| null` | 技能匹配与注入 |
|
|
229
|
+
| `agent.governance` | `MemoryGovernance \| null` | 记忆治理(去重/冲突检测/建议) |
|
|
230
|
+
| `agent.memory` | `MemoryInspector \| null` | 记忆查询 + 写入(`writeXxx` 前缀) |
|
|
231
|
+
| `agent.works` | `WorkProjectionManager \| null` | 作品投影(工作内容摘要) |
|
|
232
|
+
| `agent.polish` | `TextPolishManager \| null` | 文本润色(LLM 语法修正 + 表达优化) |
|
|
233
|
+
|
|
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`,二者均不再存在。
|
|
235
|
+
|
|
236
|
+
### 2.5 内部组件访问器(高级)
|
|
237
|
+
|
|
238
|
+
| 访问器 | 类型 | 说明 |
|
|
239
|
+
|--------|------|------|
|
|
240
|
+
| `agent.agentLoop` | `AgentLoop \| null` | Agent 循环体(`getMessages()` / `getRecentHistory()`) |
|
|
241
|
+
| `agent.agentHistory` | `MessageHistory \| null` | 消息历史(`listAllSessions()` 等) |
|
|
242
|
+
|
|
243
|
+
### 2.6 `ProjectContext` 字段(`init()` 返回值)
|
|
244
|
+
|
|
245
|
+
| 字段 | 类型 | 说明 |
|
|
246
|
+
|------|------|------|
|
|
247
|
+
| `projectPath` | `string` | 项目根目录的绝对路径 |
|
|
248
|
+
| `projectName` | `string` | 项目名称(从注册表读取,或取目录名) |
|
|
249
|
+
| `memoraDir` | `string` | `.memora/` 目录的绝对路径 |
|
|
250
|
+
| `index` | `IMemoryStorage` | 记忆存储接口 |
|
|
251
|
+
| `security` | `SecurityGuard` | 安全守卫 |
|
|
252
|
+
| `bootstrapMemories` | `Memory[]` | 启动时加载的必召记忆 |
|
|
253
|
+
|
|
254
|
+
### 2.7 事件订阅(`agent.on()` / `agent.off()` / `agent.once()`)
|
|
255
|
+
|
|
256
|
+
Agent 继承 `TypedEventEmitter<AgentEventMap>`,向宿主项目广播对话外事件。
|
|
257
|
+
|
|
258
|
+
```typescript
|
|
259
|
+
agent.on<K extends AgentEventName>(event: K, handler: (payload: AgentEventMap[K]) => void): void
|
|
260
|
+
agent.off<K extends AgentEventName>(event: K, handler: (payload: AgentEventMap[K]) => void): void
|
|
261
|
+
agent.once<K extends AgentEventName>(event: K, handler: (payload: AgentEventMap[K]) => void): void
|
|
262
|
+
```
|
|
263
|
+
|
|
264
|
+
| 事件名 | 载荷 | 触发时机 |
|
|
265
|
+
|--------|------|----------|
|
|
266
|
+
| `memoryAdded` | `{ id, source, name }` | 记忆被写入存储(round-summary 沉淀等) |
|
|
267
|
+
| `personaSwitched` | `{ from: string \| null, to }` | 角色被切换(手动指定) |
|
|
268
|
+
| `memoryRecalled` | `{ count, query }` | 记忆被召回(用于 UI 展示) |
|
|
269
|
+
| `sessionForked` | `{ from, to, messageCount }` | 会话被分叉(创建新分支) |
|
|
270
|
+
| `projectSwitched` | `{ from: string \| null, to: string, projectName: string }` | 项目切换(宿主 UI 可据此刷新项目相关界面) |
|
|
271
|
+
| `skillMatched` | `{ skill: string, score: number }` | 技能被匹配(宿主 UI 可据此展示当前激活技能) |
|
|
272
|
+
| `archiveFailed` | `{ stage: 'content'; message: string }` | 归档操作失败(仅 content 阶段,fire-and-forget catch 分支发射,宿主可通知用户) |
|
|
273
|
+
|
|
274
|
+
```typescript
|
|
275
|
+
// 使用示例
|
|
276
|
+
agent.on('memoryAdded', (e) => console.log(`新记忆: ${e.source}:${e.name}`));
|
|
277
|
+
```
|
|
278
|
+
|
|
279
|
+
> `close()` 自动移除所有事件监听器。
|
|
280
|
+
|
|
281
|
+
**状态机**:
|
|
282
|
+
```
|
|
283
|
+
[构造] --init()--> [已初始化] --chat()/其他方法...--> [已初始化]
|
|
284
|
+
--close()--> [已关闭]
|
|
285
|
+
```
|
|
286
|
+
|
|
287
|
+
未初始化时调用任何方法**抛 `configError`**。Manager 访问器在 `init()` 前返回 `null`。
|
|
288
|
+
|
|
289
|
+
---
|
|
290
|
+
|
|
291
|
+
## 三、对话 API
|
|
292
|
+
|
|
293
|
+
### 3.1 `chat(input, signal?)` — 流式对话(唯一入口)
|
|
294
|
+
|
|
295
|
+
```typescript
|
|
296
|
+
async *chat(input: string, signal?: AbortSignal): AsyncGenerator<AgentChunk, void, unknown>
|
|
297
|
+
```
|
|
298
|
+
|
|
299
|
+
流式返回 `AgentChunk` 事件,可选传入 `signal` 支持取消。
|
|
300
|
+
|
|
301
|
+
```typescript
|
|
302
|
+
type AgentChunk =
|
|
303
|
+
| { type: 'thinking'; phase: ThinkingPhase } // 推理阶段
|
|
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 归属,不重复携带)
|
|
307
|
+
| { type: 'tool_result'; toolCallId: string; name: string; ok: boolean; summary?: string } // 工具调用结果
|
|
308
|
+
| { type: 'aborted'; reason: string } // 对话被取消
|
|
309
|
+
| { type: 'error'; message: string } // 流式过程中发生错误(LLM 超时/连接断开)
|
|
310
|
+
| { type: 'retry'; attempt: number; maxRetries: number; delayMs: number; error: string } // 指数退避重试
|
|
311
|
+
| { type: 'done' }; // 结束标记
|
|
312
|
+
```
|
|
313
|
+
|
|
314
|
+
> 上表为核心事件子集(含边界/提问等更多成员的 `AgentChunk` 全集以 [types.ts](../src/agent/types.ts) 为唯一真理源)。
|
|
315
|
+
|
|
316
|
+
> **记忆召回展示链已退役(2026-09-10)**:`recall` chunk 分支与 `RecalledMemorySummary` 类型已随自动注入退役**物理删除**。记忆纯工具化后,「召回了什么」由 `search_memories` 工具的 `tool_start` / `tool_result` 过程事件天然展示;检索命中含 `accessedAt` / 溯源字段(`sessionId`/`roundId`)。
|
|
317
|
+
|
|
318
|
+
`ThinkingPhase` 取值:`'recalling' | 'processing' | 'archiving'`
|
|
319
|
+
|
|
320
|
+
### 3.2 `chatSync(input, signal?)` — 同步版(仅供测试用)
|
|
321
|
+
|
|
322
|
+
```typescript
|
|
323
|
+
async chatSync(input: string, signal?: AbortSignal): Promise<string>
|
|
324
|
+
```
|
|
325
|
+
|
|
326
|
+
收集所有 `text` 事件拼接成完整字符串返回。
|
|
327
|
+
|
|
328
|
+
---
|
|
329
|
+
|
|
330
|
+
## 四、记忆查询与写入(`agent.memory` · MemoryInspector)
|
|
331
|
+
|
|
332
|
+
> Manager 访问路径:`agent.memory.xxx()`。`init()` 前返回 `null`。
|
|
333
|
+
|
|
334
|
+
### 4.1 `snapshot()` — 3 层记忆快照
|
|
335
|
+
|
|
336
|
+
```typescript
|
|
337
|
+
agent.memory.snapshot(): MemorySnapshot
|
|
338
|
+
```
|
|
339
|
+
|
|
340
|
+
同步返回当前 3 层记忆快照(纯只读、无副作用):
|
|
341
|
+
|
|
342
|
+
| 层 | 键 | 内容 |
|
|
343
|
+
|----|-----|------|
|
|
344
|
+
| 第 1 层 | `snapshot.working` | `WorkingMemorySnapshot` — 当前 AgentLoop 消息(最近 5 条预览 + 总数) |
|
|
345
|
+
| 第 2 层 | `snapshot.bootstrap` | `BootstrapSnapshot` — 规则记忆(名称 + 来源 + 权重,Persona/Skill 已解耦为设定记忆,不进 bootstrap) |
|
|
346
|
+
| 第 3 层 | `snapshot.archive` | `ArchiveSnapshot` — 归档记忆计数(round-summary)+ 当前会话信息 |
|
|
347
|
+
|
|
348
|
+
```typescript
|
|
349
|
+
interface MemorySnapshot {
|
|
350
|
+
working: WorkingMemorySnapshot;
|
|
351
|
+
bootstrap: BootstrapSnapshot;
|
|
352
|
+
archive: ArchiveSnapshot;
|
|
353
|
+
}
|
|
354
|
+
```
|
|
355
|
+
|
|
356
|
+
### 4.2 `search(query, limit?)` — 记忆搜索
|
|
357
|
+
|
|
358
|
+
```typescript
|
|
359
|
+
// ⚠️ @deprecated 同步通道已退役(2026-09-20),改用 searchByKeyword()。实证无生产/宿主消费方。
|
|
360
|
+
agent.memory.search(query: string, limit?: number): AgentSearchHit[]
|
|
361
|
+
```
|
|
362
|
+
|
|
363
|
+
```typescript
|
|
364
|
+
interface AgentSearchHit {
|
|
365
|
+
id: string; // 记忆唯一标识(source:name 格式,供 showMemory/deleteMemory 等操作使用)
|
|
366
|
+
name: string; // 记忆名称
|
|
367
|
+
source: string; // 来源标签
|
|
368
|
+
contentPreview: string; // 内容预览(截断到 120 字符)
|
|
369
|
+
createdAt?: string; // 创建时间(ISO 8601,供 UI 层时间筛选/排序使用)
|
|
370
|
+
}
|
|
371
|
+
```
|
|
372
|
+
|
|
373
|
+
### 4.3 `stats()` — 记忆库统计
|
|
374
|
+
|
|
375
|
+
```typescript
|
|
376
|
+
agent.memory.stats(): AgentStats
|
|
377
|
+
```
|
|
378
|
+
|
|
379
|
+
```typescript
|
|
380
|
+
interface AgentStats {
|
|
381
|
+
bySource: Record<string, number>; // 按来源标签分组的记忆数量
|
|
382
|
+
total: number; // 记忆总数
|
|
383
|
+
}
|
|
384
|
+
```
|
|
385
|
+
|
|
386
|
+
### 4.4 `agent.agentLoop.getMessages()` — 工作记忆原始消息
|
|
387
|
+
|
|
388
|
+
```typescript
|
|
389
|
+
agent.agentLoop.getMessages(): readonly Message[]
|
|
390
|
+
```
|
|
391
|
+
|
|
392
|
+
### 4.5 写入方法
|
|
393
|
+
|
|
394
|
+
记忆的写入统一收口在 `agent.memory`,写方法以 `writeXxx` 前缀命名(同步返回、不调 LLM、不触发异步 IO):
|
|
395
|
+
|
|
396
|
+
```typescript
|
|
397
|
+
// ─── 写入(writeXxx 前缀) ───
|
|
398
|
+
agent.memory.writeUpsert(memory: Memory): void; // 插入或更新记忆
|
|
399
|
+
agent.memory.writeDelete(id: string): void; // 软删除(写入 deletedAt)
|
|
400
|
+
agent.memory.writeRestore(id: string): void; // 恢复软删除
|
|
401
|
+
agent.memory.writePurge(id: string): void; // 物理删除(不可恢复)
|
|
402
|
+
agent.memory.writePurgeExpired(before: Date): number; // 清理过期回收站
|
|
403
|
+
|
|
404
|
+
// ─── 只读扩展查询 ───
|
|
405
|
+
agent.memory.list(limit?: number): Memory[]; // 列出所有记忆(按 accessedAt 降序;score 已随 2026-09-09 退役)
|
|
406
|
+
agent.memory.getById(id: string): Memory | null; // 按 ID 获取活跃记忆
|
|
407
|
+
agent.memory.getBySource(source: string): Memory[]; // 按 source 获取
|
|
408
|
+
agent.memory.listDeleted(limit?: number): Memory[]; // 回收站(软删除记忆)
|
|
409
|
+
agent.memory.getDeletedById(id: string): Memory | null;
|
|
410
|
+
agent.memory.searchByKeyword(query: string, limit?: number): Promise<AgentSearchHit[]>; // 纯关键词通道
|
|
411
|
+
```
|
|
412
|
+
|
|
413
|
+
> **注意**:`suggest()` / `sourceHealth()` 经 `agent.governance` 暴露(`.suggest()` / `.sourceHealth()`),不挂在 `agent.memory` 下,避免经 MemoryInspector 转发产生多余代理层。
|
|
414
|
+
|
|
415
|
+
---
|
|
416
|
+
|
|
417
|
+
## 五、Memory 模型(基元驱动)
|
|
418
|
+
|
|
419
|
+
```typescript
|
|
420
|
+
interface Memory {
|
|
421
|
+
id: string; // 唯一标识(source:name 格式,如 'rule:core')
|
|
422
|
+
content: string; // 记忆内容(Markdown 文本)
|
|
423
|
+
source: string; // 来源标签(开放字符串,非枚举)
|
|
424
|
+
name: string; // 可读名称
|
|
425
|
+
createdAt: string; // 创建时间(ISO 8601)
|
|
426
|
+
accessedAt: string; // 最后访问时间(每次召回时刷新)
|
|
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 表示已被更新的摘要覆盖,召回时确定性过滤
|
|
434
|
+
}
|
|
435
|
+
```
|
|
436
|
+
|
|
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。
|
|
438
|
+
|
|
439
|
+
**常用 source 标签(`SOURCE_LABELS` 常量):**
|
|
440
|
+
|
|
441
|
+
| 常量 | 值 | 用途 |
|
|
442
|
+
|------|----|------|
|
|
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'` | 未知来源(未被已知标签覆盖时的兜底值) |
|
|
449
|
+
|
|
450
|
+
> source 是开放字符串,宿主可自定义新标签。`validateSource()` 可检测常见 typo(基于 Levenshtein 距离)。PERSONA/RULE/SKILL/WORK_PROJECTION 四标签**仅作历史兼容与 typo 检测**保留,已不进入治理范围(`GOVERNANCE_SOURCES`)——当前写入记忆库的主要 source 为 `round-summary`。
|
|
451
|
+
|
|
452
|
+
### 5.2 `IMemoryStorage` 接口
|
|
453
|
+
|
|
454
|
+
宿主实现此接口注入 Agent,替代默认的 `InMemoryStorage`。共 **15 方法**(14 必需 + 可选 `close`),所有方法同步(与 better-sqlite3 API 对齐,`await` 同步值安全)。所有查询方法自动过滤已软删除的记忆(`deletedAt != undefined`)。
|
|
455
|
+
|
|
456
|
+
```typescript
|
|
457
|
+
interface IMemoryStorage {
|
|
458
|
+
// ─── 基础 CRUD(6 方法) ───
|
|
459
|
+
upsert(memory: Memory): void;
|
|
460
|
+
getById(id: string): Memory | null;
|
|
461
|
+
getBySource(source: string): Memory[];
|
|
462
|
+
search(query: string, limit?: number): Memory[];
|
|
463
|
+
count(): number;
|
|
464
|
+
countBySource(source: string): number;
|
|
465
|
+
|
|
466
|
+
// ─── 软删除 / 回收站(6 方法,ADR-004 GAP-6 扩展) ───
|
|
467
|
+
delete(id: string): void; // 软删除(写入 deletedAt,不物理移除;对已软删除的 no-op)
|
|
468
|
+
restore(id: string): void; // 恢复软删除记忆(清除 deletedAt;对活跃记忆 no-op)
|
|
469
|
+
purge(id: string): void; // 物理删除(不可恢复,用于回收站"彻底删除")
|
|
470
|
+
listDeleted(limit?: number): Memory[]; // 列出回收站(按 deletedAt 降序;limit 缺省/≤0 = 全部,正整数 = 最近 N 条)
|
|
471
|
+
getDeletedById(id: string): Memory | null; // 按 ID 获取单条软删除记忆(restore/purge 前存在性校验)
|
|
472
|
+
purgeExpired(before: Date): number; // 清理过期回收站(物理删除 deletedAt 早于 before 的,返回清理数量)
|
|
473
|
+
|
|
474
|
+
// ─── 统计与维护(2 方法) ───
|
|
475
|
+
touch(id: string, now: string): boolean; // 刷新 accessedAt(score 退役后唯一写位;不写 score、无 clamp 语义)
|
|
476
|
+
getAllSources(): Map<string, number>; // 获取所有 source 标签及其活跃记忆数量
|
|
477
|
+
|
|
478
|
+
// ─── 可选(1 方法) ───
|
|
479
|
+
close?(): void;
|
|
480
|
+
}
|
|
481
|
+
```
|
|
482
|
+
|
|
483
|
+
> 宿主实现应使用 `COUNT(*)` / `UPDATE ... WHERE` 等数据库原生操作,避免全量加载数据。`getAllSources` 是性能优化方法,避免逐条遍历。详见 ADR-002 §IMemoryStorage 接口方法。
|
|
484
|
+
|
|
485
|
+
### 5.3 `ISessionStore` 接口
|
|
486
|
+
|
|
487
|
+
宿主实现此接口提供会话消息的持久化能力。
|
|
488
|
+
|
|
489
|
+
```typescript
|
|
490
|
+
interface ISessionStore {
|
|
491
|
+
appendMessage(date: string, session: string, message: SessionMessage): void;
|
|
492
|
+
loadMessages(date: string, session: string): SessionMessage[];
|
|
493
|
+
listSessions(): string[];
|
|
494
|
+
}
|
|
495
|
+
```
|
|
496
|
+
|
|
497
|
+
---
|
|
498
|
+
|
|
499
|
+
## 六、项目 / 会话管理
|
|
500
|
+
|
|
501
|
+
> **方法归属**:项目相关方法在 `agent.projects`(ProjectManager),会话相关方法在 `agent.sessionManager`(SessionManager),仅 `switchProject` / `rebuildComponents` / `forkSession` 保留在 Agent 面类作为常用入口。
|
|
502
|
+
|
|
503
|
+
> **switch* 返回值约定**:各 switch 操作返回与其操作语义最匹配的值 ——
|
|
504
|
+
> `switchSession` 返回新会话名(string)、`switchProject` 返回完整项目上下文(AgentContext,含 bootstrap 记忆等)、
|
|
505
|
+
> `agent.switchRolePack` 返回布尔值(是否切换成功)。这是设计性差异,非 bug。
|
|
506
|
+
|
|
507
|
+
### 6.1 Agent 面类方法(项目/会话入口)
|
|
508
|
+
|
|
509
|
+
| 方法 | 用途 |
|
|
510
|
+
|------|------|
|
|
511
|
+
| `switchProject(nameOrPath)` → `Promise<AgentContext>` | 切换到指定项目(保留 Agent 级记忆,自动 rebuild) |
|
|
512
|
+
| `rebuildComponents()` → `Promise<void>` | 重建 history / loop(通常不需要手动调用,switchProject 已自动执行) |
|
|
513
|
+
| `forkSession(targetSession?)` → `AgentForkResult` | 分叉当前会话(同步,复制完整消息历史到新分支) |
|
|
514
|
+
|
|
515
|
+
### 6.2 `agent.projects` — ProjectManager
|
|
516
|
+
|
|
517
|
+
| 方法 | 用途 |
|
|
518
|
+
|------|------|
|
|
519
|
+
| `projects.list` | 所有已注册项目(getter) |
|
|
520
|
+
| `projects.listProjects()` → `ProjectEntry[]` | 列出所有已注册项目 |
|
|
521
|
+
|
|
522
|
+
### 6.3 `agent.sessionManager` — SessionManager
|
|
523
|
+
|
|
524
|
+
| 方法 | 用途 |
|
|
525
|
+
|------|------|
|
|
526
|
+
| `sessionManager.switchSession(newName)` → `string` | 切换到指定会话(chatBusy 时抛 configError) |
|
|
527
|
+
| `sessionManager.forkSession(targetSession?)` → `AgentForkResult` | 分叉当前会话 |
|
|
528
|
+
| `sessionManager.loadSessionMessages(date, session)` → `Promise<SessionMessage[]>` | 加载指定日期/会话的消息(含时间戳) |
|
|
529
|
+
| `sessionManager.restoreMostRecentSession()` → `Promise<number>` | 恢复最近活跃会话(SSOT:listSessionMetas[0],updatedAt 降序;绝不隐式创建——新建会话唯一入口为宿主手动按钮) |
|
|
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) |
|
|
534
|
+
|
|
535
|
+
```typescript
|
|
536
|
+
// 项目列表
|
|
537
|
+
const projects = agent.projects.list;
|
|
538
|
+
|
|
539
|
+
// 会话分叉示例(Agent 面类入口,等价于 agent.sessionManager.forkSession())
|
|
540
|
+
const forkResult = agent.forkSession();
|
|
541
|
+
console.log(`分叉到 ${forkResult.newSession},复制了 ${forkResult.messageCount} 条消息`);
|
|
542
|
+
|
|
543
|
+
// 自定义分支名
|
|
544
|
+
const customFork = agent.forkSession('experiment');
|
|
545
|
+
|
|
546
|
+
// listAllSessions 通过 agentHistory 访问
|
|
547
|
+
const sessions = await agent.agentHistory?.listAllSessions();
|
|
548
|
+
```
|
|
549
|
+
|
|
550
|
+
### `AgentForkResult` / `ForkResult` 类型
|
|
551
|
+
|
|
552
|
+
```typescript
|
|
553
|
+
// Agent.forkSession() / sessionManager.forkSession() 返回值
|
|
554
|
+
interface AgentForkResult {
|
|
555
|
+
newSession: string;
|
|
556
|
+
messageCount: number;
|
|
557
|
+
}
|
|
558
|
+
|
|
559
|
+
// MessageHistory.forkSession() 内部类型(从 memora 导出)
|
|
560
|
+
export interface ForkResult {
|
|
561
|
+
date: string;
|
|
562
|
+
newSession: string;
|
|
563
|
+
messages: SessionMessage[];
|
|
564
|
+
}
|
|
565
|
+
```
|
|
566
|
+
|
|
567
|
+
---
|
|
568
|
+
|
|
569
|
+
## 七、角色包管理(`agent.rolePack` · RolePackManager)
|
|
570
|
+
|
|
571
|
+
> Manager 访问路径:`agent.rolePack`(RolePackManager,`init()` 前返回 `null`)。角色包是「设定记忆唯一载体」(persona/rules/skills 归属角色包,见 memory-role-pack-boundary 纪律)。
|
|
572
|
+
|
|
573
|
+
| 成员 | 类型 | 说明 |
|
|
574
|
+
|------|------|------|
|
|
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)`) |
|
|
583
|
+
|
|
584
|
+
```typescript
|
|
585
|
+
// 使用示例
|
|
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
|
+
```
|
|
593
|
+
|
|
594
|
+
---
|
|
595
|
+
|
|
596
|
+
## 八、工具注册(`agent.tools` · ToolExecutor)
|
|
597
|
+
|
|
598
|
+
> 工具注册/执行走 `agent.tools.xxx()`。
|
|
599
|
+
|
|
600
|
+
### 8.1 内置工具(核心摘要:默认常驻 + 条件暴露,非全集)
|
|
601
|
+
|
|
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` 且角色包声明特权) |
|
|
613
|
+
|
|
614
|
+
### 8.2 `agent.tools` — ToolExecutor
|
|
615
|
+
|
|
616
|
+
| 方法 | 用途 |
|
|
617
|
+
|------|------|
|
|
618
|
+
| `tools.registerTool(definition, handler)` | 注册自定义工具(会话级) |
|
|
619
|
+
| `tools.list` | 所有工具定义(getter,`ToolDefinition[]`) |
|
|
620
|
+
| `tools.execute(name, argsJson, extensions?)` → `Promise<string>` | 执行工具调用 |
|
|
621
|
+
|
|
622
|
+
```typescript
|
|
623
|
+
// 工具定义
|
|
624
|
+
interface ToolDefinition {
|
|
625
|
+
name: string;
|
|
626
|
+
description: string;
|
|
627
|
+
parameters: {
|
|
628
|
+
type: 'object';
|
|
629
|
+
properties: Record<string, { type: string; description: string }>;
|
|
630
|
+
required: string[]; // 必填参数列表(不可省略)
|
|
631
|
+
};
|
|
632
|
+
}
|
|
633
|
+
|
|
634
|
+
// 宿主注册领域工具示例
|
|
635
|
+
agent.tools.registerTool(
|
|
636
|
+
{
|
|
637
|
+
name: 'web_search',
|
|
638
|
+
description: '搜索互联网,返回结构化结果',
|
|
639
|
+
parameters: {
|
|
640
|
+
type: 'object',
|
|
641
|
+
properties: {
|
|
642
|
+
query: { type: 'string', description: '搜索关键词' },
|
|
643
|
+
limit: { type: 'number', description: '最大返回条数', default: 5 },
|
|
644
|
+
},
|
|
645
|
+
required: ['query'],
|
|
646
|
+
},
|
|
647
|
+
},
|
|
648
|
+
async (args) => {
|
|
649
|
+
const res = await fetch(`https://api.example.com/search?q=${encodeURIComponent(args.query)}`);
|
|
650
|
+
return await res.json();
|
|
651
|
+
},
|
|
652
|
+
);
|
|
653
|
+
```
|
|
654
|
+
|
|
655
|
+
### 8.3 `IWebSearchProvider` — 网络搜索注入接口
|
|
656
|
+
|
|
657
|
+
> 宿主实现此接口并注入 `AgentOptions.webSearchProvider`,即可让 Agent 拥有网络搜索能力。
|
|
658
|
+
> 未注入时,Agent 不会暴露 `web_search` 工具给 LLM,LLM 被告知搜索不可用。
|
|
659
|
+
> 内核提供 `FetchWebSearchProvider` 作为零依赖默认实现(`buildSearchEndpoints` 构建内置 Bing/DuckDuckGo 等预设降级链)。
|
|
660
|
+
> **主推宿主自建 `SearchEndpoint` 注入**(自带 URL+解析),内核预设仅作零配置保底。
|
|
661
|
+
|
|
662
|
+
```typescript
|
|
663
|
+
// 搜索结果
|
|
664
|
+
interface SearchResult {
|
|
665
|
+
title: string;
|
|
666
|
+
url: string;
|
|
667
|
+
snippet: string;
|
|
668
|
+
endpoint?: string; // 实际后端名(降级打标用,自定义实现可省略)
|
|
669
|
+
}
|
|
670
|
+
|
|
671
|
+
// 搜索选项
|
|
672
|
+
interface WebSearchOptions {
|
|
673
|
+
limit?: number; // 返回结果数量上限(默认 5)
|
|
674
|
+
}
|
|
675
|
+
|
|
676
|
+
// 搜索端点契约:宿主可自建(自带 URL+解析)覆盖内核预设
|
|
677
|
+
interface SearchEndpoint {
|
|
678
|
+
name: string; // 端点名(降级打标 / 结果透出)
|
|
679
|
+
buildUrl(query: string): string; // 由查询构造请求 URL
|
|
680
|
+
parse(html: string, limit: number): SearchResult[]; // 解析结果页
|
|
681
|
+
}
|
|
682
|
+
|
|
683
|
+
// 网络搜索提供者接口
|
|
684
|
+
interface IWebSearchProvider {
|
|
685
|
+
search(query: string, options?: WebSearchOptions): Promise<SearchResult[]>;
|
|
686
|
+
}
|
|
687
|
+
|
|
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
|
+
});
|
|
698
|
+
|
|
699
|
+
// buildSearchEndpoints:预设名与自定义端点混排,内核预设仅作保底
|
|
700
|
+
// buildSearchEndpoints(['bing', myEndpoint]) // 自定义端点优先,未知名忽略
|
|
701
|
+
```
|
|
702
|
+
|
|
703
|
+
### 8.4 `IFetchProvider` — 网页抓取注入接口(搜索→抓取闭环第二段)
|
|
704
|
+
|
|
705
|
+
> 宿主实现此接口并注入 `AgentOptions.fetchProvider`,即可让 Agent 读取 `web_search` 找到的候选链接正文。
|
|
706
|
+
> 未注入时,Agent 不会暴露 `web_fetch` 工具给 LLM。
|
|
707
|
+
> 内核提供 `FetchWebFetchProvider` 作为基于内置 `fetch` + 正则清洗 HTML 的零依赖默认实现;`safeFetch` 为带 30s 超时保护的包装(抓取失败/超时降级返回友好提示,不中断主流程)。
|
|
708
|
+
|
|
709
|
+
```typescript
|
|
710
|
+
// 抓取结果
|
|
711
|
+
interface FetchedPage {
|
|
712
|
+
url: string;
|
|
713
|
+
title: string;
|
|
714
|
+
content: string;
|
|
715
|
+
contentType?: string;
|
|
716
|
+
}
|
|
717
|
+
|
|
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(), // 使用内置默认实现
|
|
732
|
+
});
|
|
733
|
+
```
|
|
734
|
+
|
|
735
|
+
### 8.5 `ICodeExecutionProvider` — 代码执行注入接口
|
|
736
|
+
|
|
737
|
+
> 宿主实现此接口并注入 `AgentOptions.codeExecutionProvider`,即可让 Agent 拥有通用代码执行能力(计算 / 数据处理 / 验证)。
|
|
738
|
+
> 未注入时,Agent 不会暴露 `run_code` 工具给 LLM。
|
|
739
|
+
> **内核零运行时依赖**:沙箱执行(语言白名单 / 资源限制 / 网络隔离)完全由宿主 provider 决定;`safeExecuteCode` 为带 120s 超时保护的包装(执行失败/超时降级返回错误结果,不中断主流程)。
|
|
740
|
+
|
|
741
|
+
```typescript
|
|
742
|
+
// 执行结果
|
|
743
|
+
interface CodeExecutionResult {
|
|
744
|
+
stdout: string;
|
|
745
|
+
stderr: string;
|
|
746
|
+
exitCode: number;
|
|
747
|
+
timedOut: boolean;
|
|
748
|
+
}
|
|
749
|
+
|
|
750
|
+
// 执行选项
|
|
751
|
+
interface CodeExecutionOptions {
|
|
752
|
+
timeoutMs?: number; // 单次执行超时上限
|
|
753
|
+
}
|
|
754
|
+
|
|
755
|
+
// 代码执行提供者接口
|
|
756
|
+
interface ICodeExecutionProvider {
|
|
757
|
+
execute(code: string, language: string, options?: CodeExecutionOptions): Promise<CodeExecutionResult>;
|
|
758
|
+
}
|
|
759
|
+
|
|
760
|
+
// 注入方式(沙箱实现由宿主提供)
|
|
761
|
+
const agent = new Agent({
|
|
762
|
+
// ... 其他选项
|
|
763
|
+
codeExecutionProvider: mySandboxProvider,
|
|
764
|
+
});
|
|
765
|
+
```
|
|
766
|
+
|
|
767
|
+
### 8.6 `IProjectSearchProvider` — 项目内搜索注入接口
|
|
768
|
+
|
|
769
|
+
> 宿主实现此接口并注入 `AgentOptions.projectSearchProvider`,即可让 Agent 具备「在当前项目(工作区)中搜索」能力(等价 IDE 全局搜索 `Ctrl+Shift+F`)。
|
|
770
|
+
> 未注入时,Agent 不会暴露 `search_project` 工具给 LLM。
|
|
771
|
+
> **内核零依赖**:目录遍历 / 忽略规则 / 扫描与结果上限全由宿主决定;内核提供 `safeSearchProjectFiles` / `safeSearchProjectText` 两个带 30s 超时保护的包装,并内置由分词 SSOT 产出的**放宽词表**(`buildSearchTerms`)。
|
|
772
|
+
|
|
773
|
+
```typescript
|
|
774
|
+
// 文件名命中
|
|
775
|
+
interface ProjectFileMatch {
|
|
776
|
+
path: string; // 相对项目根的 posix 路径
|
|
777
|
+
}
|
|
778
|
+
|
|
779
|
+
// 内容命中
|
|
780
|
+
interface ProjectTextMatch {
|
|
781
|
+
path: string;
|
|
782
|
+
line?: number; // 命中行号(1 起)
|
|
783
|
+
preview?: string; // 命中行预览(去控制字符 + 限长,防上下文注入)
|
|
784
|
+
}
|
|
785
|
+
|
|
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
|
+
}
|
|
799
|
+
|
|
800
|
+
interface ProjectTextSearchOptions extends ProjectFileSearchOptions {
|
|
801
|
+
pattern: string; // 内容关键词(**字面量**语义,宿主自行转义,内核不假定正则)
|
|
802
|
+
terms?: string[]; // 内核下发的放宽词表;宿主**仅在整串零命中时**才启用
|
|
803
|
+
}
|
|
804
|
+
|
|
805
|
+
interface IProjectSearchProvider {
|
|
806
|
+
searchFiles(options?: ProjectFileSearchOptions): Promise<ProjectFileMatch[]>;
|
|
807
|
+
searchText(options: ProjectTextSearchOptions): Promise<ProjectTextSearchResult>;
|
|
808
|
+
}
|
|
809
|
+
```
|
|
810
|
+
|
|
811
|
+
**实现约定(宿主侧,三条都是契约而非建议)**:
|
|
812
|
+
|
|
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
|
+
|
|
818
|
+
**放宽词表(内核侧)**:`buildSearchTerms(query)` 采用「显式片段优先」——空白分隔的片段是一等公民,不含 CJK 的片段原样保留(`Next.js` 不会被切成 `next` + `js`),含 CJK 的片段交给分词 SSOT。调用方(内核 `ToolExecutor`)会剔除与整串等价的词,因此单段查询通常不会触发放宽轮。
|
|
819
|
+
|
|
820
|
+
> 参考实现:VS Code 宿主 `hosts/memora-vscode/src/extension/host/projectSearchProvider.ts`(`mode=name` 走 `workspace.findFiles`;`mode=content` 走受限 fs 递归扫描,忽略 `IGNORED_DIR_NAMES`)。
|
|
821
|
+
|
|
822
|
+
---
|
|
823
|
+
|
|
824
|
+
## 九、作品投影(`agent.works` · WorkProjectionManager)
|
|
825
|
+
|
|
826
|
+
作品投影是文件内容的轻量级摘要(50-100 字概要 + 结构 + 关键决策),存储在**项目级目录** `<memoraDir>/projections/<slug>.json`(不进入记忆库)。原始文件内容不进投影,Agent 通过工具按需读取。
|
|
827
|
+
|
|
828
|
+
> **与记忆系统的边界**:作品投影是"作品感知"而非"对话记忆"(对话记忆唯一为 round-summary,沉淀在记忆库)。它**不参与记忆召回、不参与记忆治理**(去重/冲突检测不覆盖),随项目隔离——换项目即消失。宿主如需让模型感知投影,可显式经 `agent.works.loadAll()` 注入。
|
|
829
|
+
|
|
830
|
+
### 类型定义
|
|
831
|
+
|
|
832
|
+
```typescript
|
|
833
|
+
interface WorkProjectionEntry {
|
|
834
|
+
id: string; // 唯一 ID(work-proj-<slug>)
|
|
835
|
+
sourcePath: string; // 文件路径
|
|
836
|
+
fileHash: string; // 文件 hash(SHA-256,用于变更检测)
|
|
837
|
+
summary: string; // 概要(50-100 字)
|
|
838
|
+
structure: string[]; // 结构(章节/模块列表,2-8 个)
|
|
839
|
+
keyDecisions: string[];// 关键决策(1-3 个)
|
|
840
|
+
updatedAt: string; // 最后更新时间
|
|
841
|
+
}
|
|
842
|
+
```
|
|
843
|
+
|
|
844
|
+
### `agent.works` 公开方法
|
|
845
|
+
|
|
846
|
+
| 方法 | 用途 |
|
|
847
|
+
|------|------|
|
|
848
|
+
| `agent.works.ensureProjection(filePath, content, fileName?)` | 检查并更新作品投影(核心方法)。计算 hash → 查询已有投影 → 无则生成 / hash 变则重新生成 / hash 同则跳过。同文件并发调用时复用 in-flight Promise,避免重复 LLM 调用 |
|
|
849
|
+
| `agent.works.getProjection(filePath)` | 获取已有的作品投影(不触发生成) |
|
|
850
|
+
| `agent.works.loadAll()` | 加载所有作品投影(扫描项目目录 `<memoraDir>/projections/`,非记忆召回) |
|
|
851
|
+
|
|
852
|
+
> **注意**:`agent.works` 在 `init()` 前返回 `null`。`ensureProjection` 依赖后台 LLM Provider 生成摘要,未注入 `backgroundProvider` 时使用前台 Provider。
|
|
853
|
+
|
|
854
|
+
### 宿主接入示例
|
|
855
|
+
|
|
856
|
+
```typescript
|
|
857
|
+
// 宿主工具读取文件后,调用 ensureProjection 生成/更新投影
|
|
858
|
+
agent.tools.registerTool(
|
|
859
|
+
{
|
|
860
|
+
name: 'read_file',
|
|
861
|
+
description: '读取文件内容',
|
|
862
|
+
parameters: { /* ... */ },
|
|
863
|
+
},
|
|
864
|
+
async (args) => {
|
|
865
|
+
const content = await fs.readFile(args.path, 'utf-8');
|
|
866
|
+
// 异步生成投影(fire-and-forget,不阻塞工具返回)
|
|
867
|
+
void agent.works?.ensureProjection(args.path, content);
|
|
868
|
+
return content;
|
|
869
|
+
},
|
|
870
|
+
);
|
|
871
|
+
```
|
|
872
|
+
|
|
873
|
+
---
|
|
874
|
+
|
|
875
|
+
## 十、Provider 管理
|
|
876
|
+
|
|
877
|
+
| 方法 | 用途 |
|
|
878
|
+
|------|------|
|
|
879
|
+
| `setProvider(provider)` | 运行时切换前台 Provider |
|
|
880
|
+
| `setBackgroundProvider(provider)` | 运行时切换后台 Provider |
|
|
881
|
+
|
|
882
|
+
Agent 不再管理 Provider 映射表,宿主自行管理。
|
|
883
|
+
|
|
884
|
+
---
|
|
885
|
+
|
|
886
|
+
## 十一、内部调试
|
|
887
|
+
|
|
888
|
+
> v1.0 起已移除 `getBuildCtx()` 和 `inspect()` 方法。宿主项目可通过以下渠道观察内核状态:
|
|
889
|
+
>
|
|
890
|
+
> - **事件系统**(§2.7):订阅 `memoryAdded` / `memoryRecalled` / `skillMatched` 等事件获取运行时动态
|
|
891
|
+
> - **可观测性 Tracer**(§十四):注入 `ITracer` 实现获取 AgentLoop 关键 span(RECALL / LLM_CALL / TOOL_EXEC / RESPONSE)
|
|
892
|
+
> - **`agent.memory.snapshot()`**(§4.1):获取 3 层记忆快照(working / bootstrap / archive)
|
|
893
|
+
> - **`agent.agentLoop.getMessages()`**(§4.4):获取工作记忆原始消息列表
|
|
894
|
+
|
|
895
|
+
---
|
|
896
|
+
|
|
897
|
+
## 十二、完整 API 一览
|
|
898
|
+
|
|
899
|
+
### Agent 面类直接方法
|
|
900
|
+
|
|
901
|
+
| 分组 | 方法 |
|
|
902
|
+
|------|------|
|
|
903
|
+
| 生命周期 | `init(projectPathOverride?)` / `close()` |
|
|
904
|
+
| 对话 | `chat(input, signal?)` / `chatSync(input, signal?)` / `processEvent(event)` / `resumeExecution()` / `forceReleaseChatLock()` |
|
|
905
|
+
| 事件 | `on()` / `off()` / `once()`(继承自 TypedEventEmitter) |
|
|
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()` |
|
|
908
|
+
| Provider | `setProvider(provider)` / `setBackgroundProvider(provider)` |
|
|
909
|
+
| 归档模式 | `setArchiveMode(mode)` / `getArchiveMode()` |
|
|
910
|
+
| 角色 | `switchRolePack(name)` / `getRolePackSwitchLockStatus()` / `getActiveTraits()` / `injectAffect(affectString)` |
|
|
911
|
+
| 手动归档 | `archiveSession(...)` |
|
|
912
|
+
| 配置热更新 | `reloadConfig(source?)` |
|
|
913
|
+
| 记忆治理 | 经 `agent.governance` 暴露(`.deduplicate()` / `.detectConflicts()` / `.sourceHealth()` / `.suggest()`,见下方 Manager 成员) |
|
|
914
|
+
| 指标 | `getMetrics()` |
|
|
915
|
+
|
|
916
|
+
### Agent 面类只读访问器
|
|
917
|
+
|
|
918
|
+
`initialized` / `context` / `provider` / `isBusy` / `lastInteractionAt` / `agentLoop` / `agentHistory` / `projects` / `security` / `sessionManager` / `rolePack` / `tools` / `skills` / `governance` / `memory` / `works` / `polish`
|
|
919
|
+
|
|
920
|
+
### 各 Manager / 组件公开成员
|
|
921
|
+
|
|
922
|
+
| 访问器 | 类型 | 公开成员 |
|
|
923
|
+
|---------|---------|---------|
|
|
924
|
+
| `agent.rolePack` | `RolePackManager` | `.listMeta()` / `.activeName` / `.getActive()` / `.getActiveRules()` / `.activate()` / `.getSwitchLockStatus()` / `.getActiveTraits()` |
|
|
925
|
+
| `agent.tools` | `ToolExecutor` | `.list` / `.registerTool()` / `.execute()` |
|
|
926
|
+
| `agent.skills` | `SkillManager` | `.list` / `.match()` / `.register()` / `.buildSystemPrompt()` |
|
|
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()` |
|
|
929
|
+
| `agent.works` | `WorkProjectionManager` | `.ensureProjection(filePath, content, fileName?)` / `.getProjection(filePath)` / `.loadAll()` |
|
|
930
|
+
| `agent.polish` | `TextPolishManager` | `.polish(...)`(文本润色:LLM 语法修正 + 表达优化) |
|
|
931
|
+
|
|
932
|
+
> **说明**:`suggest()` / `sourceHealth()` 经 `agent.governance` 暴露,不挂在 `agent.memory` 下。旧的 `memoryMutator` 访问器与 `MemoryMutator` 类已合并回 `MemoryInspector`,请勿再使用。
|
|
933
|
+
|
|
934
|
+
---
|
|
935
|
+
|
|
936
|
+
## 十三、可观测性(ITracer / ISpan)
|
|
937
|
+
|
|
938
|
+
Memora 内置轻量 Span/Trace 抽象,宿主注入实现后可观测 AgentLoop 行为。
|
|
939
|
+
|
|
940
|
+
### 13.1 ITracer 接口
|
|
941
|
+
|
|
942
|
+
```typescript
|
|
943
|
+
interface ITracer {
|
|
944
|
+
startSpan(name: string, attributes?: Record<string, string | number | boolean>): ISpan;
|
|
945
|
+
}
|
|
946
|
+
```
|
|
947
|
+
|
|
948
|
+
### 13.2 ISpan 接口
|
|
949
|
+
|
|
950
|
+
```typescript
|
|
951
|
+
interface ISpan {
|
|
952
|
+
setAttribute(key: string, value: string | number | boolean): void;
|
|
953
|
+
end(): void;
|
|
954
|
+
recordException(error: Error): void;
|
|
955
|
+
}
|
|
956
|
+
```
|
|
957
|
+
|
|
958
|
+
### 13.3 NoopTracer(默认实现)
|
|
959
|
+
|
|
960
|
+
```typescript
|
|
961
|
+
import { NOOP_TRACER } from '@zooique/memora';
|
|
962
|
+
|
|
963
|
+
// 不注入 tracer 时自动使用 NOOP_TRACER,零运行时开销
|
|
964
|
+
// NOOP_TRACER.startSpan() 返回共享的 NoopSpan 单例,所有方法为空操作
|
|
965
|
+
```
|
|
966
|
+
|
|
967
|
+
### 13.4 TRACE_SPANS 常量
|
|
968
|
+
|
|
969
|
+
```typescript
|
|
970
|
+
import { TRACE_SPANS } from '@zooique/memora';
|
|
971
|
+
|
|
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' — 汇报闭环(预留名)
|
|
979
|
+
```
|
|
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
|
+
|
|
987
|
+
---
|
|
988
|
+
|
|
989
|
+
## 十四、工具错误码(ToolErrorCode)
|
|
990
|
+
|
|
991
|
+
工具执行失败时,错误结果包含 `[ERR:TOOL:code]` 前缀,供 Reflection 逻辑和宿主项目解析。
|
|
992
|
+
|
|
993
|
+
### 14.1 错误码枚举
|
|
994
|
+
|
|
995
|
+
| 错误码 | 可重试 | 说明 |
|
|
996
|
+
|--------|--------|------|
|
|
997
|
+
| `PATH_NOT_ALLOWED` | ❌ | 路径不在白名单内 |
|
|
998
|
+
| `FILE_NOT_FOUND` | ✅ | 文件不存在(LLM 可能用错路径) |
|
|
999
|
+
| `PERMISSION_DENIED` | ❌ | 权限不足 |
|
|
1000
|
+
| `ARGUMENT_ERROR` | ✅ | 工具参数错误(LLM 可修正参数格式) |
|
|
1001
|
+
| `TOOL_TIMEOUT` | ✅ | 工具执行超时 |
|
|
1002
|
+
| `WRITE_REJECTED` | ❌ | 用户拒绝写入 |
|
|
1003
|
+
| `DIR_NOT_FOUND` | ✅ | 目录不存在 |
|
|
1004
|
+
| `UNKNOWN_TOOL` | ❌ | 未知工具 |
|
|
1005
|
+
| `CUSTOM_TOOL_FAILED` | ✅ | 自定义工具执行失败 |
|
|
1006
|
+
| `UNKNOWN` | ❌ | 通用错误 |
|
|
1007
|
+
|
|
1008
|
+
### 14.2 isRetryableErrorCode()
|
|
1009
|
+
|
|
1010
|
+
```typescript
|
|
1011
|
+
import { ToolErrorCode, isRetryableErrorCode } from '@zooique/memora';
|
|
1012
|
+
|
|
1013
|
+
isRetryableErrorCode(ToolErrorCode.FILE_NOT_FOUND); // true
|
|
1014
|
+
isRetryableErrorCode(ToolErrorCode.PATH_NOT_ALLOWED); // false
|
|
1015
|
+
```
|
|
1016
|
+
|
|
1017
|
+
---
|
|
1018
|
+
|
|
1019
|
+
## 十五、工具错误反思(Reflection)
|
|
1020
|
+
|
|
1021
|
+
> 注:原「内容护栏(Guardrails)」章节已移除——guardrail 是「零规则、无扫描映射、无消费者」的空转链,已随内核摘除(2026-08-17,见 memory-role-pack-boundary.md §4.4)。本章仅保留原 15.3 的有效内容。
|
|
1022
|
+
|
|
1023
|
+
当工具执行失败且错误码为 retryable 时,AgentLoop 自动注入 `[REFLECTION_HINT]` 系统消息,引导 LLM 修正参数后重试。默认最多重试 2 次(`maxReflectionRetries`)。
|
|
1024
|
+
|
|
1025
|
+
---
|
|
1026
|
+
|
|
1027
|
+
## 十六、类型导出
|
|
1028
|
+
|
|
1029
|
+
> 以下**精选子集**为宿主最常用的公开导出,全部经 `@zooique/memora` 再导出(无幻影);未在清单中的其他导出(如 `DuplicateCallInterceptor` / `SessionManager` / `ProviderRouter` / `SummaryType` 等)以 `src/index.ts` 为准。治理报告类型(`DedupReport` / `SourceHealthReport` 等)经方法返回推断,不列为显式导出。
|
|
1030
|
+
|
|
1031
|
+
```typescript
|
|
1032
|
+
// Agent 与流式事件
|
|
1033
|
+
export { Agent } from '@zooique/memora';
|
|
1034
|
+
export type {
|
|
1035
|
+
AgentChunk,
|
|
1036
|
+
ThinkingPhase,
|
|
1037
|
+
UIMessages,
|
|
1038
|
+
ArchiveMode,
|
|
1039
|
+
} from '@zooique/memora';
|
|
1040
|
+
export type {
|
|
1041
|
+
AgentOptions,
|
|
1042
|
+
AgentContext,
|
|
1043
|
+
AgentProjectEntry,
|
|
1044
|
+
} from '@zooique/memora';
|
|
1045
|
+
export { type AgentForkResult } from '@zooique/memora';
|
|
1046
|
+
export type { SessionCheckpoint } from '@zooique/memora';
|
|
1047
|
+
|
|
1048
|
+
// 记忆快照与搜索(MemoryInspector)
|
|
1049
|
+
export type {
|
|
1050
|
+
MemorySnapshot,
|
|
1051
|
+
WorkingMemorySnapshot,
|
|
1052
|
+
BootstrapSnapshot,
|
|
1053
|
+
ArchiveSnapshot,
|
|
1054
|
+
AgentSearchHit,
|
|
1055
|
+
AgentStats,
|
|
1056
|
+
} from '@zooique/memora';
|
|
1057
|
+
// 记忆治理统一门面(治理 / 健康度报告类型经方法返回推断,未列为公开显式导出)
|
|
1058
|
+
export { MemoryGovernance } from '@zooique/memora';
|
|
1059
|
+
// 文本润色
|
|
1060
|
+
export type { PolishResult } from '@zooique/memora';
|
|
1061
|
+
export { AGENT_CONSTANTS, LOOP_CONSTANTS } from '@zooique/memora';
|
|
1062
|
+
|
|
1063
|
+
// 工具
|
|
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';
|
|
1071
|
+
|
|
1072
|
+
// 作品投影
|
|
1073
|
+
export type { WorkProjectionEntry } from '@zooique/memora';
|
|
1074
|
+
|
|
1075
|
+
// 记忆
|
|
1076
|
+
export { SOURCE_LABELS } from '@zooique/memora';
|
|
1077
|
+
export type { Memory } from '@zooique/memora';
|
|
1078
|
+
export { escapeLike, escapeLikeSnippet, validateSource } from '@zooique/memora';
|
|
1079
|
+
export type { SourceValidationSeverity } from '@zooique/memora';
|
|
1080
|
+
export type { IMemoryStorage } from '@zooique/memora';
|
|
1081
|
+
export { InMemoryStorage } from '@zooique/memora';
|
|
1082
|
+
// 治理共享常量(提升/上限/下限)
|
|
1083
|
+
export { BOOST_INCREMENT, SCORE_CEILING, SCORE_FLOOR } from '@zooique/memora';
|
|
1084
|
+
export type { ISessionStore, SessionMessage } from '@zooique/memora';
|
|
1085
|
+
export type { ForkResult } from '@zooique/memora';
|
|
1086
|
+
|
|
1087
|
+
// 项目注册表 + 锁文件管理
|
|
1088
|
+
export { ProjectRegistry } from '@zooique/memora';
|
|
1089
|
+
export type { ProjectEntry } from '@zooique/memora';
|
|
1090
|
+
export { LockManager } from '@zooique/memora';
|
|
1091
|
+
|
|
1092
|
+
// 事件系统
|
|
1093
|
+
export { TypedEventEmitter } from '@zooique/memora';
|
|
1094
|
+
export type { AgentEventMap, AgentEventName, AgentEventHandler } from '@zooique/memora';
|
|
1095
|
+
|
|
1096
|
+
// 可观测性
|
|
1097
|
+
export type { ITracer, ISpan, AgentMetrics } from '@zooique/memora';
|
|
1098
|
+
export { NOOP_TRACER, TRACE_SPANS } from '@zooique/memora';
|
|
1099
|
+
|
|
1100
|
+
// 错误码
|
|
1101
|
+
export { MemoraError, ToolErrorCode, isRetryableErrorCode } from '@zooique/memora';
|
|
1102
|
+
export { toError } from '@zooique/memora';
|
|
1103
|
+
export type { ToolErrorCodeValue } from '@zooique/memora';
|
|
1104
|
+
|
|
1105
|
+
// 日志
|
|
1106
|
+
export type { ILogger } from '@zooique/memora';
|
|
1107
|
+
export { setLogger, logger } from '@zooique/memora';
|
|
1108
|
+
|
|
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';
|
|
1116
|
+
|
|
1117
|
+
// 角色包
|
|
1118
|
+
export type { RolePackMeta } from '@zooique/memora';
|
|
1119
|
+
|
|
1120
|
+
// 技能
|
|
1121
|
+
export type { SkillEntry, SkillMatch } from '@zooique/memora';
|
|
1122
|
+
|
|
1123
|
+
// LLM
|
|
1124
|
+
export { createLlmProvider, createProviderFromConfig } from '@zooique/memora';
|
|
1125
|
+
export type { ProviderConfig } from '@zooique/memora';
|
|
1126
|
+
export type { LlmProvider, ChatOptions } from '@zooique/memora';
|
|
1127
|
+
export type { LlmChunk } from '@zooique/memora';
|
|
1128
|
+
|
|
1129
|
+
// 配置
|
|
1130
|
+
export { loadConfig } from '@zooique/memora';
|
|
1131
|
+
export type { Config } from '@zooique/memora';
|
|
1132
|
+
|
|
1133
|
+
// 工具函数
|
|
1134
|
+
export { segmentText, segmentLower } from '@zooique/memora';
|
|
1135
|
+
export { parseFrontmatter, serializeFrontmatter } from '@zooique/memora';
|
|
1136
|
+
export { safeSetTimeout, safeSetInterval, clearSafeTimeout, clearSafeInterval } from '@zooique/memora';
|
|
1137
|
+
export { isPlainObject } from '@zooique/memora';
|
|
1138
|
+
export { truncate } from '@zooique/memora';
|
|
1139
|
+
export { formatDateKey, todayDate } from '@zooique/memora';
|
|
1140
|
+
|
|
1141
|
+
// 安全
|
|
1142
|
+
export type {
|
|
1143
|
+
AuditEvent,
|
|
1144
|
+
AuditListener,
|
|
1145
|
+
Permission,
|
|
1146
|
+
WriteDecision,
|
|
1147
|
+
WriteConfirmationInfo,
|
|
1148
|
+
WriteConfirmationRequest,
|
|
1149
|
+
} from '@zooique/memora';
|
|
1150
|
+
```
|
|
1151
|
+
|
|
1152
|
+
---
|
|
1153
|
+
|
|
1154
|
+
## 十七、安全与约束
|
|
1155
|
+
|
|
1156
|
+
### 核心库零越界
|
|
1157
|
+
|
|
1158
|
+
| 检查项 | 结论 |
|
|
1159
|
+
|--------|------|
|
|
1160
|
+
| 核心库 `console.*` 调用 | 0 处 |
|
|
1161
|
+
| 核心库 `process.stdin/stdout` | 0 处 |
|
|
1162
|
+
| 核心库写配置文件 | 0 处 |
|
|
1163
|
+
| 核心库 `readFileSync/writeFileSync` 写宿主业务文件 | 0 处 |
|
|
1164
|
+
|
|
1165
|
+
### 内部数据写入(不越界)
|
|
1166
|
+
|
|
1167
|
+
Agent 内部只维护两个状态文件,路径全部由宿主传入的路径推导,内核不假设 `~/.memora/` 一类的用户级默认位置:
|
|
1168
|
+
|
|
1169
|
+
- `projects.json`(项目注册表)——落 `dataDir` 内;若显式传了 `registryDir` 则落那里
|
|
1170
|
+
- `.lock`(项目锁)——固定落 `<projectPath>/.memora/.lock`,**不由 `dataDir` 推导**
|
|
1171
|
+
|
|
1172
|
+
---
|
|
1173
|
+
|
|
1174
|
+
**版本**:v3.0.0
|
|
1175
|
+
**配套文档**:[memora-接入指南.md](./memora-接入指南.md)(步骤式教程)
|