@zooique/memora 2.0.3 → 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 -272
- package/README.md +303 -260
- package/config.example.json +43 -0
- package/dist/agent/agent.d.ts +376 -408
- package/dist/agent/agent.d.ts.map +1 -1
- package/dist/agent/agent.js +1166 -926
- package/dist/agent/agent.js.map +1 -1
- package/dist/agent/assembler.d.ts +105 -43
- package/dist/agent/assembler.d.ts.map +1 -1
- package/dist/agent/assembler.js +543 -75
- package/dist/agent/assembler.js.map +1 -1
- package/dist/agent/budget.d.ts +131 -0
- package/dist/agent/budget.d.ts.map +1 -0
- package/dist/agent/budget.js +128 -0
- package/dist/agent/budget.js.map +1 -0
- package/dist/agent/builtinToolHandlers.d.ts +225 -38
- package/dist/agent/builtinToolHandlers.d.ts.map +1 -1
- package/dist/agent/builtinToolHandlers.js +748 -132
- package/dist/agent/builtinToolHandlers.js.map +1 -1
- package/dist/agent/builtinTools.d.ts +198 -7
- package/dist/agent/builtinTools.d.ts.map +1 -1
- package/dist/agent/builtinTools.js +646 -14
- package/dist/agent/builtinTools.js.map +1 -1
- package/dist/agent/compaction.d.ts +93 -0
- package/dist/agent/compaction.d.ts.map +1 -0
- package/dist/agent/compaction.js +192 -0
- package/dist/agent/compaction.js.map +1 -0
- package/dist/agent/constants.d.ts +137 -20
- package/dist/agent/constants.d.ts.map +1 -1
- package/dist/agent/constants.js +152 -20
- package/dist/agent/constants.js.map +1 -1
- package/dist/agent/contextManager.d.ts +119 -77
- package/dist/agent/contextManager.d.ts.map +1 -1
- package/dist/agent/contextManager.js +192 -135
- package/dist/agent/contextManager.js.map +1 -1
- package/dist/agent/contextPreparer.d.ts +78 -0
- package/dist/agent/contextPreparer.d.ts.map +1 -0
- package/dist/agent/contextPreparer.js +128 -0
- package/dist/agent/contextPreparer.js.map +1 -0
- package/dist/agent/duplicateInterceptor.d.ts +67 -0
- package/dist/agent/duplicateInterceptor.d.ts.map +1 -0
- package/dist/agent/duplicateInterceptor.js +82 -0
- package/dist/agent/duplicateInterceptor.js.map +1 -0
- package/dist/agent/guardRail.d.ts +166 -0
- package/dist/agent/guardRail.d.ts.map +1 -0
- package/dist/agent/guardRail.js +333 -0
- package/dist/agent/guardRail.js.map +1 -0
- package/dist/agent/loop.d.ts +716 -295
- package/dist/agent/loop.d.ts.map +1 -1
- package/dist/agent/loop.js +2178 -664
- package/dist/agent/loop.js.map +1 -1
- package/dist/agent/managers/archiveCoordinator.d.ts +14 -171
- package/dist/agent/managers/archiveCoordinator.d.ts.map +1 -1
- package/dist/agent/managers/archiveCoordinator.js +19 -287
- package/dist/agent/managers/archiveCoordinator.js.map +1 -1
- package/dist/agent/managers/chatLockManager.d.ts +20 -88
- package/dist/agent/managers/chatLockManager.d.ts.map +1 -1
- package/dist/agent/managers/chatLockManager.js +31 -103
- package/dist/agent/managers/chatLockManager.js.map +1 -1
- package/dist/agent/managers/dedupManager.d.ts +31 -115
- package/dist/agent/managers/dedupManager.d.ts.map +1 -1
- package/dist/agent/managers/dedupManager.js +48 -136
- package/dist/agent/managers/dedupManager.js.map +1 -1
- package/dist/agent/managers/goalConsistencyChecker.d.ts +42 -0
- package/dist/agent/managers/goalConsistencyChecker.d.ts.map +1 -0
- package/dist/agent/managers/goalConsistencyChecker.js +178 -0
- package/dist/agent/managers/goalConsistencyChecker.js.map +1 -0
- package/dist/agent/managers/llmCaller.d.ts +124 -0
- package/dist/agent/managers/llmCaller.d.ts.map +1 -0
- package/dist/agent/managers/llmCaller.js +417 -0
- package/dist/agent/managers/llmCaller.js.map +1 -0
- package/dist/agent/managers/llmJudgeHelper.d.ts +8 -25
- package/dist/agent/managers/llmJudgeHelper.d.ts.map +1 -1
- package/dist/agent/managers/llmJudgeHelper.js +7 -24
- package/dist/agent/managers/llmJudgeHelper.js.map +1 -1
- package/dist/agent/managers/loopMetrics.d.ts +58 -0
- package/dist/agent/managers/loopMetrics.d.ts.map +1 -0
- package/dist/agent/managers/loopMetrics.js +68 -0
- package/dist/agent/managers/loopMetrics.js.map +1 -0
- package/dist/agent/managers/memoryAdvisor.d.ts +27 -120
- package/dist/agent/managers/memoryAdvisor.d.ts.map +1 -1
- package/dist/agent/managers/memoryAdvisor.js +85 -207
- package/dist/agent/managers/memoryAdvisor.js.map +1 -1
- package/dist/agent/managers/memoryGovernance.d.ts +10 -42
- package/dist/agent/managers/memoryGovernance.d.ts.map +1 -1
- package/dist/agent/managers/memoryGovernance.js +19 -36
- package/dist/agent/managers/memoryGovernance.js.map +1 -1
- package/dist/agent/managers/memoryInspector.d.ts +59 -268
- package/dist/agent/managers/memoryInspector.d.ts.map +1 -1
- package/dist/agent/managers/memoryInspector.js +91 -442
- package/dist/agent/managers/memoryInspector.js.map +1 -1
- package/dist/agent/managers/roundSummaryGenerator.d.ts +56 -0
- package/dist/agent/managers/roundSummaryGenerator.d.ts.map +1 -0
- package/dist/agent/managers/roundSummaryGenerator.js +201 -0
- package/dist/agent/managers/roundSummaryGenerator.js.map +1 -0
- package/dist/agent/managers/sessionArchiver.d.ts +19 -68
- package/dist/agent/managers/sessionArchiver.d.ts.map +1 -1
- package/dist/agent/managers/sessionArchiver.js +76 -147
- package/dist/agent/managers/sessionArchiver.js.map +1 -1
- package/dist/agent/managers/sessionManager.d.ts +286 -57
- package/dist/agent/managers/sessionManager.d.ts.map +1 -1
- package/dist/agent/managers/sessionManager.js +846 -85
- package/dist/agent/managers/sessionManager.js.map +1 -1
- package/dist/agent/managers/sessionNamer.d.ts +35 -0
- package/dist/agent/managers/sessionNamer.d.ts.map +1 -0
- package/dist/agent/managers/sessionNamer.js +104 -0
- package/dist/agent/managers/sessionNamer.js.map +1 -0
- package/dist/agent/managers/streamAccumulator.d.ts +8 -33
- package/dist/agent/managers/streamAccumulator.d.ts.map +1 -1
- package/dist/agent/managers/streamAccumulator.js +4 -29
- package/dist/agent/managers/streamAccumulator.js.map +1 -1
- package/dist/agent/managers/textPolishManager.d.ts +8 -44
- package/dist/agent/managers/textPolishManager.d.ts.map +1 -1
- package/dist/agent/managers/textPolishManager.js +9 -41
- package/dist/agent/managers/textPolishManager.js.map +1 -1
- package/dist/agent/managers/toolCallHelpers.d.ts +105 -0
- package/dist/agent/managers/toolCallHelpers.d.ts.map +1 -0
- package/dist/agent/managers/toolCallHelpers.js +161 -0
- package/dist/agent/managers/toolCallHelpers.js.map +1 -0
- package/dist/agent/managers/workProjection.d.ts +55 -100
- package/dist/agent/managers/workProjection.d.ts.map +1 -1
- package/dist/agent/managers/workProjection.js +164 -268
- package/dist/agent/managers/workProjection.js.map +1 -1
- package/dist/agent/messageHistory.d.ts +134 -84
- package/dist/agent/messageHistory.d.ts.map +1 -1
- package/dist/agent/messageHistory.js +419 -133
- package/dist/agent/messageHistory.js.map +1 -1
- package/dist/agent/needsPlanning.d.ts +28 -0
- package/dist/agent/needsPlanning.d.ts.map +1 -0
- package/dist/agent/needsPlanning.js +68 -0
- package/dist/agent/needsPlanning.js.map +1 -0
- package/dist/agent/seed/index.d.ts +11 -0
- package/dist/agent/seed/index.d.ts.map +1 -0
- package/dist/agent/seed/index.js +10 -0
- package/dist/agent/seed/index.js.map +1 -0
- package/dist/agent/seed/orchestrator.d.ts +83 -0
- package/dist/agent/seed/orchestrator.d.ts.map +1 -0
- package/dist/agent/seed/orchestrator.js +260 -0
- package/dist/agent/seed/orchestrator.js.map +1 -0
- package/dist/agent/seed/prepare.d.ts +49 -0
- package/dist/agent/seed/prepare.d.ts.map +1 -0
- package/dist/agent/seed/prepare.js +107 -0
- package/dist/agent/seed/prepare.js.map +1 -0
- package/dist/agent/seed/types.d.ts +115 -0
- package/dist/agent/seed/types.d.ts.map +1 -0
- package/dist/agent/seed/types.js +15 -0
- package/dist/agent/seed/types.js.map +1 -0
- package/dist/agent/sessionStateMachine.d.ts +78 -0
- package/dist/agent/sessionStateMachine.d.ts.map +1 -0
- package/dist/agent/sessionStateMachine.js +182 -0
- package/dist/agent/sessionStateMachine.js.map +1 -0
- package/dist/agent/taskTableRenderer.d.ts +51 -0
- package/dist/agent/taskTableRenderer.d.ts.map +1 -0
- package/dist/agent/taskTableRenderer.js +115 -0
- package/dist/agent/taskTableRenderer.js.map +1 -0
- package/dist/agent/toolExecutor.d.ts +236 -10
- package/dist/agent/toolExecutor.d.ts.map +1 -1
- package/dist/agent/toolExecutor.js +932 -21
- package/dist/agent/toolExecutor.js.map +1 -1
- package/dist/agent/toolLedger.d.ts +120 -0
- package/dist/agent/toolLedger.d.ts.map +1 -0
- package/dist/agent/toolLedger.js +149 -0
- package/dist/agent/toolLedger.js.map +1 -0
- package/dist/agent/toolResultCache.d.ts +134 -0
- package/dist/agent/toolResultCache.d.ts.map +1 -0
- package/dist/agent/toolResultCache.js +243 -0
- package/dist/agent/toolResultCache.js.map +1 -0
- package/dist/agent/toolResultOffload.d.ts +59 -0
- package/dist/agent/toolResultOffload.d.ts.map +1 -0
- package/dist/agent/toolResultOffload.js +70 -0
- package/dist/agent/toolResultOffload.js.map +1 -0
- package/dist/agent/toolRunner.d.ts +59 -0
- package/dist/agent/toolRunner.d.ts.map +1 -0
- package/dist/agent/toolRunner.js +147 -0
- package/dist/agent/toolRunner.js.map +1 -0
- package/dist/agent/tracer.d.ts +99 -107
- package/dist/agent/tracer.d.ts.map +1 -1
- package/dist/agent/tracer.js +24 -69
- package/dist/agent/tracer.js.map +1 -1
- package/dist/agent/types.d.ts +510 -169
- package/dist/agent/types.d.ts.map +1 -1
- package/dist/agent/types.js +2 -51
- package/dist/agent/types.js.map +1 -1
- package/dist/code-exec/codeExecutionProvider.d.ts +16 -0
- package/dist/code-exec/codeExecutionProvider.d.ts.map +1 -0
- package/dist/code-exec/codeExecutionProvider.js +57 -0
- package/dist/code-exec/codeExecutionProvider.js.map +1 -0
- package/dist/code-exec/types.d.ts +37 -0
- package/dist/code-exec/types.d.ts.map +1 -0
- package/dist/code-exec/types.js +12 -0
- package/dist/code-exec/types.js.map +1 -0
- package/dist/config/expandEnvVars.d.ts +22 -0
- package/dist/config/expandEnvVars.d.ts.map +1 -0
- package/dist/config/expandEnvVars.js +38 -0
- package/dist/config/expandEnvVars.js.map +1 -0
- package/dist/config/loader.d.ts +27 -98
- package/dist/config/loader.d.ts.map +1 -1
- package/dist/config/loader.js +110 -223
- package/dist/config/loader.js.map +1 -1
- package/dist/index.d.ts +67 -77
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +90 -69
- package/dist/index.js.map +1 -1
- package/dist/llm/abortSignal.d.ts +2 -3
- package/dist/llm/abortSignal.d.ts.map +1 -1
- package/dist/llm/abortSignal.js +2 -3
- package/dist/llm/abortSignal.js.map +1 -1
- package/dist/llm/factory.d.ts +22 -32
- package/dist/llm/factory.d.ts.map +1 -1
- package/dist/llm/factory.js +29 -46
- package/dist/llm/factory.js.map +1 -1
- package/dist/llm/openaiCompatible.d.ts +25 -40
- package/dist/llm/openaiCompatible.d.ts.map +1 -1
- package/dist/llm/openaiCompatible.js +179 -120
- package/dist/llm/openaiCompatible.js.map +1 -1
- package/dist/llm/provider.d.ts +29 -42
- package/dist/llm/provider.d.ts.map +1 -1
- package/dist/llm/provider.js +11 -10
- package/dist/llm/provider.js.map +1 -1
- package/dist/llm/types.d.ts +54 -11
- package/dist/llm/types.d.ts.map +1 -1
- package/dist/llm/types.js +0 -5
- package/dist/llm/types.js.map +1 -1
- package/dist/logging/logger.d.ts +8 -31
- package/dist/logging/logger.d.ts.map +1 -1
- package/dist/logging/logger.js +28 -215
- package/dist/logging/logger.js.map +1 -1
- package/dist/logging/loggerInterface.d.ts +9 -8
- package/dist/logging/loggerInterface.d.ts.map +1 -1
- package/dist/memory/gcService.d.ts +164 -0
- package/dist/memory/gcService.d.ts.map +1 -0
- package/dist/memory/gcService.js +215 -0
- package/dist/memory/gcService.js.map +1 -0
- package/dist/memory/governance.d.ts +11 -44
- package/dist/memory/governance.d.ts.map +1 -1
- package/dist/memory/governance.js +11 -64
- package/dist/memory/governance.js.map +1 -1
- package/dist/memory/inMemoryRoundStore.d.ts +124 -0
- package/dist/memory/inMemoryRoundStore.d.ts.map +1 -0
- package/dist/memory/inMemoryRoundStore.js +216 -0
- package/dist/memory/inMemoryRoundStore.js.map +1 -0
- package/dist/memory/inMemorySessionStore.d.ts +92 -0
- package/dist/memory/inMemorySessionStore.d.ts.map +1 -0
- package/dist/memory/inMemorySessionStore.js +219 -0
- package/dist/memory/inMemorySessionStore.js.map +1 -0
- package/dist/memory/inMemorySessionViewLoader.d.ts +89 -0
- package/dist/memory/inMemorySessionViewLoader.d.ts.map +1 -0
- package/dist/memory/inMemorySessionViewLoader.js +183 -0
- package/dist/memory/inMemorySessionViewLoader.js.map +1 -0
- package/dist/memory/inMemoryStorage.d.ts +25 -175
- package/dist/memory/inMemoryStorage.d.ts.map +1 -1
- package/dist/memory/inMemoryStorage.js +32 -221
- package/dist/memory/inMemoryStorage.js.map +1 -1
- package/dist/memory/keywordsTouch.d.ts +20 -0
- package/dist/memory/keywordsTouch.d.ts.map +1 -0
- package/dist/memory/keywordsTouch.js +25 -0
- package/dist/memory/keywordsTouch.js.map +1 -0
- package/dist/memory/lockManager.d.ts +2 -2
- package/dist/memory/lockManager.d.ts.map +1 -1
- package/dist/memory/lockManager.js +6 -8
- package/dist/memory/lockManager.js.map +1 -1
- package/dist/memory/projectManager.d.ts +30 -129
- package/dist/memory/projectManager.d.ts.map +1 -1
- package/dist/memory/projectManager.js +39 -189
- package/dist/memory/projectManager.js.map +1 -1
- package/dist/memory/projectRegistry.d.ts +14 -62
- package/dist/memory/projectRegistry.d.ts.map +1 -1
- package/dist/memory/projectRegistry.js +27 -111
- package/dist/memory/projectRegistry.js.map +1 -1
- package/dist/memory/roundStore.d.ts +629 -0
- package/dist/memory/roundStore.d.ts.map +1 -0
- package/dist/memory/roundStore.js +116 -0
- package/dist/memory/roundStore.js.map +1 -0
- package/dist/memory/sessionStore.d.ts +70 -61
- package/dist/memory/sessionStore.d.ts.map +1 -1
- package/dist/memory/sessionStore.js +23 -1
- package/dist/memory/sessionStore.js.map +1 -1
- package/dist/memory/sessionViewLoader.d.ts +141 -0
- package/dist/memory/sessionViewLoader.d.ts.map +1 -0
- package/dist/memory/sessionViewLoader.js +65 -0
- package/dist/memory/sessionViewLoader.js.map +1 -0
- package/dist/memory/sourceValidation.d.ts +10 -12
- package/dist/memory/sourceValidation.d.ts.map +1 -1
- package/dist/memory/sourceValidation.js +16 -32
- package/dist/memory/sourceValidation.js.map +1 -1
- package/dist/memory/storageInterface.d.ts +44 -150
- package/dist/memory/storageInterface.d.ts.map +1 -1
- package/dist/memory/types.d.ts +65 -164
- package/dist/memory/types.d.ts.map +1 -1
- package/dist/memory/types.js +81 -83
- package/dist/memory/types.js.map +1 -1
- package/dist/project-search/projectSearchProvider.d.ts +29 -0
- package/dist/project-search/projectSearchProvider.d.ts.map +1 -0
- package/dist/project-search/projectSearchProvider.js +57 -0
- package/dist/project-search/projectSearchProvider.js.map +1 -0
- package/dist/project-search/terms.d.ts +14 -0
- package/dist/project-search/terms.d.ts.map +1 -0
- package/dist/project-search/terms.js +68 -0
- package/dist/project-search/terms.js.map +1 -0
- package/dist/project-search/types.d.ts +139 -0
- package/dist/project-search/types.d.ts.map +1 -0
- package/dist/project-search/types.js +8 -0
- package/dist/project-search/types.js.map +1 -0
- package/dist/role-pack/capabilityMap.d.ts +28 -0
- package/dist/role-pack/capabilityMap.d.ts.map +1 -0
- package/dist/role-pack/capabilityMap.js +56 -0
- package/dist/role-pack/capabilityMap.js.map +1 -0
- package/dist/role-pack/constants.d.ts +21 -0
- package/dist/role-pack/constants.d.ts.map +1 -0
- package/dist/role-pack/constants.js +21 -0
- package/dist/role-pack/constants.js.map +1 -0
- package/dist/role-pack/rolePackManager.d.ts +269 -0
- package/dist/role-pack/rolePackManager.d.ts.map +1 -0
- package/dist/role-pack/rolePackManager.js +1082 -0
- package/dist/role-pack/rolePackManager.js.map +1 -0
- package/dist/role-pack/strategyKeys.d.ts +100 -0
- package/dist/role-pack/strategyKeys.d.ts.map +1 -0
- package/dist/role-pack/strategyKeys.js +184 -0
- package/dist/role-pack/strategyKeys.js.map +1 -0
- package/dist/role-pack/strategyResolver.d.ts +109 -0
- package/dist/role-pack/strategyResolver.d.ts.map +1 -0
- package/dist/role-pack/strategyResolver.js +304 -0
- package/dist/role-pack/strategyResolver.js.map +1 -0
- package/dist/role-pack/types.d.ts +237 -0
- package/dist/role-pack/types.d.ts.map +1 -0
- package/dist/role-pack/types.js +8 -0
- package/dist/role-pack/types.js.map +1 -0
- package/dist/role-pack/validator.d.ts +38 -0
- package/dist/role-pack/validator.d.ts.map +1 -0
- package/dist/role-pack/validator.js +436 -0
- package/dist/role-pack/validator.js.map +1 -0
- package/dist/security/pathGuard.d.ts +69 -72
- package/dist/security/pathGuard.d.ts.map +1 -1
- package/dist/security/pathGuard.js +151 -131
- package/dist/security/pathGuard.js.map +1 -1
- package/dist/skill/skillLayer3.d.ts +91 -0
- package/dist/skill/skillLayer3.d.ts.map +1 -0
- package/dist/skill/skillLayer3.js +104 -0
- package/dist/skill/skillLayer3.js.map +1 -0
- package/dist/skill/skillManager.d.ts +136 -19
- package/dist/skill/skillManager.d.ts.map +1 -1
- package/dist/skill/skillManager.js +312 -61
- package/dist/skill/skillManager.js.map +1 -1
- package/dist/skill/skillScriptRunner.d.ts +97 -0
- package/dist/skill/skillScriptRunner.d.ts.map +1 -0
- package/dist/skill/skillScriptRunner.js +271 -0
- package/dist/skill/skillScriptRunner.js.map +1 -0
- package/dist/skill/types.d.ts +73 -16
- package/dist/skill/types.d.ts.map +1 -1
- package/dist/skill/types.js +5 -1
- package/dist/skill/types.js.map +1 -1
- package/dist/utils/array.d.ts +5 -6
- package/dist/utils/array.d.ts.map +1 -1
- package/dist/utils/array.js +6 -6
- package/dist/utils/array.js.map +1 -1
- package/dist/utils/atomicWrite.d.ts +8 -0
- package/dist/utils/atomicWrite.d.ts.map +1 -0
- package/dist/utils/atomicWrite.js +31 -0
- package/dist/utils/atomicWrite.js.map +1 -0
- package/dist/utils/backgroundTask.d.ts +38 -0
- package/dist/utils/backgroundTask.d.ts.map +1 -0
- package/dist/utils/backgroundTask.js +117 -0
- package/dist/utils/backgroundTask.js.map +1 -0
- package/dist/utils/configResourceManager.d.ts +40 -72
- package/dist/utils/configResourceManager.d.ts.map +1 -1
- package/dist/utils/configResourceManager.js +78 -76
- package/dist/utils/configResourceManager.js.map +1 -1
- package/dist/utils/errors.d.ts +44 -69
- package/dist/utils/errors.d.ts.map +1 -1
- package/dist/utils/errors.js +54 -71
- package/dist/utils/errors.js.map +1 -1
- package/dist/utils/eventEmitter.d.ts +104 -103
- package/dist/utils/eventEmitter.d.ts.map +1 -1
- package/dist/utils/eventEmitter.js +37 -45
- package/dist/utils/eventEmitter.js.map +1 -1
- package/dist/utils/fileSafe.d.ts +20 -0
- package/dist/utils/fileSafe.d.ts.map +1 -0
- package/dist/utils/fileSafe.js +56 -0
- package/dist/utils/fileSafe.js.map +1 -0
- package/dist/utils/frontmatter.d.ts +2 -3
- package/dist/utils/frontmatter.d.ts.map +1 -1
- package/dist/utils/frontmatter.js +2 -3
- package/dist/utils/frontmatter.js.map +1 -1
- package/dist/utils/hash.d.ts +12 -0
- package/dist/utils/hash.d.ts.map +1 -0
- package/dist/utils/hash.js +27 -0
- package/dist/utils/hash.js.map +1 -0
- package/dist/utils/http.d.ts +17 -0
- package/dist/utils/http.d.ts.map +1 -0
- package/dist/utils/http.js +29 -0
- package/dist/utils/http.js.map +1 -0
- package/dist/utils/json.d.ts +1 -1
- package/dist/utils/json.js +1 -1
- package/dist/utils/math.d.ts +25 -3
- package/dist/utils/math.d.ts.map +1 -1
- package/dist/utils/math.js +32 -16
- package/dist/utils/math.js.map +1 -1
- package/dist/utils/objects.d.ts +2 -3
- package/dist/utils/objects.d.ts.map +1 -1
- package/dist/utils/objects.js +2 -3
- package/dist/utils/objects.js.map +1 -1
- package/dist/utils/recallDefaults.d.ts +16 -0
- package/dist/utils/recallDefaults.d.ts.map +1 -0
- package/dist/utils/recallDefaults.js +16 -0
- package/dist/utils/recallDefaults.js.map +1 -0
- package/dist/utils/safeTimer.d.ts +8 -36
- package/dist/utils/safeTimer.d.ts.map +1 -1
- package/dist/utils/safeTimer.js +9 -37
- package/dist/utils/safeTimer.js.map +1 -1
- package/dist/utils/scanner.d.ts +97 -17
- package/dist/utils/scanner.d.ts.map +1 -1
- package/dist/utils/scanner.js +269 -47
- package/dist/utils/scanner.js.map +1 -1
- package/dist/utils/segmenter.d.ts +20 -19
- package/dist/utils/segmenter.d.ts.map +1 -1
- package/dist/utils/segmenter.js +230 -97
- package/dist/utils/segmenter.js.map +1 -1
- package/dist/utils/strings.d.ts +15 -32
- package/dist/utils/strings.d.ts.map +1 -1
- package/dist/utils/strings.js +25 -44
- package/dist/utils/strings.js.map +1 -1
- package/dist/utils/time.d.ts +37 -0
- package/dist/utils/time.d.ts.map +1 -1
- package/dist/utils/time.js +56 -0
- package/dist/utils/time.js.map +1 -1
- package/dist/utils/toError.d.ts +13 -1
- package/dist/utils/toError.d.ts.map +1 -1
- package/dist/utils/toError.js +18 -1
- package/dist/utils/toError.js.map +1 -1
- package/dist/web-fetch/fetchWebFetchProvider.d.ts +14 -0
- package/dist/web-fetch/fetchWebFetchProvider.d.ts.map +1 -0
- package/dist/web-fetch/fetchWebFetchProvider.js +69 -0
- package/dist/web-fetch/fetchWebFetchProvider.js.map +1 -0
- package/dist/web-fetch/types.d.ts +30 -0
- package/dist/web-fetch/types.d.ts.map +1 -0
- package/dist/web-fetch/types.js +7 -0
- package/dist/web-fetch/types.js.map +1 -0
- package/dist/web-fetch/webFetchProvider.d.ts +10 -0
- package/dist/web-fetch/webFetchProvider.d.ts.map +1 -0
- package/dist/web-fetch/webFetchProvider.js +28 -0
- package/dist/web-fetch/webFetchProvider.js.map +1 -0
- package/dist/web-search/fetchWebSearchProvider.d.ts +27 -0
- package/dist/web-search/fetchWebSearchProvider.d.ts.map +1 -0
- package/dist/web-search/fetchWebSearchProvider.js +199 -0
- package/dist/web-search/fetchWebSearchProvider.js.map +1 -0
- package/dist/web-search/types.d.ts +46 -0
- package/dist/web-search/types.d.ts.map +1 -0
- package/dist/web-search/types.js +2 -0
- package/dist/{persona → web-search}/types.js.map +1 -1
- package/dist/web-search/webSearchProvider.d.ts +10 -0
- package/dist/web-search/webSearchProvider.d.ts.map +1 -0
- package/dist/web-search/webSearchProvider.js +30 -0
- package/dist/web-search/webSearchProvider.js.map +1 -0
- package/docs/architecture/role-pack-authoring-guide.md +243 -0
- package/docs/architecture/role-pack-spec.md +767 -0
- package/docs/memora-api-reference.md +416 -476
- package/docs/memora-/346/216/245/345/205/245/346/214/207/345/215/227.md +841 -806
- package/docs/role-pack-/345/274/200/346/224/276/351/224/256/346/214/207/345/215/227.md +148 -0
- package/package.json +105 -100
- package/role-packs/README.md +41 -0
- package/role-packs/memora/345/212/251/346/211/213/manifest.json +12 -0
- package/role-packs/memora/345/212/251/346/211/213/persona.md +12 -0
- package/role-packs/memora/345/212/251/346/211/213/rules.md +4 -0
- package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/manifest.json +44 -0
- package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/persona.md +46 -0
- package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/rules.md +15 -0
- package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/character-sheet.md +34 -0
- package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/core-extractor.md +37 -0
- package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/craft-review.md +69 -0
- package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/dialogue-craft.md +45 -0
- package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/emotion-wave.md +46 -0
- package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/empathy-craft.md +79 -0
- package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/foreshadow.md +29 -0
- package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/hotspot-mapping.md +121 -0
- package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/idea-lever.md +42 -0
- package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/logline-craft.md +47 -0
- package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/longform-guard.md +64 -0
- package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/need-finder.md +40 -0
- package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/outline-expand.md +46 -0
- package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/pacing-hook.md +34 -0
- package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/polish-method.md +113 -0
- package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/pov-discipline.md +79 -0
- package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/project-init/SKILL.md +112 -0
- package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/project-init/scripts/init-novel-project.mjs +441 -0
- package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/relationship-web.md +47 -0
- package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/scene-craft.md +46 -0
- package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/story-bible.md +60 -0
- package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/story-structure.md +36 -0
- package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/style-weaver.md +109 -0
- package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/three-layer-check.md +27 -0
- package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/world-builder.md +41 -0
- package/role-packs//347/231/275/350/257/235/346/226/271/346/241/210/350/256/276/350/256/241/345/270/210/manifest.json +48 -0
- package/role-packs//347/231/275/350/257/235/346/226/271/346/241/210/350/256/276/350/256/241/345/270/210/persona.md +73 -0
- package/role-packs//347/231/275/350/257/235/346/226/271/346/241/210/350/256/276/350/256/241/345/270/210/rules.md +19 -0
- package/role-packs//347/231/275/350/257/235/346/226/271/346/241/210/350/256/276/350/256/241/345/270/210/skills/api-doc-writer.md +40 -0
- package/role-packs//347/231/275/350/257/235/346/226/271/346/241/210/350/256/276/350/256/241/345/270/210/skills/doc-planner.md +42 -0
- package/role-packs//347/231/275/350/257/235/346/226/271/346/241/210/350/256/276/350/256/241/345/270/210/skills/nutrient-search.md +28 -0
- package/role-packs//347/231/275/350/257/235/346/226/271/346/241/210/350/256/276/350/256/241/345/270/210/skills/seed-finder.md +28 -0
- package/role-packs//347/231/275/350/257/235/346/226/271/346/241/210/350/256/276/350/256/241/345/270/210/skills/ssot-audit.md +34 -0
- package/role-packs//347/231/275/350/257/235/346/226/271/346/241/210/350/256/276/350/256/241/345/270/210/skills/style-guide.md +40 -0
- package/dist/agent/guardrail.d.ts +0 -49
- package/dist/agent/guardrail.d.ts.map +0 -1
- package/dist/agent/guardrail.js +0 -59
- package/dist/agent/guardrail.js.map +0 -1
- package/dist/agent/managers/autoConfigRefiner.d.ts +0 -39
- package/dist/agent/managers/autoConfigRefiner.d.ts.map +0 -1
- package/dist/agent/managers/autoConfigRefiner.js +0 -146
- package/dist/agent/managers/autoConfigRefiner.js.map +0 -1
- package/dist/agent/managers/configManager.d.ts +0 -209
- package/dist/agent/managers/configManager.d.ts.map +0 -1
- package/dist/agent/managers/configManager.js +0 -331
- package/dist/agent/managers/configManager.js.map +0 -1
- package/dist/agent/managers/insightExtractor.d.ts +0 -139
- package/dist/agent/managers/insightExtractor.d.ts.map +0 -1
- package/dist/agent/managers/insightExtractor.js +0 -401
- package/dist/agent/managers/insightExtractor.js.map +0 -1
- package/dist/agent/managers/memoryDecayScheduler.d.ts +0 -239
- package/dist/agent/managers/memoryDecayScheduler.d.ts.map +0 -1
- package/dist/agent/managers/memoryDecayScheduler.js +0 -413
- package/dist/agent/managers/memoryDecayScheduler.js.map +0 -1
- package/dist/agent/managers/relationBuilder.d.ts +0 -131
- package/dist/agent/managers/relationBuilder.d.ts.map +0 -1
- package/dist/agent/managers/relationBuilder.js +0 -192
- package/dist/agent/managers/relationBuilder.js.map +0 -1
- package/dist/agent/personaMatcher.d.ts +0 -29
- package/dist/agent/personaMatcher.d.ts.map +0 -1
- package/dist/agent/personaMatcher.js +0 -60
- package/dist/agent/personaMatcher.js.map +0 -1
- package/dist/agent/userFactExtractor.d.ts +0 -25
- package/dist/agent/userFactExtractor.d.ts.map +0 -1
- package/dist/agent/userFactExtractor.js +0 -88
- package/dist/agent/userFactExtractor.js.map +0 -1
- package/dist/eval/evalRunner.d.ts +0 -94
- package/dist/eval/evalRunner.d.ts.map +0 -1
- package/dist/eval/evalRunner.js +0 -141
- package/dist/eval/evalRunner.js.map +0 -1
- package/dist/eval/evalTypes.d.ts +0 -148
- package/dist/eval/evalTypes.d.ts.map +0 -1
- package/dist/eval/evalTypes.js +0 -118
- package/dist/eval/evalTypes.js.map +0 -1
- package/dist/eval/scenarios.d.ts +0 -33
- package/dist/eval/scenarios.d.ts.map +0 -1
- package/dist/eval/scenarios.js +0 -109
- package/dist/eval/scenarios.js.map +0 -1
- package/dist/llm/embedding.d.ts +0 -79
- package/dist/llm/embedding.d.ts.map +0 -1
- package/dist/llm/embedding.js +0 -184
- package/dist/llm/embedding.js.map +0 -1
- package/dist/memory/hybridMerge.d.ts +0 -50
- package/dist/memory/hybridMerge.d.ts.map +0 -1
- package/dist/memory/hybridMerge.js +0 -51
- package/dist/memory/hybridMerge.js.map +0 -1
- package/dist/memory/inMemoryRelationStore.d.ts +0 -58
- package/dist/memory/inMemoryRelationStore.d.ts.map +0 -1
- package/dist/memory/inMemoryRelationStore.js +0 -80
- package/dist/memory/inMemoryRelationStore.js.map +0 -1
- package/dist/memory/loader.d.ts +0 -51
- package/dist/memory/loader.d.ts.map +0 -1
- package/dist/memory/loader.js +0 -100
- package/dist/memory/loader.js.map +0 -1
- package/dist/memory/recall.d.ts +0 -82
- package/dist/memory/recall.d.ts.map +0 -1
- package/dist/memory/recall.js +0 -157
- package/dist/memory/recall.js.map +0 -1
- package/dist/memory/relationStore.d.ts +0 -95
- package/dist/memory/relationStore.d.ts.map +0 -1
- package/dist/memory/relationStore.js +0 -2
- package/dist/memory/relationStore.js.map +0 -1
- package/dist/memory/store.d.ts +0 -71
- package/dist/memory/store.d.ts.map +0 -1
- package/dist/memory/store.js +0 -199
- package/dist/memory/store.js.map +0 -1
- package/dist/memory/userProfile.d.ts +0 -180
- package/dist/memory/userProfile.d.ts.map +0 -1
- package/dist/memory/userProfile.js +0 -381
- package/dist/memory/userProfile.js.map +0 -1
- package/dist/memory/vectorStore.d.ts +0 -179
- package/dist/memory/vectorStore.d.ts.map +0 -1
- package/dist/memory/vectorStore.js +0 -284
- package/dist/memory/vectorStore.js.map +0 -1
- package/dist/persona/personaManager.d.ts +0 -109
- package/dist/persona/personaManager.d.ts.map +0 -1
- package/dist/persona/personaManager.js +0 -315
- package/dist/persona/personaManager.js.map +0 -1
- package/dist/persona/types.d.ts +0 -32
- package/dist/persona/types.d.ts.map +0 -1
- package/dist/persona/types.js +0 -5
package/dist/agent/loop.d.ts
CHANGED
|
@@ -1,423 +1,844 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* turn(问答闭环)Act 引擎(AgentLoop)— turn 回答中阶段的 loop(对 step 的编排,官方 Agent Loop 本义)
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
4
|
+
* 概念定位(所有复杂度在单 turn step 循环里承载,无多 turn 任务编排):
|
|
5
|
+
* - step = 一次 LLM 调用 + 可选工具执行(runIterationLoop 内每次循环体);
|
|
6
|
+
* - loop = 对 step 的编排:turn 回答中阶段反复拉起 step 直到输出最终回答;
|
|
7
|
+
* - 本类承载 turn(问答闭环)的 Act 引擎(含 loop=step 编排),是 turn 的身体引擎;
|
|
8
|
+
* - 复杂任务(task_table_write + 动态规划)在一个 turn 的 step 循环里自然生长,
|
|
9
|
+
* 不再强制拆成多 turn 编排;
|
|
10
|
+
* - 上下文 = 用户输入 + Agent 记忆召回结果 + 运行帧追加。
|
|
10
11
|
*/
|
|
11
|
-
import type { LlmProvider, Message } from '../llm/provider.js';
|
|
12
|
+
import type { LlmProvider, Message, ChatOptions } from '../llm/provider.js';
|
|
13
|
+
import type { ProviderRouter } from '../llm/types.js';
|
|
12
14
|
import type { Memory } from '../memory/types.js';
|
|
13
15
|
import type { ToolDefinition } from '../agent/toolExecutor.js';
|
|
14
|
-
import type { AgentChunk, UIMessages } from '../agent/types.js';
|
|
16
|
+
import type { AgentChunk, UIMessages, PreExecutionResult, AskQuestion } from '../agent/types.js';
|
|
15
17
|
import type { ITracer, AgentMetrics } from '../agent/tracer.js';
|
|
18
|
+
import type { ContextBudget, ContextOccupancy } from '../agent/budget.js';
|
|
19
|
+
import type { ICompactionStrategy } from '../agent/compaction.js';
|
|
20
|
+
import type { DuplicateCallInterceptor } from '../agent/types.js';
|
|
21
|
+
import type { RoundEvidenceEvent } from '../memory/roundStore.js';
|
|
22
|
+
import type { L2RuntimeStrategy } from '../role-pack/types.js';
|
|
16
23
|
export interface AgentLoopOptions {
|
|
17
24
|
provider: LlmProvider;
|
|
25
|
+
/** Provider 路由选择器(多模型路由基础,可选) */
|
|
26
|
+
providerRouter?: ProviderRouter;
|
|
18
27
|
bootstrapMemories: Memory[];
|
|
19
28
|
toolExecutor: (name: string, args: string) => Promise<string>;
|
|
20
29
|
maxIterations?: number;
|
|
21
|
-
/** 系统 prompt
|
|
30
|
+
/** 系统 prompt 前缀(角色包 prompt),注入到 bootstrap 记忆之前 */
|
|
22
31
|
systemPromptPrefix?: string;
|
|
23
32
|
/**
|
|
24
|
-
*
|
|
25
|
-
*
|
|
26
|
-
* 在 systemPromptPrefix 和 bootstrapMemories 之间插入。
|
|
27
|
-
* 由 Agent.injectAffect() 设置,角色切换时保留。
|
|
33
|
+
* 当前激活角色包底盘占用(system prompt 总体 token),装配时即确定。
|
|
34
|
+
* 早于 prepare 写入,使冷启动 / 重启首屏即可显示真实占比;prepare 期以其实际值覆盖,口径一致。
|
|
28
35
|
*/
|
|
36
|
+
rolePackBaseTokens?: number;
|
|
37
|
+
/** 情感基调前缀,插在 systemPromptPrefix 与 bootstrapMemories 之间(injectAffect 设置,角色切换时保留) */
|
|
29
38
|
affectPrefix?: string;
|
|
30
|
-
/**
|
|
39
|
+
/** 任务表触发覆盖钩子:宿主可覆写 needsPlanning 判定。
|
|
40
|
+
* 缺省用内核内置 detectNeedsPlanning(确定性判定)。返回 true → 首迭代注入命令式强引导。 */
|
|
41
|
+
needsPlanningOverride?: (text: string) => boolean;
|
|
42
|
+
/** 工具定义列表(内置 + 自定义),用于 system prompt 追加工具描述 */
|
|
31
43
|
toolDefinitions?: ToolDefinition[];
|
|
32
|
-
/**
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
*
|
|
36
|
-
* 当估算 token 数超过此阈值时,保留 system prompt + 最近 N 条消息,
|
|
37
|
-
* 裁剪中间段,确保 LLM 请求不因上下文溢出而失败。
|
|
38
|
-
*
|
|
39
|
-
* 保守默认值 32000 token 对多数模型安全(DeepSeek 128K / GPT-4o 128K / 豆包 8K),
|
|
40
|
-
* 宿主可通过 AgentLoopOptions 覆盖。
|
|
41
|
-
*/
|
|
44
|
+
/** 内置工具定义列表,仅含内置工具,供只读模式(toolReadonly)查询 readonly 标记 */
|
|
45
|
+
builtinTools?: ToolDefinition[];
|
|
46
|
+
/** 上下文窗口 token 上限(默认 120_000)。估算 token 超此阈值时裁剪中间段,
|
|
47
|
+
* 仅保留 system prompt + 最近 N 条消息,防上下文溢出。 */
|
|
42
48
|
maxContextTokens?: number;
|
|
43
49
|
/** 可观测性 Tracer(宿主注入,默认 NOOP_TRACER 静默丢弃所有 span) */
|
|
44
50
|
tracer?: ITracer;
|
|
45
|
-
/**
|
|
46
|
-
* 内容护栏规则(启动时从 configDir 加载的 guardrail 记忆)
|
|
47
|
-
*
|
|
48
|
-
* 每条规则包含 pattern(正则字符串)和 action(block/warn)。
|
|
49
|
-
* 在对话输入和输出阶段分别检查,命中 block 时阻断对话。
|
|
50
|
-
* 护栏自身异常时降级为"放行 + 记日志",不阻断用户对话。
|
|
51
|
-
*/
|
|
52
|
-
guardrailRules?: readonly Memory[];
|
|
53
|
-
/**
|
|
54
|
-
* Reflection(反思/自修正)最大重试次数(默认 2)
|
|
55
|
-
*
|
|
56
|
-
* 当工具执行失败且错误码标记为 retryable 时,
|
|
57
|
-
* AgentLoop 会将错误上下文回传给 LLM 重新尝试,
|
|
58
|
-
* 而非立即结束当前迭代。超过此上限后放弃反思。
|
|
59
|
-
*/
|
|
51
|
+
/** Reflection 最大重试次数(默认 2)。工具失败且错误码 retryable 时回传 LLM 重试,超限放弃 */
|
|
60
52
|
maxReflectionRetries?: number;
|
|
61
53
|
/** 宿主可覆盖的 UI 消息文本(默认英文) */
|
|
62
54
|
messages?: UIMessages;
|
|
63
|
-
/**
|
|
64
|
-
*
|
|
65
|
-
*
|
|
66
|
-
* 开启后,当消息历史超过 maxContextTokens 时,
|
|
67
|
-
* 会对被裁剪的消息调用 provider 生成一段摘要注入到系统提示中,
|
|
68
|
-
* 避免关键信息永久丢失。(首次触发时增加 ~1-2s 延迟)
|
|
69
|
-
*/
|
|
55
|
+
/** 上下文超限时是否自动生成摘要(默认 true)。会调 provider 为被裁剪消息生成摘要注入
|
|
56
|
+
* 系统提示,避免关键信息丢失(首次触发约 +1-2s 延迟) */
|
|
70
57
|
enableContextSummary?: boolean;
|
|
71
|
-
/**
|
|
72
|
-
* 上下文截断回调(宿主可据此发射 contextTruncated 事件通知用户)
|
|
73
|
-
*
|
|
74
|
-
* 每次 truncateMessages 触发截断时调用,传入被裁剪和保留的消息数量。
|
|
75
|
-
* 未注入时静默忽略。
|
|
76
|
-
*/
|
|
58
|
+
/** 上下文截断回调(传被裁剪/保留消息数),宿主可据此发 contextTruncated 事件;未注入静默忽略 */
|
|
77
59
|
onContextTruncated?: (skippedCount: number, keptCount: number) => void;
|
|
78
|
-
/**
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
*/
|
|
84
|
-
|
|
60
|
+
/** LLM 主动压缩完成回调(第二级压缩,传压缩目标/被替换消息数/摘要长度);未注入静默忽略 */
|
|
61
|
+
onContextCompressed?: (target: 'earliest_round' | 'largest_tool_result', replacedCount: number, summaryLength: number) => void;
|
|
62
|
+
/** 工具执行完成回调(供 outbox 模式恢复时判断工具是否已执行过,避免重复执行);未注入静默忽略 */
|
|
63
|
+
onToolExecuted?: (name: string, args: string, result: string, ok: boolean) => void;
|
|
64
|
+
/** 工具执行前检查回调(宿主闸门)。三态:放行(可携 overrideArgs 改写参数)/ 跳过
|
|
65
|
+
* (返回 previousResult 幂等去重)/ 拒绝(阻止执行);未注入时正常执行 */
|
|
66
|
+
preExecutionCheck?: (name: string, args: string) => PreExecutionResult;
|
|
67
|
+
/** 主动提问回调(回答中 LLM 调 ask_user 工具时调用,loop 只回调不处理 UI) */
|
|
68
|
+
onPendingQuestion?: (questions: AskQuestion[]) => void;
|
|
69
|
+
/** 已存轮次摘要加载器。截断生成摘要前优先取持久化 round-summary(零成本保真),仅无已存时才现调 LLM */
|
|
70
|
+
roundSummaryLoader?: () => string;
|
|
71
|
+
/** 截断时最少保留的最近原始对话轮数(默认 0),宿主可据 provider prompt caching 能力放宽 */
|
|
72
|
+
minRecentRounds?: number;
|
|
73
|
+
/** ChatOptions 覆盖项(角色包策略注入 temperature/outputLimit 等;与默认值的关系见 defaultMaxTokens) */
|
|
74
|
+
chatOptions?: Partial<ChatOptions>;
|
|
75
|
+
/**
|
|
76
|
+
* per-LLM 输出预算默认值(token,宿主 per-LLM 配置透传):buildChatOptions 填入底座,
|
|
77
|
+
* 与角色包策略覆盖项(chatOptions,act.outputLimit)**取更小值**(两者都是「上限」性质,
|
|
78
|
+
* 须同时满足——对齐上下文窗口 min(provider 窗口, 角色包 contextLimit) 的语义)。
|
|
79
|
+
* undefined = 不传 max_tokens(回服务端默认)。请求层只做形态归一(非正整数不传),
|
|
80
|
+
* 上限不裁决——本层与请求层均不设上限(真实上限由服务端裁决,见 normalizeMaxTokens)。
|
|
81
|
+
*/
|
|
82
|
+
defaultMaxTokens?: number;
|
|
83
|
+
/** 上下文压缩策略(微压缩层,每轮把旧 tool_result 替换为占位符省空间);
|
|
84
|
+
* 默认 ResultReplacementStrategy(保留最近 3 次完整结果),宿主可注入自定义策略。
|
|
85
|
+
* 作为两级空间管理的**第二级**(tool_result 占位)参与压缩链 */
|
|
86
|
+
compactionStrategy?: ICompactionStrategy;
|
|
87
|
+
/** 已存轮次摘要按 roundId 取(替换式压缩第一级用);未注入时替换层降级为 no-op(返回 null) */
|
|
88
|
+
getRoundSummary?: (roundId: string) => string | null;
|
|
89
|
+
/** 替换式压缩保留最近正文轮数(默认 DEFAULT_REPLACE_KEEP_RECENT_ROUNDS=5,LRU 最早先换) */
|
|
90
|
+
replaceRoundsKeepRecent?: number;
|
|
91
|
+
/** 工具结果卸载(入口关)的落盘目录(装配注入项目 `memoraDir` 下的 outputs 子目录)。
|
|
92
|
+
* 未注入则入口关不生效(超阈结果原样入上下文)——内核不派生此路径,防产出信任根外、
|
|
93
|
+
* `read_file` 读不回的假引用(OFFLOAD-1 教训) */
|
|
94
|
+
offloadDir?: string;
|
|
95
|
+
/** 重复工具调用拦截器。每轮工具执行后调用 check() 决定注入 warning 或 block;
|
|
96
|
+
* 未注入时用 DefaultDuplicateCallInterceptor(哈希机械检测),宿主可注入差异化策略 */
|
|
97
|
+
duplicateCallInterceptor?: DuplicateCallInterceptor;
|
|
85
98
|
}
|
|
86
99
|
export declare class AgentLoop {
|
|
100
|
+
#private;
|
|
87
101
|
private readonly opts;
|
|
88
102
|
private messages;
|
|
89
103
|
private readonly maxIterations;
|
|
90
|
-
/**
|
|
91
|
-
private
|
|
104
|
+
/** provider 上下文窗口(原始声明值,默认 120_000)。模型热切换经 setContextWindow 写入。 */
|
|
105
|
+
private providerContextWindow;
|
|
106
|
+
/** **有效上下文窗口** = min(providerContextWindow, strategy.contextLimit>0 ? contextLimit : ∞)。
|
|
107
|
+
* 派生值(非独立真源):由 #recomputeEffectiveWindow 在「provider 窗口变更」与「角色策略变更」
|
|
108
|
+
* 两个入口重算;是截断 / 软上限 / 占用快照统一消费的唯一窗口数字。 */
|
|
109
|
+
private maxContextTokens;
|
|
92
110
|
/** 可观测性 Tracer(默认 NOOP_TRACER 零开销) */
|
|
93
111
|
private readonly tracer;
|
|
94
|
-
/** 内容护栏规则(启动时加载,运行时不可变) */
|
|
95
|
-
private readonly guardrailRules;
|
|
96
112
|
/** Reflection 最大重试次数(默认 2) */
|
|
97
113
|
private readonly maxReflectionRetries;
|
|
98
|
-
/**
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
114
|
+
/** 上下文压缩策略(微压缩层),默认 ResultReplacementStrategy,经 options 可注入自定义策略 */
|
|
115
|
+
private readonly compactionStrategy;
|
|
116
|
+
/** 重复工具调用拦截器实例,默认 DefaultDuplicateCallInterceptor(哈希机械检测) */
|
|
117
|
+
private readonly duplicateCallInterceptor;
|
|
118
|
+
/** 重复工具调用检测阈值(默认 3 次,供拦截器 context 使用) */
|
|
119
|
+
private readonly duplicateToolCallThreshold;
|
|
120
|
+
/**
|
|
121
|
+
* 执行期临时 system 消息引用集(self-review / reflection / duplicate-warning / metaNote)。
|
|
122
|
+
* 与 prepare 阶段的「装配性注入」(召回、最近对话)区分:装配注入每轮由 prepare 重建、
|
|
123
|
+
* 不算临时,吃 cleanTemporarySystemMessages;执行期临时的清理由每轮闭环入口自动执行
|
|
124
|
+
* (cleanExecutionTemporary),保证跨步残留不堆积。replaceContext 走浅拷贝,
|
|
125
|
+
* 引用保持有效,按引用 filter 即可安全移除。
|
|
126
|
+
*/
|
|
127
|
+
private readonly executionTempSystem;
|
|
128
|
+
/** 上一轮工具调用的哈希(运行时状态,拦截器判定时使用) */
|
|
129
|
+
private lastToolCallsHash;
|
|
130
|
+
/** 连续重复次数(运行时状态,拦截器判定时使用) */
|
|
131
|
+
private duplicateToolCallCount;
|
|
132
|
+
/** 当前迭代序号(processUserInput 循环内维护,供拦截器 context 与 toolResultCache 老化使用)。
|
|
133
|
+
* 语义边界:本计数 = **循环内**迭代号(runIterationLoop 重启即从头);轮粒度 step 序号
|
|
134
|
+
* (thought 归属打标)另见 roundStepIndex——两者重置域不同(循环 vs 轮),勿互替。 */
|
|
135
|
+
private currentIteration;
|
|
136
|
+
/** 当前轮次已推送的 REFLECTION_HINT 次数。用显式计数器而非 filter 推断,
|
|
137
|
+
* 避免上下文中段消息被裁剪后计数失真 */
|
|
105
138
|
private reflectionCountThisTurn;
|
|
139
|
+
/** 搜索收敛护栏:本闭环内成功 web_search 次数(executeToolCalls 累计,_prepareContext 检查) */
|
|
140
|
+
private successfulWebSearchCount;
|
|
141
|
+
/** 搜索收敛护栏:本轮是否已注入收敛提示(幂等,防迭代累积刷屏) */
|
|
142
|
+
private searchConvergenceHintInjected;
|
|
143
|
+
/** 搜索硬上限:本闭环内 web_search 调用次数(含被拒绝的,达到上限后后续搜索直接拒绝) */
|
|
144
|
+
private searchCallCount;
|
|
145
|
+
/** 搜索硬上限命中后:从后续 LLM 调用的工具集确定性移除 web_search(双闸的第二闸,
|
|
146
|
+
* 与 system 提示互补,彻底终结「拒绝风暴」耗尽迭代/上下文导致问答闭环中断) */
|
|
147
|
+
private searchDisabled;
|
|
148
|
+
/** 搜索硬上限提示注入标记(幂等,防迭代累积重复注入) */
|
|
149
|
+
private searchDisabledHintInjected;
|
|
150
|
+
/** 软上限收尾信号注入标记(幂等,防迭代累积刷屏):摘要层饱和是跨迭代持续态,
|
|
151
|
+
* 同一 turn 内经本 flag 最多注入一次收尾信号;随 resetTurnState 重置——
|
|
152
|
+
* 每个新 turn(新用户输入)重新注入一次(每轮回答都需要收敛提醒),
|
|
153
|
+
* 防的是「同 turn 多步迭代各注一条」的刷屏(口径与搜索收敛 flag 同构)。 */
|
|
154
|
+
private softLimitWrapupInjected;
|
|
155
|
+
/** 规划层:本 turn 是否判定为需任务表规划(processUserInput 入口由检测结果设值,
|
|
156
|
+
* continueAfterPause 续跑不重判——plan 已建则无需 nudge) */
|
|
157
|
+
private planNeedsNudge;
|
|
158
|
+
/** 规划层:本 turn 是否已注入命令式引导(幂等,仅首迭代一次,随 resetTurnState 重置) */
|
|
159
|
+
private planNudgeInjected;
|
|
160
|
+
/** 工具结果防重缓存(闭环内有效,每轮 resetTurnState 清空)。
|
|
161
|
+
* 拦截 read_file/list_dir/web_search 的同 key 重复调用,返回 [ALREADY_READ] 拒绝文案,
|
|
162
|
+
* 终结 LLM 在同一批文件上反复轮询导致的死循环(token 爆炸 + maxIterations 撞线) */
|
|
163
|
+
private readonly toolResultCache;
|
|
164
|
+
/** 文件覆盖度台账(账本・解耦侧):读到的行区间 + 轻量替身摘要。
|
|
165
|
+
* 闭环内有效(resetTurnState 清),与 toolResultCache 同生命周期。
|
|
166
|
+
* 替身回显分支据此在「原文已压缩」时回显摘要,而非放行重读(永动机)或空拦(死锁)。 */
|
|
167
|
+
private readonly fileExposure;
|
|
168
|
+
/** 运行时护栏注册表(SSOT):判定序 / 文案 / 阈值单一真理源在 guardRail.ts;
|
|
169
|
+
* 本字段只是 loop 的装载点(createDefaultGuards 出厂即覆盖 5 类前置拦截型护栏)。
|
|
170
|
+
* write_loop/read_failed 的计数状态内聚进其 guard 实例闭包,loop 仅负责
|
|
171
|
+
* 装载 registry + 调 evaluateBlocked 判定 + 调 notifyExec 写侧喂数 + reset 归零。 */
|
|
172
|
+
private readonly guardier;
|
|
173
|
+
/** 队列中是否有待消费的 pause 申请 */
|
|
174
|
+
private hasPendingPause;
|
|
175
|
+
/** 幂等申请 pause 入队(已存在则不重复追加) */
|
|
176
|
+
private requestPauseEntry;
|
|
177
|
+
/** 移除队列中的 pause 条目(保留 interject 条目) */
|
|
178
|
+
private cancelPauseEntry;
|
|
179
|
+
/** step 边界气口申请统一队列(pause/interject 统一入队,无独立 pauseRequested flag)。
|
|
180
|
+
* 用户申请的气口(pause/interject)统一入队,_handleInterrupt 在 step 边界消费:
|
|
181
|
+
* 先注入型(interject → appendUser),后挂起型(pause → yield paused)。 */
|
|
182
|
+
private interruptQueue;
|
|
183
|
+
/** 主动提问回调(LLM 调 ask_user 工具时调用,Agent 注入,loop 只回调不处理 UI) */
|
|
184
|
+
onPendingQuestion?: (questions: AskQuestion[]) => void;
|
|
185
|
+
/** 有效窗口变更回调(Agent 注入):把 loop 算出的**有效窗口**分发给 loop 之外仍持有窗口拷贝的
|
|
186
|
+
* 组件(ContextPreparer 等)。计算点唯一在 loop(#recomputeEffectiveWindow),本回调只做分发。 */
|
|
187
|
+
onContextWindowChanged?: (effectiveTokens: number) => void;
|
|
188
|
+
/** 单工具执行器(独立可测单元;strategy/回调经闭包读最新) */
|
|
189
|
+
private readonly toolRunner;
|
|
190
|
+
/** L2 运行时策略(单一策略对象)。Agent 每轮经 setStrategy 注入,构造期默认 DEFAULT_L2_STRATEGY */
|
|
191
|
+
private strategy;
|
|
192
|
+
/** 本 turn 是否已执行过自审查(单次终审:布尔状态,不再需要轮次计数) */
|
|
193
|
+
private selfReviewDone;
|
|
194
|
+
/** 本 turn(processUserInput)内是否实际执行过工具步。
|
|
195
|
+
* 自审查的唯一触发门槛:只有多轮 turn(发生过工具调用)才审查,
|
|
196
|
+
* 一遍过的纯文本问答不触发。由 processUserInput 入口重置(续跑 continueAfterPause 保留)。
|
|
197
|
+
*/
|
|
198
|
+
private toolExecutedThisTurn;
|
|
199
|
+
/** 当前轮次 ID(processUserInput 入口分配一次,各 iteration 共享),用于溯源式摘要 */
|
|
200
|
+
private currentRoundId;
|
|
201
|
+
/** 是否正处于自主工具步执行中(内核自用:resumeExecution 预判短路 / canContinueWithoutInput;宿主零消费) */
|
|
202
|
+
private inAutonomousStep;
|
|
203
|
+
/** step 边界回调——每次迭代(=step)完成时调用(传 assistant 摘要)。消费方(assembler 实现)
|
|
204
|
+
* 经 logPlanItemBoundary 写 planItemLog 关联当前 active 任务项(时间轴投影)——
|
|
205
|
+
* 不推进 plan:状态推进唯一写者 = LLM 的 task_table_update;LLM 未显式 update 的最后一个任务项
|
|
206
|
+
* 由 turn 收尾兜底(orchestrator → concludeActivePlanItemIfPlanFullyReached)补上。
|
|
207
|
+
* planItemId 由消费方自查,loop 不传——签名不留空头支票。
|
|
208
|
+
* 检出时机 = 本迭代 LLM 调用后、工具前(读「本迭代服务的那个任务项」)。 */
|
|
209
|
+
onPlanItemBoundary?: (planItemInfo: {
|
|
210
|
+
summary: string;
|
|
211
|
+
}) => void;
|
|
212
|
+
/** 任务表获取回调——每次迭代 LLM 调用前调用,返回任务表文本(空字符串=无任务表) */
|
|
213
|
+
getTaskTable?: () => string;
|
|
214
|
+
/** active 任务项元信息回调(任务项级折叠):供 _maybeEmitPlanItemBoundary
|
|
215
|
+
* 在**迭代开始**(LLM 调用前)调用,返回当前 active 任务项 { planItemId, title, rolePack };
|
|
216
|
+
* 无任务表/无 active 任务项返回 null。与 onPlanItemBoundary **时序分叉**:后者读 LLM 调用后、
|
|
217
|
+
* 工具前的 active(本迭代 LLM 实际服务的任务项),本回调经 _maybeEmitPlanItemBoundary 读迭代
|
|
218
|
+
* 开始时的 active(以下内容将归属的那个任务项)——plan_item_boundary 事件据此判定
|
|
219
|
+
* 「active 任务项是否已推进」并分组渲染。两者读的都是同一 checkpoint.plan 真源,仅读取时刻不同。
|
|
220
|
+
* rolePack 供裁决证据的会议轮判据(isMeetingRound)消费。 */
|
|
221
|
+
getActivePlanItemMeta?: () => {
|
|
222
|
+
planItemId?: string;
|
|
223
|
+
title?: string;
|
|
224
|
+
rolePack?: string;
|
|
225
|
+
} | null;
|
|
226
|
+
/** 裁决证据落盘钩子(悬案取证轨):空响应兜底 / 台账替身回显写点产个案证据时回调,
|
|
227
|
+
* 由装配层接 history.appendEvidence 归属当前闭环轮随 Round 持久化。未注入静默忽略。 */
|
|
228
|
+
appendRoundEvidence?: (ev: RoundEvidenceEvent) => void;
|
|
229
|
+
/** 在途任务表判定回调:本 turn 是否已有未完成的计划任务项(会议骨架预置 / 续会)。
|
|
230
|
+
* 装配来源 = SessionManager.hasInflightPlan(单一真理源);用途 = needsPlanning nudge 注入前
|
|
231
|
+
* 判断「是否已有在途表」,有则不重复灌「先拆解建表」。
|
|
232
|
+
* 刻意**不复用** getActivePlanItemMeta 的存在性——后者原生职责是 plan_item_boundary 事件信号,
|
|
233
|
+
* 借它回答本命题属语义借用(二者在 ensureActivePlanItem 不变量下当前等价,但职责须分离)。 */
|
|
234
|
+
hasInflightPlan?: () => boolean;
|
|
235
|
+
/** 上一任务项边界 ID(去噪):记录最近一次已 emit plan_item_boundary 的 planItemId,
|
|
236
|
+
* 仅当 getActivePlanItemMeta 返回的 planItemId 变化时才产新事件;null/undefined 不产(无任务表静默)。 */
|
|
237
|
+
private lastBoundaryPlanItemId?;
|
|
238
|
+
/** 轮内 step 序号(轮粒度单调):「这条思考是第几步产生的」唯一真源计数,thought 归属由它打标。
|
|
239
|
+
* 每次 LLM 调用(= 一个 step)前递增;随 currentRoundId 分配重置(processUserInput),
|
|
240
|
+
* continueAfterPause 续同一轮**不重置**——序号跨续跑段继续单调,同轮各 step 永不撞号。 */
|
|
241
|
+
private roundStepIndex;
|
|
242
|
+
/** 主动提问计数(本 turn 粒度,resetTurnState 清零):ask_user 工具触发次数(askLimit 硬护栏) */
|
|
243
|
+
private askCountThisTurn;
|
|
244
|
+
/**
|
|
245
|
+
* 在途提问登记(ask_user 工具轮挂起后、回答回填前):记录各 ask_user 调用的 toolCallId
|
|
246
|
+
* 与解析出的结构化问题。answerQuestion(正常作答)/ cancelAsk(跳过/兜底)二选一消费。
|
|
247
|
+
*/
|
|
248
|
+
private pendingAsk;
|
|
249
|
+
/**
|
|
250
|
+
* 已作答/已取消提问快照(answerQuestion 与 cancelAsk 消费提问后对称转存):
|
|
251
|
+
* 提问消费后把 pendingAsk.questions 转存于此,供 orchestrator.runResume
|
|
252
|
+
* 落盘交互输入时随回答/超时记录一并持久化(回放还原「问了什么+选项」)。
|
|
253
|
+
* pendingAsk 即清(runIterationLoop 兜底 cancelAsk 依赖其为「未消费」判据);
|
|
254
|
+
* 快照由 runResume takeAnsweredAsk 取走,或下次消费覆盖(残留仅进程内、单 turn,无害)。
|
|
255
|
+
*/
|
|
256
|
+
private lastAnsweredAsk;
|
|
106
257
|
/** 宿主可覆盖的 UI 消息文本(已填充默认值) */
|
|
107
258
|
private readonly ui;
|
|
108
|
-
/** 护栏规则正则编译失败回调(从 opts.onGuardrailError 提取,用于 GuardrailUI) */
|
|
109
|
-
private readonly guardrailUI;
|
|
110
259
|
/** 上下文超限时是否自动生成摘要 */
|
|
111
260
|
private readonly enableContextSummary;
|
|
261
|
+
/** LLM 主动压缩完成回调(第二级压缩,在 compressContext 成功后触发) */
|
|
262
|
+
private readonly onContextCompressed;
|
|
112
263
|
/** 上下文管理器(从 loop 提取的 token 估算 + 截断 + 摘要职责) */
|
|
113
264
|
private readonly contextManager;
|
|
265
|
+
/** 被替换轮 roundId 集合(第一级替换把越界轮正文换成已存摘要;装配 exclude 据此防二次召回) */
|
|
266
|
+
private readonly replacedRoundIds;
|
|
267
|
+
/** 最近一次输入装配的上下文预算(prepare 期写入,供指标快照透出做预算可视化) */
|
|
268
|
+
private lastBudget;
|
|
269
|
+
/** 最近一次输入装配的上下文占用快照(预算可视化,真实用量) */
|
|
270
|
+
private lastOccupancy;
|
|
271
|
+
/**
|
|
272
|
+
* 当前激活角色包底盘占用(system prompt 总体 token)。
|
|
273
|
+
* 装配 / 切换角色包时经 setRolePackBaseTokens 写入(早于 prepare,冷启动即可用),
|
|
274
|
+
* prepare 期 recordOccupancy 也以其实际值覆盖,口径一致(同一 estimateTokensMessages 估算器)。
|
|
275
|
+
*/
|
|
276
|
+
private rolePackBaseTokens;
|
|
277
|
+
/** 最近一次 _prepareContext 是否发生截断重排(替换层据此跳过——截断提取 key messages 重插中间,roundId 尾部对齐失效) */
|
|
278
|
+
private isLastContextTruncated;
|
|
279
|
+
/** 两级空间管理压缩链(第一级替换 → 第二级 tool_result 占位)。超大结果卸载已在入口关处理,不在链上 */
|
|
280
|
+
private readonly compactionStrategies;
|
|
281
|
+
/** 入口关落盘目录(装配注入;未注入则入口关不生效)。消费点:appendToolMessage */
|
|
282
|
+
private readonly offloadDir?;
|
|
283
|
+
/** 情报区(LLM 私有工作笔记):LLM 经 remember_intel 自写累积,装配时作为尾部私有 system 消息注入 */
|
|
284
|
+
private intelNote;
|
|
285
|
+
/** Provider 路由缓存(单轮内缓存同一 taskType,避免每轮重复路由计算),跨轮清空不复用 */
|
|
286
|
+
private providerRouteCache;
|
|
114
287
|
private metrics;
|
|
288
|
+
/** LLM 调用族执行器。**必须在构造函数尾部初始化**——依赖 `contextManager` /
|
|
289
|
+
* `tracer` 等构造期赋值的字段(类字段初始化器按声明顺序执行,此处读会得到 undefined)。
|
|
290
|
+
* 其所有 loop 侧能力均为**取值器 / 回调**:`strategy`(setStrategy 换对象)、
|
|
291
|
+
* `opts.provider`(setProvider 热切换)、`toolExecutedThisTurn`(同 turn 内 set true)
|
|
292
|
+
* 皆运行时可变量,且 `errorHandling` 在重试循环内被读 3 次。
|
|
293
|
+
* `providerRouteCache` 仍是 loop 字段(每轮 turn 入口清空),本类只经回调读写。 */
|
|
294
|
+
private llmCaller;
|
|
115
295
|
constructor(opts: AgentLoopOptions);
|
|
116
296
|
/**
|
|
117
|
-
*
|
|
118
|
-
*
|
|
119
|
-
*
|
|
120
|
-
*
|
|
121
|
-
*
|
|
122
|
-
*
|
|
123
|
-
*
|
|
124
|
-
*
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
*
|
|
129
|
-
*
|
|
130
|
-
|
|
131
|
-
|
|
297
|
+
* 处理一轮用户输入(编排方法:单次迭代/工具分支/纯文本结束)
|
|
298
|
+
*
|
|
299
|
+
* 记忆检索唯一入口 = LLM 经 `search_memories` 工具主动触发(builtinToolHandlers.searchMemories),
|
|
300
|
+
* prepare/loop 不代模型猜测注入(无 recalledMemories 自动注入通道)。
|
|
301
|
+
*
|
|
302
|
+
* @param userInput - 用户输入
|
|
303
|
+
* @param signal - 可选 AbortSignal,宿主导入 controller 触发取消
|
|
304
|
+
* @param roundId - 外部已分配轮次 ID(保证 user/assistant/摘要同 roundId),未传自生成
|
|
305
|
+
*/
|
|
306
|
+
processUserInput(userInput: string, signal?: AbortSignal, roundId?: string): AsyncGenerator<AgentChunk, void, unknown>;
|
|
307
|
+
/**
|
|
308
|
+
* 软暂停后续跑(在暂停边界后从保留的 this.messages 重新进入 step 循环引擎)
|
|
309
|
+
*
|
|
310
|
+
* 有补充输入时先 push 为 user 消息再续跑
|
|
311
|
+
*/
|
|
312
|
+
continueAfterPause(input?: string, signal?: AbortSignal): AsyncGenerator<AgentChunk, void, unknown>;
|
|
313
|
+
/**
|
|
314
|
+
* turn 入口通用 SLO 包装:统一任务计数 + 耗时累加 + 成功/失败判定 + 可选 tracer span 写属性。
|
|
315
|
+
*
|
|
316
|
+
* @param span 可选 tracer span(processUserInput 有 responseSpan;续跑路径无 span 传 null)
|
|
317
|
+
* @param genFn 生成迭代器的工厂函数(惰性求值:在 try 块内调用,保证异常被 catch)
|
|
318
|
+
*/
|
|
319
|
+
private _runWithSlo;
|
|
320
|
+
/** 是否正处于自主工具步执行中(消费者 = agent.ts 预判短路/canContinueWithoutInput,内核内部) */
|
|
321
|
+
get isInAutonomousStep(): boolean;
|
|
322
|
+
/**
|
|
323
|
+
* 给子生成器的每个 chunk 附加当前 turn roundId(SSOT:过程事件归属由内核唯一提供)。
|
|
324
|
+
* 宿主据此把 ProcessEvent 落盘到正确的 Round。
|
|
325
|
+
* 两个 turn 入口(processUserInput / continueAfterPause)统一经此包装。
|
|
326
|
+
*/
|
|
327
|
+
private withRound;
|
|
328
|
+
/**
|
|
329
|
+
* step 归属打标:给子生成器的 thought chunk 附加所属 step 序号(SSOT:「这条思考是第几步产生的」
|
|
330
|
+
* 由 loop 唯一提供,随 thought 本体落盘,消费方无需从工具序列推断迭代边界)。
|
|
331
|
+
* 仅 thought 需要归属(按 step 分桶渲染),其余 chunk 原样透传。
|
|
332
|
+
* 与 withRound 同构的边界打标模式;被包子生成器带返回值(LlmCallResult),
|
|
333
|
+
* 故用手动迭代转发返回值(for-await 会丢弃 generator 返回值)。
|
|
334
|
+
*/
|
|
335
|
+
private withStepIndex;
|
|
336
|
+
/** 设置 L2 运行时策略(与现策略浅合并)。默认值仅在策略解析层 resolveL2Strategy 归一,loop 不再兜底。
|
|
337
|
+
* 策略含 contextLimit → 变更后重算有效窗口(截断 / 软上限 / 占用快照随之生效)。 */
|
|
338
|
+
setStrategy(partial: Partial<L2RuntimeStrategy>): void;
|
|
339
|
+
/**
|
|
340
|
+
* 请求在下一 step 边界挂起(软暂停申请入队)。
|
|
341
|
+
* 委托 requestPauseEntry(幂等入队),step 边界由 _handleInterrupt 消费。
|
|
342
|
+
* 仅挂起不 abort,可经 continueAfterPause 续跑——与硬停止(signal.abort 无法续跑)严格区分;
|
|
343
|
+
* 暂停语义与持久化由状态机持有,本方法只控制挂起时机。
|
|
344
|
+
*/
|
|
345
|
+
requestPause(): void;
|
|
346
|
+
/** 清除在途的软暂停申请(与 requestPause 对称:用户取消/流结束清理/暂停超时清扫共用)。
|
|
347
|
+
* 委托 cancelPauseEntry 移除 pause 条目(保留 interject 条目) */
|
|
348
|
+
clearPauseRequest(): void;
|
|
349
|
+
/** 插话(申请入队):把用户补充输入作为 InterruptRequest{kind:'interject'} 入 interruptQueue。
|
|
350
|
+
* 与 requestPause(queueInterrupt pause)同为「申请 → 气口生效」——不中断当前 LLM/工具执行,
|
|
351
|
+
* 只在 step 边界统一消费(先注入型 → appendUser,后挂起型 → yield paused)。 */
|
|
352
|
+
interject(content: string): void;
|
|
353
|
+
/** 删除待注入的插话(宿主 UI 层用户后悔)。与 interject 对称,在 step 边界消费前可安全删除。
|
|
354
|
+
* 委托 interruptQueue 中 interject 条目的索引。
|
|
355
|
+
* index 越界时静默 no-op(宿主镜像数组和内核队列始终同序同长度,理论上不会越界)。
|
|
356
|
+
* @returns true=成功删除;false=index 越界或队列为空 */
|
|
357
|
+
removePendingInterject(index: number): boolean;
|
|
358
|
+
/** 清空全部待注入插话(宿主「全部清空」按钮或 stop→discard 协同清理)。
|
|
359
|
+
* 与 removePendingInterject 单条删除对称,覆盖宿主镜像与内核队列不对称缺口——
|
|
360
|
+
* clear_pending_queue handler 若只清镜像不清内核会成单写缺口;
|
|
361
|
+
* agent.discardCurrentCheckpoint 若只清 checkpoint 不清队列会留孤儿数据。
|
|
362
|
+
* @returns 被清除的条目数(宿主可用于 notice 反馈) */
|
|
363
|
+
clearPendingInterjections(): number;
|
|
364
|
+
/** 读取当前待注入插话队列快照(宿主渲染层只读镜像)。
|
|
365
|
+
* 从 interruptQueue 中筛选 kind='interject' 并提取 content。
|
|
366
|
+
* 返回副本而非原数组——宿主拿不到内核内部引用,防暗改。
|
|
367
|
+
* 宿主侧收敛:不再自己维护 _pendingQueue 镜像,每次渲染从内核读。 */
|
|
368
|
+
getPendingInterjections(): readonly string[];
|
|
369
|
+
/** 输出"达到最大迭代/步数预算"提示并结束(turn act 收尾兜底,多入口共享) */
|
|
370
|
+
private emitMaxIterationsReached;
|
|
371
|
+
/** 重置本轮运行计数状态(反思/重复检测/软暂停/自审查/工具步,每轮独立;续跑入口同样调用) */
|
|
372
|
+
private resetTurnState;
|
|
373
|
+
/** 重置 askLimit 计数(turn 入口):仅 processUserInput 调用,continueAfterPause 不动,
|
|
374
|
+
* 保证暂停-续跑同属一次用户输入、提问次数跨续跑累计(askLimit 语义:按输入打扰防刷)。 */
|
|
375
|
+
private resetAskBudget;
|
|
376
|
+
/**
|
|
377
|
+
* 单轮 step 循环引擎(turn act 内 step 编排):一次循环 = 一次 handleIteration(processUserInput/continueAfterPause 共享)。
|
|
378
|
+
* stepBudget 软上限与 maxIterations 兜底在此统一收敛。
|
|
379
|
+
* 注:所有复杂度(含 LLM 动态建任务表、会议机制角色切换)在单 turn 内承载(无多 turn 编排)。
|
|
380
|
+
*/
|
|
381
|
+
private runIterationLoop;
|
|
382
|
+
/** 处理一次迭代结果(processUserInput/continueAfterPause 共享)。
|
|
383
|
+
* continue→继续;paused→终止(step 边界挂起待续跑);aborted→终止(硬中止,排队插话已留档);
|
|
384
|
+
* done→有自审查/排队插话待注入则继续,否则终止。返回 false 表示调用方应终止循环 */
|
|
385
|
+
private handleIterationResult;
|
|
386
|
+
/**
|
|
387
|
+
* 自审查注入判定(emit selfReview 通知与注入 SELF_REVIEW 提示共用单一真理源)。
|
|
388
|
+
*
|
|
389
|
+
* 需同时满足:
|
|
390
|
+
* 1. 启用自审查(selfReviewEnabled);
|
|
391
|
+
* 2. 非工具屏蔽(toolCallsBlocked 时 'done' 来自系统占位文本而非 LLM 回复);
|
|
392
|
+
* 3. **单次终审语义**:
|
|
393
|
+
* - 多轮 turn 门槛:本 turn 内实际执行过工具步(一遍过的纯文本问答不审查);
|
|
394
|
+
* - **终审即停:本 turn 已审过(selfReviewDone)则一律不再安排**。审查轮产出后
|
|
395
|
+
* done 立即真实生效——自审只对「工具循环后的最终交付」做一次把关,不因需修改
|
|
396
|
+
* 而无限续跑空转(防 done 后反复审查拖长 turn)。深度"审查→
|
|
397
|
+
* 修正"的迭代属目标模式阶段验收,非单次问答闭环职责。
|
|
398
|
+
*/
|
|
399
|
+
private shouldInjectSelfReview;
|
|
400
|
+
/** 单次迭代编排:编排中断检查 → 上下文准备 → LLM 调用 → 结果路由。
|
|
401
|
+
* 按抽象层拆分为 _handleInterrupt / _prepareContext / _callAndRoute,
|
|
402
|
+
* 编排者只保留顺序,各阶段职责内聚在小方法(保持单轮 turn 结构完整)。 */
|
|
403
|
+
private handleIteration;
|
|
404
|
+
/** 消费申请列表中的注入型(interject → appendUserMessage)条目。
|
|
405
|
+
* 单一真理源——_handleInterrupt(step 边界,splice 取出的局部列表)和 done 分支
|
|
406
|
+
* (LLM 收尾兜底,全局 queue)共用同一遍历 + append 实现,防两处独立实现导致
|
|
407
|
+
* 消费逻辑漂移(如加去重/计数时改一处漏一处)。
|
|
408
|
+
* 删除语义留在调用方:_handleInterrupt 的 reqs 已 splice 出队无需再删;
|
|
409
|
+
* done 分支消费后自行过滤全局 queue(pause 条目保留待下轮边界消费)。
|
|
410
|
+
* @param reqs 待消费的申请列表(只读遍历,不修改)
|
|
411
|
+
* @returns 消费的 interject 条目数(调用方可据此决定是否继续迭代) */
|
|
412
|
+
private _consumeInterjects;
|
|
413
|
+
/** 中断检查:step 边界统一消费 interruptQueue(pause + interject)+ 硬中止检查。
|
|
414
|
+
*
|
|
415
|
+
* 单一气口出口——气口申请统一收在 interruptQueue(无独立 pause flag / 插话数组写位),
|
|
416
|
+
* 此处统一 queue.splice(0) 取出全部申请,按 kind 分两类处理:
|
|
417
|
+
* - 注入型(interject):先 appendUserMessage,不暂停 loop,让补充输入立刻进入下一轮 step
|
|
418
|
+
* - 挂起型(pause):yield {type:'paused'} + return 'paused',generator 在 step 边界挂起
|
|
419
|
+
*
|
|
420
|
+
* 顺序:先消费注入型 → 再检查挂起型 → 最后硬中止。注入型优先是为了让补充输入在 pause 生效前
|
|
421
|
+
* 就入史——如果用户同时发了 interject + pause,补充输入应该被看到,而不是被 pause 吞掉。
|
|
422
|
+
*
|
|
423
|
+
* 返回 'paused' | 'aborted' 表示本迭代终止;返回合并后的 AbortSignal 表示继续。 */
|
|
424
|
+
private _handleInterrupt;
|
|
425
|
+
/** 超时 + 用户已申请暂停 → 路由 paused(续跑)而非 aborted(硬中止)。
|
|
426
|
+
* SSOT:LLM 调用 abort 点(_callAndRoute)与工具执行 abort 点(handleToolCalls)统一过此判定,
|
|
427
|
+
* 消除「pause 优先于 abort」在两处各复制 if 的漂移风险。
|
|
428
|
+
* 注:step 边界(_handleInterrupt)的气口消费是另一机制——那里 pause 在 abort 之前被优先消费,
|
|
429
|
+
* 不属 abort 路由,故不经本方法。返回 paused chunk 或 null。 */
|
|
430
|
+
private _routePausedIfTimeoutAndPause;
|
|
431
|
+
/** LLM 调用 + 结果路由:上下文准备 → 调 LLM → 按 abort/工具/纯文本 分支路由。
|
|
432
|
+
* effectiveSignal 已由 _handleInterrupt 合并好,此处直接使用。 */
|
|
433
|
+
private _callAndRoute;
|
|
434
|
+
/** 任务项级折叠边界事件产出(产出的是 plan_item_boundary,**不是** step_boundary——
|
|
435
|
+
* 方法名与产出事件名必须同阵营,勿据「step」误读为迭代边界):
|
|
436
|
+
* 比较 active 任务项是否已推进,推进才产 plan_item_boundary(宿主按任务项分组后续事件)。
|
|
437
|
+
* 无任务表(null)或 planItemId 未变则不产(lastBoundaryPlanItemId 去噪,避免每迭代发一条空边界)。
|
|
438
|
+
*
|
|
439
|
+
* **检出时机 = 迭代开始、LLM 调用之前(硬,2026-09-26 定案)**:边界的语义是「**以下内容**
|
|
440
|
+
* 属于该任务项」,故必须产在它所罩住的思考与工具之前——放在工具落定之后,宿主
|
|
441
|
+
* 「向前找最近边界」的判据对该迭代必然落空 → 每个任务项的首个迭代(思考 + 首批工具)恒掉出
|
|
442
|
+
* 折叠块,且流式插入后不搬家(「任务项边界产出时机前移」定案)。
|
|
443
|
+
*
|
|
444
|
+
* 语义后果(可接受,非缺陷):任务表若由本轮某迭代的工具**新建**,该迭代仍留在组外——
|
|
445
|
+
* 那个时刻任务表还不存在。本产出点修的是「任务表在本轮开始前已存在」(续会/预置/上一 turn
|
|
446
|
+
* 遗留)的场景。
|
|
447
|
+
*
|
|
448
|
+
* 与 `onPlanItemBoundary`(写 planItemLog)的**时序分叉仍是设计语义**:后者在 LLM 调用后、
|
|
449
|
+
* 工具前读 active(= 本迭代 LLM 实际服务的任务项),本处在迭代开始读(= 以下内容将归属的
|
|
450
|
+
* 任务项)。两者读同一真相源 `sessionManager.getCheckpoint().plan`,只是读取时刻不同。
|
|
451
|
+
*
|
|
452
|
+
* 落点还必须在 `_handleInterrupt` 之后:挂起/中止的迭代不应先产一条边界再退出。
|
|
453
|
+
* roundId 由 withRound 统一附加(chunk 归属 SSOT),此处不再自带。 */
|
|
454
|
+
private _maybeEmitPlanItemBoundary;
|
|
455
|
+
/** 迭代边界产出(迭代原子落盘):迭代**完成且将继续下一轮**时 emit
|
|
456
|
+
* `step_boundary`,宿主据此增量落盘(一次迭代一次落盘)。
|
|
457
|
+
*
|
|
458
|
+
* **为什么单开一个 chunk 而不复用 plan_item_boundary**:plan_item_boundary 的语义是「任务项推进」
|
|
459
|
+
* (无任务表静默 + planItemId 未变去噪),把它当落盘时机 → 无任务表的长工具循环零增量落盘,
|
|
460
|
+
* 崩溃即全丢。本 chunk 与它语义分离:只回答「本次迭代做完了」。
|
|
461
|
+
*
|
|
462
|
+
* **条件 = result === 'continue'(硬)**:终态迭代('done' 收尾 / 'paused' 挂起 / 'aborted'
|
|
463
|
+
* 中断)之后流即结束或宿主 break → **流尾落盘**已兜底,此处不产——既避免与流尾重复写,
|
|
464
|
+
* 也保住「终态 chunk 是末条」这一既有流契约(宿主 paused 分支据 break,其后不得再有 chunk)。
|
|
465
|
+
* 无工具分支(handleTextResponse)恒终态,故本方法在该分支不产(恒非 'continue')。
|
|
466
|
+
*
|
|
467
|
+
* **顺序契约(硬,2026-09-26 更新)**:`plan_item_boundary` 已于**迭代开始**产出
|
|
468
|
+
* (见 _maybeEmitPlanItemBoundary),本 chunk 产在迭代尾 → 二者天然保持「折叠边界先于落盘
|
|
469
|
+
* 触发」的先后序,宿主本次落盘快照必含该任务项折叠边界,崩溃重放不错位。
|
|
470
|
+
*
|
|
471
|
+
* @param result 本次迭代的路由结果(handleToolCalls 返回值)
|
|
472
|
+
*/
|
|
473
|
+
private _emitStepBoundary;
|
|
474
|
+
/** 上下文准备:摘要截断 → 同步工作记忆 → 微压缩 → 任务表注入。
|
|
475
|
+
* 返回 { chatOpts, safeMessages } 供调用方送 LLM。
|
|
476
|
+
* 截断/压缩改造 this.messages 的工作记忆,是"资源边界"职责的收敛点。
|
|
477
|
+
* 上下文规模上限由**有效窗口**(min(provider 窗口, 角色包 contextLimit))在截断层生效;
|
|
478
|
+
* 不再有「预算触顶即终止」路径 —— 终止职责归 stepBudget。 */
|
|
479
|
+
private _prepareContext;
|
|
480
|
+
/**
|
|
481
|
+
* 本迭代将因 ask_user 挂起(决策关口,与用户暂停同属挂起型气口)?
|
|
482
|
+
* 含 ask_user 且未超 askLimit、非工具屏蔽。SSOT:onPlanItemBoundary 的 planItemLog 排除判定
|
|
483
|
+
* 与 handleToolCalls 挂起检出共用同一谓词(防两处判定漂移)——收口验收:
|
|
484
|
+
* ask_user 挂起谓词字面全仓仅此一处。
|
|
485
|
+
* 注:边界处传 llmResult.toolCalls(原始集)、挂起检出传 effectiveToolCalls(toolStepLimit
|
|
486
|
+
* 截断后集);截断把 ask_user 裁掉的窗口 → 边界多跳一轮不记日志,安全向(少记而非错记)。
|
|
487
|
+
* askLimit 超限的 ask_user 走 executeToolCalls 拒绝([ASK_LIMIT]),迭代照常执行 → 不判挂起。
|
|
488
|
+
*/
|
|
489
|
+
private willSuspendForAsk;
|
|
490
|
+
/** 工具调用分支 + Reflection(子方法 2/3);ask_user 提问检出挂起(返回 'paused')。
|
|
491
|
+
* stepIndex = 本迭代序号(调用方算号传入),tool_start 发射时盖章(与 thought 同构,事实单点)。 */
|
|
492
|
+
private handleToolCalls;
|
|
132
493
|
/**
|
|
133
|
-
*
|
|
494
|
+
* ask_user 提问挂起(step 边界气口):把提问作为普通工具轮落地,挂起等用户作答。
|
|
134
495
|
*
|
|
135
|
-
*
|
|
136
|
-
*
|
|
137
|
-
*
|
|
138
|
-
*
|
|
139
|
-
*
|
|
140
|
-
*
|
|
141
|
-
*
|
|
142
|
-
* @returns true 表示输入被 block 已 yield done,调用方应 return;false 表示继续
|
|
496
|
+
* 与插话/暂停统一的「申请 → 气口生效」语义:
|
|
497
|
+
* - assistant(toolCalls) 结构完整入史(含 ask_user),不「撕掉」工具——OpenAI 兼容端要求
|
|
498
|
+
* assistant.tool_calls **逐条**有配对 tool 消息:ask 的结果由用户答案回填,同批的**非 ask**
|
|
499
|
+
* 调用补「未执行」占位(见方法内注释),整批闭合;
|
|
500
|
+
* - 解析各 ask_user 参数为结构化 AskQuestion,yield question_pending 供宿主渲染提问 UI;
|
|
501
|
+
* - yield paused 挂起(consumeExecutionStream 统一翻 PAUSED + 写 pauseMeta),
|
|
502
|
+
* 用户作答后宿主调 answerQuestion() 回填 tool 结果,再 continueAfterPause() 续跑。
|
|
143
503
|
*/
|
|
144
|
-
private
|
|
504
|
+
private handleAskUser;
|
|
145
505
|
/**
|
|
146
|
-
*
|
|
147
|
-
*
|
|
148
|
-
*
|
|
149
|
-
* - abort 检查
|
|
150
|
-
* - 上下文摘要 + 截断
|
|
151
|
-
* - LLM 调用(callLlmWithRetry)
|
|
152
|
-
* - LLM 中断处理
|
|
153
|
-
* - 分支路由:工具调用 → handleToolCalls;纯文本 → handleTextResponse
|
|
154
|
-
*
|
|
155
|
-
* @yields text / aborted / done(由子方法委托)
|
|
156
|
-
* @returns 'aborted' | 'done' | 'continue'(continue 表示继续下一轮迭代)
|
|
506
|
+
* 回答在途提问(宿主在用户作答后调用,随后 continueAfterPause() 续跑):
|
|
507
|
+
* 答案以 ask_user 工具的 tool result 回填(<tool_result> 包裹防注入,与 assistant.tool_calls 配对)。
|
|
508
|
+
* answers 与提问按序一对一;不足时复用最后一条/空串兜底。返回 false 表示无在途提问。
|
|
157
509
|
*/
|
|
158
|
-
|
|
510
|
+
answerQuestion(answers: readonly string[]): boolean;
|
|
159
511
|
/**
|
|
160
|
-
*
|
|
161
|
-
*
|
|
162
|
-
*
|
|
163
|
-
* - executeToolCalls 执行工具调用
|
|
164
|
-
* - abort 检查(工具执行中断)
|
|
165
|
-
* - Reflection:检查可重试错误,追加反思提示
|
|
166
|
-
*
|
|
167
|
-
* @yields aborted(工具执行中断时)
|
|
168
|
-
* @returns 'aborted' | 'continue'(continue 表示工具结果已回填,继续下一轮 LLM 调用)
|
|
512
|
+
* 取走最近一次已作答提问快照:runResume 落盘回答交互输入前调用,取走即清。
|
|
513
|
+
* 返回 undefined = 本次续跑非提问回答路径(补充输入 / 无快照残留)。快照为
|
|
514
|
+
* AskQuestion[](多 ask_user 轮整组),调用方按需取用(当前落盘语义取 questions[0])。
|
|
169
515
|
*/
|
|
170
|
-
|
|
516
|
+
takeAnsweredAsk(): AskQuestion[] | undefined;
|
|
171
517
|
/**
|
|
172
|
-
*
|
|
173
|
-
*
|
|
174
|
-
*
|
|
175
|
-
*
|
|
176
|
-
*
|
|
177
|
-
*
|
|
178
|
-
*
|
|
179
|
-
* @yields text(空响应兜底 / guardrail block/warn)/ done
|
|
180
|
-
* @returns 'done'(调用方收到后 return)
|
|
518
|
+
* 取消在途提问(宿主「跳过/取消提问」或提问超时时调用;
|
|
519
|
+
* runIterationLoop 续跑兜底也调用):
|
|
520
|
+
* 以占位结果回填,防 assistant.tool_calls 无配对 tool 消息(OpenAI 兼容端 400)。
|
|
521
|
+
* 与 answerQuestion 对称:同样转存提问快照到 lastAnsweredAsk——
|
|
522
|
+
* 超时路径(resumeExecution kind='timeout')经 runResume takeAnsweredAsk 随「未回答」
|
|
523
|
+
* 交互记录落盘 question/options,重放可渲染「问 + 未回答」行;跳过/兜底路径不消费
|
|
524
|
+
* 快照时残留仅进程内单 turn,无害(下次 answerQuestion 覆盖)。
|
|
181
525
|
*/
|
|
526
|
+
cancelAsk(): void;
|
|
527
|
+
/** 纯文本结束(子方法 3/3):push assistant 消息(含空响应兜底)并 yield done。
|
|
528
|
+
* 本方法只处理纯文本交付;提问暂停走 ask_user 工具通道。 */
|
|
182
529
|
private handleTextResponse;
|
|
183
530
|
/**
|
|
184
|
-
* 调用 LLM
|
|
531
|
+
* 调用 LLM(带指数退避重试,仅在流式输出前失败时重试;流式已开始则直接上抛,因用户已看到部分结果)。
|
|
185
532
|
*
|
|
186
|
-
*
|
|
187
|
-
* 流式已开始则直接向上抛出(用户已看到部分结果)。
|
|
188
|
-
*
|
|
189
|
-
* @param safeMessages - 截断后的消息数组
|
|
190
|
-
* @param chatOpts - LLM 调用选项
|
|
191
|
-
* @param signal - 可选的 AbortSignal
|
|
192
|
-
* @param iteration - 当前迭代次数(用于 tracing)
|
|
193
|
-
* @yields AgentChunk 文本片段
|
|
194
|
-
* @returns LLM 调用结果(fullContent + toolCalls + aborted 状态)
|
|
533
|
+
* 实现内聚于 `LlmCaller.callWithRetry`;此处保留委托壳。
|
|
195
534
|
*/
|
|
196
535
|
private callLlmWithRetry;
|
|
197
536
|
/**
|
|
198
|
-
*
|
|
199
|
-
*
|
|
200
|
-
* 遍历 LLM 返回的 toolCalls,逐个执行并收集结果。
|
|
201
|
-
* 工具执行异常会被捕获并转为结构化错误字符串回传给 LLM,
|
|
202
|
-
* 而非直接中断对话。
|
|
203
|
-
*
|
|
204
|
-
* @param toolCalls - LLM 返回的工具调用列表
|
|
205
|
-
* @param fullContent - LLM 返回的文本内容
|
|
206
|
-
* @param signal - 可选的 AbortSignal
|
|
207
|
-
* @yields AgentChunk 工具开始/结果片段
|
|
208
|
-
* @returns 执行结果(aborted 状态)
|
|
537
|
+
* 执行工具调用列表(并发执行,异常捕获后转为结构化错误串回传给 LLM,而非中断对话)。
|
|
538
|
+
* stepIndex = 本迭代序号(调用链逐级传入),tool_start 发射时盖章(与 thought 同构,事实单点)。
|
|
209
539
|
*/
|
|
210
540
|
private executeToolCalls;
|
|
211
541
|
/**
|
|
212
|
-
*
|
|
542
|
+
* 第二级压缩(LLM 主动触发兜底):把最早的 turn 或超大工具结果现场压成临时摘要替换。
|
|
213
543
|
*
|
|
214
|
-
*
|
|
215
|
-
*
|
|
216
|
-
* 工具卡住时 generator 永久挂起,导致 _chatBusy 锁泄漏、UI 全阻塞。
|
|
544
|
+
* 作用对象是尚无记忆摘要的东西(第一级替换只对已沉淀摘要的 turn 可用);压缩摘要是
|
|
545
|
+
* loop 内临时态(标记 executionTemp,下一轮 turn 入口即弃),不进记忆库。
|
|
217
546
|
*
|
|
218
|
-
*
|
|
219
|
-
*
|
|
220
|
-
*
|
|
221
|
-
* 让 executeToolCalls 不再 await 工具(工具仍在后台运行,但 generator 解除阻塞)
|
|
222
|
-
*
|
|
223
|
-
* 设计权衡:
|
|
224
|
-
* - 不改 toolExecutor 签名(82 处测试用例依赖此签名,保持向后兼容)
|
|
225
|
-
* - 不抛 AbortError(避免破坏 executeToolCalls 的 try/catch 错误回传 LLM 契约)
|
|
226
|
-
* - 返回错误字符串符合现有"工具失败回传 LLM"契约([ERR:TOOL:code] 前缀)
|
|
227
|
-
* - ABORTED 不进入 ToolErrorCode 体系(用户主动取消非工具失败,不触发 Reflection)
|
|
228
|
-
*
|
|
229
|
-
* @param name 工具名称
|
|
230
|
-
* @param args 工具参数 JSON 字符串
|
|
231
|
-
* @param signal 可选的 AbortSignal
|
|
232
|
-
* @returns 工具结果字符串,或 [ERR:TOOL:ABORTED] 表示被中断
|
|
547
|
+
* @param args 工具参数 JSON({ target: 'earliest_round' | 'largest_tool_result' })
|
|
548
|
+
* @param signal 中止信号
|
|
549
|
+
* @returns 回传给 LLM 的确认串(失败/无目标时返回提示,不抛错阻断工具链)
|
|
233
550
|
*/
|
|
234
|
-
private
|
|
551
|
+
private compressContext;
|
|
235
552
|
/**
|
|
236
|
-
*
|
|
237
|
-
*
|
|
238
|
-
* 职责:
|
|
239
|
-
* - startSpan / endSpan(工具执行 Span,并发时 span 时间重叠,可观测性改进)
|
|
240
|
-
* - raceToolWithSignal 竞争包裹(兼容 signal 中断,每个工具独立 race)
|
|
241
|
-
* - 异常捕获并转为结构化错误字符串([ERR:TOOL:code] 前缀,供 Reflection 解析)
|
|
242
|
-
*
|
|
243
|
-
* 不含职责(由 executeToolCalls 主循环控制,保证顺序确定):
|
|
244
|
-
* - yield tool_start / tool_result(事件顺序由主循环批量 yield 保证)
|
|
245
|
-
* - messages.push(消息顺序由主循环按原始顺序 push,确保 Reflection slice 正确)
|
|
246
|
-
* - metricToolCallCount / metricToolFailureCount(统计由主循环控制)
|
|
247
|
-
*
|
|
248
|
-
* 并发安全:本方法无共享状态,多个 executeOneTool 可同时执行。
|
|
249
|
-
* toolExecutor 内部无状态(纯分发 + 参数校验),天然支持并发调用。
|
|
250
|
-
*
|
|
251
|
-
* @param tc 单个工具调用描述(id + function.name + function.arguments)
|
|
252
|
-
* @param signal 可选的 AbortSignal
|
|
253
|
-
* @returns 工具结果字符串(成功)或 [ERR:TOOL:code] 错误字符串(失败)
|
|
553
|
+
* 定位当前触发输入(顶级锚点)之前最早的 turn;无旧轮次(新对话第一轮)返回 null
|
|
554
|
+
* (当前输入永不压缩——交软上限收尾而非压掉触发输入继续硬跑)。
|
|
254
555
|
*/
|
|
255
|
-
private
|
|
556
|
+
private findEarliestRound;
|
|
557
|
+
/** 定位最大的 tool 结果(超大 tool_result 的压缩目标) */
|
|
558
|
+
private findLargestToolResult;
|
|
559
|
+
/** 用 provider 把目标内容压成临时摘要(走 summary 路由,轻量模型优先;失败降级空串) */
|
|
560
|
+
private summarizeForCompression;
|
|
256
561
|
/**
|
|
257
|
-
* 构建 system prompt
|
|
562
|
+
* 构建 system prompt(装载 bootstrapMemories + 工具描述)
|
|
563
|
+
*
|
|
564
|
+
* 身份中性(architecture_philosophy §11「memora 不需要知道自己是谁」):
|
|
565
|
+
* 本函数**不注入任何引擎自称**——人格/身份由角色包 systemPromptPrefix 提供
|
|
566
|
+
* (AgentLoop 构造时 `prefix + buildSystemPrompt(...)` 拼接),此处只做
|
|
567
|
+
* 「设定装载 + 回应口径骨架 + 工具描述」,不出现 Memora 专名。
|
|
258
568
|
*/
|
|
259
569
|
private buildSystemPrompt;
|
|
570
|
+
/** 注入系统消息到消息数组(技能注入、角色切换等场景,动态注入上下文) */
|
|
571
|
+
injectSystemMessage(content: string): void;
|
|
260
572
|
/**
|
|
261
|
-
*
|
|
573
|
+
* 剔除文本工具调用骨架(SSOT 纪律的收口)。
|
|
262
574
|
*
|
|
263
|
-
*
|
|
264
|
-
*
|
|
575
|
+
* 返回语义:
|
|
576
|
+
* - 全文**不含**任何文本工具骨架标签 → `null`(正常路径,交付原文不动);
|
|
577
|
+
* - 含**任一**骨架标签(`<tool_call` / `<function=` / `<parameter` 及闭合)→ 剔除全部
|
|
578
|
+
* 骨架后返回字符串(可能为空串,代表「纯工具意图、无正文交付」)。
|
|
265
579
|
*
|
|
266
|
-
*
|
|
580
|
+
* 宽匹配 + 不校验闭合:针对未闭合/残缺骨架(测试样本即 `<function=list_dir</parameter>`)也能命中。
|
|
581
|
+
* 仅用于「文本出口已不宣告可调用通道」后的防御性收敛,正常模型不应触发。
|
|
267
582
|
*/
|
|
268
|
-
|
|
583
|
+
private stripToolIntentSkeleton;
|
|
269
584
|
/**
|
|
270
|
-
*
|
|
585
|
+
* 当前 provider 是否支持原生工具调用(OpenAI Function Calling tools 协议)。
|
|
271
586
|
*
|
|
272
|
-
*
|
|
273
|
-
*
|
|
274
|
-
*
|
|
587
|
+
* 读 provider 的互斥双能力位:
|
|
588
|
+
* - true → loop 走原生工具通道(列工具 + 传 tools)。
|
|
589
|
+
* - false → 工具通道不可用,须收起工具清单走显式回落(见 buildSystemPrompt / buildChatOptions)。
|
|
590
|
+
* provider 未配置(undefined)时按支持处理(默认 true,与存量「有工具集即传 tools」一致)。
|
|
275
591
|
*/
|
|
276
|
-
private
|
|
592
|
+
private toolCallingEnabled;
|
|
277
593
|
/**
|
|
278
|
-
*
|
|
279
|
-
*
|
|
280
|
-
* 将 toolDefinitions 转换为 OpenAI Function Calling 格式,
|
|
281
|
-
* 让 LLM 能通过标准协议发起 tool_call,而非文本模拟。
|
|
282
|
-
*
|
|
283
|
-
* 设计说明:
|
|
284
|
-
* `response_format` 约束的是最终响应体,而 `tool_calls` 是通过
|
|
285
|
-
* `tools` 参数触发的独立流式协议(SSE delta),两者不能并存
|
|
286
|
-
* (同时传入会导致 API 报错或行为未定义)。因此本方法只透传 tools
|
|
287
|
-
* 参数,不生成 `response_format: json_schema`。
|
|
594
|
+
* 当前 provider 是否支持结构化输出(response_format / JSON mode)。
|
|
288
595
|
*
|
|
289
|
-
*
|
|
290
|
-
*
|
|
291
|
-
* 强制 JSON、配置建议提取等),由调用方显式传入 response_format。
|
|
596
|
+
* 与 toolCallingEnabled 互斥:response_format 不能与 tools 同用(OpenAI 协议限制)。
|
|
597
|
+
* 作为「无原生工具能力」时的显式回落通道(产出机器可读 JSON,而非静默丢弃工具)。
|
|
292
598
|
*/
|
|
293
|
-
private
|
|
599
|
+
private structuredOutputEnabled;
|
|
294
600
|
/**
|
|
295
|
-
*
|
|
296
|
-
*
|
|
297
|
-
* 当宿主项目通过 agent.registerTool() 注册新工具后,
|
|
298
|
-
* 需要更新 system prompt 中的工具描述,让 LLM 能看到新工具。
|
|
299
|
-
* 重建 messages[0] 的 system prompt 内容。
|
|
601
|
+
* 解析「本轮可用工具集」——单一真源(SSOT)
|
|
300
602
|
*
|
|
301
|
-
*
|
|
603
|
+
* 工具可用性事实本来被写作两处(buildSystemPrompt 文本出口 + buildChatOptions 原生出口),
|
|
604
|
+
* 属「同语义多实现」带伤。搜索硬上限命中后两处都要剔除 web_search,故把排除谓词收口到本方法。
|
|
605
|
+
* 不修改 opts.toolDefinitions,仅按轮过滤,随 resetTurnState 自然恢复。
|
|
302
606
|
*/
|
|
303
|
-
|
|
607
|
+
private resolveActiveTools;
|
|
304
608
|
/**
|
|
305
|
-
*
|
|
609
|
+
* 构建 LLM 调用选项(互斥双能力位的确定性通道选择)。
|
|
306
610
|
*
|
|
307
|
-
*
|
|
308
|
-
*
|
|
309
|
-
*
|
|
611
|
+
* 通道取当前 provider 的能力位:
|
|
612
|
+
* - 支持原生工具调用(supportsToolCalling)→ 走 tools 原生 FC 通道(唯一可调用通道);
|
|
613
|
+
* - 否则若支持结构化输出(supportsStructuredOutput)→ 走 response_format(JSON mode 回落);
|
|
614
|
+
* - 两者皆否 → 不传任何通道(工具不可用,见 buildSystemPrompt 展示的显式回落告知,不静默)。
|
|
310
615
|
*
|
|
311
|
-
*
|
|
616
|
+
* 不传 response_format 的原因(既有纪律保留):它约束最终响应体,而 tool_calls 是通过
|
|
617
|
+
* tools 参数触发的独立流式协议,两者不能并存;此处仅在「无 tools 能力」时作为落回通道拉通。
|
|
312
618
|
*/
|
|
619
|
+
private buildChatOptions;
|
|
620
|
+
/** 刷新工具定义(registerTool 后调用),重建 system prompt 让 LLM 看到新工具 */
|
|
621
|
+
refreshToolDefinitions(toolDefinitions: ToolDefinition[]): void;
|
|
622
|
+
/** 运行时切换 LLM Provider(多 Provider 路由场景,后续调用使用新 Provider) */
|
|
313
623
|
setProvider(provider: LlmProvider): void;
|
|
314
624
|
/**
|
|
315
|
-
*
|
|
625
|
+
* 运行时更新 **provider 上下文窗口**(token)
|
|
316
626
|
*
|
|
317
|
-
*
|
|
318
|
-
*
|
|
627
|
+
* 与 setProvider 配套:模型热切换时同步窗口。本方法只记录 provider 原始声明值,
|
|
628
|
+
* 有效窗口由 #recomputeEffectiveWindow 按 min(provider 窗口, 角色包 contextLimit) 重算,
|
|
629
|
+
* 令截断 / 软上限 / 占用快照随新模型与当前角色策略调整。只改窗口数字,不重建对话/不触碰消息。
|
|
319
630
|
*
|
|
320
|
-
* @param
|
|
631
|
+
* @param tokens provider 声明的窗口 token 数
|
|
321
632
|
*/
|
|
322
|
-
|
|
633
|
+
setContextWindow(tokens: number): void;
|
|
634
|
+
/** 当前**有效上下文窗口** = min(provider 窗口, 角色包 contextLimit)(诊断 / 测试读取面)。 */
|
|
635
|
+
getEffectiveContextWindow(): number;
|
|
636
|
+
/** 刷新角色包 prompt(角色切换时只替换 prefix,保留 bootstrapMemories 与 toolDefinitions) */
|
|
637
|
+
refreshRolePackPrefix(newPrefix: string): void;
|
|
638
|
+
/** 从角色包策略更新 ChatOptions 覆盖项(temperature/outputLimit 等立即生效) */
|
|
639
|
+
setChatOptions(chatOptions: Partial<ChatOptions> | undefined): void;
|
|
323
640
|
/**
|
|
324
|
-
*
|
|
325
|
-
*
|
|
326
|
-
* 设定面板对 rule/skill 执行增删改后,调用此方法用最新的记忆数组
|
|
327
|
-
* 重建 system prompt 中的 bootstrap 段,使变更立即对当前会话生效。
|
|
328
|
-
*
|
|
329
|
-
* 与 refreshPersonaPrefix 的区别:
|
|
330
|
-
* - refreshPersonaPrefix 替换 systemPromptPrefix(角色 + 画像)
|
|
331
|
-
* - refreshBootstrapMemories 替换 bootstrapMemories(rule + skill)
|
|
332
|
-
*
|
|
333
|
-
* 调用链:ConfigManager.deleteRule/updateRule/deleteSkill
|
|
334
|
-
* → refreshBootstrapMemories 回调(assembler 注入)
|
|
335
|
-
* → loop.refreshBootstrapMemories(memories)
|
|
336
|
-
* → rebuildSystemMessage()
|
|
337
|
-
*
|
|
338
|
-
* @param memories 最新的 rule + skill 活跃记忆数组(由 ConfigManager.getBootstrapMemories 提供)
|
|
641
|
+
* 运行时更新 per-LLM 输出预算默认值(Provider 热切换配套,与 setContextWindow 同链路)。
|
|
642
|
+
* undefined = 清除(回服务端默认)。轮内下一迭代即用新值(请求参数非上下文结构,无一致性风险)。
|
|
339
643
|
*/
|
|
340
|
-
|
|
644
|
+
setDefaultMaxTokens(tokens: number | undefined): void;
|
|
341
645
|
/**
|
|
342
|
-
*
|
|
343
|
-
*
|
|
344
|
-
* 在角色前缀和 bootstrap 记忆之间插入情感描述文本。
|
|
345
|
-
* 与 refreshPersonaPrefix 独立——角色切换不会清除情感注入。
|
|
646
|
+
* 读取本轮请求体**实际**携带的 max_tokens(生效值,供宿主取证 / 展示)。
|
|
346
647
|
*
|
|
347
|
-
*
|
|
648
|
+
* 为何不交给宿主自行推算:生效值由 `buildChatOptions()` 单点裁决——per-LLM 配置与角色包
|
|
649
|
+
* act.outputLimit 取更小值、单侧缺位取另一侧;宿主侧重算等于复制规则、
|
|
650
|
+
* 制造第二真理源(真机教训:meta 记了用户配的 64000,实际发出的是角色包的 4096,
|
|
651
|
+
* 取证包把「配置意图」当成了「已生效事实」,由此得出过错误结论)。
|
|
348
652
|
*
|
|
349
|
-
* @
|
|
653
|
+
* @returns 生效的输出上限(token);undefined = 不传 max_tokens(回服务端默认)
|
|
350
654
|
*/
|
|
655
|
+
getEffectiveMaxTokens(): number | undefined;
|
|
656
|
+
/** 刷新 bootstrap 记忆段(设定面板对 rule/skill 增删改后用最新记忆重建 bootstrap 段)。
|
|
657
|
+
* 与 refreshRolePackPrefix 区别:后者替换 prefix(角色包 prompt),本方法替换 bootstrapMemories */
|
|
658
|
+
refreshBootstrapMemories(memories: Memory[]): void;
|
|
659
|
+
/** 注入情感基调到 system prompt(角色前缀与 bootstrap 记忆之间;与角色切换独立,切换不清除) */
|
|
351
660
|
injectAffect(affectString: string): void;
|
|
352
|
-
/**
|
|
353
|
-
* 重建 messages[0] 的 system prompt
|
|
354
|
-
*/
|
|
661
|
+
/** 重建 messages[0] 的 system prompt */
|
|
355
662
|
private rebuildSystemMessage;
|
|
663
|
+
/** 获取消息历史(用于持久化) */
|
|
664
|
+
getMessages(): readonly Message[];
|
|
356
665
|
/**
|
|
357
|
-
*
|
|
666
|
+
* 记录最近一次输入装配的上下文预算(prepare 期调用,预算可视化)。
|
|
667
|
+
* 只存最新一轮预算供指标快照透出,不跨轮累积。
|
|
358
668
|
*/
|
|
359
|
-
|
|
669
|
+
recordBudget(budget: ContextBudget): void;
|
|
360
670
|
/**
|
|
361
|
-
*
|
|
362
|
-
*
|
|
363
|
-
* 返回 LLM 调用、记忆召回、工具调用、上下文管理四个维度的累计指标。
|
|
364
|
-
* 衰减指标(decay)由 Agent 层填充,此处返回 null。
|
|
671
|
+
* 获取最近一轮输入装配的上下文预算(预算联动)
|
|
365
672
|
*
|
|
366
|
-
*
|
|
367
|
-
*
|
|
368
|
-
* @returns AgentMetrics 快照(decay 字段为 null,由 Agent 层填充)
|
|
673
|
+
* 供工具执行器在工具执行期读取剩余预算(search_project 预算下探)。
|
|
674
|
+
* 未 prepare 时返回 undefined(如纯工具单元测试场景)。
|
|
369
675
|
*/
|
|
370
|
-
|
|
676
|
+
getLastBudget(): ContextBudget | undefined;
|
|
371
677
|
/**
|
|
372
|
-
*
|
|
373
|
-
*
|
|
374
|
-
|
|
375
|
-
|
|
678
|
+
* 记录最近一次输入装配的上下文占用快照(prepare 期调用,预算可视化)。
|
|
679
|
+
* 存最新一轮真实用量供指标快照/输入区指示器透出,不跨轮累积。
|
|
680
|
+
*/
|
|
681
|
+
recordOccupancy(occupancy: ContextOccupancy): void;
|
|
682
|
+
/**
|
|
683
|
+
* 对话占用实时刷新(预算可视化 · 输入区常驻指示器)。
|
|
376
684
|
*
|
|
377
|
-
*
|
|
378
|
-
*
|
|
685
|
+
* occupancy 主体在 prepare 期 record(见 contextPreparer),但 prepare 发生在 assistant
|
|
686
|
+
* 生成前,故快照的 dialogue 段天然不含本轮 assistant、且单轮对话结束后不再刷新。
|
|
687
|
+
* 本方法在 user 消息落库 / assistant 落盘后以最新 this.messages 重算 dialogue 段:
|
|
688
|
+
* dialogueCount = user 消息数(计数标准:一个问答闭环=1,残缺回答如实记录)
|
|
689
|
+
* dialogueTokens = 全量 user+assistant 估算(容量诚实统计问答闭环总和)
|
|
690
|
+
* 其余段(rolePackBase/memory/inputAnchor/outputReserve)沿用 prepare 快照,不重算
|
|
691
|
+
* (守 SSOT:宿主只透传,内核单一真相源)。
|
|
692
|
+
* 幂等:无快照时 no-op(如首轮 prepare 尚未发生)。
|
|
379
693
|
*/
|
|
380
|
-
|
|
694
|
+
private refreshOccupancyDialogue;
|
|
695
|
+
/**
|
|
696
|
+
* 写入当前激活角色包底盘占用(system prompt 总体 token)。
|
|
697
|
+
* 装配 / 切换角色包时调用(早于 prepare),使冷启动 / 重启首屏即可显示真实占比;
|
|
698
|
+
* prepare 期 recordOccupancy 也以其实际注入值覆盖,口径一致(同一估算器)。
|
|
699
|
+
*/
|
|
700
|
+
setRolePackBaseTokens(tokens: number): void;
|
|
701
|
+
/** 读取当前激活角色包底盘占用(未确定时为 undefined,调用方降级处理) */
|
|
702
|
+
getRolePackBaseTokens(): number | undefined;
|
|
703
|
+
/**
|
|
704
|
+
* 获取 AgentLoop 运行时指标快照(纯只读、零副作用,适合宿主轮询构建监控面板)。
|
|
705
|
+
*/
|
|
706
|
+
getMetrics(): AgentMetrics;
|
|
707
|
+
/** 估算消息 token 数(CJK 感知,委托 ContextManager)——装配层/预算派生复用同一估算真理源 */
|
|
708
|
+
estimateTokens(messages: readonly Message[]): number;
|
|
709
|
+
/** 被替换轮 roundId 列表(第一级替换产物;装配层合并进 exclude 防其摘要被二次召回) */
|
|
710
|
+
getReplacedRoundIds(): readonly string[];
|
|
711
|
+
/** 当前工作记忆中实际保留的轮次 roundId 集合(装配 exclude 用)。
|
|
712
|
+
* 扫描视图内 user 消息自带 roundId(与 ReplaceRoundsStrategy.groupRounds 同源,
|
|
713
|
+
* 无外部序列/尾部对齐依赖)。覆盖截断重排后按重要性提炼保留的中间轮——其正文已在
|
|
714
|
+
* 视图,round-summary 须排除防与该正文双写;被完全裁掉的旧轮不在集合内,其摘要仍可召回。 */
|
|
715
|
+
getVisibleRoundIds(): ReadonlySet<string>;
|
|
716
|
+
/**
|
|
717
|
+
* 召回互斥排除集(memory-tool-recall-design §5.1):正文已不在眼前、但其摘要已在眼前的轮次。
|
|
718
|
+
*
|
|
719
|
+
* = 视图内轮次(`getVisibleRoundIds`,含截断后按重要性保留的中间轮)
|
|
720
|
+
* ∪ 已被第一级替换的轮次(`getReplacedRoundIds`,正文被换成了摘要,roundId 已不在 messages
|
|
721
|
+
* 但摘要已在上下文,故须另计——否则其 round-summary 会被二次召回重复返回)
|
|
722
|
+
* ∪ 当前在途轮次(`currentRoundId`,当轮 user 已落 store 但尚未进 messages 的窗口期)。
|
|
723
|
+
*
|
|
724
|
+
* **唯一真理源**:从 loop 的工作记忆视图派生(精确集合),不再用「最近 N 轮」代理量近似。
|
|
725
|
+
* 由装配期注入 `search_memories`(`toolExec.setExclusionRoundIdsProvider`)。
|
|
726
|
+
* 首轮若仍在视图内则已被覆盖;长会话首轮被裁掉时可另行显式计入(当前无消费者,未接)。
|
|
727
|
+
*/
|
|
728
|
+
getExclusionRoundIds(): ReadonlySet<string>;
|
|
729
|
+
/**
|
|
730
|
+
* 获取当前窗口中的完整对话消息(仅 user + assistant,排除 system/tool)。
|
|
731
|
+
* 供 contextPreparer 计量 fixed/query 模式下实际进窗的完整对话占用
|
|
732
|
+
* (区别于 hybrid 模式注入的最近轮次摘要块,见 getRecentHistoryWithinBudget)。
|
|
733
|
+
*/
|
|
734
|
+
getConversationMessages(): Array<{
|
|
381
735
|
role: 'user' | 'assistant';
|
|
382
736
|
content: string;
|
|
383
737
|
}>;
|
|
384
738
|
/**
|
|
385
|
-
*
|
|
386
|
-
*
|
|
387
|
-
*
|
|
388
|
-
* @param
|
|
739
|
+
* 按预算容量派生完整对话层轮次集合(动态轮数,role-pack-spec §C/§D)。
|
|
740
|
+
* 从最近往回塞到预算止,会话第一条问答闭环必然在场(次级锚点:默认在场,压缩可让位)。
|
|
741
|
+
*
|
|
742
|
+
* @param maxTokens 完整对话层预算(token,由上下文预算计算派生)
|
|
743
|
+
* @returns 注入的历史序列 + 最近轮数(供互斥 roundId 排除)+ 是否显式补了第一条
|
|
744
|
+
*/
|
|
745
|
+
getRecentHistoryWithinBudget(maxTokens: number): {
|
|
746
|
+
history: Array<{
|
|
747
|
+
role: 'user' | 'assistant';
|
|
748
|
+
content: string;
|
|
749
|
+
}>;
|
|
750
|
+
recentRoundCount: number;
|
|
751
|
+
firstRoundIncluded: boolean;
|
|
752
|
+
};
|
|
753
|
+
/** 获取当前轮次 ID(processUserInput 入口分配,多 iteration 共享),空串表示无活动轮次 */
|
|
754
|
+
getCurrentRoundId(): string;
|
|
755
|
+
/** 设置当前轮次 ID(appendUser 在 processUserInput 之前调用,故需提前生成供 RoundSummaryGenerator 使用) */
|
|
756
|
+
setCurrentRoundId(roundId: string): void;
|
|
757
|
+
/** 分配新轮次 ID(SSOT:prepare 提前生成与 processUserInput 回退生成共用唯一出处,避免 round-模板串重复漂移) */
|
|
758
|
+
allocRoundId(): string;
|
|
759
|
+
/**
|
|
760
|
+
* 恢复历史消息(跳过 system,只恢复 user/assistant/tool;传空数组=清空工作记忆,保留 system prompt)
|
|
761
|
+
*
|
|
762
|
+
* 历史集合被整体替换是上下文摘要缓存的失效点(见 ContextManager.resetSummary 注释:
|
|
763
|
+
* 若新历史更短,长度差反推会误判"未过期",把上一段会话的陈旧摘要注入新上下文)。
|
|
764
|
+
* 故整体替换(清空 / 恢复检查点)经此入口时统一作废摘要缓存——调用方无需各自记得调 reset,
|
|
765
|
+
* 失效动作与替换动作同处(SSOT)。
|
|
389
766
|
*/
|
|
390
767
|
restoreHistory(historyMessages: readonly Message[]): void;
|
|
768
|
+
/** 作废 loop 级派生缓存(会话替换 chokepoint 调用);只暴露行为不暴露 ContextManager,保持边界有界 */
|
|
769
|
+
resetContextSummary(): void;
|
|
770
|
+
/** 清理上一轮注入的临时 system 消息(每轮 chat() 前调用),防 recall/技能/截断注入堆积成冗余指令 */
|
|
771
|
+
cleanTemporarySystemMessages(): void;
|
|
391
772
|
/**
|
|
392
|
-
*
|
|
773
|
+
* 清理执行期临时 system 消息(self-review / reflection / duplicate-warning / metaNote)。
|
|
393
774
|
*
|
|
394
|
-
*
|
|
395
|
-
*
|
|
396
|
-
*
|
|
397
|
-
*
|
|
775
|
+
* 每轮闭环入口执行一次(processUserInput / continueAfterPause),清掉上一轮
|
|
776
|
+
* 执行中产生、下一轮不应再见的残留。与 prepare 阶段的装配性注入区分:装配注入(召回、
|
|
777
|
+
* 最近对话)不在此集合,保留到 prepare 重建。replaceContext 走浅拷贝保留消息引用,
|
|
778
|
+
* 故按引用过滤是安全且幂等的。
|
|
398
779
|
*/
|
|
399
|
-
|
|
780
|
+
private cleanExecutionTemporary;
|
|
781
|
+
/** 追加一条 user 消息(统一 <user_input> 标签包裹,防注入攻击);附当前轮次 roundId(替换式压缩单一真理源) */
|
|
782
|
+
private appendUserMessage;
|
|
783
|
+
/** 追加一条 system 消息(技能注入、召回、任务表、自审查提示等通用注入通道) */
|
|
784
|
+
private appendSystemMessage;
|
|
785
|
+
/** 会议轮判据(裁决证据用,操作化单点):任务表 active 任务项声明 rolePack = 会议逐项切换生效中 */
|
|
786
|
+
private isMeetingRound;
|
|
787
|
+
/** 追加一条 assistant 纯文本消息(正常 LLM 回复或兜底文本);附当前轮次 roundId */
|
|
788
|
+
private appendAssistantText;
|
|
789
|
+
/** 追加一条带 toolCalls 的 assistant 消息(executeToolCalls 前导);附当前轮次 roundId */
|
|
790
|
+
private appendAssistantToolCall;
|
|
400
791
|
/**
|
|
401
|
-
*
|
|
792
|
+
* 追加一条 tool 消息(loop **唯一** tool 写点:工具结果 / `[ASK_ANSWER]` / `[ASK_ABORTED]` /
|
|
793
|
+
* `[ASK_SUSPENDED]` / `[TOOL_ABORTED]` 五处皆经此)。
|
|
402
794
|
*
|
|
403
|
-
*
|
|
404
|
-
*
|
|
795
|
+
* **入口关**(大文本统一通道 §6.2):单条内容超 `SINGLE_TOOL_RESULT_MAX_TOKENS` → 原文落盘,
|
|
796
|
+
* 上下文只留「路径 + 预览 + 续读提示」。收口在此而非 `_processToolResults`:后者只覆盖工具结果,
|
|
797
|
+
* 会漏掉 `answerQuestion` 的 `[ASK_ANSWER]` —— 用户被问「请提供需求文档」后直接贴长文即可超阈。
|
|
405
798
|
*/
|
|
406
|
-
private
|
|
799
|
+
private appendToolMessage;
|
|
407
800
|
/**
|
|
408
|
-
*
|
|
801
|
+
* 情报区写回(remember_intel 工具实现,CLoop 拦截执行):把 LLM 私有笔记追加到情报区。
|
|
802
|
+
*
|
|
803
|
+
* 累积为 `intelNote`(跨 turn 自持);超 `MAX_INTEL_PREFIX_LEN` 裁最旧(保留最新)。返回给 LLM 的
|
|
804
|
+
* ack **不回填 note 原文**(工具结果只回「已记录」),note 原文只进情报区 system 消息 → 不在用户流。
|
|
409
805
|
*
|
|
410
|
-
*
|
|
411
|
-
*
|
|
806
|
+
* @param args remember_intel 的 JSON arguments
|
|
807
|
+
* @returns 简短 ack(作为该工具调用的 tool 结果)
|
|
412
808
|
*/
|
|
413
|
-
private
|
|
809
|
+
private handleRememberIntel;
|
|
414
810
|
/**
|
|
415
|
-
*
|
|
811
|
+
* 每轮装配把情报区注入为**单条尾部私有 system 消息**。
|
|
812
|
+
*
|
|
813
|
+
* - 复用 Message[] 视图:不新增对象,情报区 = 一条 system 消息正文;
|
|
814
|
+
* - 已存在则更新原文(保持单条),被截断删除则重建 → 参与 `truncateMessages` 尾部淘汰(B 语义);
|
|
815
|
+
* - 非 executionTemp → 跨 turn 自持(每轮 `_prepareContext` 注入最新版)。
|
|
816
|
+
*
|
|
817
|
+
* **归属注**:对已存在消息的 `existing.content = ...` 属**单条尾部私有消息的幂等刷新**(同
|
|
818
|
+
* `ResultReplacement` 只改 content),**不是装配重排**——不违背 loop「只追加、不重装配」的编排原则。
|
|
819
|
+
*
|
|
820
|
+
* **时序注(诚实声明)**:`_prepareContext` 先算 `safeMessages`、后注入本消息——
|
|
821
|
+
* 在**截断轮**(截断重排后安全快照 ≠ this.messages)里,本轮被发送的 `safeMessages` 不含本情报区,
|
|
822
|
+
* 下一轮 `_prepareContext` 重算后才可见(瞬时,非死锁)。此与 search 收敛提示 / taskTable 等所有
|
|
823
|
+
* 既有动态注入提示的时序一致(库级既有行为),非本机制特例。
|
|
416
824
|
*/
|
|
417
|
-
private
|
|
825
|
+
private injectIntelNote;
|
|
418
826
|
/**
|
|
419
|
-
*
|
|
827
|
+
* 缓存条目对应的工具结果是否**仍在当前上下文中** —— 防重拦截的前提(调用点见 handleToolCalls)。
|
|
828
|
+
*
|
|
829
|
+
* 三道判据全过才算「在」:① 条目带 toolCallId 与指纹;② `this.messages` 中仍有该 toolCallId 的
|
|
830
|
+
* tool 消息;③ 其内容指纹与记录一致(内容未被压缩链替换成 `[Previous: used x]` 占位符)。
|
|
831
|
+
*
|
|
832
|
+
* **保守方向:宁可放行,不可误拦。** 找不到消息 / 指纹不符 / 条目缺元信息 → 一律 false(放行)。
|
|
833
|
+
* 误放行的代价是「多读一次」;误拦的代价是「内容已不在手上却读不回来 = 死锁」——两者不对称。
|
|
834
|
+
*
|
|
835
|
+
* 注:超阈结果经入口关落盘后,上下文里留的是「路径 + 预览」,与记录指纹(包裹后的原文)不符
|
|
836
|
+
* → 判为「不在」,重读放行。这是正确语义:原文确实已不在上下文中。
|
|
420
837
|
*/
|
|
421
|
-
private
|
|
838
|
+
private isCachedResultStillInContext;
|
|
839
|
+
/** 整体替换执行上下文(截断落盘 / 恢复历史 / 装配重排:传入的数组已是完整上下文) */
|
|
840
|
+
private replaceContext;
|
|
841
|
+
/** 处理工具执行结果:push tool 消息 + 统计失败数 */
|
|
842
|
+
private _processToolResults;
|
|
422
843
|
}
|
|
423
844
|
//# sourceMappingURL=loop.d.ts.map
|