@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
package/dist/agent/assembler.js
CHANGED
|
@@ -9,63 +9,77 @@
|
|
|
9
9
|
* - 纯工厂逻辑,不持有状态
|
|
10
10
|
* - Agent 门面类通过 assembleComponents() 获取组件引用
|
|
11
11
|
* - 组件间的依赖关系在此处显式声明
|
|
12
|
+
* - 角色相关功能统一由 RolePackManager 承载
|
|
12
13
|
*/
|
|
14
|
+
import { join } from 'node:path';
|
|
13
15
|
import { AgentLoop } from '../agent/loop.js';
|
|
14
16
|
import { ToolExecutor } from '../agent/toolExecutor.js';
|
|
15
17
|
import { MessageHistory } from '../agent/messageHistory.js';
|
|
16
|
-
import { PersonaManager } from '../persona/personaManager.js';
|
|
17
18
|
import { SkillManager } from '../skill/skillManager.js';
|
|
18
|
-
import { UserProfile } from '../memory/userProfile.js';
|
|
19
19
|
import { WorkProjectionManager } from '../agent/managers/workProjection.js';
|
|
20
|
-
import { InsightExtractor } from '../agent/managers/insightExtractor.js';
|
|
21
|
-
import { RelationBuilder } from '../agent/managers/relationBuilder.js';
|
|
22
20
|
import { SessionArchiver } from '../agent/managers/sessionArchiver.js';
|
|
23
|
-
import { ConfigManager } from '../agent/managers/configManager.js';
|
|
24
21
|
import { MemoryInspector } from '../agent/managers/memoryInspector.js';
|
|
22
|
+
// DedupManager 在组合根装配,承担 L1 语义去重
|
|
23
|
+
import { DedupManager } from '../agent/managers/dedupManager.js';
|
|
25
24
|
// MemoryAdvisor 在组合根装配,注入 MemoryInspector(组合根一致性)
|
|
26
25
|
import { MemoryAdvisor } from '../agent/managers/memoryAdvisor.js';
|
|
27
|
-
import { AutoConfigRefiner } from '../agent/managers/autoConfigRefiner.js';
|
|
28
26
|
import { TextPolishManager } from '../agent/managers/textPolishManager.js';
|
|
27
|
+
import { RoundSummaryGenerator } from '../agent/managers/roundSummaryGenerator.js';
|
|
28
|
+
import { SessionManager } from '../agent/managers/sessionManager.js';
|
|
29
|
+
// 输入增强管线(角色/记忆/技能增强的叶子逻辑)
|
|
30
|
+
import { ContextPreparer } from '../agent/contextPreparer.js';
|
|
31
|
+
import { estimateTokensMessages } from '../agent/contextManager.js';
|
|
32
|
+
// 工具幂等契约(接线下沉:onToolExecuted / preExecutionCheck 依赖幂等表 + 补偿判断)
|
|
33
|
+
import { BUILTIN_TOOL_IDEMPOTENCY, shouldSkipForIdempotency } from '../agent/builtinTools.js';
|
|
34
|
+
// 任务表渲染(接线下沉:loop.getTaskTable 依赖)
|
|
35
|
+
import { renderTaskTable, buildCompletionVerifyNudge } from '../agent/taskTableRenderer.js';
|
|
36
|
+
import { logger } from '../logging/logger.js';
|
|
37
|
+
/** 截断优先复用 round-summary 的最大条数 */
|
|
38
|
+
const ROUND_SUMMARY_LOADER_MAX = 5;
|
|
29
39
|
import { SOURCE_LABELS } from '../memory/types.js';
|
|
30
40
|
import { AGENT_CONSTANTS } from '../agent/constants.js';
|
|
41
|
+
import { AGENT_EVENTS } from '../utils/eventEmitter.js';
|
|
31
42
|
import { configError } from '../utils/errors.js';
|
|
43
|
+
// 角色包管理器(唯一角色真理源)
|
|
44
|
+
import { RolePackManager } from '../role-pack/rolePackManager.js';
|
|
45
|
+
// run_team_meeting 会议实现(工具内嵌 LLM 调用;装配层持 provider + rolePackManager 闭包注入)
|
|
46
|
+
import { runTeamMeetingAssessment } from '../agent/builtinToolHandlers.js';
|
|
47
|
+
// L3 脚本执行器(静态导入,避免每次调用动态加载)
|
|
48
|
+
import { runSkillScript, formatScriptResult } from '../skill/skillScriptRunner.js';
|
|
32
49
|
/**
|
|
33
|
-
*
|
|
50
|
+
* Turn 起始策略固定段(内核行为约束)。
|
|
34
51
|
*
|
|
35
|
-
*
|
|
36
|
-
*
|
|
37
|
-
*
|
|
38
|
-
*
|
|
39
|
-
|
|
52
|
+
* 约束式极简:只画"何时该查 / 何时该规划"的行为边界,不写步骤脚本
|
|
53
|
+
* (对齐 Anthropic「目标+约束」指南——脚本化指示降低输出质量)。输出形态由 LLM 裁量。
|
|
54
|
+
* 边界:与 search_memories 工具描述 / loop「记忆回想」软引导**不重复**——此处不点名"先回忆"
|
|
55
|
+
* (记忆引导已两处,三处重复即带伤)。SSOT:本常量唯一真源,仅 buildSystemPromptPrefix 消费。
|
|
56
|
+
*/
|
|
57
|
+
const TURN_START_STRATEGY_PROMPT = `## Turn 起始策略
|
|
58
|
+
需要外部信息时,先调用工具调查再回答,不要凭记忆猜测;
|
|
59
|
+
任务需要多步推进时,使用任务表工具规划执行;
|
|
60
|
+
简单问题直接回答。`;
|
|
61
|
+
/**
|
|
62
|
+
* 构建 systemPromptPrefix 的共享函数(SSOT)
|
|
40
63
|
*
|
|
41
|
-
*
|
|
42
|
-
*
|
|
43
|
-
*
|
|
64
|
+
* 初始化时和刷新时都必须使用此函数,确保前缀包含:
|
|
65
|
+
* 1. 角色包 L1 persona + 技能清单(rolePackPrompt)
|
|
66
|
+
* 2. 全局技能 L1 清单(globalSkillList)
|
|
67
|
+
* 3. 作品投影装配注入块(workProjectionContext,可选:极简元数据清单,AI 按需 read_file)
|
|
68
|
+
* 4. 当前时间戳
|
|
69
|
+
* 5. 分隔线
|
|
70
|
+
*
|
|
71
|
+
* 必须包含全局技能清单和时间戳——若只拼接 rolePackPrompt,
|
|
72
|
+
* 首次角色切换后全局技能永久不可见。
|
|
73
|
+
* 本函数作为唯一真理源,两处调用均走此处。
|
|
74
|
+
*
|
|
75
|
+
* @param rolePackPrompt 角色包构建的 prompt(含 L1 persona + 角色包技能清单)
|
|
76
|
+
* @param globalSkillList 全局技能清单(SkillManager.buildSkillList())
|
|
77
|
+
* @param locale 时间格式化 locale
|
|
78
|
+
* @param workProjectionContext 作品投影装配注入块(可选;由 WorkProjectionManager.loadAndGetContextBlock() 产出)
|
|
79
|
+
* @returns 完整的 systemPromptPrefix
|
|
44
80
|
*/
|
|
45
|
-
export
|
|
46
|
-
const
|
|
47
|
-
// ── Phase 1: 无依赖组件 ──
|
|
48
|
-
// Agent 层总是注入 createSecurityGuard,此处显式校验并收窄类型
|
|
49
|
-
if (!pctx.security) {
|
|
50
|
-
throw configError('security guard 未注入', undefined, ['检查 AgentOptions.permission 或 createSecurityGuard 配置']);
|
|
51
|
-
}
|
|
52
|
-
const history = new MessageHistory(sessionStore);
|
|
53
|
-
const workProjection = new WorkProjectionManager(pctx.index, backgroundProvider ?? provider);
|
|
54
|
-
const toolExec = new ToolExecutor(projectPath, pctx.security, pctx.index, workProjection);
|
|
55
|
-
// ── Phase 2: 依赖 Provider 的组件 ──
|
|
56
|
-
const personaManager = new PersonaManager(configDir, pctx.index);
|
|
57
|
-
const personaPrompt = await personaManager.load(personaName);
|
|
58
|
-
const userProfile = new UserProfile(pctx.index);
|
|
59
|
-
await userProfile.load();
|
|
60
|
-
const skillManager = existingSkillManager ?? new SkillManager(configDir, pctx.index);
|
|
61
|
-
await skillManager.load();
|
|
62
|
-
// ── Phase 3: AgentLoop ──
|
|
63
|
-
const systemPrefixParts = [personaPrompt];
|
|
64
|
-
const profilePrompt = userProfile.buildSystemPrompt();
|
|
65
|
-
if (profilePrompt)
|
|
66
|
-
systemPrefixParts.push(profilePrompt);
|
|
67
|
-
// 注入当前时间(让 Agent 知道实时时间,避免 LLM 知识截止日期滞后)
|
|
68
|
-
// locale 可通过 AssembleInput.locale 注入(默认 'zh-CN'),实现国际化时间格式
|
|
81
|
+
export function buildSystemPromptPrefix(rolePackPrompt, globalSkillList, locale, workProjectionContext) {
|
|
82
|
+
const systemPrefixParts = [rolePackPrompt, globalSkillList, workProjectionContext].filter(Boolean);
|
|
69
83
|
const now = new Date();
|
|
70
84
|
const timeStr = now.toLocaleString(locale ?? AGENT_CONSTANTS.DEFAULT_LOCALE, {
|
|
71
85
|
year: 'numeric',
|
|
@@ -78,59 +92,548 @@ export async function assembleComponents(pctx, input) {
|
|
|
78
92
|
});
|
|
79
93
|
const tz = Intl.DateTimeFormat().resolvedOptions().timeZone;
|
|
80
94
|
systemPrefixParts.push(`当前时间:${timeStr}(${tz})`);
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
//
|
|
84
|
-
|
|
85
|
-
//
|
|
86
|
-
//
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
95
|
+
// 内核固定行为段:Turn 起始策略,放时间戳后(最接近用户消息,LLM 注意力位)。
|
|
96
|
+
// 单点注入(SSOT):TURN_START_STRATEGY_PROMPT 常量唯一真源,本函数是唯一消费点;
|
|
97
|
+
// 初始化/刷新共用本函数,角色切换不丢失。
|
|
98
|
+
systemPrefixParts.push(TURN_START_STRATEGY_PROMPT);
|
|
99
|
+
// 时间戳与 Turn 起始策略无条件 push,systemPrefixParts 恒非空(len ≥ 2)——
|
|
100
|
+
// 分隔线无条件追加(各段均无条件 push,无需 filter(Boolean) 兜底)。
|
|
101
|
+
return systemPrefixParts.join('\n\n') + '\n\n---\n\n';
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* 组装所有运行时组件
|
|
105
|
+
*
|
|
106
|
+
* 组件创建顺序(解决循环依赖):
|
|
107
|
+
* 1. 无依赖组件:history, workProjection, toolExec
|
|
108
|
+
* 2. 依赖 Provider 的组件:skillManager, rolePackManager
|
|
109
|
+
* 3. AgentLoop(依赖 toolExec + systemPromptPrefix)
|
|
110
|
+
* 4. 依赖 Loop 的组件:memoryAdvisor, memoryInspector, dedupManager
|
|
111
|
+
*
|
|
112
|
+
* @param pctx 项目上下文
|
|
113
|
+
* @param input 组装参数
|
|
114
|
+
* @returns 所有组件引用
|
|
115
|
+
*/
|
|
116
|
+
// ── 子工厂函数 ─────────────────────────────────────────────
|
|
117
|
+
/**
|
|
118
|
+
* 装配 loop 运行时回调 + 任务表管理(接线下沉:onPendingQuestion/onPlanItemBoundary/getTaskTable/planManager)
|
|
119
|
+
*
|
|
120
|
+
* 这些闭包回填在组装器——接线本质是组件间协作,
|
|
121
|
+
* 属装配职责(装配逻辑单一真理源)。
|
|
122
|
+
* 注:loop.onPaused 不在此装配——暂停收口(Agent.consumeExecutionStream)统一写 pauseMeta。
|
|
123
|
+
* 注:任务表停滞检测内嵌在单 turn step 循环中(无多 turn 编排)。
|
|
124
|
+
*
|
|
125
|
+
* @param loop AgentLoop(装配其 onPendingQuestion/onPlanItemBoundary/getTaskTable)
|
|
126
|
+
* @param toolExec 工具执行器(装配其 planManager)
|
|
127
|
+
* @param sessionManager 会话管理器(全部闭包的操作落点)
|
|
128
|
+
* @param hooks Agent 门面注入的稳定能力(emit/requestPause;可选,缺省 no-op)
|
|
129
|
+
* @param history 消息历史(裁决证据 appendEvidence 的落点)
|
|
130
|
+
*/
|
|
131
|
+
function wireRuntimeCallbacks(loop, toolExec, sessionManager, hooks, history) {
|
|
132
|
+
// 主动提问(ask_user 工具检出):发射 questionPending 事件(宿主渲染提问 UI)+
|
|
133
|
+
// 触发暂停(pauseMeta 记 reason/source,供重启恢复展示"问了什么")。
|
|
134
|
+
loop.onPendingQuestion = (questions) => {
|
|
135
|
+
if (questions.length === 0)
|
|
136
|
+
return;
|
|
137
|
+
hooks?.emit(AGENT_EVENTS.questionPending, questions);
|
|
138
|
+
// 触发软暂停:handleAskUser 检出 ask_user 返回 'paused' 后由 consumeExecutionStream 翻 PAUSED
|
|
139
|
+
const reason = `需要澄清:${questions.map((q) => q.question).join('; ')}`;
|
|
140
|
+
hooks?.requestPause(reason, 'agent');
|
|
141
|
+
};
|
|
142
|
+
// 任务项边界回调(每次 LLM 迭代完成后、工具执行前触发):只写 planItemLog 关联任务表当前 active
|
|
143
|
+
// 任务项(时间轴投影)。plan 状态推进唯一写者 =
|
|
144
|
+
// LLM 的 task_table_update(updatePlanItem → updatePlanItemStatus 单一写点);LLM 未显式 update
|
|
145
|
+
// 的最后一个任务项由 turn 收尾兜底(orchestrator → concludeActivePlanItemIfPlanFullyReached)补上。
|
|
146
|
+
loop.onPlanItemBoundary = (planItemInfo) => {
|
|
147
|
+
const activePlanItemId = sessionManager
|
|
148
|
+
.getCheckpoint()
|
|
149
|
+
?.plan.find((s) => s.status === 'active')?.id;
|
|
150
|
+
sessionManager.logPlanItemBoundary({
|
|
151
|
+
planItemId: activePlanItemId,
|
|
152
|
+
summary: planItemInfo.summary,
|
|
153
|
+
});
|
|
154
|
+
};
|
|
155
|
+
// active 任务项元信息回调(任务项级折叠):loop 经 _maybeEmitPlanItemBoundary
|
|
156
|
+
// 在**迭代开始**(LLM 调用前)取当前 active 任务项 { planItemId, title },供 loop 对比推进产
|
|
157
|
+
// plan_item_boundary 事件——边界语义是「以下内容属于该任务项」,故须早于本迭代的思考与工具。
|
|
158
|
+
// 无任务表返回 null,宿主端据此不产边界(静默)。
|
|
159
|
+
// 与 onPlanItemBoundary 读同一 checkpoint.plan 真源,但读取时刻不同:后者读 LLM 调用后、
|
|
160
|
+
// 工具前的 active(本迭代 LLM 实际服务的任务项,只写 planItemLog 不推进),本回调读迭代开始
|
|
161
|
+
// 时的 active(以下内容将归属的那个任务项)——时序分叉是设计语义。
|
|
162
|
+
loop.getActivePlanItemMeta = () => {
|
|
163
|
+
const cp = sessionManager.getCheckpoint();
|
|
164
|
+
const active = cp?.plan.find((s) => s.status === 'active');
|
|
165
|
+
return active
|
|
166
|
+
? { planItemId: active.id, title: active.description ?? active.id, rolePack: active.rolePack }
|
|
167
|
+
: null;
|
|
168
|
+
};
|
|
169
|
+
// 裁决证据落盘钩子(悬案取证):loop 写点(空响应兜底 / 台账替身回显)产个案证据,
|
|
170
|
+
// 归属当前闭环轮随 Round 落盘(消费方 = 人工/抽样裁决,非 UI 重放)
|
|
171
|
+
loop.appendRoundEvidence = (ev) => {
|
|
172
|
+
void history.appendEvidence(loop.getCurrentRoundId(), ev);
|
|
173
|
+
};
|
|
174
|
+
// 在途任务表判定回调(单一真理源 = SessionManager.hasInflightPlan):loop 注入 needsPlanning
|
|
175
|
+
// nudge 前询问「是否已有在途任务表」。与 prepare 的会议骨架守卫共用同一谓词——同一命题
|
|
176
|
+
// 禁两处各自实现(prepare 内联谓词与 loop 借 getActivePlanItemMeta 存在性判定必须合一)。
|
|
177
|
+
loop.hasInflightPlan = () => sessionManager.hasInflightPlan();
|
|
178
|
+
// 装配任务表注入回调:每次迭代 LLM 调用前统一注入
|
|
179
|
+
loop.getTaskTable = () => {
|
|
180
|
+
const cp = sessionManager.getCheckpoint();
|
|
181
|
+
if (!cp)
|
|
182
|
+
return '';
|
|
183
|
+
// 会议逐项切换:每轮按当前 active 任务项派生装配视角(与任务表渲染同源;防重见 agent.applyActivePlanItemAssemblyIfChanged)
|
|
184
|
+
hooks?.applyActivePlanItemAssembly?.();
|
|
185
|
+
const table = renderTaskTable(cp.plan, cp.planItemLog);
|
|
186
|
+
if (!table)
|
|
187
|
+
return '';
|
|
188
|
+
// 未完成硬约束:仍有任务项未标记 done 时追加「不得提前收尾」执行要求。
|
|
189
|
+
// 实证(round-1790068191972):ask 回答后续跑轮,LLM 已提出「重新标记任务项4」却未调
|
|
190
|
+
// task_table_update 就纯文本收尾——任务表在 turn 内进行中持续存在(checkpoint.plan 内存态,
|
|
191
|
+
// 由 clearPlanOnTurnEnd 在 turn 结束才清空),收尾兜底不会自动补状态,故在每次注入时把
|
|
192
|
+
// 「未完成 ⇏ 收尾」作为明示纪律。
|
|
193
|
+
// 语义边界:约束 = 「先更新任务表、交代未完成任务项再收尾」,不强制完成任务本身——
|
|
194
|
+
// 放弃/降级任务仍是合法用户决策(可 task_table_update 置 blocked 后收尾),防锁死。
|
|
195
|
+
// 与 buildCompletionVerifyNudge(全 done 防假完成)互补:一个卡「没做完」、一个卡「做完没验证」。
|
|
196
|
+
const unfinished = cp.plan.filter((s) => s.status !== 'done');
|
|
197
|
+
if (unfinished.length > 0) {
|
|
198
|
+
return (table +
|
|
199
|
+
'\n\n(执行约束,非历史信息)仍有任务项未标记「已完成」,不得就此结束回合:' +
|
|
200
|
+
'请继续用 task_table_update 推进并标记结果;确需中止该任务时,请先用 task_table_update ' +
|
|
201
|
+
'将未完成任务项标记为 blocked(已阻塞),并在收尾汇报中说明原因。');
|
|
202
|
+
}
|
|
203
|
+
return table;
|
|
204
|
+
};
|
|
205
|
+
// 装配任务表工具回调(planManager)
|
|
206
|
+
toolExec.planManager = {
|
|
207
|
+
writePlan: (mode, items) => {
|
|
208
|
+
// 分发归位 SessionManager.writePlan(计划写入口 SSOT,可被单测直接覆盖)
|
|
209
|
+
const newPlan = sessionManager.writePlan(mode, items);
|
|
210
|
+
return `任务表已更新(${mode}),当前共 ${newPlan.length} 个任务项:\n${newPlan
|
|
211
|
+
.map((s) => ` - [${s.id.slice(0, 8)}] ${s.description}${s.rolePack ? `(角色:${s.rolePack})` : ''}`)
|
|
212
|
+
.join('\n')}`;
|
|
213
|
+
},
|
|
214
|
+
updatePlanItem: (planItemId, status) => {
|
|
215
|
+
// 状态变更收口 SessionManager.updatePlanItemStatus(内部标脏 + 心跳,唯一写点)。
|
|
216
|
+
// 必须经此写点置 checkpointDirty,否则计划变更可能丢失标脏(纯内存态)
|
|
217
|
+
if (!sessionManager.updatePlanItemStatus(planItemId, status)) {
|
|
218
|
+
return `[ERR:PLAN_ITEM_NOT_FOUND] 未找到任务项 ${planItemId}`;
|
|
219
|
+
}
|
|
220
|
+
// updatePlanItemStatus 返回 true ⇒ checkpoint/plan 必存在(SessionManager.updatePlanItemStatus 早退契约),用非空断言保证
|
|
221
|
+
const plan = sessionManager.getCheckpoint().plan;
|
|
222
|
+
const planItem = plan.find((s) => s.id === planItemId);
|
|
223
|
+
// 收尾验证 nudge:把最后一个任务项标 done = LLM 宣称任务完成——
|
|
224
|
+
// 若全 done 且无执行性验证任务项,追加提示引导补真验证(触发条件确定性,内容交 LLM)。
|
|
225
|
+
// 仅 done 路径触发(blocked 是中止宣告,无需 nudge);判定函数返回 null = 零打扰。
|
|
226
|
+
const result = `任务项 [${planItemId.slice(0, 8)}] "${planItem.description}" 已标记为 ${status}`;
|
|
227
|
+
if (status === 'done') {
|
|
228
|
+
return result + (buildCompletionVerifyNudge(plan) ?? '');
|
|
229
|
+
}
|
|
230
|
+
return result;
|
|
231
|
+
},
|
|
232
|
+
getPlan: () => {
|
|
233
|
+
const cp = sessionManager.getCheckpoint();
|
|
234
|
+
return (cp?.plan ?? []).map((s) => ({
|
|
235
|
+
id: s.id,
|
|
236
|
+
description: s.description,
|
|
237
|
+
status: s.status,
|
|
238
|
+
order: s.order,
|
|
239
|
+
rolePack: s.rolePack,
|
|
240
|
+
}));
|
|
241
|
+
},
|
|
242
|
+
};
|
|
243
|
+
}
|
|
244
|
+
/**
|
|
245
|
+
* 创建 AgentLoop 及其直接依赖
|
|
246
|
+
*/
|
|
247
|
+
async function createAgentLoopAndDeps(params) {
|
|
248
|
+
const { provider, backgroundProvider, providerRouter, pctx, rolePackPrompt, skillManager, toolExec, maxContextTokens,
|
|
249
|
+
// per-LLM 输出预算默认值(T1):宿主 per-LLM 配置透传 → loop.defaultMaxTokens
|
|
250
|
+
maxTokens, tracer, messages, enableContextSummary, sessionStore, locale, sessionManager, hooks, workProjectionContext, } = params;
|
|
251
|
+
// 系统前缀:使用共享函数构建(SSOT:buildSystemPromptPrefix)
|
|
252
|
+
// 包含角色包 L1 persona + 全局技能清单 + 作品投影装配块(L1 清单 + L2 always 正文)+ 当前时间戳
|
|
253
|
+
const globalSkillList = skillManager.buildSkillList();
|
|
254
|
+
const systemPromptPrefix = buildSystemPromptPrefix(rolePackPrompt, globalSkillList, locale, workProjectionContext);
|
|
255
|
+
// 角色包底盘占用(system prompt 总体 token)= 装配此刻即确定的真值,早于 prepare;
|
|
256
|
+
// 冷启动 / 重启首屏即可显示真实占比。与运行时 prepare 用同一 estimateTokensMessages 估算器(口径一致)。
|
|
257
|
+
const rolePackBaseTokens = estimateTokensMessages([{ content: systemPromptPrefix }]);
|
|
258
|
+
// 后台组件统一使用 backgroundProvider,降级到前台 provider(SSOT:与 textPolisher 同模式)
|
|
259
|
+
const sessionArchiver = new SessionArchiver(backgroundProvider ?? provider, sessionStore);
|
|
94
260
|
const textPolisher = new TextPolishManager(backgroundProvider ?? provider);
|
|
261
|
+
const roundSummaryGenerator = new RoundSummaryGenerator(backgroundProvider ?? provider, pctx.index);
|
|
262
|
+
// 截断时优先复用已存 round-summary,避免现调 LLM 生成上下文摘要
|
|
263
|
+
// 仅取当前会话 roundIds 对应的摘要(round-based:会话由 roundIds 列表定义,摘要以 roundId 溯源)——
|
|
264
|
+
// 防止其他会话(分叉分支/会话切换遗留)的摘要渗入当前上下文"遗忘补偿"。
|
|
265
|
+
// sessionStore 缺失或当前会话未就绪时降级返回空(防渗入优先),回退 LLM 现场摘要;不阻断截断。
|
|
266
|
+
// (必须返回 '' 而非降级放行全库会话摘要:别会话内容渗入会与「防跨会话渗入」使命语义反转。)
|
|
267
|
+
const roundSummaryLoader = () => {
|
|
268
|
+
try {
|
|
269
|
+
// 惰性求取当前会话 roundIds:限定摘要只取本会话。
|
|
270
|
+
// sessionStore 缺失或 checkpoint 未就绪(sessionId 空)→ 降级返回空而非全量,
|
|
271
|
+
// 杜绝跨会话/分叉分支摘要渗入当前上下文"遗忘补偿",交由 LLM 现场摘要兜底。
|
|
272
|
+
const sessionId = sessionManager?.getCheckpoint()?.sessionId ?? '';
|
|
273
|
+
if (!sessionStore || !sessionId)
|
|
274
|
+
return '';
|
|
275
|
+
const ids = sessionStore.getRoundIds(sessionId);
|
|
276
|
+
const allowedRoundIds = new Set(Array.isArray(ids) ? ids : []);
|
|
277
|
+
if (allowedRoundIds.size === 0)
|
|
278
|
+
return '';
|
|
279
|
+
const summaries = pctx.index
|
|
280
|
+
.getBySource(SOURCE_LABELS.ROUND_SUMMARY)
|
|
281
|
+
.filter((s) => s.roundId !== undefined && allowedRoundIds.has(s.roundId))
|
|
282
|
+
.sort((a, b) => b.createdAt.localeCompare(a.createdAt))
|
|
283
|
+
.slice(0, ROUND_SUMMARY_LOADER_MAX);
|
|
284
|
+
if (summaries.length === 0)
|
|
285
|
+
return '';
|
|
286
|
+
return `[Earlier conversation summaries]\n${summaries.map((s) => `- ${s.content}`).join('\n')}`;
|
|
287
|
+
}
|
|
288
|
+
catch (err) {
|
|
289
|
+
// 记忆索引异常时降级为空(回退 LLM 摘要生成),不阻断截断
|
|
290
|
+
logger.debug({ err }, 'roundSummaryLoader:记忆索引异常,降级为空');
|
|
291
|
+
return '';
|
|
292
|
+
}
|
|
293
|
+
};
|
|
95
294
|
const loop = new AgentLoop({
|
|
96
295
|
provider,
|
|
296
|
+
providerRouter: providerRouter ?? undefined,
|
|
97
297
|
bootstrapMemories: pctx.bootstrapMemories,
|
|
98
|
-
toolExecutor: (name, args) => toolExec.execute(name, args
|
|
298
|
+
toolExecutor: (name, args) => toolExec.execute(name, args),
|
|
99
299
|
systemPromptPrefix,
|
|
300
|
+
rolePackBaseTokens,
|
|
100
301
|
toolDefinitions: toolExec.list,
|
|
302
|
+
// 完整内置定义注入只读闸(toolReadonly 查询 readonly 标记;单一真理源取 toolExec.builtinDefinitions)
|
|
303
|
+
builtinTools: toolExec.builtinDefinitions,
|
|
101
304
|
maxContextTokens,
|
|
305
|
+
// per-LLM 输出预算默认值(token):buildChatOptions 填底座,策略覆盖项(chatOptions)后压
|
|
306
|
+
defaultMaxTokens: maxTokens,
|
|
102
307
|
tracer,
|
|
103
308
|
messages,
|
|
104
309
|
enableContextSummary,
|
|
105
|
-
|
|
310
|
+
// 卸载式压缩落盘目录:项目级 .memora/outputs。两条约束同时满足——在 SecurityGuard 信任根
|
|
311
|
+
// (memoraDir)内 → read_file 可回取;`.memora` 属 IGNORED_DIR_NAMES → search_project/list_dir
|
|
312
|
+
// 不命中,不污染项目检索(故不落用户级 ~/.memora,那在信任根外,引用读不回)
|
|
313
|
+
offloadDir: join(pctx.memoraDir, 'outputs'),
|
|
314
|
+
// 替换式压缩第一级:按 roundId 取已存 round-summary(无摘要返回 null,该轮不替换交第二级压缩)
|
|
315
|
+
getRoundSummary: (roundId) => {
|
|
316
|
+
try {
|
|
317
|
+
const found = pctx.index
|
|
318
|
+
.getBySource(SOURCE_LABELS.ROUND_SUMMARY)
|
|
319
|
+
.find((s) => s.roundId === roundId);
|
|
320
|
+
return found ? found.content : null;
|
|
321
|
+
}
|
|
322
|
+
catch (err) {
|
|
323
|
+
// 记忆索引异常时降级为 null(替换层 no-op),不阻断压缩链
|
|
324
|
+
logger.debug({ err, roundId }, 'getRoundSummary:记忆索引异常,降级为 null');
|
|
325
|
+
return null;
|
|
326
|
+
}
|
|
327
|
+
},
|
|
328
|
+
// 上下文截断 → 广播 contextTruncated 事件(宿主可提示用户)
|
|
329
|
+
onContextTruncated: (skippedCount, keptCount) => {
|
|
330
|
+
hooks?.emit(AGENT_EVENTS.contextTruncated, { skippedCount, keptCount });
|
|
331
|
+
},
|
|
332
|
+
// LLM 主动压缩完成 → 广播 contextCompressed 事件(宿主可提示"为保持专注已压缩")
|
|
333
|
+
onContextCompressed: (target, replacedCount, summaryLength) => {
|
|
334
|
+
hooks?.emit(AGENT_EVENTS.contextCompressed, { target, replacedCount, summaryLength });
|
|
335
|
+
},
|
|
336
|
+
// 工具执行完成回调(幂等 outbox 落点):记录执行到检查点供恢复排重
|
|
337
|
+
// sessionManager 先于 loop 创建,此处可直接写入——无需暂存队列补丁
|
|
338
|
+
onToolExecuted: (name, args, toolResult, ok) => {
|
|
339
|
+
// 幂等级别查内置映射表,自定义工具默认非幂等
|
|
340
|
+
const idempotent = BUILTIN_TOOL_IDEMPOTENCY[name] ?? 'non-idempotent';
|
|
341
|
+
const record = {
|
|
342
|
+
name,
|
|
343
|
+
argsSignature: args,
|
|
344
|
+
executedAt: Date.now(),
|
|
345
|
+
resultSummary: toolResult.slice(0, 100),
|
|
346
|
+
ok,
|
|
347
|
+
idempotent,
|
|
348
|
+
};
|
|
349
|
+
sessionManager.logToolExecution(record);
|
|
350
|
+
// completedToolCalls 仅内存态(不落盘):「工具重跑排重 / 补偿」仅在单进程存活期内生效,
|
|
351
|
+
// 崩溃/重启后失效(走中断轮补全)。此处 flushNow() 为语义边界上的 no-op 清脏,
|
|
352
|
+
// 调用无害但无持久化效果——幂等分级(non-idempotent/idempotent-key 优先清脏)仅作调用纪律保留。
|
|
353
|
+
if (idempotent === 'non-idempotent' || idempotent === 'idempotent-key') {
|
|
354
|
+
// 有写副作用且需持久化记录的工具:完成后立即清脏(SessionManager 恒实现,纯内存)
|
|
355
|
+
sessionManager.flushNow();
|
|
356
|
+
}
|
|
357
|
+
},
|
|
358
|
+
// 工具执行前检查(统一执行入口·单点聚合):宿主审批优先(denied 短路返回),放行后再做内部幂等检查。
|
|
359
|
+
// ⚠️ 宿主未注入 preExecutionCheck 时 → 完全降级为仅内部幂等检查。
|
|
360
|
+
// 这是单用户信任模型下的显式决策(intentionally left blank),
|
|
361
|
+
// 多用户/服务端部署必须在宿主层注入真实审批策略(权限/路径/只读等)。
|
|
362
|
+
preExecutionCheck: (name, args) => {
|
|
363
|
+
// 1. 宿主审批(审批/审计/参数改写/白名单/只读拦截)
|
|
364
|
+
const hostResult = hooks?.preExecutionCheck?.(name, args);
|
|
365
|
+
if (hostResult?.denied)
|
|
366
|
+
return hostResult; // 拒绝:直接短路,阻止工具意图
|
|
367
|
+
if (hostResult?.skip)
|
|
368
|
+
return hostResult; // 跳过:宿主决定不执行
|
|
369
|
+
// 2. 内部幂等检查(补偿机制·仅一次语义):仅对幂等工具生效,非幂等工具不跳过
|
|
370
|
+
// 幂等契约委托 shouldSkipForIdempotency(SSOT):non-idempotent 不跳过(失败可重试);
|
|
371
|
+
// 幂等工具仅上次执行成功(ok=true)时跳过
|
|
372
|
+
const idempotent = BUILTIN_TOOL_IDEMPOTENCY[name] ?? 'non-idempotent';
|
|
373
|
+
const idemResult = shouldSkipForIdempotency(sessionManager.getCheckpoint()?.completedToolCalls, name, args, idempotent);
|
|
374
|
+
return {
|
|
375
|
+
skip: idemResult.skip,
|
|
376
|
+
previousResult: idemResult.previousResult,
|
|
377
|
+
overrideArgs: hostResult?.overrideArgs,
|
|
378
|
+
};
|
|
379
|
+
},
|
|
380
|
+
roundSummaryLoader,
|
|
106
381
|
});
|
|
107
|
-
|
|
108
|
-
//
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
382
|
+
toolExec.setOnToolsChanged(() => loop.refreshToolDefinitions(toolExec.list));
|
|
383
|
+
// 预算联动:search_project 执行期读取 loop 最近一轮 prepare 的剩余预算,
|
|
384
|
+
// 预算紧张时自动下探结果条数上限(loop 创建后注入,与 read_skill 同款时序解耦)
|
|
385
|
+
toolExec.setBudgetProvider(() => loop.getLastBudget()?.remainingTokens);
|
|
386
|
+
return { loop, sessionArchiver, textPolisher, roundSummaryGenerator };
|
|
387
|
+
}
|
|
388
|
+
/**
|
|
389
|
+
* 创建依赖 Loop 的组件
|
|
390
|
+
*/
|
|
391
|
+
function createLoopDependentComponents(params) {
|
|
392
|
+
const { pctx, loop, history, backgroundProvider, hooks } = params;
|
|
393
|
+
const memoryInspector = new MemoryInspector(pctx.index, loop, history);
|
|
114
394
|
const memoryAdvisor = new MemoryAdvisor(pctx.index, backgroundProvider ?? null);
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
395
|
+
const dedupManager = new DedupManager(pctx.index, backgroundProvider ?? null, (report) => {
|
|
396
|
+
hooks?.emit(AGENT_EVENTS.dedupCompleted, {
|
|
397
|
+
deduplicatedCount: report.deduplicatedCount,
|
|
398
|
+
demotedIds: report.demotedIds,
|
|
399
|
+
});
|
|
400
|
+
});
|
|
401
|
+
return { memoryAdvisor, memoryInspector, dedupManager };
|
|
402
|
+
}
|
|
403
|
+
// ── 主组装函数 ─────────────────────────────────────────────
|
|
404
|
+
export async function assembleComponents(pctx, input) {
|
|
405
|
+
const { provider, backgroundProvider, projectPath, configDir, activeRolePack, rolePackTeams, builtinFallbackRole, maxContextTokens, maxTokens, sessionStore, roundStore, tracer, messages, enableContextSummary, existingSkillManager, locale, } = input;
|
|
406
|
+
const hooks = input.hooks;
|
|
407
|
+
// ── 无依赖组件 ──
|
|
408
|
+
// Agent 层总是注入 createSecurityGuard,此处显式校验并收窄类型
|
|
409
|
+
if (!pctx.security) {
|
|
410
|
+
throw configError('security guard 未注入', undefined, [
|
|
411
|
+
'检查 AgentOptions.permission 或 createSecurityGuard 配置',
|
|
412
|
+
]);
|
|
413
|
+
}
|
|
414
|
+
const history = new MessageHistory(sessionStore, undefined, undefined, roundStore);
|
|
415
|
+
// 作品投影登记/更新 → 广播 workProjectionGenerated 事件(宿主可展示通知)
|
|
416
|
+
// 投影落项目级目录(pctx.memoraDir/work-projections.json)而非记忆库:随项目隔离,换项目即消失(记忆系统纯化)
|
|
417
|
+
// 作品投影 = 用户主动触发的极简索引(JSON 单文件),AI 按需 read_file 读取原文
|
|
418
|
+
const workProjection = new WorkProjectionManager(pctx.memoraDir, (sourcePath, description) => {
|
|
419
|
+
hooks?.emit(AGENT_EVENTS.workProjectionGenerated, { sourcePath, summary: description });
|
|
420
|
+
}, projectPath);
|
|
421
|
+
const toolExec = new ToolExecutor(projectPath, pctx.security, pctx.index, input.webSearchProvider, sessionStore, input.fetchProvider, input.codeExecutionProvider, input.projectSearchProvider,
|
|
422
|
+
// 脚本执行 node 路径(可选):透传 run_project_script 分支
|
|
423
|
+
input.scriptNodePath);
|
|
424
|
+
// ── 会话管理器(先于 loop 创建)──
|
|
425
|
+
// SessionManager 构造只存 getter(getHistory/getLoop 惰性取用),不访问 history/loop 本体——
|
|
426
|
+
// 因此可先于 loop 创建,使 loop 的工具执行回调(onToolExecuted/preExecutionCheck)装配期即可
|
|
427
|
+
// 直接写入,无需工具执行期再借助暂存窗口。
|
|
428
|
+
// loop 经闭包变量后赋引用;装配期不会触发 getLoop。
|
|
429
|
+
let loopRef = null;
|
|
430
|
+
const sessionManager = new SessionManager(() => history, () => loopRef, sessionStore, () => hooks?.isChatBusy() ?? false,
|
|
431
|
+
// 会话事件转发:桥接到 Agent 强类型 emit(Agent 侧按 AGENT_EVENT_SET 校验,避免不安全断言)
|
|
432
|
+
(event, data) => hooks?.emit(event, data));
|
|
433
|
+
// ── 依赖 Provider 的组件 ──
|
|
434
|
+
const skillManager = existingSkillManager ?? new SkillManager(configDir);
|
|
435
|
+
await skillManager.load();
|
|
436
|
+
// 禁用技能过滤(配置形态启停):load 后再设禁用集(load 的 loadItems 会整体替换 items,
|
|
437
|
+
// 顺序无冲突;复用 existingSkillManager 时若有旧禁用集会被本轮覆盖——装配期一次性注入)
|
|
438
|
+
if (input.disabledSkills && input.disabledSkills.length > 0) {
|
|
439
|
+
skillManager.setDisabledSkills(input.disabledSkills);
|
|
440
|
+
}
|
|
441
|
+
// 角色包清单:创建角色包管理器,角色相关功能的唯一真理源
|
|
442
|
+
// activeRolePack:宿主注入持久化的用户角色包选择,§4.1 单链优先激活;未配置/包不存在落兜底包(非 items[0])
|
|
443
|
+
const rolePackManager = new RolePackManager(configDir);
|
|
444
|
+
// 宿主装配级参数注入:兜底角色覆盖(须存在,否则回退内核常量)+ 组数据(会议名单容器)
|
|
445
|
+
rolePackManager.setBuiltinFallbackRole(builtinFallbackRole ?? null);
|
|
446
|
+
// rolePackTeams 为必选参数(Agent 构造 ?? [] 归一化),直接透传无 null 传播;
|
|
447
|
+
// 漏传在编译期即报错
|
|
448
|
+
rolePackManager.setRolePackTeams(rolePackTeams);
|
|
449
|
+
await rolePackManager.load(activeRolePack);
|
|
450
|
+
// 激活角色包的 L1 persona(角色包唯一;无激活角色包时为空串)
|
|
451
|
+
const rolePackPrompt = rolePackManager.buildSystemPrompt();
|
|
452
|
+
// run_team_meeting:注入评估/评审型会议回调(工具内嵌一次 LLM 调用)
|
|
453
|
+
// rolePackManager 建于 toolExec 之后,用回调注入解耦时序(同 readSkill/registerWork 模式)。
|
|
454
|
+
// 闭包收敛 rolePackManager(getTeam 组解析 + buildSystemPrompt persona 全文)与前台 provider(单次 chat)。
|
|
455
|
+
toolExec.runTeamMeeting = async (group, topic) => runTeamMeetingAssessment({
|
|
456
|
+
resolveTeam: (g) => rolePackManager.getTeam(g),
|
|
457
|
+
buildPersona: (n) => rolePackManager.buildSystemPrompt(n),
|
|
458
|
+
provider,
|
|
459
|
+
group,
|
|
460
|
+
topic,
|
|
461
|
+
});
|
|
462
|
+
// 渐进披露 L2:注入 read_skill 技能正文读取回调(read_skill 工具数据源)
|
|
463
|
+
// 两级技能统一渐进披露:先查激活角色包内嵌技能,再查全局通用技能池。
|
|
464
|
+
// rolePackManager 在 toolExec 之后创建,用回调注入解耦时序(见 toolExecutor.readSkill 注释)
|
|
465
|
+
toolExec.readSkill = async (skillName) => {
|
|
466
|
+
const rolePackContent = await rolePackManager.readSkillContent(skillName);
|
|
467
|
+
if (rolePackContent)
|
|
468
|
+
return rolePackContent;
|
|
469
|
+
// 全局通用技能:SkillManager 条目正文(已由 load() 装载)
|
|
470
|
+
const globalSkill = skillManager.get(skillName);
|
|
471
|
+
return globalSkill ? globalSkill.content : null;
|
|
472
|
+
};
|
|
473
|
+
// 渐进披露 L3:注入 read_resource 资源读取回调
|
|
474
|
+
// 两级技能统一 L3:先查激活角色包内嵌技能的资源,再查全局通用技能
|
|
475
|
+
toolExec.readResource = async (skillName, resourcePath) => {
|
|
476
|
+
const rolePackResource = await rolePackManager.readSkillResource(skillName, resourcePath);
|
|
477
|
+
if (rolePackResource)
|
|
478
|
+
return rolePackResource;
|
|
479
|
+
return skillManager.readResource(skillName, resourcePath);
|
|
480
|
+
};
|
|
481
|
+
// 渐进披露 L3:注入 run_skill_script 脚本执行回调
|
|
482
|
+
toolExec.runSkillScript = async (skillName, scriptPath, args) => {
|
|
483
|
+
// 先查激活角色包内嵌技能的脚本路径
|
|
484
|
+
const rolePackPath = rolePackManager.getSkillScriptPath(skillName, scriptPath);
|
|
485
|
+
if (rolePackPath) {
|
|
486
|
+
const scriptInfo = rolePackManager.getSkillScriptInfo(skillName, scriptPath);
|
|
487
|
+
if (scriptInfo) {
|
|
488
|
+
// 执行超时走内核默认(60s,上限 600s,见 skillScriptRunner 常量)——脚本级超时无配置通道
|
|
489
|
+
// nodePath 沿用宿主注入:角色包技能脚本 node runtime 分支可走真实 node 路径
|
|
490
|
+
const result = await runSkillScript(rolePackPath, scriptInfo.runtime, args, undefined, undefined, input.scriptNodePath);
|
|
491
|
+
return formatScriptResult(result);
|
|
492
|
+
}
|
|
493
|
+
}
|
|
494
|
+
// 再查全局通用技能
|
|
495
|
+
const globalPath = skillManager.getScriptPath(skillName, scriptPath);
|
|
496
|
+
if (globalPath) {
|
|
497
|
+
const scripts = skillManager.listScripts(skillName);
|
|
498
|
+
const scriptInfo = scripts.find((s) => s.path === scriptPath);
|
|
499
|
+
if (scriptInfo) {
|
|
500
|
+
// nodePath 沿用宿主注入:全局技能脚本 node runtime 分支可走真实 node 路径
|
|
501
|
+
const result = await runSkillScript(globalPath, scriptInfo.runtime, args, undefined, undefined, input.scriptNodePath);
|
|
502
|
+
return formatScriptResult(result);
|
|
503
|
+
}
|
|
504
|
+
}
|
|
505
|
+
return null;
|
|
506
|
+
};
|
|
507
|
+
// 渐进披露 L3:注入 list_resources 资源清单回调
|
|
508
|
+
toolExec.listResources = async (skillName) => {
|
|
509
|
+
// 先查激活角色包,再查全局通用技能
|
|
510
|
+
const roleResources = rolePackManager.listSkillResources(skillName);
|
|
511
|
+
if (roleResources.length > 0) {
|
|
512
|
+
return JSON.stringify(roleResources.map((r) => ({ path: r.path, size: r.size })), null, 2);
|
|
513
|
+
}
|
|
514
|
+
const globalResources = skillManager.listResources(skillName);
|
|
515
|
+
return JSON.stringify(globalResources.map((r) => ({ path: r.path, size: r.size })), null, 2);
|
|
516
|
+
};
|
|
517
|
+
// 渐进披露 L1 补充:注入 list_skills 技能清单回调 (使用 SkillManager.formatSkillForPrompt SSOT)
|
|
518
|
+
toolExec.listSkills = async () => {
|
|
519
|
+
const lines = ['【全局通用技能】'];
|
|
520
|
+
// 过滤**收口于 SkillManager.listAvailable**(LLM 可见集唯一真理源,与 L1 枚举侧共用):
|
|
521
|
+
// 可用性(缺 description 模型不知何时激活)+ 禁用(对模型语义不存在)两条判据
|
|
522
|
+
// 都在那里。此处**不得**自写 filter——两侧同为 LLM 消费,判据分叉即双轨镜像。
|
|
523
|
+
// ⚠️ 漏过滤即带伤:若只过滤 description、漏掉禁用过滤,禁用技能仍对模型可见;
|
|
524
|
+
// 注释声明的「过滤标准必须一致」必须与实现同源。
|
|
525
|
+
const availableGlobalSkills = skillManager.listAvailable();
|
|
526
|
+
for (const skill of availableGlobalSkills) {
|
|
527
|
+
const formatted = SkillManager.formatSkillForPrompt(skill);
|
|
528
|
+
if (formatted)
|
|
529
|
+
lines.push(formatted);
|
|
530
|
+
}
|
|
531
|
+
// 技能清单跟随本轮装配视角(会议内 = 任务项角色;非会议 = activePack)
|
|
532
|
+
const perspectiveName = rolePackManager.roundAssemblyPerspective ?? rolePackManager.activeName;
|
|
533
|
+
if (perspectiveName) {
|
|
534
|
+
lines.push('');
|
|
535
|
+
lines.push(`【装配角色技能(${perspectiveName})】`);
|
|
536
|
+
// 直接用结构化数据(RolePackAssembly.skills),不再正则解析 prompt 文本
|
|
537
|
+
const assembly = rolePackManager.get(perspectiveName);
|
|
538
|
+
const skills = assembly?.skills ?? [];
|
|
539
|
+
for (const skill of skills) {
|
|
540
|
+
const fallbackName = skill.file
|
|
541
|
+
? rolePackManager.deriveSkillNameFromFile(skill.file)
|
|
542
|
+
: undefined;
|
|
543
|
+
const formatted = SkillManager.formatSkillForPrompt(skill, fallbackName);
|
|
544
|
+
if (formatted)
|
|
545
|
+
lines.push(formatted);
|
|
546
|
+
}
|
|
547
|
+
}
|
|
548
|
+
return lines.join('\n');
|
|
549
|
+
};
|
|
550
|
+
// 作品投影登记:注入 register_work 工具回调(用户主动触发,写 JSON 索引)
|
|
551
|
+
// 复用 read_skill 的注入回调模式——ToolExecutor 不持有 WorkProjectionManager,装配层解耦时序
|
|
552
|
+
toolExec.registerWork = async (sourcePath, description) => {
|
|
553
|
+
const entry = await workProjection.registerWork(sourcePath, description);
|
|
554
|
+
return entry
|
|
555
|
+
? `✅ 已登记作品索引:${entry.name}(${entry.description})\n源文件:${entry.source}`
|
|
556
|
+
: '[ERR:REGISTER_FAILED] 作品索引登记失败';
|
|
557
|
+
};
|
|
558
|
+
// ── AgentLoop + 其直接依赖 ──
|
|
559
|
+
// 作品投影装配注入:使用 SSOT 读取路径(刷新 + 读取合为单一操作)
|
|
560
|
+
// 刷新失败不阻断装配——loadAndGetContextBlock 内部已容错,返回空串即不注入(投影是可选项,非装配硬依赖)
|
|
561
|
+
const workProjectionContext = await workProjection.loadAndGetContextBlock();
|
|
562
|
+
const { loop, sessionArchiver, textPolisher, roundSummaryGenerator } = await createAgentLoopAndDeps({
|
|
563
|
+
provider,
|
|
564
|
+
backgroundProvider,
|
|
565
|
+
pctx,
|
|
566
|
+
rolePackPrompt,
|
|
567
|
+
skillManager,
|
|
568
|
+
toolExec,
|
|
569
|
+
maxContextTokens,
|
|
570
|
+
maxTokens,
|
|
571
|
+
tracer,
|
|
572
|
+
messages,
|
|
573
|
+
enableContextSummary,
|
|
574
|
+
sessionStore,
|
|
575
|
+
locale,
|
|
576
|
+
sessionManager,
|
|
577
|
+
hooks,
|
|
578
|
+
workProjectionContext,
|
|
579
|
+
});
|
|
580
|
+
loopRef = loop;
|
|
581
|
+
// 装配 loop 运行时回调 + 任务表管理(onPendingQuestion/onPlanItemBoundary/getTaskTable/planManager)
|
|
582
|
+
wireRuntimeCallbacks(loop, toolExec, sessionManager, hooks, history);
|
|
583
|
+
// ── 依赖 Loop 的组件 ──
|
|
584
|
+
const { memoryAdvisor, memoryInspector, dedupManager } = createLoopDependentComponents({
|
|
585
|
+
pctx,
|
|
586
|
+
loop,
|
|
587
|
+
history,
|
|
588
|
+
backgroundProvider,
|
|
589
|
+
hooks,
|
|
590
|
+
});
|
|
591
|
+
// 绑定记忆写入回调:round-summary 沉淀后广播 memoryAdded 事件
|
|
592
|
+
roundSummaryGenerator.setOnMemoryAdded((info) => {
|
|
593
|
+
hooks?.emit(AGENT_EVENTS.memoryAdded, info);
|
|
594
|
+
});
|
|
595
|
+
// 接线 search_memories 后端:toolExec 先于 memoryInspector 构造,故此处后注入;
|
|
596
|
+
// 注入后 search_memories 走 searchByKeyword(关键词+superseded 过滤+accessedAt/溯源揭示,§3.3;纯关键词单通道,无语义通道)
|
|
597
|
+
toolExec.setMemoryInspector(memoryInspector);
|
|
598
|
+
// 接线 memoryRecalled 事件(§2.4 保留改语义定案):search_memories 命中记忆 → 宿主广播
|
|
599
|
+
// 「LLM 查询记忆命中 N 条」。唯一发射位 = search_memories 命中
|
|
600
|
+
// (无 warmRecall 等其他发射路径)。
|
|
601
|
+
toolExec.setOnMemoryRecalled((info) => hooks?.emit(AGENT_EVENTS.memoryRecalled, info));
|
|
602
|
+
// 接线工具召回与装配期内容互斥(§5.1):search_memories 排除「正文或摘要已在眼前」的轮次
|
|
603
|
+
// round-summary,避免 LLM 拿回眼前内容的摘要重复。排除集从 loop 工作记忆视图精确派生
|
|
604
|
+
// (getExclusionRoundIds = 视图内 ∪ 被替换 ∪ 在途),与模型窗口无关,不用固定轮数代理量。
|
|
605
|
+
toolExec.setExclusionRoundIdsProvider(() => loop.getExclusionRoundIds());
|
|
606
|
+
// ── 输入增强管线 ──
|
|
607
|
+
// ContextPreparer 依赖已装配的 loop/history/rolePackManager;策略推导走 rolePackManager(SSOT)。
|
|
608
|
+
const contextPreparer = new ContextPreparer({
|
|
609
|
+
loop,
|
|
610
|
+
rolePackManager,
|
|
611
|
+
getIndex: () => pctx.index,
|
|
612
|
+
config: {
|
|
613
|
+
// 组装器可选字段(undefined)收窄为 deps 的显式 null(关闭语义)
|
|
614
|
+
tracer: tracer ?? null,
|
|
615
|
+
messages,
|
|
616
|
+
// 上下文预算装配的容量来源(动态轮数派生基准)
|
|
617
|
+
maxContextTokens,
|
|
618
|
+
},
|
|
619
|
+
// 事件发射桥接到 Agent 强类型 emit(Agent 侧按 AGENT_EVENT_SET 校验)
|
|
620
|
+
emit: (event, data) => hooks?.emit(event, data),
|
|
621
|
+
});
|
|
120
622
|
return {
|
|
121
623
|
history,
|
|
122
624
|
loop,
|
|
123
625
|
toolExec,
|
|
124
|
-
personaManager,
|
|
125
|
-
userProfile,
|
|
126
626
|
workProjection,
|
|
127
627
|
skillManager,
|
|
128
|
-
insightExtractor,
|
|
129
|
-
configManager,
|
|
130
628
|
memoryInspector,
|
|
131
|
-
|
|
629
|
+
dedupManager,
|
|
630
|
+
memoryAdvisor,
|
|
132
631
|
sessionArchiver,
|
|
133
632
|
textPolisher,
|
|
633
|
+
rolePackManager,
|
|
634
|
+
roundSummaryGenerator,
|
|
635
|
+
sessionManager,
|
|
636
|
+
contextPreparer,
|
|
134
637
|
};
|
|
135
638
|
}
|
|
136
639
|
//# sourceMappingURL=assembler.js.map
|