@lingxiao-office/sdk 1.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/dist/agents/AgentCompletionNoteWriter.d.ts +20 -0
- package/dist/agents/AgentCompletionNoteWriter.d.ts.map +1 -0
- package/dist/agents/AgentCompletionNoteWriter.js +26 -0
- package/dist/agents/AgentCompletionNoteWriter.js.map +1 -0
- package/dist/agents/AgentContextController.d.ts +14 -0
- package/dist/agents/AgentContextController.d.ts.map +1 -0
- package/dist/agents/AgentContextController.js +50 -0
- package/dist/agents/AgentContextController.js.map +1 -0
- package/dist/agents/AgentDefinitionService.d.ts +79 -0
- package/dist/agents/AgentDefinitionService.d.ts.map +1 -0
- package/dist/agents/AgentDefinitionService.js +295 -0
- package/dist/agents/AgentDefinitionService.js.map +1 -0
- package/dist/agents/AgentExecutionResult.d.ts +68 -0
- package/dist/agents/AgentExecutionResult.d.ts.map +1 -0
- package/dist/agents/AgentExecutionResult.js +81 -0
- package/dist/agents/AgentExecutionResult.js.map +1 -0
- package/dist/agents/AgentInterventionHandler.d.ts +33 -0
- package/dist/agents/AgentInterventionHandler.d.ts.map +1 -0
- package/dist/agents/AgentInterventionHandler.js +58 -0
- package/dist/agents/AgentInterventionHandler.js.map +1 -0
- package/dist/agents/AgentMessageHistory.d.ts +27 -0
- package/dist/agents/AgentMessageHistory.d.ts.map +1 -0
- package/dist/agents/AgentMessageHistory.js +43 -0
- package/dist/agents/AgentMessageHistory.js.map +1 -0
- package/dist/agents/AgentPoolRuntime.d.ts +647 -0
- package/dist/agents/AgentPoolRuntime.d.ts.map +1 -0
- package/dist/agents/AgentPoolRuntime.js +1713 -0
- package/dist/agents/AgentPoolRuntime.js.map +1 -0
- package/dist/agents/AgentRoundExecutor.d.ts +56 -0
- package/dist/agents/AgentRoundExecutor.d.ts.map +1 -0
- package/dist/agents/AgentRoundExecutor.js +116 -0
- package/dist/agents/AgentRoundExecutor.js.map +1 -0
- package/dist/agents/AgentRuntimeUtilities.d.ts +14 -0
- package/dist/agents/AgentRuntimeUtilities.d.ts.map +1 -0
- package/dist/agents/AgentRuntimeUtilities.js +169 -0
- package/dist/agents/AgentRuntimeUtilities.js.map +1 -0
- package/dist/agents/AutonomyDecisionEngine.d.ts +20 -0
- package/dist/agents/AutonomyDecisionEngine.d.ts.map +1 -0
- package/dist/agents/AutonomyDecisionEngine.js +150 -0
- package/dist/agents/AutonomyDecisionEngine.js.map +1 -0
- package/dist/agents/BaseAgentRuntime.d.ts +509 -0
- package/dist/agents/BaseAgentRuntime.d.ts.map +1 -0
- package/dist/agents/BaseAgentRuntime.js +3280 -0
- package/dist/agents/BaseAgentRuntime.js.map +1 -0
- package/dist/agents/BlockedAgingPolicy.d.ts +3 -0
- package/dist/agents/BlockedAgingPolicy.d.ts.map +1 -0
- package/dist/agents/BlockedAgingPolicy.js +3 -0
- package/dist/agents/BlockedAgingPolicy.js.map +1 -0
- package/dist/agents/DispatchDecisionCoordinator.d.ts +98 -0
- package/dist/agents/DispatchDecisionCoordinator.d.ts.map +1 -0
- package/dist/agents/DispatchDecisionCoordinator.js +388 -0
- package/dist/agents/DispatchDecisionCoordinator.js.map +1 -0
- package/dist/agents/IntentClassifier.d.ts +19 -0
- package/dist/agents/IntentClassifier.d.ts.map +1 -0
- package/dist/agents/IntentClassifier.js +176 -0
- package/dist/agents/IntentClassifier.js.map +1 -0
- package/dist/agents/LeaderAgent.d.ts +752 -0
- package/dist/agents/LeaderAgent.d.ts.map +1 -0
- package/dist/agents/LeaderAgent.js +3511 -0
- package/dist/agents/LeaderAgent.js.map +1 -0
- package/dist/agents/LeaderBlackboard.d.ts +177 -0
- package/dist/agents/LeaderBlackboard.d.ts.map +1 -0
- package/dist/agents/LeaderBlackboard.js +800 -0
- package/dist/agents/LeaderBlackboard.js.map +1 -0
- package/dist/agents/LeaderDirectTools.d.ts +66 -0
- package/dist/agents/LeaderDirectTools.d.ts.map +1 -0
- package/dist/agents/LeaderDirectTools.js +124 -0
- package/dist/agents/LeaderDirectTools.js.map +1 -0
- package/dist/agents/LeaderExecutionController.d.ts +102 -0
- package/dist/agents/LeaderExecutionController.d.ts.map +1 -0
- package/dist/agents/LeaderExecutionController.js +260 -0
- package/dist/agents/LeaderExecutionController.js.map +1 -0
- package/dist/agents/LeaderPermissionManager.d.ts +117 -0
- package/dist/agents/LeaderPermissionManager.d.ts.map +1 -0
- package/dist/agents/LeaderPermissionManager.js +455 -0
- package/dist/agents/LeaderPermissionManager.js.map +1 -0
- package/dist/agents/LeaderProgressInvariant.d.ts +174 -0
- package/dist/agents/LeaderProgressInvariant.d.ts.map +1 -0
- package/dist/agents/LeaderProgressInvariant.js +479 -0
- package/dist/agents/LeaderProgressInvariant.js.map +1 -0
- package/dist/agents/LeaderSupervisionCoordinator.d.ts +109 -0
- package/dist/agents/LeaderSupervisionCoordinator.d.ts.map +1 -0
- package/dist/agents/LeaderSupervisionCoordinator.js +492 -0
- package/dist/agents/LeaderSupervisionCoordinator.js.map +1 -0
- package/dist/agents/LeaderSupervisionPolicy.d.ts +52 -0
- package/dist/agents/LeaderSupervisionPolicy.d.ts.map +1 -0
- package/dist/agents/LeaderSupervisionPolicy.js +130 -0
- package/dist/agents/LeaderSupervisionPolicy.js.map +1 -0
- package/dist/agents/LeaderTools.d.ts +169 -0
- package/dist/agents/LeaderTools.d.ts.map +1 -0
- package/dist/agents/LeaderTools.js +1693 -0
- package/dist/agents/LeaderTools.js.map +1 -0
- package/dist/agents/LeaderWorkOrchestrator.d.ts +187 -0
- package/dist/agents/LeaderWorkOrchestrator.d.ts.map +1 -0
- package/dist/agents/LeaderWorkOrchestrator.js +554 -0
- package/dist/agents/LeaderWorkOrchestrator.js.map +1 -0
- package/dist/agents/LlmGuard.d.ts +160 -0
- package/dist/agents/LlmGuard.d.ts.map +1 -0
- package/dist/agents/LlmGuard.js +727 -0
- package/dist/agents/LlmGuard.js.map +1 -0
- package/dist/agents/OrchestrationRuntime.d.ts +50 -0
- package/dist/agents/OrchestrationRuntime.d.ts.map +1 -0
- package/dist/agents/OrchestrationRuntime.js +436 -0
- package/dist/agents/OrchestrationRuntime.js.map +1 -0
- package/dist/agents/ProjectControlService.d.ts +18 -0
- package/dist/agents/ProjectControlService.d.ts.map +1 -0
- package/dist/agents/ProjectControlService.js +99 -0
- package/dist/agents/ProjectControlService.js.map +1 -0
- package/dist/agents/RoleCapabilityModel.d.ts +125 -0
- package/dist/agents/RoleCapabilityModel.d.ts.map +1 -0
- package/dist/agents/RoleCapabilityModel.js +303 -0
- package/dist/agents/RoleCapabilityModel.js.map +1 -0
- package/dist/agents/RoleRegistry.d.ts +92 -0
- package/dist/agents/RoleRegistry.d.ts.map +1 -0
- package/dist/agents/RoleRegistry.js +209 -0
- package/dist/agents/RoleRegistry.js.map +1 -0
- package/dist/agents/TaskClassifier.d.ts +34 -0
- package/dist/agents/TaskClassifier.d.ts.map +1 -0
- package/dist/agents/TaskClassifier.js +132 -0
- package/dist/agents/TaskClassifier.js.map +1 -0
- package/dist/agents/TeamSynchronizer.d.ts +113 -0
- package/dist/agents/TeamSynchronizer.d.ts.map +1 -0
- package/dist/agents/TeamSynchronizer.js +250 -0
- package/dist/agents/TeamSynchronizer.js.map +1 -0
- package/dist/agents/UnifiedScheduler.d.ts +111 -0
- package/dist/agents/UnifiedScheduler.d.ts.map +1 -0
- package/dist/agents/UnifiedScheduler.js +246 -0
- package/dist/agents/UnifiedScheduler.js.map +1 -0
- package/dist/agents/WorkerDbClosedClassification.d.ts +51 -0
- package/dist/agents/WorkerDbClosedClassification.d.ts.map +1 -0
- package/dist/agents/WorkerDbClosedClassification.js +59 -0
- package/dist/agents/WorkerDbClosedClassification.js.map +1 -0
- package/dist/agents/WorkerFlushRegistry.d.ts +15 -0
- package/dist/agents/WorkerFlushRegistry.d.ts.map +1 -0
- package/dist/agents/WorkerFlushRegistry.js +33 -0
- package/dist/agents/WorkerFlushRegistry.js.map +1 -0
- package/dist/agents/WorkerProcessEntry.d.ts +12 -0
- package/dist/agents/WorkerProcessEntry.d.ts.map +1 -0
- package/dist/agents/WorkerProcessEntry.js +565 -0
- package/dist/agents/WorkerProcessEntry.js.map +1 -0
- package/dist/agents/WorkerTaskAgent.d.ts +46 -0
- package/dist/agents/WorkerTaskAgent.d.ts.map +1 -0
- package/dist/agents/WorkerTaskAgent.js +114 -0
- package/dist/agents/WorkerTaskAgent.js.map +1 -0
- package/dist/agents/agentP0Message.d.ts +42 -0
- package/dist/agents/agentP0Message.d.ts.map +1 -0
- package/dist/agents/agentP0Message.js +48 -0
- package/dist/agents/agentP0Message.js.map +1 -0
- package/dist/agents/errors/TimeoutError.d.ts +12 -0
- package/dist/agents/errors/TimeoutError.d.ts.map +1 -0
- package/dist/agents/errors/TimeoutError.js +20 -0
- package/dist/agents/errors/TimeoutError.js.map +1 -0
- package/dist/agents/external/ExternalAgentOrphans.d.ts +16 -0
- package/dist/agents/external/ExternalAgentOrphans.d.ts.map +1 -0
- package/dist/agents/external/ExternalAgentOrphans.js +95 -0
- package/dist/agents/external/ExternalAgentOrphans.js.map +1 -0
- package/dist/agents/external/ExternalAgentRunner.d.ts +78 -0
- package/dist/agents/external/ExternalAgentRunner.d.ts.map +1 -0
- package/dist/agents/external/ExternalAgentRunner.js +671 -0
- package/dist/agents/external/ExternalAgentRunner.js.map +1 -0
- package/dist/agents/external/availability.d.ts +16 -0
- package/dist/agents/external/availability.d.ts.map +1 -0
- package/dist/agents/external/availability.js +43 -0
- package/dist/agents/external/availability.js.map +1 -0
- package/dist/agents/external/completionReport.d.ts +17 -0
- package/dist/agents/external/completionReport.d.ts.map +1 -0
- package/dist/agents/external/completionReport.js +167 -0
- package/dist/agents/external/completionReport.js.map +1 -0
- package/dist/agents/external/drivers/ClaudeCodeDriver.d.ts +9 -0
- package/dist/agents/external/drivers/ClaudeCodeDriver.d.ts.map +1 -0
- package/dist/agents/external/drivers/ClaudeCodeDriver.js +210 -0
- package/dist/agents/external/drivers/ClaudeCodeDriver.js.map +1 -0
- package/dist/agents/external/drivers/CodexDriver.d.ts +9 -0
- package/dist/agents/external/drivers/CodexDriver.d.ts.map +1 -0
- package/dist/agents/external/drivers/CodexDriver.js +184 -0
- package/dist/agents/external/drivers/CodexDriver.js.map +1 -0
- package/dist/agents/external/lineReader.d.ts +10 -0
- package/dist/agents/external/lineReader.d.ts.map +1 -0
- package/dist/agents/external/lineReader.js +30 -0
- package/dist/agents/external/lineReader.js.map +1 -0
- package/dist/agents/external/modelResolver.d.ts +5 -0
- package/dist/agents/external/modelResolver.d.ts.map +1 -0
- package/dist/agents/external/modelResolver.js +87 -0
- package/dist/agents/external/modelResolver.js.map +1 -0
- package/dist/agents/external/promptBuilder.d.ts +3 -0
- package/dist/agents/external/promptBuilder.d.ts.map +1 -0
- package/dist/agents/external/promptBuilder.js +39 -0
- package/dist/agents/external/promptBuilder.js.map +1 -0
- package/dist/agents/external/types.d.ts +131 -0
- package/dist/agents/external/types.d.ts.map +1 -0
- package/dist/agents/external/types.js +2 -0
- package/dist/agents/external/types.js.map +1 -0
- package/dist/agents/leader/LeaderContextBuilder.d.ts +155 -0
- package/dist/agents/leader/LeaderContextBuilder.d.ts.map +1 -0
- package/dist/agents/leader/LeaderContextBuilder.js +629 -0
- package/dist/agents/leader/LeaderContextBuilder.js.map +1 -0
- package/dist/agents/leader/LeaderLlmSession.d.ts +11 -0
- package/dist/agents/leader/LeaderLlmSession.d.ts.map +1 -0
- package/dist/agents/leader/LeaderLlmSession.js +17 -0
- package/dist/agents/leader/LeaderLlmSession.js.map +1 -0
- package/dist/agents/leader/LeaderMetaToolRegistry.d.ts +15 -0
- package/dist/agents/leader/LeaderMetaToolRegistry.d.ts.map +1 -0
- package/dist/agents/leader/LeaderMetaToolRegistry.js +73 -0
- package/dist/agents/leader/LeaderMetaToolRegistry.js.map +1 -0
- package/dist/agents/leader/LeaderStreamBuffer.d.ts +15 -0
- package/dist/agents/leader/LeaderStreamBuffer.d.ts.map +1 -0
- package/dist/agents/leader/LeaderStreamBuffer.js +19 -0
- package/dist/agents/leader/LeaderStreamBuffer.js.map +1 -0
- package/dist/agents/leader/LeaderThinkingLoop.d.ts +239 -0
- package/dist/agents/leader/LeaderThinkingLoop.d.ts.map +1 -0
- package/dist/agents/leader/LeaderThinkingLoop.js +950 -0
- package/dist/agents/leader/LeaderThinkingLoop.js.map +1 -0
- package/dist/agents/leader/LeaderToolDispatch.d.ts +48 -0
- package/dist/agents/leader/LeaderToolDispatch.d.ts.map +1 -0
- package/dist/agents/leader/LeaderToolDispatch.js +337 -0
- package/dist/agents/leader/LeaderToolDispatch.js.map +1 -0
- package/dist/agents/leader/LeaderToolFailure.d.ts +22 -0
- package/dist/agents/leader/LeaderToolFailure.d.ts.map +1 -0
- package/dist/agents/leader/LeaderToolFailure.js +25 -0
- package/dist/agents/leader/LeaderToolFailure.js.map +1 -0
- package/dist/agents/leader/LeaderToolGates.d.ts +131 -0
- package/dist/agents/leader/LeaderToolGates.d.ts.map +1 -0
- package/dist/agents/leader/LeaderToolGates.js +290 -0
- package/dist/agents/leader/LeaderToolGates.js.map +1 -0
- package/dist/agents/leader/artifactContent.d.ts +38 -0
- package/dist/agents/leader/artifactContent.d.ts.map +1 -0
- package/dist/agents/leader/artifactContent.js +101 -0
- package/dist/agents/leader/artifactContent.js.map +1 -0
- package/dist/agents/leader/builtinRoles.d.ts +36 -0
- package/dist/agents/leader/builtinRoles.d.ts.map +1 -0
- package/dist/agents/leader/builtinRoles.js +41 -0
- package/dist/agents/leader/builtinRoles.js.map +1 -0
- package/dist/agents/leader/contextLimit.d.ts +25 -0
- package/dist/agents/leader/contextLimit.d.ts.map +1 -0
- package/dist/agents/leader/contextLimit.js +24 -0
- package/dist/agents/leader/contextLimit.js.map +1 -0
- package/dist/agents/leader/contextMemory.d.ts +19 -0
- package/dist/agents/leader/contextMemory.d.ts.map +1 -0
- package/dist/agents/leader/contextMemory.js +18 -0
- package/dist/agents/leader/contextMemory.js.map +1 -0
- package/dist/agents/leader/conversationBuffer.d.ts +23 -0
- package/dist/agents/leader/conversationBuffer.d.ts.map +1 -0
- package/dist/agents/leader/conversationBuffer.js +42 -0
- package/dist/agents/leader/conversationBuffer.js.map +1 -0
- package/dist/agents/leader/dynamicContext.d.ts +23 -0
- package/dist/agents/leader/dynamicContext.d.ts.map +1 -0
- package/dist/agents/leader/dynamicContext.js +51 -0
- package/dist/agents/leader/dynamicContext.js.map +1 -0
- package/dist/agents/leader/p0Message.d.ts +154 -0
- package/dist/agents/leader/p0Message.d.ts.map +1 -0
- package/dist/agents/leader/p0Message.js +229 -0
- package/dist/agents/leader/p0Message.js.map +1 -0
- package/dist/agents/leader/progressReport.d.ts +33 -0
- package/dist/agents/leader/progressReport.d.ts.map +1 -0
- package/dist/agents/leader/progressReport.js +59 -0
- package/dist/agents/leader/progressReport.js.map +1 -0
- package/dist/agents/leader/systemPrompt.d.ts +32 -0
- package/dist/agents/leader/systemPrompt.d.ts.map +1 -0
- package/dist/agents/leader/systemPrompt.js +32 -0
- package/dist/agents/leader/systemPrompt.js.map +1 -0
- package/dist/agents/leader/tools/LeaderAgentControlTools.d.ts +62 -0
- package/dist/agents/leader/tools/LeaderAgentControlTools.d.ts.map +1 -0
- package/dist/agents/leader/tools/LeaderAgentControlTools.js +619 -0
- package/dist/agents/leader/tools/LeaderAgentControlTools.js.map +1 -0
- package/dist/agents/leader/tools/LeaderTaskPlanningTools.d.ts +54 -0
- package/dist/agents/leader/tools/LeaderTaskPlanningTools.d.ts.map +1 -0
- package/dist/agents/leader/tools/LeaderTaskPlanningTools.js +1353 -0
- package/dist/agents/leader/tools/LeaderTaskPlanningTools.js.map +1 -0
- package/dist/agents/leader/userContent.d.ts +15 -0
- package/dist/agents/leader/userContent.d.ts.map +1 -0
- package/dist/agents/leader/userContent.js +50 -0
- package/dist/agents/leader/userContent.js.map +1 -0
- package/dist/agents/leader/workerCompletionFormatter.d.ts +48 -0
- package/dist/agents/leader/workerCompletionFormatter.d.ts.map +1 -0
- package/dist/agents/leader/workerCompletionFormatter.js +53 -0
- package/dist/agents/leader/workerCompletionFormatter.js.map +1 -0
- package/dist/agents/messageMemoryBudget.d.ts +41 -0
- package/dist/agents/messageMemoryBudget.d.ts.map +1 -0
- package/dist/agents/messageMemoryBudget.js +91 -0
- package/dist/agents/messageMemoryBudget.js.map +1 -0
- package/dist/agents/office/OfficeModeProtocol.d.ts +3 -0
- package/dist/agents/office/OfficeModeProtocol.d.ts.map +1 -0
- package/dist/agents/office/OfficeModeProtocol.js +111 -0
- package/dist/agents/office/OfficeModeProtocol.js.map +1 -0
- package/dist/agents/pool/AgentPoolBroadcast.d.ts +25 -0
- package/dist/agents/pool/AgentPoolBroadcast.d.ts.map +1 -0
- package/dist/agents/pool/AgentPoolBroadcast.js +88 -0
- package/dist/agents/pool/AgentPoolBroadcast.js.map +1 -0
- package/dist/agents/pool/AgentPoolCompletionPayload.d.ts +17 -0
- package/dist/agents/pool/AgentPoolCompletionPayload.d.ts.map +1 -0
- package/dist/agents/pool/AgentPoolCompletionPayload.js +2 -0
- package/dist/agents/pool/AgentPoolCompletionPayload.js.map +1 -0
- package/dist/agents/pool/AgentPoolEvents.d.ts +20 -0
- package/dist/agents/pool/AgentPoolEvents.d.ts.map +1 -0
- package/dist/agents/pool/AgentPoolEvents.js +35 -0
- package/dist/agents/pool/AgentPoolEvents.js.map +1 -0
- package/dist/agents/pool/FaultRecovery.d.ts +106 -0
- package/dist/agents/pool/FaultRecovery.d.ts.map +1 -0
- package/dist/agents/pool/FaultRecovery.js +290 -0
- package/dist/agents/pool/FaultRecovery.js.map +1 -0
- package/dist/agents/pool/RemoteDispatchCoordinator.d.ts +63 -0
- package/dist/agents/pool/RemoteDispatchCoordinator.d.ts.map +1 -0
- package/dist/agents/pool/RemoteDispatchCoordinator.js +127 -0
- package/dist/agents/pool/RemoteDispatchCoordinator.js.map +1 -0
- package/dist/agents/pool/SlotScheduler.d.ts +83 -0
- package/dist/agents/pool/SlotScheduler.d.ts.map +1 -0
- package/dist/agents/pool/SlotScheduler.js +292 -0
- package/dist/agents/pool/SlotScheduler.js.map +1 -0
- package/dist/agents/pool/WorkerEventHandlerBinder.d.ts +133 -0
- package/dist/agents/pool/WorkerEventHandlerBinder.d.ts.map +1 -0
- package/dist/agents/pool/WorkerEventHandlerBinder.js +668 -0
- package/dist/agents/pool/WorkerEventHandlerBinder.js.map +1 -0
- package/dist/agents/pool/WorkerLifecycle.d.ts +68 -0
- package/dist/agents/pool/WorkerLifecycle.d.ts.map +1 -0
- package/dist/agents/pool/WorkerLifecycle.js +99 -0
- package/dist/agents/pool/WorkerLifecycle.js.map +1 -0
- package/dist/agents/pool/WorkerPayloadBuilder.d.ts +46 -0
- package/dist/agents/pool/WorkerPayloadBuilder.d.ts.map +1 -0
- package/dist/agents/pool/WorkerPayloadBuilder.js +294 -0
- package/dist/agents/pool/WorkerPayloadBuilder.js.map +1 -0
- package/dist/agents/prompts/PromptTemplates.d.ts +59 -0
- package/dist/agents/prompts/PromptTemplates.d.ts.map +1 -0
- package/dist/agents/prompts/PromptTemplates.js +223 -0
- package/dist/agents/prompts/PromptTemplates.js.map +1 -0
- package/dist/agents/prompts/architect_system.d.ts +30 -0
- package/dist/agents/prompts/architect_system.d.ts.map +1 -0
- package/dist/agents/prompts/architect_system.js +95 -0
- package/dist/agents/prompts/architect_system.js.map +1 -0
- package/dist/agents/prompts/backend_system.d.ts +5 -0
- package/dist/agents/prompts/backend_system.d.ts.map +1 -0
- package/dist/agents/prompts/backend_system.js +64 -0
- package/dist/agents/prompts/backend_system.js.map +1 -0
- package/dist/agents/prompts/evaluator_system.d.ts +5 -0
- package/dist/agents/prompts/evaluator_system.d.ts.map +1 -0
- package/dist/agents/prompts/evaluator_system.js +67 -0
- package/dist/agents/prompts/evaluator_system.js.map +1 -0
- package/dist/agents/prompts/frontend_system.d.ts +5 -0
- package/dist/agents/prompts/frontend_system.d.ts.map +1 -0
- package/dist/agents/prompts/frontend_system.js +66 -0
- package/dist/agents/prompts/frontend_system.js.map +1 -0
- package/dist/agents/prompts/fullstack_system.d.ts +5 -0
- package/dist/agents/prompts/fullstack_system.d.ts.map +1 -0
- package/dist/agents/prompts/fullstack_system.js +64 -0
- package/dist/agents/prompts/fullstack_system.js.map +1 -0
- package/dist/agents/prompts/i18n/catalog.d.ts +172 -0
- package/dist/agents/prompts/i18n/catalog.d.ts.map +1 -0
- package/dist/agents/prompts/i18n/catalog.js +498 -0
- package/dist/agents/prompts/i18n/catalog.js.map +1 -0
- package/dist/agents/prompts/i18n/leader_system_prompt.d.ts +6 -0
- package/dist/agents/prompts/i18n/leader_system_prompt.d.ts.map +1 -0
- package/dist/agents/prompts/i18n/leader_system_prompt.js +909 -0
- package/dist/agents/prompts/i18n/leader_system_prompt.js.map +1 -0
- package/dist/agents/prompts/i18n/userIntentLabels.d.ts +10 -0
- package/dist/agents/prompts/i18n/userIntentLabels.d.ts.map +1 -0
- package/dist/agents/prompts/i18n/userIntentLabels.js +21 -0
- package/dist/agents/prompts/i18n/userIntentLabels.js.map +1 -0
- package/dist/agents/prompts/leader/system_prompt.d.ts +6 -0
- package/dist/agents/prompts/leader/system_prompt.d.ts.map +1 -0
- package/dist/agents/prompts/leader/system_prompt.js +8 -0
- package/dist/agents/prompts/leader/system_prompt.js.map +1 -0
- package/dist/agents/prompts/planner_system.d.ts +5 -0
- package/dist/agents/prompts/planner_system.d.ts.map +1 -0
- package/dist/agents/prompts/planner_system.js +69 -0
- package/dist/agents/prompts/planner_system.js.map +1 -0
- package/dist/agents/prompts/qa_system.d.ts +5 -0
- package/dist/agents/prompts/qa_system.d.ts.map +1 -0
- package/dist/agents/prompts/qa_system.js +57 -0
- package/dist/agents/prompts/qa_system.js.map +1 -0
- package/dist/agents/prompts/shared/fragments.d.ts +54 -0
- package/dist/agents/prompts/shared/fragments.d.ts.map +1 -0
- package/dist/agents/prompts/shared/fragments.js +222 -0
- package/dist/agents/prompts/shared/fragments.js.map +1 -0
- package/dist/agents/prompts/shared/prompt_builder.d.ts +6 -0
- package/dist/agents/prompts/shared/prompt_builder.d.ts.map +1 -0
- package/dist/agents/prompts/shared/prompt_builder.js +17 -0
- package/dist/agents/prompts/shared/prompt_builder.js.map +1 -0
- package/dist/agents/prompts/task-runtime/thinking_instruction.d.ts +2 -0
- package/dist/agents/prompts/task-runtime/thinking_instruction.d.ts.map +1 -0
- package/dist/agents/prompts/task-runtime/thinking_instruction.js +37 -0
- package/dist/agents/prompts/task-runtime/thinking_instruction.js.map +1 -0
- package/dist/agents/prompts/task-runtime/worker_task_prompt.d.ts +42 -0
- package/dist/agents/prompts/task-runtime/worker_task_prompt.d.ts.map +1 -0
- package/dist/agents/prompts/task-runtime/worker_task_prompt.js +181 -0
- package/dist/agents/prompts/task-runtime/worker_task_prompt.js.map +1 -0
- package/dist/agents/prompts/ux_designer_system.d.ts +5 -0
- package/dist/agents/prompts/ux_designer_system.d.ts.map +1 -0
- package/dist/agents/prompts/ux_designer_system.js +60 -0
- package/dist/agents/prompts/ux_designer_system.js.map +1 -0
- package/dist/agents/prompts/worker/system_prompts.d.ts +22 -0
- package/dist/agents/prompts/worker/system_prompts.d.ts.map +1 -0
- package/dist/agents/prompts/worker/system_prompts.js +313 -0
- package/dist/agents/prompts/worker/system_prompts.js.map +1 -0
- package/dist/agents/raw_tool_calls.d.ts +15 -0
- package/dist/agents/raw_tool_calls.d.ts.map +1 -0
- package/dist/agents/raw_tool_calls.js +273 -0
- package/dist/agents/raw_tool_calls.js.map +1 -0
- package/dist/agents/runtime/AgentCore.d.ts +13 -0
- package/dist/agents/runtime/AgentCore.d.ts.map +1 -0
- package/dist/agents/runtime/AgentCore.js +19 -0
- package/dist/agents/runtime/AgentCore.js.map +1 -0
- package/dist/agents/runtime/AgentInboxParsers.d.ts +46 -0
- package/dist/agents/runtime/AgentInboxParsers.d.ts.map +1 -0
- package/dist/agents/runtime/AgentInboxParsers.js +152 -0
- package/dist/agents/runtime/AgentInboxParsers.js.map +1 -0
- package/dist/agents/runtime/AgentRuntimeState.d.ts +36 -0
- package/dist/agents/runtime/AgentRuntimeState.d.ts.map +1 -0
- package/dist/agents/runtime/AgentRuntimeState.js +68 -0
- package/dist/agents/runtime/AgentRuntimeState.js.map +1 -0
- package/dist/agents/runtime/CompletionTerminationPolicy.d.ts +15 -0
- package/dist/agents/runtime/CompletionTerminationPolicy.d.ts.map +1 -0
- package/dist/agents/runtime/CompletionTerminationPolicy.js +18 -0
- package/dist/agents/runtime/CompletionTerminationPolicy.js.map +1 -0
- package/dist/agents/runtime/EternalPatrolJudge.d.ts +23 -0
- package/dist/agents/runtime/EternalPatrolJudge.d.ts.map +1 -0
- package/dist/agents/runtime/EternalPatrolJudge.js +114 -0
- package/dist/agents/runtime/EternalPatrolJudge.js.map +1 -0
- package/dist/agents/runtime/LlmRoundExecutor.d.ts +55 -0
- package/dist/agents/runtime/LlmRoundExecutor.d.ts.map +1 -0
- package/dist/agents/runtime/LlmRoundExecutor.js +382 -0
- package/dist/agents/runtime/LlmRoundExecutor.js.map +1 -0
- package/dist/agents/runtime/LlmStreamHooks.d.ts +59 -0
- package/dist/agents/runtime/LlmStreamHooks.d.ts.map +1 -0
- package/dist/agents/runtime/LlmStreamHooks.js +140 -0
- package/dist/agents/runtime/LlmStreamHooks.js.map +1 -0
- package/dist/agents/runtime/MandatoryVerification.d.ts +23 -0
- package/dist/agents/runtime/MandatoryVerification.d.ts.map +1 -0
- package/dist/agents/runtime/MandatoryVerification.js +108 -0
- package/dist/agents/runtime/MandatoryVerification.js.map +1 -0
- package/dist/agents/runtime/NextSpeakerPolicy.d.ts +53 -0
- package/dist/agents/runtime/NextSpeakerPolicy.d.ts.map +1 -0
- package/dist/agents/runtime/NextSpeakerPolicy.js +162 -0
- package/dist/agents/runtime/NextSpeakerPolicy.js.map +1 -0
- package/dist/agents/runtime/ReasoningLoopDriver.d.ts +32 -0
- package/dist/agents/runtime/ReasoningLoopDriver.d.ts.map +1 -0
- package/dist/agents/runtime/ReasoningLoopDriver.js +58 -0
- package/dist/agents/runtime/ReasoningLoopDriver.js.map +1 -0
- package/dist/agents/runtime/StreamChunkBuffer.d.ts +45 -0
- package/dist/agents/runtime/StreamChunkBuffer.d.ts.map +1 -0
- package/dist/agents/runtime/StreamChunkBuffer.js +57 -0
- package/dist/agents/runtime/StreamChunkBuffer.js.map +1 -0
- package/dist/agents/runtime/ToolCallSafety.d.ts +42 -0
- package/dist/agents/runtime/ToolCallSafety.d.ts.map +1 -0
- package/dist/agents/runtime/ToolCallSafety.js +319 -0
- package/dist/agents/runtime/ToolCallSafety.js.map +1 -0
- package/dist/agents/runtime/ToolFailureLoopGuard.d.ts +163 -0
- package/dist/agents/runtime/ToolFailureLoopGuard.d.ts.map +1 -0
- package/dist/agents/runtime/ToolFailureLoopGuard.js +368 -0
- package/dist/agents/runtime/ToolFailureLoopGuard.js.map +1 -0
- package/dist/agents/runtime/ToolLoopDetector.d.ts +47 -0
- package/dist/agents/runtime/ToolLoopDetector.d.ts.map +1 -0
- package/dist/agents/runtime/ToolLoopDetector.js +108 -0
- package/dist/agents/runtime/ToolLoopDetector.js.map +1 -0
- package/dist/agents/runtime/ToolProgressHeartbeat.d.ts +73 -0
- package/dist/agents/runtime/ToolProgressHeartbeat.d.ts.map +1 -0
- package/dist/agents/runtime/ToolProgressHeartbeat.js +152 -0
- package/dist/agents/runtime/ToolProgressHeartbeat.js.map +1 -0
- package/dist/agents/runtime/ToolResponseProcessor.d.ts +57 -0
- package/dist/agents/runtime/ToolResponseProcessor.d.ts.map +1 -0
- package/dist/agents/runtime/ToolResponseProcessor.js +87 -0
- package/dist/agents/runtime/ToolResponseProcessor.js.map +1 -0
- package/dist/agents/runtime/ToolScheduler.d.ts +31 -0
- package/dist/agents/runtime/ToolScheduler.d.ts.map +1 -0
- package/dist/agents/runtime/ToolScheduler.js +63 -0
- package/dist/agents/runtime/ToolScheduler.js.map +1 -0
- package/dist/agents/runtime/WorkerCompletionPolicy.d.ts +47 -0
- package/dist/agents/runtime/WorkerCompletionPolicy.d.ts.map +1 -0
- package/dist/agents/runtime/WorkerCompletionPolicy.js +304 -0
- package/dist/agents/runtime/WorkerCompletionPolicy.js.map +1 -0
- package/dist/agents/runtime/WorkerInteractiveRuntime.d.ts +87 -0
- package/dist/agents/runtime/WorkerInteractiveRuntime.d.ts.map +1 -0
- package/dist/agents/runtime/WorkerInteractiveRuntime.js +122 -0
- package/dist/agents/runtime/WorkerInteractiveRuntime.js.map +1 -0
- package/dist/agents/runtime/messageSummary.d.ts +7 -0
- package/dist/agents/runtime/messageSummary.d.ts.map +1 -0
- package/dist/agents/runtime/messageSummary.js +21 -0
- package/dist/agents/runtime/messageSummary.js.map +1 -0
- package/dist/agents/runtime/parallelToolBatch.d.ts +39 -0
- package/dist/agents/runtime/parallelToolBatch.d.ts.map +1 -0
- package/dist/agents/runtime/parallelToolBatch.js +64 -0
- package/dist/agents/runtime/parallelToolBatch.js.map +1 -0
- package/dist/config/ModelManager.d.ts +59 -0
- package/dist/config/ModelManager.d.ts.map +1 -0
- package/dist/config/ModelManager.js +256 -0
- package/dist/config/ModelManager.js.map +1 -0
- package/dist/config/defaults.d.ts +468 -0
- package/dist/config/defaults.d.ts.map +1 -0
- package/dist/config/defaults.js +520 -0
- package/dist/config/defaults.js.map +1 -0
- package/dist/config.d.ts +1225 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +1580 -0
- package/dist/config.js.map +1 -0
- package/dist/contracts/adapters/BlockedAgingPolicy.d.ts +22 -0
- package/dist/contracts/adapters/BlockedAgingPolicy.d.ts.map +1 -0
- package/dist/contracts/adapters/BlockedAgingPolicy.js +29 -0
- package/dist/contracts/adapters/BlockedAgingPolicy.js.map +1 -0
- package/dist/contracts/adapters/EternalPatrolPolicy.d.ts +49 -0
- package/dist/contracts/adapters/EternalPatrolPolicy.d.ts.map +1 -0
- package/dist/contracts/adapters/EternalPatrolPolicy.js +78 -0
- package/dist/contracts/adapters/EternalPatrolPolicy.js.map +1 -0
- package/dist/contracts/adapters/EternalRuntimeProjection.d.ts +39 -0
- package/dist/contracts/adapters/EternalRuntimeProjection.d.ts.map +1 -0
- package/dist/contracts/adapters/EternalRuntimeProjection.js +114 -0
- package/dist/contracts/adapters/EternalRuntimeProjection.js.map +1 -0
- package/dist/contracts/adapters/EventAdapter.d.ts +89 -0
- package/dist/contracts/adapters/EventAdapter.d.ts.map +1 -0
- package/dist/contracts/adapters/EventAdapter.js +535 -0
- package/dist/contracts/adapters/EventAdapter.js.map +1 -0
- package/dist/contracts/adapters/SessionScope.d.ts +12 -0
- package/dist/contracts/adapters/SessionScope.d.ts.map +1 -0
- package/dist/contracts/adapters/SessionScope.js +33 -0
- package/dist/contracts/adapters/SessionScope.js.map +1 -0
- package/dist/contracts/adapters/StatusAdapter.d.ts +238 -0
- package/dist/contracts/adapters/StatusAdapter.d.ts.map +1 -0
- package/dist/contracts/adapters/StatusAdapter.js +719 -0
- package/dist/contracts/adapters/StatusAdapter.js.map +1 -0
- package/dist/contracts/adapters/ThinkContent.d.ts +19 -0
- package/dist/contracts/adapters/ThinkContent.d.ts.map +1 -0
- package/dist/contracts/adapters/ThinkContent.js +99 -0
- package/dist/contracts/adapters/ThinkContent.js.map +1 -0
- package/dist/contracts/constants/eventTypes.d.ts +3 -0
- package/dist/contracts/constants/eventTypes.d.ts.map +1 -0
- package/dist/contracts/constants/eventTypes.js +2 -0
- package/dist/contracts/constants/eventTypes.js.map +1 -0
- package/dist/contracts/constants/leaderToolDefinitions.d.ts +18 -0
- package/dist/contracts/constants/leaderToolDefinitions.d.ts.map +1 -0
- package/dist/contracts/constants/leaderToolDefinitions.js +1070 -0
- package/dist/contracts/constants/leaderToolDefinitions.js.map +1 -0
- package/dist/contracts/constants/statusValues.d.ts +7 -0
- package/dist/contracts/constants/statusValues.d.ts.map +1 -0
- package/dist/contracts/constants/statusValues.js +6 -0
- package/dist/contracts/constants/statusValues.js.map +1 -0
- package/dist/contracts/constants/toolNames.d.ts +8 -0
- package/dist/contracts/constants/toolNames.d.ts.map +1 -0
- package/dist/contracts/constants/toolNames.js +25 -0
- package/dist/contracts/constants/toolNames.js.map +1 -0
- package/dist/contracts/index.d.ts +13 -0
- package/dist/contracts/index.d.ts.map +1 -0
- package/dist/contracts/index.js +13 -0
- package/dist/contracts/index.js.map +1 -0
- package/dist/contracts/modes.d.ts +93 -0
- package/dist/contracts/modes.d.ts.map +1 -0
- package/dist/contracts/modes.js +104 -0
- package/dist/contracts/modes.js.map +1 -0
- package/dist/contracts/types/Agent.d.ts +164 -0
- package/dist/contracts/types/Agent.d.ts.map +1 -0
- package/dist/contracts/types/Agent.js +156 -0
- package/dist/contracts/types/Agent.js.map +1 -0
- package/dist/contracts/types/Autonomy.d.ts +88 -0
- package/dist/contracts/types/Autonomy.d.ts.map +1 -0
- package/dist/contracts/types/Autonomy.js +126 -0
- package/dist/contracts/types/Autonomy.js.map +1 -0
- package/dist/contracts/types/AutonomyDecision.d.ts +48 -0
- package/dist/contracts/types/AutonomyDecision.d.ts.map +1 -0
- package/dist/contracts/types/AutonomyDecision.js +27 -0
- package/dist/contracts/types/AutonomyDecision.js.map +1 -0
- package/dist/contracts/types/Canvas.d.ts +163 -0
- package/dist/contracts/types/Canvas.d.ts.map +1 -0
- package/dist/contracts/types/Canvas.js +22 -0
- package/dist/contracts/types/Canvas.js.map +1 -0
- package/dist/contracts/types/Event.d.ts +510 -0
- package/dist/contracts/types/Event.d.ts.map +1 -0
- package/dist/contracts/types/Event.js +197 -0
- package/dist/contracts/types/Event.js.map +1 -0
- package/dist/contracts/types/Message.d.ts +94 -0
- package/dist/contracts/types/Message.d.ts.map +1 -0
- package/dist/contracts/types/Message.js +151 -0
- package/dist/contracts/types/Message.js.map +1 -0
- package/dist/contracts/types/Session.d.ts +9 -0
- package/dist/contracts/types/Session.d.ts.map +1 -0
- package/dist/contracts/types/Session.js +2 -0
- package/dist/contracts/types/Session.js.map +1 -0
- package/dist/contracts/types/Status.d.ts +12 -0
- package/dist/contracts/types/Status.d.ts.map +1 -0
- package/dist/contracts/types/Status.js +30 -0
- package/dist/contracts/types/Status.js.map +1 -0
- package/dist/contracts/types/TokenUsage.d.ts +46 -0
- package/dist/contracts/types/TokenUsage.d.ts.map +1 -0
- package/dist/contracts/types/TokenUsage.js +41 -0
- package/dist/contracts/types/TokenUsage.js.map +1 -0
- package/dist/contracts/types/Tool.d.ts +66 -0
- package/dist/contracts/types/Tool.d.ts.map +1 -0
- package/dist/contracts/types/Tool.js +10 -0
- package/dist/contracts/types/Tool.js.map +1 -0
- package/dist/contracts/types/ToolMetadata.d.ts +35 -0
- package/dist/contracts/types/ToolMetadata.d.ts.map +1 -0
- package/dist/contracts/types/ToolMetadata.js +131 -0
- package/dist/contracts/types/ToolMetadata.js.map +1 -0
- package/dist/contracts/types/Workflow.d.ts +278 -0
- package/dist/contracts/types/Workflow.d.ts.map +1 -0
- package/dist/contracts/types/Workflow.js +752 -0
- package/dist/contracts/types/Workflow.js.map +1 -0
- package/dist/core/ActiveSessionCoordinator.d.ts +23 -0
- package/dist/core/ActiveSessionCoordinator.d.ts.map +1 -0
- package/dist/core/ActiveSessionCoordinator.js +34 -0
- package/dist/core/ActiveSessionCoordinator.js.map +1 -0
- package/dist/core/AgentHealthMonitor.d.ts +162 -0
- package/dist/core/AgentHealthMonitor.d.ts.map +1 -0
- package/dist/core/AgentHealthMonitor.js +442 -0
- package/dist/core/AgentHealthMonitor.js.map +1 -0
- package/dist/core/AgentProtocol.d.ts +187 -0
- package/dist/core/AgentProtocol.d.ts.map +1 -0
- package/dist/core/AgentProtocol.js +213 -0
- package/dist/core/AgentProtocol.js.map +1 -0
- package/dist/core/AlertManager.d.ts +66 -0
- package/dist/core/AlertManager.d.ts.map +1 -0
- package/dist/core/AlertManager.js +126 -0
- package/dist/core/AlertManager.js.map +1 -0
- package/dist/core/ArtifactAwareness.d.ts +37 -0
- package/dist/core/ArtifactAwareness.d.ts.map +1 -0
- package/dist/core/ArtifactAwareness.js +212 -0
- package/dist/core/ArtifactAwareness.js.map +1 -0
- package/dist/core/AssumptionTracker.d.ts +88 -0
- package/dist/core/AssumptionTracker.d.ts.map +1 -0
- package/dist/core/AssumptionTracker.js +316 -0
- package/dist/core/AssumptionTracker.js.map +1 -0
- package/dist/core/AstStructuralEngine.d.ts +91 -0
- package/dist/core/AstStructuralEngine.d.ts.map +1 -0
- package/dist/core/AstStructuralEngine.js +436 -0
- package/dist/core/AstStructuralEngine.js.map +1 -0
- package/dist/core/AutonomousFaultPolicy.d.ts +17 -0
- package/dist/core/AutonomousFaultPolicy.d.ts.map +1 -0
- package/dist/core/AutonomousFaultPolicy.js +108 -0
- package/dist/core/AutonomousFaultPolicy.js.map +1 -0
- package/dist/core/BaselineAlertMonitor.d.ts +25 -0
- package/dist/core/BaselineAlertMonitor.d.ts.map +1 -0
- package/dist/core/BaselineAlertMonitor.js +66 -0
- package/dist/core/BaselineAlertMonitor.js.map +1 -0
- package/dist/core/BootstrapDoctor.d.ts +36 -0
- package/dist/core/BootstrapDoctor.d.ts.map +1 -0
- package/dist/core/BootstrapDoctor.js +288 -0
- package/dist/core/BootstrapDoctor.js.map +1 -0
- package/dist/core/BrowserProvider.d.ts +59 -0
- package/dist/core/BrowserProvider.d.ts.map +1 -0
- package/dist/core/BrowserProvider.js +533 -0
- package/dist/core/BrowserProvider.js.map +1 -0
- package/dist/core/BrowserRuntime.d.ts +178 -0
- package/dist/core/BrowserRuntime.d.ts.map +1 -0
- package/dist/core/BrowserRuntime.js +487 -0
- package/dist/core/BrowserRuntime.js.map +1 -0
- package/dist/core/BrowserStealth.d.ts +31 -0
- package/dist/core/BrowserStealth.d.ts.map +1 -0
- package/dist/core/BrowserStealth.js +111 -0
- package/dist/core/BrowserStealth.js.map +1 -0
- package/dist/core/BughuntDagScheduler.d.ts +19 -0
- package/dist/core/BughuntDagScheduler.d.ts.map +1 -0
- package/dist/core/BughuntDagScheduler.js +82 -0
- package/dist/core/BughuntDagScheduler.js.map +1 -0
- package/dist/core/BughuntEvidenceCapture.d.ts +9 -0
- package/dist/core/BughuntEvidenceCapture.d.ts.map +1 -0
- package/dist/core/BughuntEvidenceCapture.js +27 -0
- package/dist/core/BughuntEvidenceCapture.js.map +1 -0
- package/dist/core/BughuntEvidenceExtractor.d.ts +10 -0
- package/dist/core/BughuntEvidenceExtractor.d.ts.map +1 -0
- package/dist/core/BughuntEvidenceExtractor.js +82 -0
- package/dist/core/BughuntEvidenceExtractor.js.map +1 -0
- package/dist/core/BughuntEvidencePack.d.ts +11 -0
- package/dist/core/BughuntEvidencePack.d.ts.map +1 -0
- package/dist/core/BughuntEvidencePack.js +47 -0
- package/dist/core/BughuntEvidencePack.js.map +1 -0
- package/dist/core/BughuntLedger.d.ts +125 -0
- package/dist/core/BughuntLedger.d.ts.map +1 -0
- package/dist/core/BughuntLedger.js +432 -0
- package/dist/core/BughuntLedger.js.map +1 -0
- package/dist/core/BughuntPolicy.d.ts +23 -0
- package/dist/core/BughuntPolicy.d.ts.map +1 -0
- package/dist/core/BughuntPolicy.js +37 -0
- package/dist/core/BughuntPolicy.js.map +1 -0
- package/dist/core/BuildDiagnosticsCollector.d.ts +97 -0
- package/dist/core/BuildDiagnosticsCollector.d.ts.map +1 -0
- package/dist/core/BuildDiagnosticsCollector.js +200 -0
- package/dist/core/BuildDiagnosticsCollector.js.map +1 -0
- package/dist/core/BundledSkillRegistry.d.ts +25 -0
- package/dist/core/BundledSkillRegistry.d.ts.map +1 -0
- package/dist/core/BundledSkillRegistry.js +86 -0
- package/dist/core/BundledSkillRegistry.js.map +1 -0
- package/dist/core/BusMessageTypes.d.ts +109 -0
- package/dist/core/BusMessageTypes.d.ts.map +1 -0
- package/dist/core/BusMessageTypes.js +49 -0
- package/dist/core/BusMessageTypes.js.map +1 -0
- package/dist/core/ChangeImpactResolver.d.ts +71 -0
- package/dist/core/ChangeImpactResolver.d.ts.map +1 -0
- package/dist/core/ChangeImpactResolver.js +130 -0
- package/dist/core/ChangeImpactResolver.js.map +1 -0
- package/dist/core/CleanupRegistry.d.ts +39 -0
- package/dist/core/CleanupRegistry.d.ts.map +1 -0
- package/dist/core/CleanupRegistry.js +91 -0
- package/dist/core/CleanupRegistry.js.map +1 -0
- package/dist/core/ContextManager.d.ts +135 -0
- package/dist/core/ContextManager.d.ts.map +1 -0
- package/dist/core/ContextManager.js +755 -0
- package/dist/core/ContextManager.js.map +1 -0
- package/dist/core/ContextManifest.d.ts +125 -0
- package/dist/core/ContextManifest.d.ts.map +1 -0
- package/dist/core/ContextManifest.js +265 -0
- package/dist/core/ContextManifest.js.map +1 -0
- package/dist/core/ContextMemoryIndex.d.ts +74 -0
- package/dist/core/ContextMemoryIndex.d.ts.map +1 -0
- package/dist/core/ContextMemoryIndex.js +431 -0
- package/dist/core/ContextMemoryIndex.js.map +1 -0
- package/dist/core/ContextRuntimeState.d.ts +43 -0
- package/dist/core/ContextRuntimeState.d.ts.map +1 -0
- package/dist/core/ContextRuntimeState.js +79 -0
- package/dist/core/ContextRuntimeState.js.map +1 -0
- package/dist/core/ContractAllowedScope.d.ts +67 -0
- package/dist/core/ContractAllowedScope.d.ts.map +1 -0
- package/dist/core/ContractAllowedScope.js +109 -0
- package/dist/core/ContractAllowedScope.js.map +1 -0
- package/dist/core/ContractDriftAudit.d.ts +28 -0
- package/dist/core/ContractDriftAudit.d.ts.map +1 -0
- package/dist/core/ContractDriftAudit.js +31 -0
- package/dist/core/ContractDriftAudit.js.map +1 -0
- package/dist/core/ContractHotSync.d.ts +88 -0
- package/dist/core/ContractHotSync.d.ts.map +1 -0
- package/dist/core/ContractHotSync.js +142 -0
- package/dist/core/ContractHotSync.js.map +1 -0
- package/dist/core/ContractPack.d.ts +67 -0
- package/dist/core/ContractPack.d.ts.map +1 -0
- package/dist/core/ContractPack.js +397 -0
- package/dist/core/ContractPack.js.map +1 -0
- package/dist/core/ContractProvenance.d.ts +6 -0
- package/dist/core/ContractProvenance.d.ts.map +1 -0
- package/dist/core/ContractProvenance.js +39 -0
- package/dist/core/ContractProvenance.js.map +1 -0
- package/dist/core/CrashReporter.d.ts +51 -0
- package/dist/core/CrashReporter.d.ts.map +1 -0
- package/dist/core/CrashReporter.js +179 -0
- package/dist/core/CrashReporter.js.map +1 -0
- package/dist/core/DaemonManager.d.ts +100 -0
- package/dist/core/DaemonManager.d.ts.map +1 -0
- package/dist/core/DaemonManager.js +429 -0
- package/dist/core/DaemonManager.js.map +1 -0
- package/dist/core/DagScheduler.d.ts +73 -0
- package/dist/core/DagScheduler.d.ts.map +1 -0
- package/dist/core/DagScheduler.js +111 -0
- package/dist/core/DagScheduler.js.map +1 -0
- package/dist/core/Database.d.ts +545 -0
- package/dist/core/Database.d.ts.map +1 -0
- package/dist/core/Database.js +2158 -0
- package/dist/core/Database.js.map +1 -0
- package/dist/core/DatabaseLockRecovery.d.ts +50 -0
- package/dist/core/DatabaseLockRecovery.d.ts.map +1 -0
- package/dist/core/DatabaseLockRecovery.js +167 -0
- package/dist/core/DatabaseLockRecovery.js.map +1 -0
- package/dist/core/DatabaseRepositories.d.ts +298 -0
- package/dist/core/DatabaseRepositories.d.ts.map +1 -0
- package/dist/core/DatabaseRepositories.js +292 -0
- package/dist/core/DatabaseRepositories.js.map +1 -0
- package/dist/core/DesignAssetCatalog.d.ts +180 -0
- package/dist/core/DesignAssetCatalog.d.ts.map +1 -0
- package/dist/core/DesignAssetCatalog.js +691 -0
- package/dist/core/DesignAssetCatalog.js.map +1 -0
- package/dist/core/DeterministicAcceptance.d.ts +96 -0
- package/dist/core/DeterministicAcceptance.d.ts.map +1 -0
- package/dist/core/DeterministicAcceptance.js +218 -0
- package/dist/core/DeterministicAcceptance.js.map +1 -0
- package/dist/core/Diagnostics.d.ts +49 -0
- package/dist/core/Diagnostics.d.ts.map +1 -0
- package/dist/core/Diagnostics.js +308 -0
- package/dist/core/Diagnostics.js.map +1 -0
- package/dist/core/EternalGoal.d.ts +15 -0
- package/dist/core/EternalGoal.d.ts.map +1 -0
- package/dist/core/EternalGoal.js +67 -0
- package/dist/core/EternalGoal.js.map +1 -0
- package/dist/core/EternalLoop.d.ts +206 -0
- package/dist/core/EternalLoop.d.ts.map +1 -0
- package/dist/core/EternalLoop.js +595 -0
- package/dist/core/EternalLoop.js.map +1 -0
- package/dist/core/EternalRuntimeProjection.d.ts +39 -0
- package/dist/core/EternalRuntimeProjection.d.ts.map +1 -0
- package/dist/core/EternalRuntimeProjection.js +114 -0
- package/dist/core/EternalRuntimeProjection.js.map +1 -0
- package/dist/core/EternalRuntimeTelemetry.d.ts +63 -0
- package/dist/core/EternalRuntimeTelemetry.d.ts.map +1 -0
- package/dist/core/EternalRuntimeTelemetry.js +153 -0
- package/dist/core/EternalRuntimeTelemetry.js.map +1 -0
- package/dist/core/EternalSupervisor.d.ts +108 -0
- package/dist/core/EternalSupervisor.d.ts.map +1 -0
- package/dist/core/EternalSupervisor.js +259 -0
- package/dist/core/EternalSupervisor.js.map +1 -0
- package/dist/core/EventEmitter.d.ts +1325 -0
- package/dist/core/EventEmitter.d.ts.map +1 -0
- package/dist/core/EventEmitter.js +76 -0
- package/dist/core/EventEmitter.js.map +1 -0
- package/dist/core/ExecutionLease.d.ts +46 -0
- package/dist/core/ExecutionLease.d.ts.map +1 -0
- package/dist/core/ExecutionLease.js +123 -0
- package/dist/core/ExecutionLease.js.map +1 -0
- package/dist/core/ExecutionTraceMemory.d.ts +96 -0
- package/dist/core/ExecutionTraceMemory.d.ts.map +1 -0
- package/dist/core/ExecutionTraceMemory.js +243 -0
- package/dist/core/ExecutionTraceMemory.js.map +1 -0
- package/dist/core/FileLock.d.ts +108 -0
- package/dist/core/FileLock.d.ts.map +1 -0
- package/dist/core/FileLock.js +431 -0
- package/dist/core/FileLock.js.map +1 -0
- package/dist/core/HardeningPolicy.d.ts +85 -0
- package/dist/core/HardeningPolicy.d.ts.map +1 -0
- package/dist/core/HardeningPolicy.js +191 -0
- package/dist/core/HardeningPolicy.js.map +1 -0
- package/dist/core/HierarchicalContextManager.d.ts +83 -0
- package/dist/core/HierarchicalContextManager.d.ts.map +1 -0
- package/dist/core/HierarchicalContextManager.js +324 -0
- package/dist/core/HierarchicalContextManager.js.map +1 -0
- package/dist/core/ImportGraphEngine.d.ts +84 -0
- package/dist/core/ImportGraphEngine.d.ts.map +1 -0
- package/dist/core/ImportGraphEngine.js +253 -0
- package/dist/core/ImportGraphEngine.js.map +1 -0
- package/dist/core/IntegrationVerifyInjector.d.ts +76 -0
- package/dist/core/IntegrationVerifyInjector.d.ts.map +1 -0
- package/dist/core/IntegrationVerifyInjector.js +164 -0
- package/dist/core/IntegrationVerifyInjector.js.map +1 -0
- package/dist/core/IntuitionRuntime.d.ts +12 -0
- package/dist/core/IntuitionRuntime.d.ts.map +1 -0
- package/dist/core/IntuitionRuntime.js +137 -0
- package/dist/core/IntuitionRuntime.js.map +1 -0
- package/dist/core/JudgmentService.d.ts +45 -0
- package/dist/core/JudgmentService.d.ts.map +1 -0
- package/dist/core/JudgmentService.js +77 -0
- package/dist/core/JudgmentService.js.map +1 -0
- package/dist/core/LangfuseIntegration.d.ts +208 -0
- package/dist/core/LangfuseIntegration.d.ts.map +1 -0
- package/dist/core/LangfuseIntegration.js +611 -0
- package/dist/core/LangfuseIntegration.js.map +1 -0
- package/dist/core/LlmInputManifest.d.ts +40 -0
- package/dist/core/LlmInputManifest.d.ts.map +1 -0
- package/dist/core/LlmInputManifest.js +94 -0
- package/dist/core/LlmInputManifest.js.map +1 -0
- package/dist/core/LocalLlmGateway.d.ts +75 -0
- package/dist/core/LocalLlmGateway.d.ts.map +1 -0
- package/dist/core/LocalLlmGateway.js +389 -0
- package/dist/core/LocalLlmGateway.js.map +1 -0
- package/dist/core/LocalLlmGatewayServer.d.ts +38 -0
- package/dist/core/LocalLlmGatewayServer.d.ts.map +1 -0
- package/dist/core/LocalLlmGatewayServer.js +85 -0
- package/dist/core/LocalLlmGatewayServer.js.map +1 -0
- package/dist/core/Log.d.ts +97 -0
- package/dist/core/Log.d.ts.map +1 -0
- package/dist/core/Log.js +249 -0
- package/dist/core/Log.js.map +1 -0
- package/dist/core/LogMaintenance.d.ts +38 -0
- package/dist/core/LogMaintenance.d.ts.map +1 -0
- package/dist/core/LogMaintenance.js +239 -0
- package/dist/core/LogMaintenance.js.map +1 -0
- package/dist/core/MarketplaceService.d.ts +57 -0
- package/dist/core/MarketplaceService.d.ts.map +1 -0
- package/dist/core/MarketplaceService.js +982 -0
- package/dist/core/MarketplaceService.js.map +1 -0
- package/dist/core/McpClient.d.ts +93 -0
- package/dist/core/McpClient.d.ts.map +1 -0
- package/dist/core/McpClient.js +277 -0
- package/dist/core/McpClient.js.map +1 -0
- package/dist/core/MessageBus.d.ts +247 -0
- package/dist/core/MessageBus.d.ts.map +1 -0
- package/dist/core/MessageBus.js +852 -0
- package/dist/core/MessageBus.js.map +1 -0
- package/dist/core/Metrics.d.ts +50 -0
- package/dist/core/Metrics.d.ts.map +1 -0
- package/dist/core/Metrics.js +171 -0
- package/dist/core/Metrics.js.map +1 -0
- package/dist/core/MetricsRegistry.d.ts +47 -0
- package/dist/core/MetricsRegistry.d.ts.map +1 -0
- package/dist/core/MetricsRegistry.js +119 -0
- package/dist/core/MetricsRegistry.js.map +1 -0
- package/dist/core/ModeAudit.d.ts +87 -0
- package/dist/core/ModeAudit.d.ts.map +1 -0
- package/dist/core/ModeAudit.js +113 -0
- package/dist/core/ModeAudit.js.map +1 -0
- package/dist/core/ModeRuntimeProjection.d.ts +96 -0
- package/dist/core/ModeRuntimeProjection.d.ts.map +1 -0
- package/dist/core/ModeRuntimeProjection.js +216 -0
- package/dist/core/ModeRuntimeProjection.js.map +1 -0
- package/dist/core/ModeStore.d.ts +62 -0
- package/dist/core/ModeStore.d.ts.map +1 -0
- package/dist/core/ModeStore.js +77 -0
- package/dist/core/ModeStore.js.map +1 -0
- package/dist/core/ModeToolPolicy.d.ts +62 -0
- package/dist/core/ModeToolPolicy.d.ts.map +1 -0
- package/dist/core/ModeToolPolicy.js +145 -0
- package/dist/core/ModeToolPolicy.js.map +1 -0
- package/dist/core/ModeWorktreeService.d.ts +31 -0
- package/dist/core/ModeWorktreeService.d.ts.map +1 -0
- package/dist/core/ModeWorktreeService.js +116 -0
- package/dist/core/ModeWorktreeService.js.map +1 -0
- package/dist/core/OrchestrationTypes.d.ts +114 -0
- package/dist/core/OrchestrationTypes.d.ts.map +1 -0
- package/dist/core/OrchestrationTypes.js +2 -0
- package/dist/core/OrchestrationTypes.js.map +1 -0
- package/dist/core/PatternRecognitionEngine.d.ts +33 -0
- package/dist/core/PatternRecognitionEngine.d.ts.map +1 -0
- package/dist/core/PatternRecognitionEngine.js +82 -0
- package/dist/core/PatternRecognitionEngine.js.map +1 -0
- package/dist/core/PerformanceBaselineTracker.d.ts +28 -0
- package/dist/core/PerformanceBaselineTracker.d.ts.map +1 -0
- package/dist/core/PerformanceBaselineTracker.js +48 -0
- package/dist/core/PerformanceBaselineTracker.js.map +1 -0
- package/dist/core/PermissionStore.d.ts +14 -0
- package/dist/core/PermissionStore.d.ts.map +1 -0
- package/dist/core/PermissionStore.js +318 -0
- package/dist/core/PermissionStore.js.map +1 -0
- package/dist/core/PermissionSystem.d.ts +79 -0
- package/dist/core/PermissionSystem.d.ts.map +1 -0
- package/dist/core/PermissionSystem.js +380 -0
- package/dist/core/PermissionSystem.js.map +1 -0
- package/dist/core/PhasePolicy.d.ts +10 -0
- package/dist/core/PhasePolicy.d.ts.map +1 -0
- package/dist/core/PhasePolicy.js +15 -0
- package/dist/core/PhasePolicy.js.map +1 -0
- package/dist/core/PidRegistry.d.ts +58 -0
- package/dist/core/PidRegistry.d.ts.map +1 -0
- package/dist/core/PidRegistry.js +152 -0
- package/dist/core/PidRegistry.js.map +1 -0
- package/dist/core/ProcessIdleGuard.d.ts +76 -0
- package/dist/core/ProcessIdleGuard.d.ts.map +1 -0
- package/dist/core/ProcessIdleGuard.js +201 -0
- package/dist/core/ProcessIdleGuard.js.map +1 -0
- package/dist/core/ProcessOrphanCleaner.d.ts +37 -0
- package/dist/core/ProcessOrphanCleaner.d.ts.map +1 -0
- package/dist/core/ProcessOrphanCleaner.js +106 -0
- package/dist/core/ProcessOrphanCleaner.js.map +1 -0
- package/dist/core/ProcessSelfProtection.d.ts +45 -0
- package/dist/core/ProcessSelfProtection.d.ts.map +1 -0
- package/dist/core/ProcessSelfProtection.js +234 -0
- package/dist/core/ProcessSelfProtection.js.map +1 -0
- package/dist/core/ProjectBlueprint.d.ts +176 -0
- package/dist/core/ProjectBlueprint.d.ts.map +1 -0
- package/dist/core/ProjectBlueprint.js +542 -0
- package/dist/core/ProjectBlueprint.js.map +1 -0
- package/dist/core/ProjectContracts.d.ts +22 -0
- package/dist/core/ProjectContracts.d.ts.map +1 -0
- package/dist/core/ProjectContracts.js +97 -0
- package/dist/core/ProjectContracts.js.map +1 -0
- package/dist/core/ProjectRetentionPolicy.d.ts +31 -0
- package/dist/core/ProjectRetentionPolicy.d.ts.map +1 -0
- package/dist/core/ProjectRetentionPolicy.js +68 -0
- package/dist/core/ProjectRetentionPolicy.js.map +1 -0
- package/dist/core/ProjectRuntimeManager.d.ts +91 -0
- package/dist/core/ProjectRuntimeManager.d.ts.map +1 -0
- package/dist/core/ProjectRuntimeManager.js +458 -0
- package/dist/core/ProjectRuntimeManager.js.map +1 -0
- package/dist/core/ProjectRuntimeState.d.ts +122 -0
- package/dist/core/ProjectRuntimeState.d.ts.map +1 -0
- package/dist/core/ProjectRuntimeState.js +27 -0
- package/dist/core/ProjectRuntimeState.js.map +1 -0
- package/dist/core/ProxyConfig.d.ts +26 -0
- package/dist/core/ProxyConfig.d.ts.map +1 -0
- package/dist/core/ProxyConfig.js +121 -0
- package/dist/core/ProxyConfig.js.map +1 -0
- package/dist/core/RecoveryRecords.d.ts +29 -0
- package/dist/core/RecoveryRecords.d.ts.map +1 -0
- package/dist/core/RecoveryRecords.js +122 -0
- package/dist/core/RecoveryRecords.js.map +1 -0
- package/dist/core/RepairStrategyEngine.d.ts +94 -0
- package/dist/core/RepairStrategyEngine.d.ts.map +1 -0
- package/dist/core/RepairStrategyEngine.js +268 -0
- package/dist/core/RepairStrategyEngine.js.map +1 -0
- package/dist/core/ResourceBudgetService.d.ts +61 -0
- package/dist/core/ResourceBudgetService.d.ts.map +1 -0
- package/dist/core/ResourceBudgetService.js +257 -0
- package/dist/core/ResourceBudgetService.js.map +1 -0
- package/dist/core/ResumeManager.d.ts +18 -0
- package/dist/core/ResumeManager.d.ts.map +1 -0
- package/dist/core/ResumeManager.js +139 -0
- package/dist/core/ResumeManager.js.map +1 -0
- package/dist/core/RuntimeDiagnostics.d.ts +126 -0
- package/dist/core/RuntimeDiagnostics.d.ts.map +1 -0
- package/dist/core/RuntimeDiagnostics.js +367 -0
- package/dist/core/RuntimeDiagnostics.js.map +1 -0
- package/dist/core/RuntimeGuards.d.ts +16 -0
- package/dist/core/RuntimeGuards.d.ts.map +1 -0
- package/dist/core/RuntimeGuards.js +222 -0
- package/dist/core/RuntimeGuards.js.map +1 -0
- package/dist/core/RuntimeRecoveryController.d.ts +52 -0
- package/dist/core/RuntimeRecoveryController.d.ts.map +1 -0
- package/dist/core/RuntimeRecoveryController.js +156 -0
- package/dist/core/RuntimeRecoveryController.js.map +1 -0
- package/dist/core/ScheduledTaskManager.d.ts +110 -0
- package/dist/core/ScheduledTaskManager.d.ts.map +1 -0
- package/dist/core/ScheduledTaskManager.js +532 -0
- package/dist/core/ScheduledTaskManager.js.map +1 -0
- package/dist/core/ScratchpadReview.d.ts +22 -0
- package/dist/core/ScratchpadReview.d.ts.map +1 -0
- package/dist/core/ScratchpadReview.js +162 -0
- package/dist/core/ScratchpadReview.js.map +1 -0
- package/dist/core/SessionManager.d.ts +3 -0
- package/dist/core/SessionManager.d.ts.map +1 -0
- package/dist/core/SessionManager.js +2 -0
- package/dist/core/SessionManager.js.map +1 -0
- package/dist/core/SessionManagerRuntime.d.ts +3 -0
- package/dist/core/SessionManagerRuntime.d.ts.map +1 -0
- package/dist/core/SessionManagerRuntime.js +3 -0
- package/dist/core/SessionManagerRuntime.js.map +1 -0
- package/dist/core/SessionRuntime.d.ts +2 -0
- package/dist/core/SessionRuntime.d.ts.map +1 -0
- package/dist/core/SessionRuntime.js +2 -0
- package/dist/core/SessionRuntime.js.map +1 -0
- package/dist/core/SessionRuntimeState.d.ts +112 -0
- package/dist/core/SessionRuntimeState.d.ts.map +1 -0
- package/dist/core/SessionRuntimeState.js +250 -0
- package/dist/core/SessionRuntimeState.js.map +1 -0
- package/dist/core/SessionStateKeys.d.ts +138 -0
- package/dist/core/SessionStateKeys.d.ts.map +1 -0
- package/dist/core/SessionStateKeys.js +168 -0
- package/dist/core/SessionStateKeys.js.map +1 -0
- package/dist/core/SharedLedger.d.ts +98 -0
- package/dist/core/SharedLedger.d.ts.map +1 -0
- package/dist/core/SharedLedger.js +145 -0
- package/dist/core/SharedLedger.js.map +1 -0
- package/dist/core/SkillCatalog.d.ts +79 -0
- package/dist/core/SkillCatalog.d.ts.map +1 -0
- package/dist/core/SkillCatalog.js +473 -0
- package/dist/core/SkillCatalog.js.map +1 -0
- package/dist/core/SkillDefinitionService.d.ts +56 -0
- package/dist/core/SkillDefinitionService.d.ts.map +1 -0
- package/dist/core/SkillDefinitionService.js +144 -0
- package/dist/core/SkillDefinitionService.js.map +1 -0
- package/dist/core/SkillPhaseLoader.d.ts +21 -0
- package/dist/core/SkillPhaseLoader.d.ts.map +1 -0
- package/dist/core/SkillPhaseLoader.js +85 -0
- package/dist/core/SkillPhaseLoader.js.map +1 -0
- package/dist/core/SkillSelectionPolicy.d.ts +7 -0
- package/dist/core/SkillSelectionPolicy.d.ts.map +1 -0
- package/dist/core/SkillSelectionPolicy.js +10 -0
- package/dist/core/SkillSelectionPolicy.js.map +1 -0
- package/dist/core/SlidevServerManager.d.ts +51 -0
- package/dist/core/SlidevServerManager.d.ts.map +1 -0
- package/dist/core/SlidevServerManager.js +200 -0
- package/dist/core/SlidevServerManager.js.map +1 -0
- package/dist/core/SoulExtractor.d.ts +34 -0
- package/dist/core/SoulExtractor.d.ts.map +1 -0
- package/dist/core/SoulExtractor.js +100 -0
- package/dist/core/SoulExtractor.js.map +1 -0
- package/dist/core/SpecFirstPipeline.d.ts +77 -0
- package/dist/core/SpecFirstPipeline.d.ts.map +1 -0
- package/dist/core/SpecFirstPipeline.js +95 -0
- package/dist/core/SpecFirstPipeline.js.map +1 -0
- package/dist/core/SpeculativeExecutionController.d.ts +64 -0
- package/dist/core/SpeculativeExecutionController.d.ts.map +1 -0
- package/dist/core/SpeculativeExecutionController.js +263 -0
- package/dist/core/SpeculativeExecutionController.js.map +1 -0
- package/dist/core/SpeculativeOrchestrationPlanner.d.ts +40 -0
- package/dist/core/SpeculativeOrchestrationPlanner.d.ts.map +1 -0
- package/dist/core/SpeculativeOrchestrationPlanner.js +186 -0
- package/dist/core/SpeculativeOrchestrationPlanner.js.map +1 -0
- package/dist/core/StateSemantics.d.ts +238 -0
- package/dist/core/StateSemantics.d.ts.map +1 -0
- package/dist/core/StateSemantics.js +729 -0
- package/dist/core/StateSemantics.js.map +1 -0
- package/dist/core/SystemBrowserOpener.d.ts +25 -0
- package/dist/core/SystemBrowserOpener.d.ts.map +1 -0
- package/dist/core/SystemBrowserOpener.js +154 -0
- package/dist/core/SystemBrowserOpener.js.map +1 -0
- package/dist/core/SystemMessageSlot.d.ts +48 -0
- package/dist/core/SystemMessageSlot.d.ts.map +1 -0
- package/dist/core/SystemMessageSlot.js +130 -0
- package/dist/core/SystemMessageSlot.js.map +1 -0
- package/dist/core/TaintFlowEngine.d.ts +37 -0
- package/dist/core/TaintFlowEngine.d.ts.map +1 -0
- package/dist/core/TaintFlowEngine.js +200 -0
- package/dist/core/TaintFlowEngine.js.map +1 -0
- package/dist/core/TaskBoard.d.ts +243 -0
- package/dist/core/TaskBoard.d.ts.map +1 -0
- package/dist/core/TaskBoard.js +955 -0
- package/dist/core/TaskBoard.js.map +1 -0
- package/dist/core/TaskContextEnricher.d.ts +37 -0
- package/dist/core/TaskContextEnricher.d.ts.map +1 -0
- package/dist/core/TaskContextEnricher.js +147 -0
- package/dist/core/TaskContextEnricher.js.map +1 -0
- package/dist/core/TaskDisplayState.d.ts +21 -0
- package/dist/core/TaskDisplayState.d.ts.map +1 -0
- package/dist/core/TaskDisplayState.js +29 -0
- package/dist/core/TaskDisplayState.js.map +1 -0
- package/dist/core/TaskPriorityEngine.d.ts +31 -0
- package/dist/core/TaskPriorityEngine.d.ts.map +1 -0
- package/dist/core/TaskPriorityEngine.js +122 -0
- package/dist/core/TaskPriorityEngine.js.map +1 -0
- package/dist/core/TeamCommunicationGuard.d.ts +83 -0
- package/dist/core/TeamCommunicationGuard.d.ts.map +1 -0
- package/dist/core/TeamCommunicationGuard.js +221 -0
- package/dist/core/TeamCommunicationGuard.js.map +1 -0
- package/dist/core/TeamCommunicationService.d.ts +55 -0
- package/dist/core/TeamCommunicationService.d.ts.map +1 -0
- package/dist/core/TeamCommunicationService.js +178 -0
- package/dist/core/TeamCommunicationService.js.map +1 -0
- package/dist/core/TeamMailbox.d.ts +203 -0
- package/dist/core/TeamMailbox.d.ts.map +1 -0
- package/dist/core/TeamMailbox.js +729 -0
- package/dist/core/TeamMailbox.js.map +1 -0
- package/dist/core/TeamProtocol.d.ts +70 -0
- package/dist/core/TeamProtocol.d.ts.map +1 -0
- package/dist/core/TeamProtocol.js +75 -0
- package/dist/core/TeamProtocol.js.map +1 -0
- package/dist/core/TeamRequestTracker.d.ts +59 -0
- package/dist/core/TeamRequestTracker.d.ts.map +1 -0
- package/dist/core/TeamRequestTracker.js +212 -0
- package/dist/core/TeamRequestTracker.js.map +1 -0
- package/dist/core/TeamView.d.ts +34 -0
- package/dist/core/TeamView.d.ts.map +1 -0
- package/dist/core/TeamView.js +109 -0
- package/dist/core/TeamView.js.map +1 -0
- package/dist/core/TempDownloadRegistry.d.ts +44 -0
- package/dist/core/TempDownloadRegistry.d.ts.map +1 -0
- package/dist/core/TempDownloadRegistry.js +150 -0
- package/dist/core/TempDownloadRegistry.js.map +1 -0
- package/dist/core/TestRunnerAdapter.d.ts +31 -0
- package/dist/core/TestRunnerAdapter.d.ts.map +1 -0
- package/dist/core/TestRunnerAdapter.js +203 -0
- package/dist/core/TestRunnerAdapter.js.map +1 -0
- package/dist/core/ThinkContent.d.ts +19 -0
- package/dist/core/ThinkContent.d.ts.map +1 -0
- package/dist/core/ThinkContent.js +99 -0
- package/dist/core/ThinkContent.js.map +1 -0
- package/dist/core/TiktokenCache.d.ts +32 -0
- package/dist/core/TiktokenCache.d.ts.map +1 -0
- package/dist/core/TiktokenCache.js +188 -0
- package/dist/core/TiktokenCache.js.map +1 -0
- package/dist/core/TokenTracker.d.ts +64 -0
- package/dist/core/TokenTracker.d.ts.map +1 -0
- package/dist/core/TokenTracker.js +146 -0
- package/dist/core/TokenTracker.js.map +1 -0
- package/dist/core/ToolPruner.d.ts +73 -0
- package/dist/core/ToolPruner.d.ts.map +1 -0
- package/dist/core/ToolPruner.js +297 -0
- package/dist/core/ToolPruner.js.map +1 -0
- package/dist/core/Tracing.d.ts +74 -0
- package/dist/core/Tracing.d.ts.map +1 -0
- package/dist/core/Tracing.js +171 -0
- package/dist/core/Tracing.js.map +1 -0
- package/dist/core/TurnCoordinator.d.ts +12 -0
- package/dist/core/TurnCoordinator.d.ts.map +1 -0
- package/dist/core/TurnCoordinator.js +112 -0
- package/dist/core/TurnCoordinator.js.map +1 -0
- package/dist/core/UpdateChecker.d.ts +32 -0
- package/dist/core/UpdateChecker.d.ts.map +1 -0
- package/dist/core/UpdateChecker.js +129 -0
- package/dist/core/UpdateChecker.js.map +1 -0
- package/dist/core/UserAgent.d.ts +5 -0
- package/dist/core/UserAgent.d.ts.map +1 -0
- package/dist/core/UserAgent.js +34 -0
- package/dist/core/UserAgent.js.map +1 -0
- package/dist/core/VerificationPipeline.d.ts +47 -0
- package/dist/core/VerificationPipeline.d.ts.map +1 -0
- package/dist/core/VerificationPipeline.js +144 -0
- package/dist/core/VerificationPipeline.js.map +1 -0
- package/dist/core/WorkNoteManager.d.ts +94 -0
- package/dist/core/WorkNoteManager.d.ts.map +1 -0
- package/dist/core/WorkNoteManager.js +273 -0
- package/dist/core/WorkNoteManager.js.map +1 -0
- package/dist/core/WorkerProcessRunner.d.ts +330 -0
- package/dist/core/WorkerProcessRunner.d.ts.map +1 -0
- package/dist/core/WorkerProcessRunner.js +903 -0
- package/dist/core/WorkerProcessRunner.js.map +1 -0
- package/dist/core/Workspace.d.ts +85 -0
- package/dist/core/Workspace.d.ts.map +1 -0
- package/dist/core/Workspace.js +151 -0
- package/dist/core/Workspace.js.map +1 -0
- package/dist/core/WorktreeManager.d.ts +63 -0
- package/dist/core/WorktreeManager.d.ts.map +1 -0
- package/dist/core/WorktreeManager.js +147 -0
- package/dist/core/WorktreeManager.js.map +1 -0
- package/dist/core/WorktreeService.d.ts +104 -0
- package/dist/core/WorktreeService.d.ts.map +1 -0
- package/dist/core/WorktreeService.js +335 -0
- package/dist/core/WorktreeService.js.map +1 -0
- package/dist/core/blackboard/BlackboardGraph.d.ts +146 -0
- package/dist/core/blackboard/BlackboardGraph.d.ts.map +1 -0
- package/dist/core/blackboard/BlackboardGraph.js +793 -0
- package/dist/core/blackboard/BlackboardGraph.js.map +1 -0
- package/dist/core/blackboard/CompletionChecker.d.ts +39 -0
- package/dist/core/blackboard/CompletionChecker.d.ts.map +1 -0
- package/dist/core/blackboard/CompletionChecker.js +179 -0
- package/dist/core/blackboard/CompletionChecker.js.map +1 -0
- package/dist/core/blackboard/ContractFormatParser.d.ts +67 -0
- package/dist/core/blackboard/ContractFormatParser.d.ts.map +1 -0
- package/dist/core/blackboard/ContractFormatParser.js +212 -0
- package/dist/core/blackboard/ContractFormatParser.js.map +1 -0
- package/dist/core/blackboard/DispatcherEngine.d.ts +33 -0
- package/dist/core/blackboard/DispatcherEngine.d.ts.map +1 -0
- package/dist/core/blackboard/DispatcherEngine.js +135 -0
- package/dist/core/blackboard/DispatcherEngine.js.map +1 -0
- package/dist/core/blackboard/GraphBridge.d.ts +52 -0
- package/dist/core/blackboard/GraphBridge.d.ts.map +1 -0
- package/dist/core/blackboard/GraphBridge.js +166 -0
- package/dist/core/blackboard/GraphBridge.js.map +1 -0
- package/dist/core/blackboard/GraphStore.d.ts +46 -0
- package/dist/core/blackboard/GraphStore.d.ts.map +1 -0
- package/dist/core/blackboard/GraphStore.js +237 -0
- package/dist/core/blackboard/GraphStore.js.map +1 -0
- package/dist/core/blackboard/WorkerOutputParser.d.ts +25 -0
- package/dist/core/blackboard/WorkerOutputParser.d.ts.map +1 -0
- package/dist/core/blackboard/WorkerOutputParser.js +191 -0
- package/dist/core/blackboard/WorkerOutputParser.js.map +1 -0
- package/dist/core/blackboard/schemas.d.ts +137 -0
- package/dist/core/blackboard/schemas.d.ts.map +1 -0
- package/dist/core/blackboard/schemas.js +102 -0
- package/dist/core/blackboard/schemas.js.map +1 -0
- package/dist/core/blackboard/types.d.ts +115 -0
- package/dist/core/blackboard/types.d.ts.map +1 -0
- package/dist/core/blackboard/types.js +31 -0
- package/dist/core/blackboard/types.js.map +1 -0
- package/dist/core/canvas/CanvasStore.d.ts +64 -0
- package/dist/core/canvas/CanvasStore.d.ts.map +1 -0
- package/dist/core/canvas/CanvasStore.js +193 -0
- package/dist/core/canvas/CanvasStore.js.map +1 -0
- package/dist/core/checkpoint/CheckpointBoundary.d.ts +36 -0
- package/dist/core/checkpoint/CheckpointBoundary.d.ts.map +1 -0
- package/dist/core/checkpoint/CheckpointBoundary.js +147 -0
- package/dist/core/checkpoint/CheckpointBoundary.js.map +1 -0
- package/dist/core/checkpoint/CheckpointPrompt.d.ts +15 -0
- package/dist/core/checkpoint/CheckpointPrompt.d.ts.map +1 -0
- package/dist/core/checkpoint/CheckpointPrompt.js +76 -0
- package/dist/core/checkpoint/CheckpointPrompt.js.map +1 -0
- package/dist/core/checkpoint/CheckpointService.d.ts +55 -0
- package/dist/core/checkpoint/CheckpointService.d.ts.map +1 -0
- package/dist/core/checkpoint/CheckpointService.js +168 -0
- package/dist/core/checkpoint/CheckpointService.js.map +1 -0
- package/dist/core/checkpoint/CheckpointWriter.d.ts +38 -0
- package/dist/core/checkpoint/CheckpointWriter.d.ts.map +1 -0
- package/dist/core/checkpoint/CheckpointWriter.js +193 -0
- package/dist/core/checkpoint/CheckpointWriter.js.map +1 -0
- package/dist/core/checkpoint/ContextRebuild.d.ts +52 -0
- package/dist/core/checkpoint/ContextRebuild.d.ts.map +1 -0
- package/dist/core/checkpoint/ContextRebuild.js +213 -0
- package/dist/core/checkpoint/ContextRebuild.js.map +1 -0
- package/dist/core/checkpoint/MicroCompact.d.ts +32 -0
- package/dist/core/checkpoint/MicroCompact.d.ts.map +1 -0
- package/dist/core/checkpoint/MicroCompact.js +109 -0
- package/dist/core/checkpoint/MicroCompact.js.map +1 -0
- package/dist/core/checkpoint/index.d.ts +11 -0
- package/dist/core/checkpoint/index.d.ts.map +1 -0
- package/dist/core/checkpoint/index.js +11 -0
- package/dist/core/checkpoint/index.js.map +1 -0
- package/dist/core/checkpoint/types.d.ts +47 -0
- package/dist/core/checkpoint/types.d.ts.map +1 -0
- package/dist/core/checkpoint/types.js +24 -0
- package/dist/core/checkpoint/types.js.map +1 -0
- package/dist/core/compress/BlackboardCompressor.d.ts +54 -0
- package/dist/core/compress/BlackboardCompressor.d.ts.map +1 -0
- package/dist/core/compress/BlackboardCompressor.js +342 -0
- package/dist/core/compress/BlackboardCompressor.js.map +1 -0
- package/dist/core/compress/CompressionPipeline.d.ts +93 -0
- package/dist/core/compress/CompressionPipeline.d.ts.map +1 -0
- package/dist/core/compress/CompressionPipeline.js +1143 -0
- package/dist/core/compress/CompressionPipeline.js.map +1 -0
- package/dist/core/compress/CompressionTypes.d.ts +103 -0
- package/dist/core/compress/CompressionTypes.d.ts.map +1 -0
- package/dist/core/compress/CompressionTypes.js +5 -0
- package/dist/core/compress/CompressionTypes.js.map +1 -0
- package/dist/core/compress/ContextDAG.d.ts +149 -0
- package/dist/core/compress/ContextDAG.d.ts.map +1 -0
- package/dist/core/compress/ContextDAG.js +323 -0
- package/dist/core/compress/ContextDAG.js.map +1 -0
- package/dist/core/compress/ContextTokenCalculator.d.ts +46 -0
- package/dist/core/compress/ContextTokenCalculator.d.ts.map +1 -0
- package/dist/core/compress/ContextTokenCalculator.js +216 -0
- package/dist/core/compress/ContextTokenCalculator.js.map +1 -0
- package/dist/core/compress/MessageByteTruncator.d.ts +65 -0
- package/dist/core/compress/MessageByteTruncator.d.ts.map +1 -0
- package/dist/core/compress/MessageByteTruncator.js +178 -0
- package/dist/core/compress/MessageByteTruncator.js.map +1 -0
- package/dist/core/constants.d.ts +67 -0
- package/dist/core/constants.d.ts.map +1 -0
- package/dist/core/constants.js +67 -0
- package/dist/core/constants.js.map +1 -0
- package/dist/core/errors.d.ts +9 -0
- package/dist/core/errors.d.ts.map +1 -0
- package/dist/core/errors.js +20 -0
- package/dist/core/errors.js.map +1 -0
- package/dist/core/git/GitEnv.d.ts +10 -0
- package/dist/core/git/GitEnv.d.ts.map +1 -0
- package/dist/core/git/GitEnv.js +47 -0
- package/dist/core/git/GitEnv.js.map +1 -0
- package/dist/core/git/GitPlatformApi.d.ts +90 -0
- package/dist/core/git/GitPlatformApi.d.ts.map +1 -0
- package/dist/core/git/GitPlatformApi.js +552 -0
- package/dist/core/git/GitPlatformApi.js.map +1 -0
- package/dist/core/git/RealGitService.d.ts +184 -0
- package/dist/core/git/RealGitService.d.ts.map +1 -0
- package/dist/core/git/RealGitService.js +430 -0
- package/dist/core/git/RealGitService.js.map +1 -0
- package/dist/core/hooks/executor.d.ts +51 -0
- package/dist/core/hooks/executor.d.ts.map +1 -0
- package/dist/core/hooks/executor.js +317 -0
- package/dist/core/hooks/executor.js.map +1 -0
- package/dist/core/hooks/index.d.ts +9 -0
- package/dist/core/hooks/index.d.ts.map +1 -0
- package/dist/core/hooks/index.js +12 -0
- package/dist/core/hooks/index.js.map +1 -0
- package/dist/core/hooks/registry.d.ts +71 -0
- package/dist/core/hooks/registry.d.ts.map +1 -0
- package/dist/core/hooks/registry.js +231 -0
- package/dist/core/hooks/registry.js.map +1 -0
- package/dist/core/hooks/session_hooks.d.ts +54 -0
- package/dist/core/hooks/session_hooks.d.ts.map +1 -0
- package/dist/core/hooks/session_hooks.js +104 -0
- package/dist/core/hooks/session_hooks.js.map +1 -0
- package/dist/core/hooks/types.d.ts +136 -0
- package/dist/core/hooks/types.d.ts.map +1 -0
- package/dist/core/hooks/types.js +49 -0
- package/dist/core/hooks/types.js.map +1 -0
- package/dist/core/index.d.ts +23 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +22 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/ipc/IPCDrainQueue.d.ts +58 -0
- package/dist/core/ipc/IPCDrainQueue.d.ts.map +1 -0
- package/dist/core/ipc/IPCDrainQueue.js +166 -0
- package/dist/core/ipc/IPCDrainQueue.js.map +1 -0
- package/dist/core/mcp-share/McpBundle.d.ts +43 -0
- package/dist/core/mcp-share/McpBundle.d.ts.map +1 -0
- package/dist/core/mcp-share/McpBundle.js +100 -0
- package/dist/core/mcp-share/McpBundle.js.map +1 -0
- package/dist/core/mcp-share/McpShare.d.ts +110 -0
- package/dist/core/mcp-share/McpShare.d.ts.map +1 -0
- package/dist/core/mcp-share/McpShare.js +311 -0
- package/dist/core/mcp-share/McpShare.js.map +1 -0
- package/dist/core/plugins/PluginManifest.d.ts +128 -0
- package/dist/core/plugins/PluginManifest.d.ts.map +1 -0
- package/dist/core/plugins/PluginManifest.js +166 -0
- package/dist/core/plugins/PluginManifest.js.map +1 -0
- package/dist/core/plugins/PluginStore.d.ts +76 -0
- package/dist/core/plugins/PluginStore.d.ts.map +1 -0
- package/dist/core/plugins/PluginStore.js +511 -0
- package/dist/core/plugins/PluginStore.js.map +1 -0
- package/dist/core/session/SessionCleanup.d.ts +15 -0
- package/dist/core/session/SessionCleanup.d.ts.map +1 -0
- package/dist/core/session/SessionCleanup.js +24 -0
- package/dist/core/session/SessionCleanup.js.map +1 -0
- package/dist/core/session/SessionFactory.d.ts +14 -0
- package/dist/core/session/SessionFactory.d.ts.map +1 -0
- package/dist/core/session/SessionFactory.js +15 -0
- package/dist/core/session/SessionFactory.js.map +1 -0
- package/dist/core/session/SessionFork.d.ts +31 -0
- package/dist/core/session/SessionFork.d.ts.map +1 -0
- package/dist/core/session/SessionFork.js +78 -0
- package/dist/core/session/SessionFork.js.map +1 -0
- package/dist/core/session/SessionInitialization.d.ts +23 -0
- package/dist/core/session/SessionInitialization.d.ts.map +1 -0
- package/dist/core/session/SessionInitialization.js +55 -0
- package/dist/core/session/SessionInitialization.js.map +1 -0
- package/dist/core/session/SessionStateSync.d.ts +14 -0
- package/dist/core/session/SessionStateSync.d.ts.map +1 -0
- package/dist/core/session/SessionStateSync.js +23 -0
- package/dist/core/session/SessionStateSync.js.map +1 -0
- package/dist/core/session/TurnCoordinator.d.ts +3 -0
- package/dist/core/session/TurnCoordinator.d.ts.map +1 -0
- package/dist/core/session/TurnCoordinator.js +2 -0
- package/dist/core/session/TurnCoordinator.js.map +1 -0
- package/dist/core/terminalRestore.d.ts +36 -0
- package/dist/core/terminalRestore.d.ts.map +1 -0
- package/dist/core/terminalRestore.js +52 -0
- package/dist/core/terminalRestore.js.map +1 -0
- package/dist/core/transport/LocalTransport.d.ts +11 -0
- package/dist/core/transport/LocalTransport.d.ts.map +1 -0
- package/dist/core/transport/LocalTransport.js +20 -0
- package/dist/core/transport/LocalTransport.js.map +1 -0
- package/dist/core/transport/RemoteWorkerRegistry.d.ts +25 -0
- package/dist/core/transport/RemoteWorkerRegistry.d.ts.map +1 -0
- package/dist/core/transport/RemoteWorkerRegistry.js +77 -0
- package/dist/core/transport/RemoteWorkerRegistry.js.map +1 -0
- package/dist/core/transport/Transport.d.ts +18 -0
- package/dist/core/transport/Transport.d.ts.map +1 -0
- package/dist/core/transport/Transport.js +17 -0
- package/dist/core/transport/Transport.js.map +1 -0
- package/dist/core/transport/WebSocketTransport.d.ts +41 -0
- package/dist/core/transport/WebSocketTransport.d.ts.map +1 -0
- package/dist/core/transport/WebSocketTransport.js +124 -0
- package/dist/core/transport/WebSocketTransport.js.map +1 -0
- package/dist/core/verify/BughuntVerificationRunner.d.ts +45 -0
- package/dist/core/verify/BughuntVerificationRunner.d.ts.map +1 -0
- package/dist/core/verify/BughuntVerificationRunner.js +109 -0
- package/dist/core/verify/BughuntVerificationRunner.js.map +1 -0
- package/dist/core/verify/TargetServiceManager.d.ts +24 -0
- package/dist/core/verify/TargetServiceManager.d.ts.map +1 -0
- package/dist/core/verify/TargetServiceManager.js +115 -0
- package/dist/core/verify/TargetServiceManager.js.map +1 -0
- package/dist/core/workflow/ExecutionGraph.d.ts +83 -0
- package/dist/core/workflow/ExecutionGraph.d.ts.map +1 -0
- package/dist/core/workflow/ExecutionGraph.js +275 -0
- package/dist/core/workflow/ExecutionGraph.js.map +1 -0
- package/dist/core/workflow/ScheduleTriggerSync.d.ts +22 -0
- package/dist/core/workflow/ScheduleTriggerSync.d.ts.map +1 -0
- package/dist/core/workflow/ScheduleTriggerSync.js +141 -0
- package/dist/core/workflow/ScheduleTriggerSync.js.map +1 -0
- package/dist/core/workflow/VariableResolver.d.ts +83 -0
- package/dist/core/workflow/VariableResolver.d.ts.map +1 -0
- package/dist/core/workflow/VariableResolver.js +277 -0
- package/dist/core/workflow/VariableResolver.js.map +1 -0
- package/dist/core/workflow/WorkflowAnalyzer.d.ts +40 -0
- package/dist/core/workflow/WorkflowAnalyzer.d.ts.map +1 -0
- package/dist/core/workflow/WorkflowAnalyzer.js +381 -0
- package/dist/core/workflow/WorkflowAnalyzer.js.map +1 -0
- package/dist/core/workflow/WorkflowEngine.d.ts +158 -0
- package/dist/core/workflow/WorkflowEngine.d.ts.map +1 -0
- package/dist/core/workflow/WorkflowEngine.js +1249 -0
- package/dist/core/workflow/WorkflowEngine.js.map +1 -0
- package/dist/core/workflow/WorkflowManager.d.ts +129 -0
- package/dist/core/workflow/WorkflowManager.d.ts.map +1 -0
- package/dist/core/workflow/WorkflowManager.js +525 -0
- package/dist/core/workflow/WorkflowManager.js.map +1 -0
- package/dist/core/workflow/executors/AgentNodeExecutor.d.ts +21 -0
- package/dist/core/workflow/executors/AgentNodeExecutor.d.ts.map +1 -0
- package/dist/core/workflow/executors/AgentNodeExecutor.js +44 -0
- package/dist/core/workflow/executors/AgentNodeExecutor.js.map +1 -0
- package/dist/core/workflow/executors/BaseNodeExecutor.d.ts +24 -0
- package/dist/core/workflow/executors/BaseNodeExecutor.d.ts.map +1 -0
- package/dist/core/workflow/executors/BaseNodeExecutor.js +30 -0
- package/dist/core/workflow/executors/BaseNodeExecutor.js.map +1 -0
- package/dist/core/workflow/executors/ConditionNodeExecutor.d.ts +25 -0
- package/dist/core/workflow/executors/ConditionNodeExecutor.d.ts.map +1 -0
- package/dist/core/workflow/executors/ConditionNodeExecutor.js +118 -0
- package/dist/core/workflow/executors/ConditionNodeExecutor.js.map +1 -0
- package/dist/core/workflow/executors/DataNodeExecutor.d.ts +26 -0
- package/dist/core/workflow/executors/DataNodeExecutor.d.ts.map +1 -0
- package/dist/core/workflow/executors/DataNodeExecutor.js +315 -0
- package/dist/core/workflow/executors/DataNodeExecutor.js.map +1 -0
- package/dist/core/workflow/executors/ParallelNodeExecutor.d.ts +17 -0
- package/dist/core/workflow/executors/ParallelNodeExecutor.d.ts.map +1 -0
- package/dist/core/workflow/executors/ParallelNodeExecutor.js +58 -0
- package/dist/core/workflow/executors/ParallelNodeExecutor.js.map +1 -0
- package/dist/core/workflow/executors/ToolNodeExecutor.d.ts +16 -0
- package/dist/core/workflow/executors/ToolNodeExecutor.d.ts.map +1 -0
- package/dist/core/workflow/executors/ToolNodeExecutor.js +83 -0
- package/dist/core/workflow/executors/ToolNodeExecutor.js.map +1 -0
- package/dist/core/workflow/expressionEvaluator.d.ts +27 -0
- package/dist/core/workflow/expressionEvaluator.d.ts.map +1 -0
- package/dist/core/workflow/expressionEvaluator.js +35 -0
- package/dist/core/workflow/expressionEvaluator.js.map +1 -0
- package/dist/core/workflow/safeExpressionEvaluator.d.ts +28 -0
- package/dist/core/workflow/safeExpressionEvaluator.d.ts.map +1 -0
- package/dist/core/workflow/safeExpressionEvaluator.js +298 -0
- package/dist/core/workflow/safeExpressionEvaluator.js.map +1 -0
- package/dist/core/workflow/types.d.ts +258 -0
- package/dist/core/workflow/types.d.ts.map +1 -0
- package/dist/core/workflow/types.js +7 -0
- package/dist/core/workflow/types.js.map +1 -0
- package/dist/core/workflow/variableScope.d.ts +20 -0
- package/dist/core/workflow/variableScope.d.ts.map +1 -0
- package/dist/core/workflow/variableScope.js +42 -0
- package/dist/core/workflow/variableScope.js.map +1 -0
- package/dist/facade/AgentLoop.d.ts +91 -0
- package/dist/facade/AgentLoop.d.ts.map +1 -0
- package/dist/facade/AgentLoop.js +140 -0
- package/dist/facade/AgentLoop.js.map +1 -0
- package/dist/i18n.d.ts +871 -0
- package/dist/i18n.d.ts.map +1 -0
- package/dist/i18n.js +1912 -0
- package/dist/i18n.js.map +1 -0
- package/dist/index.d.ts +31 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +29 -0
- package/dist/index.js.map +1 -0
- package/dist/llm/AnthropicContentGenerator.d.ts +66 -0
- package/dist/llm/AnthropicContentGenerator.d.ts.map +1 -0
- package/dist/llm/AnthropicContentGenerator.js +973 -0
- package/dist/llm/AnthropicContentGenerator.js.map +1 -0
- package/dist/llm/AnthropicToolSchema.d.ts +4 -0
- package/dist/llm/AnthropicToolSchema.d.ts.map +1 -0
- package/dist/llm/AnthropicToolSchema.js +179 -0
- package/dist/llm/AnthropicToolSchema.js.map +1 -0
- package/dist/llm/CircuitBreaker.d.ts +77 -0
- package/dist/llm/CircuitBreaker.d.ts.map +1 -0
- package/dist/llm/CircuitBreaker.js +185 -0
- package/dist/llm/CircuitBreaker.js.map +1 -0
- package/dist/llm/Client.d.ts +59 -0
- package/dist/llm/Client.d.ts.map +1 -0
- package/dist/llm/Client.js +174 -0
- package/dist/llm/Client.js.map +1 -0
- package/dist/llm/ContentGenerationPipeline.d.ts +104 -0
- package/dist/llm/ContentGenerationPipeline.d.ts.map +1 -0
- package/dist/llm/ContentGenerationPipeline.js +85 -0
- package/dist/llm/ContentGenerationPipeline.js.map +1 -0
- package/dist/llm/ContentGenerator.d.ts +137 -0
- package/dist/llm/ContentGenerator.d.ts.map +1 -0
- package/dist/llm/ContentGenerator.js +49 -0
- package/dist/llm/ContentGenerator.js.map +1 -0
- package/dist/llm/CostService.d.ts +121 -0
- package/dist/llm/CostService.d.ts.map +1 -0
- package/dist/llm/CostService.js +287 -0
- package/dist/llm/CostService.js.map +1 -0
- package/dist/llm/LoggingContentGenerator.d.ts +25 -0
- package/dist/llm/LoggingContentGenerator.d.ts.map +1 -0
- package/dist/llm/LoggingContentGenerator.js +82 -0
- package/dist/llm/LoggingContentGenerator.js.map +1 -0
- package/dist/llm/ModelGateway.d.ts +88 -0
- package/dist/llm/ModelGateway.d.ts.map +1 -0
- package/dist/llm/ModelGateway.js +261 -0
- package/dist/llm/ModelGateway.js.map +1 -0
- package/dist/llm/ModelsDevRegistry.d.ts +159 -0
- package/dist/llm/ModelsDevRegistry.d.ts.map +1 -0
- package/dist/llm/ModelsDevRegistry.js +301 -0
- package/dist/llm/ModelsDevRegistry.js.map +1 -0
- package/dist/llm/OpenAIContentGenerator.d.ts +57 -0
- package/dist/llm/OpenAIContentGenerator.d.ts.map +1 -0
- package/dist/llm/OpenAIContentGenerator.js +644 -0
- package/dist/llm/OpenAIContentGenerator.js.map +1 -0
- package/dist/llm/RetryEngine.d.ts +89 -0
- package/dist/llm/RetryEngine.d.ts.map +1 -0
- package/dist/llm/RetryEngine.js +121 -0
- package/dist/llm/RetryEngine.js.map +1 -0
- package/dist/llm/StreamingToolCallParser.d.ts +113 -0
- package/dist/llm/StreamingToolCallParser.d.ts.map +1 -0
- package/dist/llm/StreamingToolCallParser.js +294 -0
- package/dist/llm/StreamingToolCallParser.js.map +1 -0
- package/dist/llm/VercelAIContentGenerator.d.ts +71 -0
- package/dist/llm/VercelAIContentGenerator.d.ts.map +1 -0
- package/dist/llm/VercelAIContentGenerator.js +471 -0
- package/dist/llm/VercelAIContentGenerator.js.map +1 -0
- package/dist/llm/errors.d.ts +44 -0
- package/dist/llm/errors.d.ts.map +1 -0
- package/dist/llm/errors.js +713 -0
- package/dist/llm/errors.js.map +1 -0
- package/dist/llm/http_dispatcher.d.ts +51 -0
- package/dist/llm/http_dispatcher.d.ts.map +1 -0
- package/dist/llm/http_dispatcher.js +151 -0
- package/dist/llm/http_dispatcher.js.map +1 -0
- package/dist/llm/image_blob_store.d.ts +8 -0
- package/dist/llm/image_blob_store.d.ts.map +1 -0
- package/dist/llm/image_blob_store.js +135 -0
- package/dist/llm/image_blob_store.js.map +1 -0
- package/dist/llm/local_vision_fallback.d.ts +37 -0
- package/dist/llm/local_vision_fallback.d.ts.map +1 -0
- package/dist/llm/local_vision_fallback.js +296 -0
- package/dist/llm/local_vision_fallback.js.map +1 -0
- package/dist/llm/message_sanitizer.d.ts +109 -0
- package/dist/llm/message_sanitizer.d.ts.map +1 -0
- package/dist/llm/message_sanitizer.js +536 -0
- package/dist/llm/message_sanitizer.js.map +1 -0
- package/dist/llm/model_capabilities.d.ts +131 -0
- package/dist/llm/model_capabilities.d.ts.map +1 -0
- package/dist/llm/model_capabilities.js +484 -0
- package/dist/llm/model_capabilities.js.map +1 -0
- package/dist/llm/model_capability_config.d.ts +19 -0
- package/dist/llm/model_capability_config.d.ts.map +1 -0
- package/dist/llm/model_capability_config.js +16 -0
- package/dist/llm/model_capability_config.js.map +1 -0
- package/dist/llm/promptCacheKey.d.ts +27 -0
- package/dist/llm/promptCacheKey.d.ts.map +1 -0
- package/dist/llm/promptCacheKey.js +53 -0
- package/dist/llm/promptCacheKey.js.map +1 -0
- package/dist/llm/provider_runtime.d.ts +64 -0
- package/dist/llm/provider_runtime.d.ts.map +1 -0
- package/dist/llm/provider_runtime.js +181 -0
- package/dist/llm/provider_runtime.js.map +1 -0
- package/dist/llm/providers/anthropic.d.ts +7 -0
- package/dist/llm/providers/anthropic.d.ts.map +1 -0
- package/dist/llm/providers/anthropic.js +12 -0
- package/dist/llm/providers/anthropic.js.map +1 -0
- package/dist/llm/providers/bedrock.d.ts +7 -0
- package/dist/llm/providers/bedrock.d.ts.map +1 -0
- package/dist/llm/providers/bedrock.js +14 -0
- package/dist/llm/providers/bedrock.js.map +1 -0
- package/dist/llm/providers/custom.d.ts +10 -0
- package/dist/llm/providers/custom.d.ts.map +1 -0
- package/dist/llm/providers/custom.js +16 -0
- package/dist/llm/providers/custom.js.map +1 -0
- package/dist/llm/providers/google.d.ts +7 -0
- package/dist/llm/providers/google.d.ts.map +1 -0
- package/dist/llm/providers/google.js +12 -0
- package/dist/llm/providers/google.js.map +1 -0
- package/dist/llm/providers/index.d.ts +31 -0
- package/dist/llm/providers/index.d.ts.map +1 -0
- package/dist/llm/providers/index.js +36 -0
- package/dist/llm/providers/index.js.map +1 -0
- package/dist/llm/providers/openai.d.ts +7 -0
- package/dist/llm/providers/openai.d.ts.map +1 -0
- package/dist/llm/providers/openai.js +12 -0
- package/dist/llm/providers/openai.js.map +1 -0
- package/dist/llm/reasoningSampling.d.ts +55 -0
- package/dist/llm/reasoningSampling.d.ts.map +1 -0
- package/dist/llm/reasoningSampling.js +72 -0
- package/dist/llm/reasoningSampling.js.map +1 -0
- package/dist/llm/tesseractResolver.d.ts +41 -0
- package/dist/llm/tesseractResolver.d.ts.map +1 -0
- package/dist/llm/tesseractResolver.js +103 -0
- package/dist/llm/tesseractResolver.js.map +1 -0
- package/dist/llm/tokenLimits.d.ts +32 -0
- package/dist/llm/tokenLimits.d.ts.map +1 -0
- package/dist/llm/tokenLimits.js +91 -0
- package/dist/llm/tokenLimits.js.map +1 -0
- package/dist/llm/token_counter.d.ts +82 -0
- package/dist/llm/token_counter.d.ts.map +1 -0
- package/dist/llm/token_counter.js +184 -0
- package/dist/llm/token_counter.js.map +1 -0
- package/dist/llm/types.d.ts +192 -0
- package/dist/llm/types.d.ts.map +1 -0
- package/dist/llm/types.js +10 -0
- package/dist/llm/types.js.map +1 -0
- package/dist/llm/usageExtractor.d.ts +36 -0
- package/dist/llm/usageExtractor.d.ts.map +1 -0
- package/dist/llm/usageExtractor.js +156 -0
- package/dist/llm/usageExtractor.js.map +1 -0
- package/dist/mcp-servers/browser-server.d.ts +12 -0
- package/dist/mcp-servers/browser-server.d.ts.map +1 -0
- package/dist/mcp-servers/browser-server.js +264 -0
- package/dist/mcp-servers/browser-server.js.map +1 -0
- package/dist/mcp-servers/code-intelligence-server.d.ts +8 -0
- package/dist/mcp-servers/code-intelligence-server.d.ts.map +1 -0
- package/dist/mcp-servers/code-intelligence-server.js +218 -0
- package/dist/mcp-servers/code-intelligence-server.js.map +1 -0
- package/dist/mcp-servers/memory-server.d.ts +9 -0
- package/dist/mcp-servers/memory-server.d.ts.map +1 -0
- package/dist/mcp-servers/memory-server.js +142 -0
- package/dist/mcp-servers/memory-server.js.map +1 -0
- package/dist/mcp-servers/session-server.d.ts +8 -0
- package/dist/mcp-servers/session-server.d.ts.map +1 -0
- package/dist/mcp-servers/session-server.js +113 -0
- package/dist/mcp-servers/session-server.js.map +1 -0
- package/dist/mcp-servers/shared.d.ts +41 -0
- package/dist/mcp-servers/shared.d.ts.map +1 -0
- package/dist/mcp-servers/shared.js +34 -0
- package/dist/mcp-servers/shared.js.map +1 -0
- package/dist/memory/AssetUsageStore.d.ts +63 -0
- package/dist/memory/AssetUsageStore.d.ts.map +1 -0
- package/dist/memory/AssetUsageStore.js +117 -0
- package/dist/memory/AssetUsageStore.js.map +1 -0
- package/dist/memory/AutoDreamTrigger.d.ts +37 -0
- package/dist/memory/AutoDreamTrigger.d.ts.map +1 -0
- package/dist/memory/AutoDreamTrigger.js +79 -0
- package/dist/memory/AutoDreamTrigger.js.map +1 -0
- package/dist/memory/DistillCommand.d.ts +89 -0
- package/dist/memory/DistillCommand.d.ts.map +1 -0
- package/dist/memory/DistillCommand.js +418 -0
- package/dist/memory/DistillCommand.js.map +1 -0
- package/dist/memory/DreamCommand.d.ts +54 -0
- package/dist/memory/DreamCommand.d.ts.map +1 -0
- package/dist/memory/DreamCommand.js +289 -0
- package/dist/memory/DreamCommand.js.map +1 -0
- package/dist/memory/MemoryDeduplicator.d.ts +38 -0
- package/dist/memory/MemoryDeduplicator.d.ts.map +1 -0
- package/dist/memory/MemoryDeduplicator.js +125 -0
- package/dist/memory/MemoryDeduplicator.js.map +1 -0
- package/dist/memory/MemoryEmbedding.d.ts +25 -0
- package/dist/memory/MemoryEmbedding.d.ts.map +1 -0
- package/dist/memory/MemoryEmbedding.js +104 -0
- package/dist/memory/MemoryEmbedding.js.map +1 -0
- package/dist/memory/MemoryFTS.d.ts +55 -0
- package/dist/memory/MemoryFTS.d.ts.map +1 -0
- package/dist/memory/MemoryFTS.js +333 -0
- package/dist/memory/MemoryFTS.js.map +1 -0
- package/dist/memory/MemoryGC.d.ts +40 -0
- package/dist/memory/MemoryGC.d.ts.map +1 -0
- package/dist/memory/MemoryGC.js +146 -0
- package/dist/memory/MemoryGC.js.map +1 -0
- package/dist/memory/MemoryMaintenance.d.ts +31 -0
- package/dist/memory/MemoryMaintenance.d.ts.map +1 -0
- package/dist/memory/MemoryMaintenance.js +111 -0
- package/dist/memory/MemoryMaintenance.js.map +1 -0
- package/dist/memory/MemoryMaintenanceEvents.d.ts +24 -0
- package/dist/memory/MemoryMaintenanceEvents.d.ts.map +1 -0
- package/dist/memory/MemoryMaintenanceEvents.js +47 -0
- package/dist/memory/MemoryMaintenanceEvents.js.map +1 -0
- package/dist/memory/MemoryMaintenanceStatus.d.ts +61 -0
- package/dist/memory/MemoryMaintenanceStatus.d.ts.map +1 -0
- package/dist/memory/MemoryMaintenanceStatus.js +165 -0
- package/dist/memory/MemoryMaintenanceStatus.js.map +1 -0
- package/dist/memory/MemoryManager.d.ts +80 -0
- package/dist/memory/MemoryManager.d.ts.map +1 -0
- package/dist/memory/MemoryManager.js +310 -0
- package/dist/memory/MemoryManager.js.map +1 -0
- package/dist/memory/MemoryReconciler.d.ts +27 -0
- package/dist/memory/MemoryReconciler.d.ts.map +1 -0
- package/dist/memory/MemoryReconciler.js +163 -0
- package/dist/memory/MemoryReconciler.js.map +1 -0
- package/dist/memory/MemoryService.d.ts +82 -0
- package/dist/memory/MemoryService.d.ts.map +1 -0
- package/dist/memory/MemoryService.js +114 -0
- package/dist/memory/MemoryService.js.map +1 -0
- package/dist/memory/TrajectoryReader.d.ts +39 -0
- package/dist/memory/TrajectoryReader.d.ts.map +1 -0
- package/dist/memory/TrajectoryReader.js +150 -0
- package/dist/memory/TrajectoryReader.js.map +1 -0
- package/dist/memory/types.d.ts +122 -0
- package/dist/memory/types.d.ts.map +1 -0
- package/dist/memory/types.js +10 -0
- package/dist/memory/types.js.map +1 -0
- package/dist/plugins/hooks/ChatTransformHook.d.ts +57 -0
- package/dist/plugins/hooks/ChatTransformHook.d.ts.map +1 -0
- package/dist/plugins/hooks/ChatTransformHook.js +59 -0
- package/dist/plugins/hooks/ChatTransformHook.js.map +1 -0
- package/dist/plugins/hooks/ToolHooks.d.ts +125 -0
- package/dist/plugins/hooks/ToolHooks.d.ts.map +1 -0
- package/dist/plugins/hooks/ToolHooks.js +106 -0
- package/dist/plugins/hooks/ToolHooks.js.map +1 -0
- package/dist/plugins/hooks/index.d.ts +8 -0
- package/dist/plugins/hooks/index.d.ts.map +1 -0
- package/dist/plugins/hooks/index.js +6 -0
- package/dist/plugins/hooks/index.js.map +1 -0
- package/dist/runtime/LoggingRuntime.d.ts +35 -0
- package/dist/runtime/LoggingRuntime.d.ts.map +1 -0
- package/dist/runtime/LoggingRuntime.js +87 -0
- package/dist/runtime/LoggingRuntime.js.map +1 -0
- package/dist/runtime/SessionManagerRuntime.d.ts +475 -0
- package/dist/runtime/SessionManagerRuntime.d.ts.map +1 -0
- package/dist/runtime/SessionManagerRuntime.js +2299 -0
- package/dist/runtime/SessionManagerRuntime.js.map +1 -0
- package/dist/runtime/SessionRuntime.d.ts +62 -0
- package/dist/runtime/SessionRuntime.d.ts.map +1 -0
- package/dist/runtime/SessionRuntime.js +241 -0
- package/dist/runtime/SessionRuntime.js.map +1 -0
- package/dist/tools/LazyToolProxy.d.ts +33 -0
- package/dist/tools/LazyToolProxy.d.ts.map +1 -0
- package/dist/tools/LazyToolProxy.js +59 -0
- package/dist/tools/LazyToolProxy.js.map +1 -0
- package/dist/tools/LspClient.d.ts +94 -0
- package/dist/tools/LspClient.d.ts.map +1 -0
- package/dist/tools/LspClient.js +429 -0
- package/dist/tools/LspClient.js.map +1 -0
- package/dist/tools/MetaTool.d.ts +22 -0
- package/dist/tools/MetaTool.d.ts.map +1 -0
- package/dist/tools/MetaTool.js +21 -0
- package/dist/tools/MetaTool.js.map +1 -0
- package/dist/tools/Registry.d.ts +156 -0
- package/dist/tools/Registry.d.ts.map +1 -0
- package/dist/tools/Registry.js +1484 -0
- package/dist/tools/Registry.js.map +1 -0
- package/dist/tools/SchemaUtils.d.ts +5 -0
- package/dist/tools/SchemaUtils.d.ts.map +1 -0
- package/dist/tools/SchemaUtils.js +215 -0
- package/dist/tools/SchemaUtils.js.map +1 -0
- package/dist/tools/Tool.d.ts +90 -0
- package/dist/tools/Tool.d.ts.map +1 -0
- package/dist/tools/Tool.js +128 -0
- package/dist/tools/Tool.js.map +1 -0
- package/dist/tools/ToolMetadata.d.ts +35 -0
- package/dist/tools/ToolMetadata.d.ts.map +1 -0
- package/dist/tools/ToolMetadata.js +139 -0
- package/dist/tools/ToolMetadata.js.map +1 -0
- package/dist/tools/UserToolFactory.d.ts +34 -0
- package/dist/tools/UserToolFactory.d.ts.map +1 -0
- package/dist/tools/UserToolFactory.js +249 -0
- package/dist/tools/UserToolFactory.js.map +1 -0
- package/dist/tools/implementations/AddEdgeTool.d.ts +22 -0
- package/dist/tools/implementations/AddEdgeTool.d.ts.map +1 -0
- package/dist/tools/implementations/AddEdgeTool.js +43 -0
- package/dist/tools/implementations/AddEdgeTool.js.map +1 -0
- package/dist/tools/implementations/AstQueryTool.d.ts +40 -0
- package/dist/tools/implementations/AstQueryTool.d.ts.map +1 -0
- package/dist/tools/implementations/AstQueryTool.js +142 -0
- package/dist/tools/implementations/AstQueryTool.js.map +1 -0
- package/dist/tools/implementations/AttemptCompletionTool.d.ts +178 -0
- package/dist/tools/implementations/AttemptCompletionTool.d.ts.map +1 -0
- package/dist/tools/implementations/AttemptCompletionTool.js +384 -0
- package/dist/tools/implementations/AttemptCompletionTool.js.map +1 -0
- package/dist/tools/implementations/BlackboardTool.d.ts +80 -0
- package/dist/tools/implementations/BlackboardTool.d.ts.map +1 -0
- package/dist/tools/implementations/BlackboardTool.js +87 -0
- package/dist/tools/implementations/BlackboardTool.js.map +1 -0
- package/dist/tools/implementations/BrowserActionTool.d.ts +109 -0
- package/dist/tools/implementations/BrowserActionTool.d.ts.map +1 -0
- package/dist/tools/implementations/BrowserActionTool.js +265 -0
- package/dist/tools/implementations/BrowserActionTool.js.map +1 -0
- package/dist/tools/implementations/BrowserManager.d.ts +191 -0
- package/dist/tools/implementations/BrowserManager.d.ts.map +1 -0
- package/dist/tools/implementations/BrowserManager.js +619 -0
- package/dist/tools/implementations/BrowserManager.js.map +1 -0
- package/dist/tools/implementations/BrowserVisualVerifyTool.d.ts +56 -0
- package/dist/tools/implementations/BrowserVisualVerifyTool.d.ts.map +1 -0
- package/dist/tools/implementations/BrowserVisualVerifyTool.js +269 -0
- package/dist/tools/implementations/BrowserVisualVerifyTool.js.map +1 -0
- package/dist/tools/implementations/BughuntScanToolWrappers.d.ts +28 -0
- package/dist/tools/implementations/BughuntScanToolWrappers.d.ts.map +1 -0
- package/dist/tools/implementations/BughuntScanToolWrappers.js +183 -0
- package/dist/tools/implementations/BughuntScanToolWrappers.js.map +1 -0
- package/dist/tools/implementations/BughuntScanTools.d.ts +48 -0
- package/dist/tools/implementations/BughuntScanTools.d.ts.map +1 -0
- package/dist/tools/implementations/BughuntScanTools.js +502 -0
- package/dist/tools/implementations/BughuntScanTools.js.map +1 -0
- package/dist/tools/implementations/BughuntTaintScanner.d.ts +11 -0
- package/dist/tools/implementations/BughuntTaintScanner.d.ts.map +1 -0
- package/dist/tools/implementations/BughuntTaintScanner.js +82 -0
- package/dist/tools/implementations/BughuntTaintScanner.js.map +1 -0
- package/dist/tools/implementations/CodeSearch.d.ts +55 -0
- package/dist/tools/implementations/CodeSearch.d.ts.map +1 -0
- package/dist/tools/implementations/CodeSearch.js +564 -0
- package/dist/tools/implementations/CodeSearch.js.map +1 -0
- package/dist/tools/implementations/CodeSearchTool.d.ts +17 -0
- package/dist/tools/implementations/CodeSearchTool.d.ts.map +1 -0
- package/dist/tools/implementations/CodeSearchTool.js +35 -0
- package/dist/tools/implementations/CodeSearchTool.js.map +1 -0
- package/dist/tools/implementations/DeclareAssumptionTool.d.ts +21 -0
- package/dist/tools/implementations/DeclareAssumptionTool.d.ts.map +1 -0
- package/dist/tools/implementations/DeclareAssumptionTool.js +60 -0
- package/dist/tools/implementations/DeclareAssumptionTool.js.map +1 -0
- package/dist/tools/implementations/DeclareIntentTool.d.ts +14 -0
- package/dist/tools/implementations/DeclareIntentTool.d.ts.map +1 -0
- package/dist/tools/implementations/DeclareIntentTool.js +41 -0
- package/dist/tools/implementations/DeclareIntentTool.js.map +1 -0
- package/dist/tools/implementations/DesignAssetTool.d.ts +25 -0
- package/dist/tools/implementations/DesignAssetTool.d.ts.map +1 -0
- package/dist/tools/implementations/DesignAssetTool.js +197 -0
- package/dist/tools/implementations/DesignAssetTool.js.map +1 -0
- package/dist/tools/implementations/EditDocxTool.d.ts +60 -0
- package/dist/tools/implementations/EditDocxTool.d.ts.map +1 -0
- package/dist/tools/implementations/EditDocxTool.js +344 -0
- package/dist/tools/implementations/EditDocxTool.js.map +1 -0
- package/dist/tools/implementations/EditPptxTool.d.ts +100 -0
- package/dist/tools/implementations/EditPptxTool.d.ts.map +1 -0
- package/dist/tools/implementations/EditPptxTool.js +447 -0
- package/dist/tools/implementations/EditPptxTool.js.map +1 -0
- package/dist/tools/implementations/EditXlsxTool.d.ts +58 -0
- package/dist/tools/implementations/EditXlsxTool.d.ts.map +1 -0
- package/dist/tools/implementations/EditXlsxTool.js +210 -0
- package/dist/tools/implementations/EditXlsxTool.js.map +1 -0
- package/dist/tools/implementations/ExecutionSandbox.d.ts +51 -0
- package/dist/tools/implementations/ExecutionSandbox.d.ts.map +1 -0
- package/dist/tools/implementations/ExecutionSandbox.js +415 -0
- package/dist/tools/implementations/ExecutionSandbox.js.map +1 -0
- package/dist/tools/implementations/FileCreate.d.ts +15 -0
- package/dist/tools/implementations/FileCreate.d.ts.map +1 -0
- package/dist/tools/implementations/FileCreate.js +68 -0
- package/dist/tools/implementations/FileCreate.js.map +1 -0
- package/dist/tools/implementations/FileParser.d.ts +41 -0
- package/dist/tools/implementations/FileParser.d.ts.map +1 -0
- package/dist/tools/implementations/FileParser.js +524 -0
- package/dist/tools/implementations/FileParser.js.map +1 -0
- package/dist/tools/implementations/FileRead.d.ts +14 -0
- package/dist/tools/implementations/FileRead.d.ts.map +1 -0
- package/dist/tools/implementations/FileRead.js +311 -0
- package/dist/tools/implementations/FileRead.js.map +1 -0
- package/dist/tools/implementations/GenerateCanvasTool.d.ts +109 -0
- package/dist/tools/implementations/GenerateCanvasTool.d.ts.map +1 -0
- package/dist/tools/implementations/GenerateCanvasTool.js +364 -0
- package/dist/tools/implementations/GenerateCanvasTool.js.map +1 -0
- package/dist/tools/implementations/GenerateDocxTool.d.ts +36 -0
- package/dist/tools/implementations/GenerateDocxTool.d.ts.map +1 -0
- package/dist/tools/implementations/GenerateDocxTool.js +327 -0
- package/dist/tools/implementations/GenerateDocxTool.js.map +1 -0
- package/dist/tools/implementations/GenerateHtmlDocumentTool.d.ts +149 -0
- package/dist/tools/implementations/GenerateHtmlDocumentTool.d.ts.map +1 -0
- package/dist/tools/implementations/GenerateHtmlDocumentTool.js +111 -0
- package/dist/tools/implementations/GenerateHtmlDocumentTool.js.map +1 -0
- package/dist/tools/implementations/GenerateHtmlPresentationTool.d.ts +20 -0
- package/dist/tools/implementations/GenerateHtmlPresentationTool.d.ts.map +1 -0
- package/dist/tools/implementations/GenerateHtmlPresentationTool.js +77 -0
- package/dist/tools/implementations/GenerateHtmlPresentationTool.js.map +1 -0
- package/dist/tools/implementations/GeneratePdfTool.d.ts +48 -0
- package/dist/tools/implementations/GeneratePdfTool.d.ts.map +1 -0
- package/dist/tools/implementations/GeneratePdfTool.js +301 -0
- package/dist/tools/implementations/GeneratePdfTool.js.map +1 -0
- package/dist/tools/implementations/GeneratePptxTool.d.ts +91 -0
- package/dist/tools/implementations/GeneratePptxTool.d.ts.map +1 -0
- package/dist/tools/implementations/GeneratePptxTool.js +570 -0
- package/dist/tools/implementations/GeneratePptxTool.js.map +1 -0
- package/dist/tools/implementations/GenerateSlidevTool.d.ts +26 -0
- package/dist/tools/implementations/GenerateSlidevTool.d.ts.map +1 -0
- package/dist/tools/implementations/GenerateSlidevTool.js +128 -0
- package/dist/tools/implementations/GenerateSlidevTool.js.map +1 -0
- package/dist/tools/implementations/GenerateXlsxTool.d.ts +63 -0
- package/dist/tools/implementations/GenerateXlsxTool.d.ts.map +1 -0
- package/dist/tools/implementations/GenerateXlsxTool.js +202 -0
- package/dist/tools/implementations/GenerateXlsxTool.js.map +1 -0
- package/dist/tools/implementations/GetTerminalOutput.d.ts +15 -0
- package/dist/tools/implementations/GetTerminalOutput.d.ts.map +1 -0
- package/dist/tools/implementations/GetTerminalOutput.js +97 -0
- package/dist/tools/implementations/GetTerminalOutput.js.map +1 -0
- package/dist/tools/implementations/GitTool.d.ts +70 -0
- package/dist/tools/implementations/GitTool.d.ts.map +1 -0
- package/dist/tools/implementations/GitTool.js +321 -0
- package/dist/tools/implementations/GitTool.js.map +1 -0
- package/dist/tools/implementations/GlobTool.d.ts +16 -0
- package/dist/tools/implementations/GlobTool.d.ts.map +1 -0
- package/dist/tools/implementations/GlobTool.js +85 -0
- package/dist/tools/implementations/GlobTool.js.map +1 -0
- package/dist/tools/implementations/HttpRequestTool.d.ts +33 -0
- package/dist/tools/implementations/HttpRequestTool.d.ts.map +1 -0
- package/dist/tools/implementations/HttpRequestTool.js +197 -0
- package/dist/tools/implementations/HttpRequestTool.js.map +1 -0
- package/dist/tools/implementations/InspectDocxTool.d.ts +14 -0
- package/dist/tools/implementations/InspectDocxTool.d.ts.map +1 -0
- package/dist/tools/implementations/InspectDocxTool.js +78 -0
- package/dist/tools/implementations/InspectDocxTool.js.map +1 -0
- package/dist/tools/implementations/InspectPptxTool.d.ts +14 -0
- package/dist/tools/implementations/InspectPptxTool.d.ts.map +1 -0
- package/dist/tools/implementations/InspectPptxTool.js +81 -0
- package/dist/tools/implementations/InspectPptxTool.js.map +1 -0
- package/dist/tools/implementations/ListDir.d.ts +15 -0
- package/dist/tools/implementations/ListDir.d.ts.map +1 -0
- package/dist/tools/implementations/ListDir.js +156 -0
- package/dist/tools/implementations/ListDir.js.map +1 -0
- package/dist/tools/implementations/LspTool.d.ts +27 -0
- package/dist/tools/implementations/LspTool.d.ts.map +1 -0
- package/dist/tools/implementations/LspTool.js +111 -0
- package/dist/tools/implementations/LspTool.js.map +1 -0
- package/dist/tools/implementations/McpTool.d.ts +41 -0
- package/dist/tools/implementations/McpTool.d.ts.map +1 -0
- package/dist/tools/implementations/McpTool.js +103 -0
- package/dist/tools/implementations/McpTool.js.map +1 -0
- package/dist/tools/implementations/MemoryTool.d.ts +90 -0
- package/dist/tools/implementations/MemoryTool.d.ts.map +1 -0
- package/dist/tools/implementations/MemoryTool.js +167 -0
- package/dist/tools/implementations/MemoryTool.js.map +1 -0
- package/dist/tools/implementations/NodeReplTool.d.ts +20 -0
- package/dist/tools/implementations/NodeReplTool.d.ts.map +1 -0
- package/dist/tools/implementations/NodeReplTool.js +109 -0
- package/dist/tools/implementations/NodeReplTool.js.map +1 -0
- package/dist/tools/implementations/OCRTool.d.ts +33 -0
- package/dist/tools/implementations/OCRTool.d.ts.map +1 -0
- package/dist/tools/implementations/OCRTool.js +253 -0
- package/dist/tools/implementations/OCRTool.js.map +1 -0
- package/dist/tools/implementations/OfficeAssetTool.d.ts +42 -0
- package/dist/tools/implementations/OfficeAssetTool.d.ts.map +1 -0
- package/dist/tools/implementations/OfficeAssetTool.js +210 -0
- package/dist/tools/implementations/OfficeAssetTool.js.map +1 -0
- package/dist/tools/implementations/OfficeOpsTool.d.ts +33 -0
- package/dist/tools/implementations/OfficeOpsTool.d.ts.map +1 -0
- package/dist/tools/implementations/OfficeOpsTool.js +221 -0
- package/dist/tools/implementations/OfficeOpsTool.js.map +1 -0
- package/dist/tools/implementations/OfficeReviewTool.d.ts +75 -0
- package/dist/tools/implementations/OfficeReviewTool.d.ts.map +1 -0
- package/dist/tools/implementations/OfficeReviewTool.js +125 -0
- package/dist/tools/implementations/OfficeReviewTool.js.map +1 -0
- package/dist/tools/implementations/OfficeRuntimeTool.d.ts +40 -0
- package/dist/tools/implementations/OfficeRuntimeTool.d.ts.map +1 -0
- package/dist/tools/implementations/OfficeRuntimeTool.js +266 -0
- package/dist/tools/implementations/OfficeRuntimeTool.js.map +1 -0
- package/dist/tools/implementations/OfficeXmlBuilder.d.ts +226 -0
- package/dist/tools/implementations/OfficeXmlBuilder.d.ts.map +1 -0
- package/dist/tools/implementations/OfficeXmlBuilder.js +560 -0
- package/dist/tools/implementations/OfficeXmlBuilder.js.map +1 -0
- package/dist/tools/implementations/ParallelReadBatchTool.d.ts +21 -0
- package/dist/tools/implementations/ParallelReadBatchTool.d.ts.map +1 -0
- package/dist/tools/implementations/ParallelReadBatchTool.js +90 -0
- package/dist/tools/implementations/ParallelReadBatchTool.js.map +1 -0
- package/dist/tools/implementations/ParseFileTool.d.ts +20 -0
- package/dist/tools/implementations/ParseFileTool.d.ts.map +1 -0
- package/dist/tools/implementations/ParseFileTool.js +59 -0
- package/dist/tools/implementations/ParseFileTool.js.map +1 -0
- package/dist/tools/implementations/PythonExec.d.ts +38 -0
- package/dist/tools/implementations/PythonExec.d.ts.map +1 -0
- package/dist/tools/implementations/PythonExec.js +204 -0
- package/dist/tools/implementations/PythonExec.js.map +1 -0
- package/dist/tools/implementations/PythonExecTool.d.ts +15 -0
- package/dist/tools/implementations/PythonExecTool.d.ts.map +1 -0
- package/dist/tools/implementations/PythonExecTool.js +54 -0
- package/dist/tools/implementations/PythonExecTool.js.map +1 -0
- package/dist/tools/implementations/ReadGraphTool.d.ts +31 -0
- package/dist/tools/implementations/ReadGraphTool.d.ts.map +1 -0
- package/dist/tools/implementations/ReadGraphTool.js +259 -0
- package/dist/tools/implementations/ReadGraphTool.js.map +1 -0
- package/dist/tools/implementations/ScreenshotTool.d.ts +27 -0
- package/dist/tools/implementations/ScreenshotTool.d.ts.map +1 -0
- package/dist/tools/implementations/ScreenshotTool.js +124 -0
- package/dist/tools/implementations/ScreenshotTool.js.map +1 -0
- package/dist/tools/implementations/SendMessageTool.d.ts +21 -0
- package/dist/tools/implementations/SendMessageTool.d.ts.map +1 -0
- package/dist/tools/implementations/SendMessageTool.js +75 -0
- package/dist/tools/implementations/SendMessageTool.js.map +1 -0
- package/dist/tools/implementations/SessionArtifacts.d.ts +22 -0
- package/dist/tools/implementations/SessionArtifacts.d.ts.map +1 -0
- package/dist/tools/implementations/SessionArtifacts.js +141 -0
- package/dist/tools/implementations/SessionArtifacts.js.map +1 -0
- package/dist/tools/implementations/SessionInfoTool.d.ts +10 -0
- package/dist/tools/implementations/SessionInfoTool.d.ts.map +1 -0
- package/dist/tools/implementations/SessionInfoTool.js +38 -0
- package/dist/tools/implementations/SessionInfoTool.js.map +1 -0
- package/dist/tools/implementations/Shell.d.ts +77 -0
- package/dist/tools/implementations/Shell.d.ts.map +1 -0
- package/dist/tools/implementations/Shell.js +772 -0
- package/dist/tools/implementations/Shell.js.map +1 -0
- package/dist/tools/implementations/StructuredPatchTool.d.ts +57 -0
- package/dist/tools/implementations/StructuredPatchTool.d.ts.map +1 -0
- package/dist/tools/implementations/StructuredPatchTool.js +970 -0
- package/dist/tools/implementations/StructuredPatchTool.js.map +1 -0
- package/dist/tools/implementations/SupersedeNodeTool.d.ts +19 -0
- package/dist/tools/implementations/SupersedeNodeTool.d.ts.map +1 -0
- package/dist/tools/implementations/SupersedeNodeTool.js +50 -0
- package/dist/tools/implementations/SupersedeNodeTool.js.map +1 -0
- package/dist/tools/implementations/TeamCreate.d.ts +20 -0
- package/dist/tools/implementations/TeamCreate.d.ts.map +1 -0
- package/dist/tools/implementations/TeamCreate.js +99 -0
- package/dist/tools/implementations/TeamCreate.js.map +1 -0
- package/dist/tools/implementations/TeamDelete.d.ts +11 -0
- package/dist/tools/implementations/TeamDelete.d.ts.map +1 -0
- package/dist/tools/implementations/TeamDelete.js +55 -0
- package/dist/tools/implementations/TeamDelete.js.map +1 -0
- package/dist/tools/implementations/TeamEdit.d.ts +35 -0
- package/dist/tools/implementations/TeamEdit.d.ts.map +1 -0
- package/dist/tools/implementations/TeamEdit.js +254 -0
- package/dist/tools/implementations/TeamEdit.js.map +1 -0
- package/dist/tools/implementations/TeamInboxCheck.d.ts +22 -0
- package/dist/tools/implementations/TeamInboxCheck.d.ts.map +1 -0
- package/dist/tools/implementations/TeamInboxCheck.js +111 -0
- package/dist/tools/implementations/TeamInboxCheck.js.map +1 -0
- package/dist/tools/implementations/TeamInboxTool.d.ts +13 -0
- package/dist/tools/implementations/TeamInboxTool.d.ts.map +1 -0
- package/dist/tools/implementations/TeamInboxTool.js +17 -0
- package/dist/tools/implementations/TeamInboxTool.js.map +1 -0
- package/dist/tools/implementations/TeamListMembers.d.ts +16 -0
- package/dist/tools/implementations/TeamListMembers.d.ts.map +1 -0
- package/dist/tools/implementations/TeamListMembers.js +34 -0
- package/dist/tools/implementations/TeamListMembers.js.map +1 -0
- package/dist/tools/implementations/TeamManageTool.d.ts +33 -0
- package/dist/tools/implementations/TeamManageTool.d.ts.map +1 -0
- package/dist/tools/implementations/TeamManageTool.js +68 -0
- package/dist/tools/implementations/TeamManageTool.js.map +1 -0
- package/dist/tools/implementations/TeamMessageTool.d.ts +94 -0
- package/dist/tools/implementations/TeamMessageTool.d.ts.map +1 -0
- package/dist/tools/implementations/TeamMessageTool.js +89 -0
- package/dist/tools/implementations/TeamMessageTool.js.map +1 -0
- package/dist/tools/implementations/TeamSendMessage.d.ts +57 -0
- package/dist/tools/implementations/TeamSendMessage.d.ts.map +1 -0
- package/dist/tools/implementations/TeamSendMessage.js +290 -0
- package/dist/tools/implementations/TeamSendMessage.js.map +1 -0
- package/dist/tools/implementations/TeamStatus.d.ts +18 -0
- package/dist/tools/implementations/TeamStatus.d.ts.map +1 -0
- package/dist/tools/implementations/TeamStatus.js +106 -0
- package/dist/tools/implementations/TeamStatus.js.map +1 -0
- package/dist/tools/implementations/TeamTaskBoard.d.ts +22 -0
- package/dist/tools/implementations/TeamTaskBoard.d.ts.map +1 -0
- package/dist/tools/implementations/TeamTaskBoard.js +119 -0
- package/dist/tools/implementations/TeamTaskBoard.js.map +1 -0
- package/dist/tools/implementations/TerminalControl.d.ts +27 -0
- package/dist/tools/implementations/TerminalControl.d.ts.map +1 -0
- package/dist/tools/implementations/TerminalControl.js +198 -0
- package/dist/tools/implementations/TerminalControl.js.map +1 -0
- package/dist/tools/implementations/TerminalSessionManager.d.ts +196 -0
- package/dist/tools/implementations/TerminalSessionManager.d.ts.map +1 -0
- package/dist/tools/implementations/TerminalSessionManager.js +525 -0
- package/dist/tools/implementations/TerminalSessionManager.js.map +1 -0
- package/dist/tools/implementations/ToolDiscoveryTool.d.ts +24 -0
- package/dist/tools/implementations/ToolDiscoveryTool.d.ts.map +1 -0
- package/dist/tools/implementations/ToolDiscoveryTool.js +138 -0
- package/dist/tools/implementations/ToolDiscoveryTool.js.map +1 -0
- package/dist/tools/implementations/ToolPreflightTool.d.ts +17 -0
- package/dist/tools/implementations/ToolPreflightTool.d.ts.map +1 -0
- package/dist/tools/implementations/ToolPreflightTool.js +27 -0
- package/dist/tools/implementations/ToolPreflightTool.js.map +1 -0
- package/dist/tools/implementations/TreeSitterSecurityEngine.d.ts +67 -0
- package/dist/tools/implementations/TreeSitterSecurityEngine.d.ts.map +1 -0
- package/dist/tools/implementations/TreeSitterSecurityEngine.js +355 -0
- package/dist/tools/implementations/TreeSitterSecurityEngine.js.map +1 -0
- package/dist/tools/implementations/ValidateOfficeTool.d.ts +33 -0
- package/dist/tools/implementations/ValidateOfficeTool.d.ts.map +1 -0
- package/dist/tools/implementations/ValidateOfficeTool.js +50 -0
- package/dist/tools/implementations/ValidateOfficeTool.js.map +1 -0
- package/dist/tools/implementations/VisualContactSheetTool.d.ts +32 -0
- package/dist/tools/implementations/VisualContactSheetTool.d.ts.map +1 -0
- package/dist/tools/implementations/VisualContactSheetTool.js +234 -0
- package/dist/tools/implementations/VisualContactSheetTool.js.map +1 -0
- package/dist/tools/implementations/WebCommon.d.ts +12 -0
- package/dist/tools/implementations/WebCommon.d.ts.map +1 -0
- package/dist/tools/implementations/WebCommon.js +286 -0
- package/dist/tools/implementations/WebCommon.js.map +1 -0
- package/dist/tools/implementations/WebFetch.d.ts +38 -0
- package/dist/tools/implementations/WebFetch.d.ts.map +1 -0
- package/dist/tools/implementations/WebFetch.js +294 -0
- package/dist/tools/implementations/WebFetch.js.map +1 -0
- package/dist/tools/implementations/WebSearch.d.ts +45 -0
- package/dist/tools/implementations/WebSearch.d.ts.map +1 -0
- package/dist/tools/implementations/WebSearch.js +432 -0
- package/dist/tools/implementations/WebSearch.js.map +1 -0
- package/dist/tools/implementations/WorkNoteTool.d.ts +71 -0
- package/dist/tools/implementations/WorkNoteTool.d.ts.map +1 -0
- package/dist/tools/implementations/WorkNoteTool.js +238 -0
- package/dist/tools/implementations/WorkNoteTool.js.map +1 -0
- package/dist/tools/implementations/WriteFactTool.d.ts +34 -0
- package/dist/tools/implementations/WriteFactTool.d.ts.map +1 -0
- package/dist/tools/implementations/WriteFactTool.js +43 -0
- package/dist/tools/implementations/WriteFactTool.js.map +1 -0
- package/dist/tools/implementations/office/ConditionalFormattingBuilder.d.ts +149 -0
- package/dist/tools/implementations/office/ConditionalFormattingBuilder.d.ts.map +1 -0
- package/dist/tools/implementations/office/ConditionalFormattingBuilder.js +259 -0
- package/dist/tools/implementations/office/ConditionalFormattingBuilder.js.map +1 -0
- package/dist/tools/implementations/office/ExcelWorkbook.d.ts +21 -0
- package/dist/tools/implementations/office/ExcelWorkbook.d.ts.map +1 -0
- package/dist/tools/implementations/office/ExcelWorkbook.js +114 -0
- package/dist/tools/implementations/office/ExcelWorkbook.js.map +1 -0
- package/dist/tools/implementations/office/OfficeAuditLog.d.ts +28 -0
- package/dist/tools/implementations/office/OfficeAuditLog.d.ts.map +1 -0
- package/dist/tools/implementations/office/OfficeAuditLog.js +221 -0
- package/dist/tools/implementations/office/OfficeAuditLog.js.map +1 -0
- package/dist/tools/implementations/office/OfficePdfRenderer.d.ts +33 -0
- package/dist/tools/implementations/office/OfficePdfRenderer.d.ts.map +1 -0
- package/dist/tools/implementations/office/OfficePdfRenderer.js +194 -0
- package/dist/tools/implementations/office/OfficePdfRenderer.js.map +1 -0
- package/dist/tools/implementations/office/OfficePreviewExtractor.d.ts +6 -0
- package/dist/tools/implementations/office/OfficePreviewExtractor.d.ts.map +1 -0
- package/dist/tools/implementations/office/OfficePreviewExtractor.js +493 -0
- package/dist/tools/implementations/office/OfficePreviewExtractor.js.map +1 -0
- package/dist/tools/implementations/office/OfficePreviewModel.d.ts +96 -0
- package/dist/tools/implementations/office/OfficePreviewModel.d.ts.map +1 -0
- package/dist/tools/implementations/office/OfficePreviewModel.js +2 -0
- package/dist/tools/implementations/office/OfficePreviewModel.js.map +1 -0
- package/dist/tools/implementations/office/OfficeReview.d.ts +94 -0
- package/dist/tools/implementations/office/OfficeReview.d.ts.map +1 -0
- package/dist/tools/implementations/office/OfficeReview.js +496 -0
- package/dist/tools/implementations/office/OfficeReview.js.map +1 -0
- package/dist/tools/implementations/office/OfficeRuntime.d.ts +13 -0
- package/dist/tools/implementations/office/OfficeRuntime.d.ts.map +1 -0
- package/dist/tools/implementations/office/OfficeRuntime.js +22 -0
- package/dist/tools/implementations/office/OfficeRuntime.js.map +1 -0
- package/dist/tools/implementations/office/OfficeTemplateRegistry.d.ts +76 -0
- package/dist/tools/implementations/office/OfficeTemplateRegistry.d.ts.map +1 -0
- package/dist/tools/implementations/office/OfficeTemplateRegistry.js +624 -0
- package/dist/tools/implementations/office/OfficeTemplateRegistry.js.map +1 -0
- package/dist/tools/implementations/office/OfficeValidator.d.ts +33 -0
- package/dist/tools/implementations/office/OfficeValidator.d.ts.map +1 -0
- package/dist/tools/implementations/office/OfficeValidator.js +651 -0
- package/dist/tools/implementations/office/OfficeValidator.js.map +1 -0
- package/dist/tools/implementations/office/OoxmlTextReplace.d.ts +12 -0
- package/dist/tools/implementations/office/OoxmlTextReplace.d.ts.map +1 -0
- package/dist/tools/implementations/office/OoxmlTextReplace.js +107 -0
- package/dist/tools/implementations/office/OoxmlTextReplace.js.map +1 -0
- package/dist/tools/implementations/office/XlsxStyleBuilder.d.ts +85 -0
- package/dist/tools/implementations/office/XlsxStyleBuilder.d.ts.map +1 -0
- package/dist/tools/implementations/office/XlsxStyleBuilder.js +156 -0
- package/dist/tools/implementations/office/XlsxStyleBuilder.js.map +1 -0
- package/dist/tools/implementations/office/html/HtmlOfficeEngine.d.ts +53 -0
- package/dist/tools/implementations/office/html/HtmlOfficeEngine.d.ts.map +1 -0
- package/dist/tools/implementations/office/html/HtmlOfficeEngine.js +90 -0
- package/dist/tools/implementations/office/html/HtmlOfficeEngine.js.map +1 -0
- package/dist/tools/implementations/office/html/assemble.d.ts +52 -0
- package/dist/tools/implementations/office/html/assemble.d.ts.map +1 -0
- package/dist/tools/implementations/office/html/assemble.js +183 -0
- package/dist/tools/implementations/office/html/assemble.js.map +1 -0
- package/dist/tools/implementations/office/html/components.d.ts +132 -0
- package/dist/tools/implementations/office/html/components.d.ts.map +1 -0
- package/dist/tools/implementations/office/html/components.js +182 -0
- package/dist/tools/implementations/office/html/components.js.map +1 -0
- package/dist/tools/implementations/office/html/exporters/HtmlToDocx.d.ts +19 -0
- package/dist/tools/implementations/office/html/exporters/HtmlToDocx.d.ts.map +1 -0
- package/dist/tools/implementations/office/html/exporters/HtmlToDocx.js +180 -0
- package/dist/tools/implementations/office/html/exporters/HtmlToDocx.js.map +1 -0
- package/dist/tools/implementations/office/html/exporters/HtmlToPdf.d.ts +38 -0
- package/dist/tools/implementations/office/html/exporters/HtmlToPdf.d.ts.map +1 -0
- package/dist/tools/implementations/office/html/exporters/HtmlToPdf.js +118 -0
- package/dist/tools/implementations/office/html/exporters/HtmlToPdf.js.map +1 -0
- package/dist/tools/implementations/office/html/exporters/HtmlToPptx.d.ts +28 -0
- package/dist/tools/implementations/office/html/exporters/HtmlToPptx.d.ts.map +1 -0
- package/dist/tools/implementations/office/html/exporters/HtmlToPptx.js +79 -0
- package/dist/tools/implementations/office/html/exporters/HtmlToPptx.js.map +1 -0
- package/dist/tools/implementations/office/html/exporters/HtmlToXlsx.d.ts +20 -0
- package/dist/tools/implementations/office/html/exporters/HtmlToXlsx.d.ts.map +1 -0
- package/dist/tools/implementations/office/html/exporters/HtmlToXlsx.js +101 -0
- package/dist/tools/implementations/office/html/exporters/HtmlToXlsx.js.map +1 -0
- package/dist/tools/implementations/office/html/provenance.d.ts +25 -0
- package/dist/tools/implementations/office/html/provenance.d.ts.map +1 -0
- package/dist/tools/implementations/office/html/provenance.js +51 -0
- package/dist/tools/implementations/office/html/provenance.js.map +1 -0
- package/dist/tools/implementations/office/html/themes.d.ts +60 -0
- package/dist/tools/implementations/office/html/themes.d.ts.map +1 -0
- package/dist/tools/implementations/office/html/themes.js +183 -0
- package/dist/tools/implementations/office/html/themes.js.map +1 -0
- package/dist/tools/implementations/rules/RuleLoader.d.ts +27 -0
- package/dist/tools/implementations/rules/RuleLoader.d.ts.map +1 -0
- package/dist/tools/implementations/rules/RuleLoader.js +69 -0
- package/dist/tools/implementations/rules/RuleLoader.js.map +1 -0
- package/dist/tools/implementations/rules/schema.d.ts +236 -0
- package/dist/tools/implementations/rules/schema.d.ts.map +1 -0
- package/dist/tools/implementations/rules/schema.js +119 -0
- package/dist/tools/implementations/rules/schema.js.map +1 -0
- package/dist/tools/implementations/rules/seed.d.ts +18 -0
- package/dist/tools/implementations/rules/seed.d.ts.map +1 -0
- package/dist/tools/implementations/rules/seed.js +252 -0
- package/dist/tools/implementations/rules/seed.js.map +1 -0
- package/dist/tools/implementations/rules/taintFacts.d.ts +26 -0
- package/dist/tools/implementations/rules/taintFacts.d.ts.map +1 -0
- package/dist/tools/implementations/rules/taintFacts.js +48 -0
- package/dist/tools/implementations/rules/taintFacts.js.map +1 -0
- package/dist/tools/implementations/scanners/ScannerAdapter.d.ts +35 -0
- package/dist/tools/implementations/scanners/ScannerAdapter.d.ts.map +1 -0
- package/dist/tools/implementations/scanners/ScannerAdapter.js +2 -0
- package/dist/tools/implementations/scanners/ScannerAdapter.js.map +1 -0
- package/dist/tools/implementations/utils.d.ts +76 -0
- package/dist/tools/implementations/utils.d.ts.map +1 -0
- package/dist/tools/implementations/utils.js +468 -0
- package/dist/tools/implementations/utils.js.map +1 -0
- package/dist/tools/implementations/workflow/WorkflowAddNodeTool.d.ts +128 -0
- package/dist/tools/implementations/workflow/WorkflowAddNodeTool.d.ts.map +1 -0
- package/dist/tools/implementations/workflow/WorkflowAddNodeTool.js +399 -0
- package/dist/tools/implementations/workflow/WorkflowAddNodeTool.js.map +1 -0
- package/dist/tools/implementations/workflow/WorkflowApplyTool.d.ts +98 -0
- package/dist/tools/implementations/workflow/WorkflowApplyTool.d.ts.map +1 -0
- package/dist/tools/implementations/workflow/WorkflowApplyTool.js +329 -0
- package/dist/tools/implementations/workflow/WorkflowApplyTool.js.map +1 -0
- package/dist/tools/implementations/workflow/WorkflowAuditTool.d.ts +12 -0
- package/dist/tools/implementations/workflow/WorkflowAuditTool.d.ts.map +1 -0
- package/dist/tools/implementations/workflow/WorkflowAuditTool.js +51 -0
- package/dist/tools/implementations/workflow/WorkflowAuditTool.js.map +1 -0
- package/dist/tools/implementations/workflow/WorkflowConnectTool.d.ts +21 -0
- package/dist/tools/implementations/workflow/WorkflowConnectTool.d.ts.map +1 -0
- package/dist/tools/implementations/workflow/WorkflowConnectTool.js +175 -0
- package/dist/tools/implementations/workflow/WorkflowConnectTool.js.map +1 -0
- package/dist/tools/implementations/workflow/WorkflowCreateTool.d.ts +17 -0
- package/dist/tools/implementations/workflow/WorkflowCreateTool.d.ts.map +1 -0
- package/dist/tools/implementations/workflow/WorkflowCreateTool.js +78 -0
- package/dist/tools/implementations/workflow/WorkflowCreateTool.js.map +1 -0
- package/dist/tools/implementations/workflow/WorkflowExecuteTool.d.ts +20 -0
- package/dist/tools/implementations/workflow/WorkflowExecuteTool.d.ts.map +1 -0
- package/dist/tools/implementations/workflow/WorkflowExecuteTool.js +178 -0
- package/dist/tools/implementations/workflow/WorkflowExecuteTool.js.map +1 -0
- package/dist/tools/implementations/workflow/WorkflowGetStatusTool.d.ts +12 -0
- package/dist/tools/implementations/workflow/WorkflowGetStatusTool.d.ts.map +1 -0
- package/dist/tools/implementations/workflow/WorkflowGetStatusTool.js +87 -0
- package/dist/tools/implementations/workflow/WorkflowGetStatusTool.js.map +1 -0
- package/dist/tools/implementations/workflow/WorkflowInspectTool.d.ts +11 -0
- package/dist/tools/implementations/workflow/WorkflowInspectTool.d.ts.map +1 -0
- package/dist/tools/implementations/workflow/WorkflowInspectTool.js +186 -0
- package/dist/tools/implementations/workflow/WorkflowInspectTool.js.map +1 -0
- package/dist/tools/implementations/workflow/WorkflowSchemaUtils.d.ts +49 -0
- package/dist/tools/implementations/workflow/WorkflowSchemaUtils.d.ts.map +1 -0
- package/dist/tools/implementations/workflow/WorkflowSchemaUtils.js +186 -0
- package/dist/tools/implementations/workflow/WorkflowSchemaUtils.js.map +1 -0
- package/dist/tools/implementations/workflow/WorkflowTool.d.ts +129 -0
- package/dist/tools/implementations/workflow/WorkflowTool.d.ts.map +1 -0
- package/dist/tools/implementations/workflow/WorkflowTool.js +141 -0
- package/dist/tools/implementations/workflow/WorkflowTool.js.map +1 -0
- package/dist/tools/implementations/workflow/WorkflowValidateTool.d.ts +11 -0
- package/dist/tools/implementations/workflow/WorkflowValidateTool.d.ts.map +1 -0
- package/dist/tools/implementations/workflow/WorkflowValidateTool.js +238 -0
- package/dist/tools/implementations/workflow/WorkflowValidateTool.js.map +1 -0
- package/dist/tools/index.d.ts +49 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +364 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/officeToolContract.d.ts +2 -0
- package/dist/tools/officeToolContract.d.ts.map +1 -0
- package/dist/tools/officeToolContract.js +2 -0
- package/dist/tools/officeToolContract.js.map +1 -0
- package/dist/tools/slidev/SlidevExporter.d.ts +15 -0
- package/dist/tools/slidev/SlidevExporter.d.ts.map +1 -0
- package/dist/tools/slidev/SlidevExporter.js +112 -0
- package/dist/tools/slidev/SlidevExporter.js.map +1 -0
- package/dist/tools/slidev/SlidevProjectBuilder.d.ts +22 -0
- package/dist/tools/slidev/SlidevProjectBuilder.d.ts.map +1 -0
- package/dist/tools/slidev/SlidevProjectBuilder.js +139 -0
- package/dist/tools/slidev/SlidevProjectBuilder.js.map +1 -0
- package/dist/types/canonical.d.ts +124 -0
- package/dist/types/canonical.d.ts.map +1 -0
- package/dist/types/canonical.js +8 -0
- package/dist/types/canonical.js.map +1 -0
- package/dist/utils/SmartTruncator.d.ts +22 -0
- package/dist/utils/SmartTruncator.d.ts.map +1 -0
- package/dist/utils/SmartTruncator.js +88 -0
- package/dist/utils/SmartTruncator.js.map +1 -0
- package/dist/utils/getPty.d.ts +42 -0
- package/dist/utils/getPty.d.ts.map +1 -0
- package/dist/utils/getPty.js +57 -0
- package/dist/utils/getPty.js.map +1 -0
- package/dist/utils/platform.d.ts +137 -0
- package/dist/utils/platform.d.ts.map +1 -0
- package/dist/utils/platform.js +374 -0
- package/dist/utils/platform.js.map +1 -0
- package/dist/utils/sleep.d.ts +8 -0
- package/dist/utils/sleep.d.ts.map +1 -0
- package/dist/utils/sleep.js +10 -0
- package/dist/utils/sleep.js.map +1 -0
- package/dist/utils/textTable.d.ts +27 -0
- package/dist/utils/textTable.d.ts.map +1 -0
- package/dist/utils/textTable.js +55 -0
- package/dist/utils/textTable.js.map +1 -0
- package/dist/version.d.ts +12 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +42 -0
- package/dist/version.js.map +1 -0
- package/dist/web-server/FileChangesApi.d.ts +131 -0
- package/dist/web-server/FileChangesApi.d.ts.map +1 -0
- package/dist/web-server/FileChangesApi.js +552 -0
- package/dist/web-server/FileChangesApi.js.map +1 -0
- package/dist/web-server/GitEnv.d.ts +6 -0
- package/dist/web-server/GitEnv.d.ts.map +1 -0
- package/dist/web-server/GitEnv.js +6 -0
- package/dist/web-server/GitEnv.js.map +1 -0
- package/dist/web-server/GitService.d.ts +151 -0
- package/dist/web-server/GitService.d.ts.map +1 -0
- package/dist/web-server/GitService.js +1172 -0
- package/dist/web-server/GitService.js.map +1 -0
- package/dist/web-server/LocalLlmGatewayRoutes.d.ts +45 -0
- package/dist/web-server/LocalLlmGatewayRoutes.d.ts.map +1 -0
- package/dist/web-server/LocalLlmGatewayRoutes.js +812 -0
- package/dist/web-server/LocalLlmGatewayRoutes.js.map +1 -0
- package/package.json +114 -0
|
@@ -0,0 +1,3511 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LeaderAgent - 领导者 Agent
|
|
3
|
+
* 负责任务分解、协调和监督多个子 Agent
|
|
4
|
+
*
|
|
5
|
+
* 参考 Python 版本的 LeaderAgent 实现
|
|
6
|
+
*/
|
|
7
|
+
import { createHash } from 'node:crypto';
|
|
8
|
+
import { contentToPlainText, isEmptyContent, } from '../llm/types.js';
|
|
9
|
+
import { healInterruptedToolCalls, resequenceTimestampsForPersistence } from '../llm/message_sanitizer.js';
|
|
10
|
+
import { collectScratchpadFollowUps } from '../core/ScratchpadReview.js';
|
|
11
|
+
import { WorkNoteManager } from '../core/WorkNoteManager.js';
|
|
12
|
+
import { AgentRoleRegistry } from './RoleRegistry.js';
|
|
13
|
+
import { AgentDefinitionService } from './AgentDefinitionService.js';
|
|
14
|
+
import { ContextManager } from '../core/ContextManager.js';
|
|
15
|
+
import { upsertSystemSlot, collapseSystemSlots } from '../core/SystemMessageSlot.js';
|
|
16
|
+
import { LEADER_MAX_TOOL_ROUNDS, LEADER_IDLE_WARNING_SECONDS, LEADER_PROBE_BACKOFF_MULTIPLIER, LEADER_PROBE_MAX_INTERVAL_SECONDS, LEADER_PROBE_SILENCE_SECONDS, MAX_CONVERSATION_BYTES, MAX_CONVERSATION_MESSAGES, } from '../config.js';
|
|
17
|
+
import { join } from 'path';
|
|
18
|
+
import { AssetUsageStore } from '../memory/AssetUsageStore.js';
|
|
19
|
+
import { mkdirSync, writeFileSync } from 'fs';
|
|
20
|
+
import { Workspace } from '../core/Workspace.js';
|
|
21
|
+
import { buildImplementationContent } from './leader/artifactContent.js';
|
|
22
|
+
import { t } from '../i18n.js';
|
|
23
|
+
import { getExternalAgentAvailability } from './external/availability.js';
|
|
24
|
+
import { getTeamMailbox } from '../core/TeamMailbox.js';
|
|
25
|
+
import { createLlmGuard } from './LlmGuard.js';
|
|
26
|
+
import { getTeamRequestTracker } from '../core/TeamRequestTracker.js';
|
|
27
|
+
import { assertCoreAgentTransition, isRunTerminalStatus } from '../contracts/adapters/StatusAdapter.js';
|
|
28
|
+
import { LeaderToolsExecutor } from './LeaderTools.js';
|
|
29
|
+
import { LeaderDirectToolsExecutor } from './LeaderDirectTools.js';
|
|
30
|
+
import { registerLeaderMetaTools } from './leader/LeaderMetaToolRegistry.js';
|
|
31
|
+
import { buildInitialUserContent } from './leader/userContent.js';
|
|
32
|
+
import { buildLeaderSystemPrompt } from './leader/systemPrompt.js';
|
|
33
|
+
import { LeaderContextBuilder, isModeHintContent } from './leader/LeaderContextBuilder.js';
|
|
34
|
+
import { ensureMessageTimestamp, trimConversationBuffer, } from './leader/conversationBuffer.js';
|
|
35
|
+
import { resolveModelContextLimit } from './leader/contextLimit.js';
|
|
36
|
+
import { collectBuiltinRoles } from './leader/builtinRoles.js';
|
|
37
|
+
import { LeaderP0Handler, } from './leader/p0Message.js';
|
|
38
|
+
import { collectAvailableSkills, resolveExplicitSkillMentions, resolveDisabledSkillNames } from '../core/SkillCatalog.js';
|
|
39
|
+
import { resolveDynamicRoleCapability, applyRoleToolsConfigMap } from './RoleCapabilityModel.js';
|
|
40
|
+
import { TeamSynchronizer } from './TeamSynchronizer.js';
|
|
41
|
+
import { isPermissionMode, summarizePermissionContextForDisplay, } from '../core/PermissionSystem.js';
|
|
42
|
+
import { isTaskTerminalControlMessage, isActionableAgentBusMessage, readAgentControlMessage, } from '../core/AgentProtocol.js';
|
|
43
|
+
import { renderContextManifest } from '../core/ContextManifest.js';
|
|
44
|
+
import { formatWorkerCompletion } from './leader/workerCompletionFormatter.js';
|
|
45
|
+
import { classifyLLMError } from '../llm/errors.js';
|
|
46
|
+
import { _resetAllCircuitBreakers } from '../llm/CircuitBreaker.js';
|
|
47
|
+
import { SESSION_KEYS } from '../core/SessionStateKeys.js';
|
|
48
|
+
import { createEventStreamClient } from './runtime/LlmRoundExecutor.js';
|
|
49
|
+
import { startToolProgressHeartbeat } from './runtime/ToolProgressHeartbeat.js';
|
|
50
|
+
import { LEADER_PARALLEL_SAFE_TOOLS, canBatchExecuteToolCalls as canBatchExecuteToolCallsFn, runToolCallsBatch, } from './runtime/parallelToolBatch.js';
|
|
51
|
+
import { createLeaderSupervisionState, normalizeLeaderSupervisionConfig, } from './LeaderSupervisionPolicy.js';
|
|
52
|
+
import { AgentHealthMonitor, } from '../core/AgentHealthMonitor.js';
|
|
53
|
+
import { HEALTH_POLL_INTERVAL_SECONDS, HEALTH_STALL_THRESHOLD_SECONDS, HEALTH_STUCK_THRESHOLD_SECONDS, HEALTH_RUNAWAY_THRESHOLD_SECONDS, HEALTH_NUDGE_COOLDOWN_SECONDS, HEALTH_MAX_NUDGE_BEFORE_ESCALATION, config as globalConfig, refreshRuntimeConfig, onConfigReload, } from '../config.js';
|
|
54
|
+
import { leaderLogger } from '../core/Log.js';
|
|
55
|
+
import { LeaderPermissionManager } from './LeaderPermissionManager.js';
|
|
56
|
+
import { LeaderProgressInvariant } from './LeaderProgressInvariant.js';
|
|
57
|
+
import { LeaderWorkOrchestrator } from './LeaderWorkOrchestrator.js';
|
|
58
|
+
import { LeaderSupervisionCoordinator } from './LeaderSupervisionCoordinator.js';
|
|
59
|
+
import { LeaderExecutionController } from './LeaderExecutionController.js';
|
|
60
|
+
import { LeaderThinkingEngine } from './leader/LeaderThinkingLoop.js';
|
|
61
|
+
import { LeaderBlackboard } from './LeaderBlackboard.js';
|
|
62
|
+
import { UnifiedScheduler } from './UnifiedScheduler.js';
|
|
63
|
+
import { DispatchDecisionCoordinator } from './DispatchDecisionCoordinator.js';
|
|
64
|
+
import { resolveModeRuntimeProjection } from '../core/ModeRuntimeProjection.js';
|
|
65
|
+
import { WorktreeService } from '../core/WorktreeService.js';
|
|
66
|
+
import { DatabaseRepositoryAdapter } from '../core/DatabaseRepositories.js';
|
|
67
|
+
import { SharedLedger } from '../core/SharedLedger.js';
|
|
68
|
+
import { buildExpansion, renderExpansionHint } from '../core/SpecFirstPipeline.js';
|
|
69
|
+
import { ContractHotSync } from '../core/ContractHotSync.js';
|
|
70
|
+
import { IntegrationVerifyInjector } from '../core/IntegrationVerifyInjector.js';
|
|
71
|
+
import { DeterministicAcceptance } from '../core/DeterministicAcceptance.js';
|
|
72
|
+
import { RepairStrategyEngine } from '../core/RepairStrategyEngine.js';
|
|
73
|
+
// 导入预设角色的系统提示
|
|
74
|
+
import { getLeaderSystemPrompt } from './prompts/leader/system_prompt.js';
|
|
75
|
+
import { getPromptLocale, getPromptCatalog } from './prompts/i18n/catalog.js';
|
|
76
|
+
import { buildSessionScopeSection } from './prompts/shared/fragments.js';
|
|
77
|
+
import { RESEARCH_SYSTEM_PROMPT_BY_LOCALE, EXPLORE_SYSTEM_PROMPT_BY_LOCALE, CODING_SYSTEM_PROMPT_BY_LOCALE, VERIFY_SYSTEM_PROMPT_BY_LOCALE, REVIEW_SYSTEM_PROMPT_BY_LOCALE } from './prompts/worker/system_prompts.js';
|
|
78
|
+
import { FRONTEND_SYSTEM_PROMPT_BY_LOCALE } from './prompts/frontend_system.js';
|
|
79
|
+
import { BACKEND_SYSTEM_PROMPT_BY_LOCALE } from './prompts/backend_system.js';
|
|
80
|
+
import { FULLSTACK_SYSTEM_PROMPT_BY_LOCALE } from './prompts/fullstack_system.js';
|
|
81
|
+
import { QA_SYSTEM_PROMPT_BY_LOCALE } from './prompts/qa_system.js';
|
|
82
|
+
import { UX_DESIGNER_SYSTEM_PROMPT_BY_LOCALE } from './prompts/ux_designer_system.js';
|
|
83
|
+
import { PLANNER_SYSTEM_PROMPT_BY_LOCALE } from './prompts/planner_system.js';
|
|
84
|
+
import { EVALUATOR_SYSTEM_PROMPT_BY_LOCALE } from './prompts/evaluator_system.js';
|
|
85
|
+
import { ARCHITECT_SYSTEM_PROMPT_BY_LOCALE } from './prompts/architect_system.js';
|
|
86
|
+
import { LLM } from '../config/defaults.js';
|
|
87
|
+
import { getModelManager } from '../config/ModelManager.js';
|
|
88
|
+
import { OrchestrationRuntime } from './OrchestrationRuntime.js';
|
|
89
|
+
import { captureBughuntEvidence } from '../core/BughuntEvidenceCapture.js';
|
|
90
|
+
import { readBughuntLedger, updateBughuntDagNode } from '../core/BughuntLedger.js';
|
|
91
|
+
import { getModelDevInfo } from '../llm/ModelsDevRegistry.js';
|
|
92
|
+
import { getContextWindowSizeFromProvider } from '../llm/model_capabilities.js';
|
|
93
|
+
function transitionLeaderAgentHandleToStopped(handle) {
|
|
94
|
+
if (handle.status === 'stopped') {
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
assertCoreAgentTransition(handle.status, 'stopped', `Agent "${handle.name}"`);
|
|
98
|
+
handle.status = 'stopped';
|
|
99
|
+
}
|
|
100
|
+
function stripSessionPrefix(sessionId, agentName) {
|
|
101
|
+
const prefix = `${sessionId}:`;
|
|
102
|
+
return agentName.startsWith(prefix) ? agentName.slice(prefix.length) : agentName;
|
|
103
|
+
}
|
|
104
|
+
export function formatWorkerRecoveryPayload(payload) {
|
|
105
|
+
const agent = payload.agentName.replace(/^[^:]+:/, '') || 'unknown';
|
|
106
|
+
const lines = [
|
|
107
|
+
`--- Worker Recovery Required @${agent} ---`,
|
|
108
|
+
`task: ${payload.taskId}${typeof payload.taskRunGeneration === 'number' ? ` generation=${payload.taskRunGeneration}` : ''}`,
|
|
109
|
+
`status: ${payload.status}`,
|
|
110
|
+
`category: ${payload.category}`,
|
|
111
|
+
`fault_class: ${payload.faultClass}`,
|
|
112
|
+
`recovery_action: ${payload.recoveryAction}`,
|
|
113
|
+
`auto_retry_scheduled: ${payload.autoRetryScheduled === true}`,
|
|
114
|
+
...(payload.llmErrorKind ? [`llm_error_kind: ${payload.llmErrorKind}`] : []),
|
|
115
|
+
`attempt: ${payload.attempt}`,
|
|
116
|
+
`reason: ${payload.reason}`,
|
|
117
|
+
];
|
|
118
|
+
if (payload.roleType) {
|
|
119
|
+
lines.push(`role: ${payload.roleType}`);
|
|
120
|
+
}
|
|
121
|
+
if (typeof payload.lastActivityAt === 'number') {
|
|
122
|
+
lines.push(`last_activity_at: ${payload.lastActivityAt}`);
|
|
123
|
+
}
|
|
124
|
+
if (payload.diagnostics) {
|
|
125
|
+
const diag = payload.diagnostics;
|
|
126
|
+
const diagParts = [
|
|
127
|
+
typeof diag.pid === 'number' ? `pid=${diag.pid}` : '',
|
|
128
|
+
diag.exitCode !== undefined && diag.exitCode !== null ? `exit=${diag.exitCode}` : '',
|
|
129
|
+
diag.exitSignal ? `signal=${diag.exitSignal}` : '',
|
|
130
|
+
diag.timeoutReason ? `timeout=${diag.timeoutReason}` : '',
|
|
131
|
+
diag.error ? `error=${diag.error}` : '',
|
|
132
|
+
].filter(Boolean);
|
|
133
|
+
if (diagParts.length > 0) {
|
|
134
|
+
lines.push(`diagnostics: ${diagParts.join(' ')}`);
|
|
135
|
+
}
|
|
136
|
+
if (diag.stderrTail?.length) {
|
|
137
|
+
lines.push(`stderr_tail: ${diag.stderrTail.slice(-3).join(' | ')}`);
|
|
138
|
+
}
|
|
139
|
+
else if (diag.stdoutTail?.length) {
|
|
140
|
+
lines.push(`stdout_tail: ${diag.stdoutTail.slice(-3).join(' | ')}`);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
const autoScheduled = payload.autoRetryScheduled === true;
|
|
144
|
+
const redispatchAction = payload.recoveryAction === 'worker_restart' || payload.recoveryAction === 'worker_redispatch';
|
|
145
|
+
lines.push(autoScheduled
|
|
146
|
+
? `runtime: system has ALREADY auto-scheduled a worker respawn/redispatch for this recovery (attempt ${payload.attempt}). Verify the new worker is running and wait/verify its output; only explicitly redispatch if the auto retry failed — do NOT re-dispatch the same task.`
|
|
147
|
+
: redispatchAction
|
|
148
|
+
? 'runtime: system has scheduled an autonomous worker respawn/redispatch when possible; verify the restarted worker or dispatch a replacement if auto retry failed.'
|
|
149
|
+
: 'runtime: Leader must take over, block, escalate, or explicitly redispatch; this is not task completion.');
|
|
150
|
+
return lines.join('\n');
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* LeaderAgent - 领导者 Agent
|
|
154
|
+
* 负责任务分解与协调,管理多个子 Agent 的执行
|
|
155
|
+
*/
|
|
156
|
+
export class LeaderAgent {
|
|
157
|
+
// ==================== Policy Threshold Constants ====================
|
|
158
|
+
/** Max automatic recovery attempts for stuck open work */
|
|
159
|
+
static OPEN_WORK_RECOVERY_MAX_ATTEMPTS = 3;
|
|
160
|
+
/** Tool calls count threshold for diagnostic logging */
|
|
161
|
+
static TOOL_CALLS_DIAGNOSTIC_THRESHOLD = 5;
|
|
162
|
+
sessionId;
|
|
163
|
+
llm;
|
|
164
|
+
board;
|
|
165
|
+
bus;
|
|
166
|
+
pool;
|
|
167
|
+
tracker;
|
|
168
|
+
workspace;
|
|
169
|
+
db;
|
|
170
|
+
emitter;
|
|
171
|
+
model;
|
|
172
|
+
name = 'leader';
|
|
173
|
+
/** 带 sessionId 前缀的 bus 收件人名 */
|
|
174
|
+
get busName() { return `${this.sessionId}:${this.name}`; }
|
|
175
|
+
/** 本会话 leader 的 bus 收件人名(等同 busName) */
|
|
176
|
+
get leaderBusName() { return `${this.sessionId}:leader`; }
|
|
177
|
+
/** 给任意 agent name 加上本会话前缀 */
|
|
178
|
+
/** 用户中断控制器,abort 时会 kill 正在执行的 shell 命令 */
|
|
179
|
+
userInterruptController = new AbortController();
|
|
180
|
+
sessionPrefix(name) { return `${this.sessionId}:${name}`; }
|
|
181
|
+
customPrompt;
|
|
182
|
+
defaultSkillsContent;
|
|
183
|
+
running = false;
|
|
184
|
+
/**
|
|
185
|
+
* 当前 run() 的 in-flight Promise(P0 #2 单飞锁)。
|
|
186
|
+
* - stop() 后 finished=true,run() 仍在 await LLM/工具调用,外部紧接着 sendUserInput 可能重启 run()。
|
|
187
|
+
* 此字段保证同一时刻只有一个 run() 在跑:第二次进入直接返回当前 Promise,等旧 run() finally 设回 null 后再启动。
|
|
188
|
+
* - 用 protected 是因为运行时扩展共享主循环。
|
|
189
|
+
*/
|
|
190
|
+
currentRunPromise = null;
|
|
191
|
+
/** Restart requested while a stopped run is still unwinding. */
|
|
192
|
+
pendingRunRestartPromise = null;
|
|
193
|
+
rawXmlRetryCount = 0;
|
|
194
|
+
emptyResponseRetryCount = 0;
|
|
195
|
+
conversation = [];
|
|
196
|
+
pendingUserInput = null;
|
|
197
|
+
waitingForUser = false;
|
|
198
|
+
controlMode = 'manual';
|
|
199
|
+
currentLlmAbortController = null;
|
|
200
|
+
finished = false;
|
|
201
|
+
userInterruptPending = false;
|
|
202
|
+
/** 用户消息队列:Leader 忙碌时到来的用户消息按序存放,空闲后依次处理 */
|
|
203
|
+
userMessageQueue = [];
|
|
204
|
+
/** Leader 是否正在执行 leaderThinkAndAct(即正在忙碌) */
|
|
205
|
+
isBusy = false;
|
|
206
|
+
/** Public getter for isBusy — allows SessionManager to check Leader state */
|
|
207
|
+
get busy() { return this.isBusy; }
|
|
208
|
+
pendingReview = false;
|
|
209
|
+
/**
|
|
210
|
+
* 原始用户任务文本(防漂移锚点)。新会话首条 user prompt 时捕获,
|
|
211
|
+
* 供每轮 getDynamicContext() 置顶「当前使命」锚点段(见 LeaderContextBuilder)。
|
|
212
|
+
*/
|
|
213
|
+
originalGoal = null;
|
|
214
|
+
/** 防漂移:对外暴露原始用户任务文本,供 create_task 注入每个子任务的 context。 */
|
|
215
|
+
getOriginalGoal() {
|
|
216
|
+
return this.originalGoal;
|
|
217
|
+
}
|
|
218
|
+
/**
|
|
219
|
+
* Leader 上下文构建子模块(L1/B4 抽出)。fingerprint 状态已迁入 builder。
|
|
220
|
+
*/
|
|
221
|
+
_contextBuilder = null;
|
|
222
|
+
get contextBuilder() {
|
|
223
|
+
if (!this._contextBuilder) {
|
|
224
|
+
this._contextBuilder = new LeaderContextBuilder(this.buildContextBuilderDeps());
|
|
225
|
+
}
|
|
226
|
+
return this._contextBuilder;
|
|
227
|
+
}
|
|
228
|
+
emitRoundComplete(trigger) {
|
|
229
|
+
this.emitter.emit('leader:round_complete', { sessionId: this.sessionId, trigger });
|
|
230
|
+
}
|
|
231
|
+
planApproved = false;
|
|
232
|
+
/** 非打断式用户指导消息,在下轮 LLM 调用时作为 system 消息注入 */
|
|
233
|
+
nudgeMessage = null;
|
|
234
|
+
lastScratchpadReviewDigest = null;
|
|
235
|
+
lastRuntimeContextFingerprint = null;
|
|
236
|
+
lastContextMemoryFingerprint = null;
|
|
237
|
+
lastProgressReportDigest = null;
|
|
238
|
+
turnCount = 0;
|
|
239
|
+
lastOpenWorkRecoveryFingerprint = null;
|
|
240
|
+
openWorkRecoveryAttempts = 0;
|
|
241
|
+
/** Active team name for this session (set when Leader calls team_manage(action="create")). */
|
|
242
|
+
activeTeamName = null;
|
|
243
|
+
/** Agent 完成报告队列:P0 到达时立即保存报告正文,直到注入 Leader conversation 后才清除 */
|
|
244
|
+
pendingAgentCompletionSignals = [];
|
|
245
|
+
/** P0 消息处理下沉载体 — handleLeaderP0Message 改为薄委托 */
|
|
246
|
+
_leaderP0Handler = null;
|
|
247
|
+
workerResultQueue = Promise.resolve();
|
|
248
|
+
lastOpenWorkRecoveryAtMs = 0;
|
|
249
|
+
/** LLM 连续错误重试计数 */
|
|
250
|
+
llmErrorRetryCount = 0;
|
|
251
|
+
LLM_MAX_ERROR_RETRIES = globalConfig.llm.max_retries;
|
|
252
|
+
/**
|
|
253
|
+
* 进度哈希检测 + Watchdog — 委托给 LeaderProgressInvariant
|
|
254
|
+
*/
|
|
255
|
+
progressInvariant;
|
|
256
|
+
workOrchestrator;
|
|
257
|
+
workNoteManager;
|
|
258
|
+
getWorkNoteManager() { return this.workNoteManager; }
|
|
259
|
+
toolsExecutor;
|
|
260
|
+
directToolsExecutor;
|
|
261
|
+
roleRegistry;
|
|
262
|
+
contextManager;
|
|
263
|
+
orchestrationRuntime;
|
|
264
|
+
toolRegistry;
|
|
265
|
+
executionMode = 'direct';
|
|
266
|
+
executionReason = '默认优先由 Leader 直接处理当前请求';
|
|
267
|
+
permManager;
|
|
268
|
+
teamSynchronizer = null;
|
|
269
|
+
healthMonitor;
|
|
270
|
+
supervCoordinator;
|
|
271
|
+
executionController;
|
|
272
|
+
fileChangesApi = null;
|
|
273
|
+
thinkingEngine;
|
|
274
|
+
workflowManager;
|
|
275
|
+
workflowEngine;
|
|
276
|
+
scheduledTaskManager;
|
|
277
|
+
supervisionConfig = normalizeLeaderSupervisionConfig({
|
|
278
|
+
initialProbeSilenceSeconds: LEADER_PROBE_SILENCE_SECONDS,
|
|
279
|
+
maxProbeIntervalSeconds: LEADER_PROBE_MAX_INTERVAL_SECONDS,
|
|
280
|
+
probeBackoffMultiplier: LEADER_PROBE_BACKOFF_MULTIPLIER,
|
|
281
|
+
idleWarningSeconds: LEADER_IDLE_WARNING_SECONDS,
|
|
282
|
+
});
|
|
283
|
+
supervisionState = createLeaderSupervisionState();
|
|
284
|
+
// ─── 黑板架构(feature flag: LINGXIAO_BLACKBOARD) ───
|
|
285
|
+
/** 黑板集成模块 — 持有 blackboardGraph / graphBridge / dispatcherEngine */
|
|
286
|
+
leaderBlackboard = null; /** 共享账本 — 替代 BlackboardGraph 的轻量共享状态 */
|
|
287
|
+
sharedLedger = new SharedLedger(); // ─── 0→1 交付引擎 ───
|
|
288
|
+
// specPipeline 已经是纯函数(buildExpansion/renderExpansionHint),不再需要实例
|
|
289
|
+
contractHotSync = null;
|
|
290
|
+
integrationInjector = new IntegrationVerifyInjector();
|
|
291
|
+
deterministicAcceptance = new DeterministicAcceptance();
|
|
292
|
+
repairEngine = new RepairStrategyEngine(this.sharedLedger);
|
|
293
|
+
/** 统一调度器 — 全局唯一 worker dispatch 入口 */
|
|
294
|
+
scheduler = null;
|
|
295
|
+
getScheduler() { return this.scheduler; }
|
|
296
|
+
dispatchDecisionCoordinator = null;
|
|
297
|
+
/** requestLeaderDispatchDecision 去重:避免事件驱动 + 主循环兜底重复注入同一批提示 */
|
|
298
|
+
lastLeaderDecisionSig = null;
|
|
299
|
+
/**
|
|
300
|
+
* 构造器级(实例级)事件退订函数集合:attachTaskLifecycleToTeamMailbox 注册的
|
|
301
|
+
* task:failed / task:cancelled 监听器存放于此。这些监听器在构造器注册一次、
|
|
302
|
+
* 不随 run() 重入而重注册,因此必须在 dispose()(实例终结)时退订,
|
|
303
|
+
* 而非 run() 的 finally(否则同实例重跑 run() 后团队通知会永久失效)。
|
|
304
|
+
*/
|
|
305
|
+
_taskTeamUnsubscribers = [];
|
|
306
|
+
/** onConfigReload 退订函数:在 dispose() 时调用以防止监听器泄漏 */
|
|
307
|
+
_configReloadUnsubscribe = null;
|
|
308
|
+
/**
|
|
309
|
+
* Leader 已"看过并决定等待"的 dispatchable 任务集合指纹。
|
|
310
|
+
* 非 eternal 模式下,Leader 思考完一轮仍未派发某 dispatchable 任务(如等待上游、
|
|
311
|
+
* 或有意先观察)会 latch waitingForUser。若主循环每轮都因"还有 dispatchable"把它
|
|
312
|
+
* 重新唤醒 think,就成了用户看到的"没开 eternal 却无限请求 LLM"。
|
|
313
|
+
* 用指纹记住"这批 dispatchable 我已经决定等了",集合不变就不再重复唤醒;
|
|
314
|
+
* 集合变化(新任务解锁 / 派发后减少)才重新驱动一次。
|
|
315
|
+
*/
|
|
316
|
+
waitedDispatchableSig = null;
|
|
317
|
+
/** 公开访问器 — SessionRoutes 等外部消费者用来读取黑板分析 */
|
|
318
|
+
getLeaderBlackboard() { return this.leaderBlackboard; }
|
|
319
|
+
// ─── 0→1 交付引擎 getter ───
|
|
320
|
+
getSpecPipeline() { return { buildExpansion, renderExpansionHint }; }
|
|
321
|
+
getContractHotSync() { return this.contractHotSync; }
|
|
322
|
+
getIntegrationInjector() { return this.integrationInjector; }
|
|
323
|
+
getDeterministicAcceptance() { return this.deterministicAcceptance; }
|
|
324
|
+
getRepairEngine() { return this.repairEngine; }
|
|
325
|
+
getSharedLedger() { return this.sharedLedger; }
|
|
326
|
+
/**
|
|
327
|
+
* 获取黑板图分析结果(供 LeaderThinkingEngine 注入上下文)
|
|
328
|
+
* 黑板模式未启用时返回 null
|
|
329
|
+
*/
|
|
330
|
+
getBlackboardAnalysis() {
|
|
331
|
+
return this.leaderBlackboard?.getBlackboardAnalysis() ?? null;
|
|
332
|
+
}
|
|
333
|
+
/** 黑板模式是否启用 */
|
|
334
|
+
isBlackboardEnabled() {
|
|
335
|
+
return this.leaderBlackboard?.isEnabled() ?? false;
|
|
336
|
+
}
|
|
337
|
+
resolveTaskContractReadiness(task) {
|
|
338
|
+
const binding = task.orchestration?.contractBinding;
|
|
339
|
+
if (!binding || (!binding.requireContract && !binding.requireAck)) {
|
|
340
|
+
return { ready: true };
|
|
341
|
+
}
|
|
342
|
+
const reasons = [];
|
|
343
|
+
const tag = binding.tag || `contract:${binding.surface}`;
|
|
344
|
+
if (binding.requireContract) {
|
|
345
|
+
// 方案 C: 同时查 BlackboardGraph 和 SharedLedger——任一有契约即视为就绪
|
|
346
|
+
const graph = this.leaderBlackboard?.blackboardGraph;
|
|
347
|
+
const contractEvidence = graph?.getContractEvidence(this.sessionId, binding.surface)
|
|
348
|
+
?? graph?.getActiveContract(this.sessionId, binding.surface);
|
|
349
|
+
const ledgerContract = this.sharedLedger.query({
|
|
350
|
+
type: 'contract',
|
|
351
|
+
surface: binding.surface,
|
|
352
|
+
latestOnly: true,
|
|
353
|
+
});
|
|
354
|
+
if (!contractEvidence && ledgerContract.length === 0) {
|
|
355
|
+
reasons.push(`等待契约就绪: ${tag}(可用 write_contract 直接写入)`);
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
if (binding.requireAck) {
|
|
359
|
+
const requestId = binding.requestId || `${binding.surface}@v${binding.version ?? 1}`;
|
|
360
|
+
const state = getTeamRequestTracker(this.sessionId).getRequestState(requestId);
|
|
361
|
+
if (state.status === 'unknown') {
|
|
362
|
+
reasons.push(`等待契约 ack request 登记: ${requestId}`);
|
|
363
|
+
}
|
|
364
|
+
else if (state.status === 'pending') {
|
|
365
|
+
const missing = state.missingAckBy && state.missingAckBy.length > 0
|
|
366
|
+
? ` 缺 ${state.missingAckBy.join(', ')}`
|
|
367
|
+
: '';
|
|
368
|
+
reasons.push(`等待契约 ack 闭环: ${requestId}${missing}`);
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
return reasons.length > 0 ? { ready: false, reasons } : { ready: true };
|
|
372
|
+
}
|
|
373
|
+
refreshContractBoundTasks(event) {
|
|
374
|
+
if (event.sessionId !== this.sessionId)
|
|
375
|
+
return;
|
|
376
|
+
if (event.type !== 'node_added' && event.type !== 'node_superseded')
|
|
377
|
+
return;
|
|
378
|
+
this.board.refreshReadiness();
|
|
379
|
+
void this.dispatchDecisionCoordinator?.notifyLeaderOfDispatchable();
|
|
380
|
+
}
|
|
381
|
+
buildInitialUserContent(content) {
|
|
382
|
+
return buildInitialUserContent(content, this.workspace);
|
|
383
|
+
}
|
|
384
|
+
/**
|
|
385
|
+
* 订阅 task:failed/cancelled,向 active team 中所有 *running* worker 直推系统通知。
|
|
386
|
+
*
|
|
387
|
+
* 设计取舍(2026-05-27 重构):
|
|
388
|
+
* - 直接走 MessageBus,不再写 TeamMailbox。系统通知是"实时事件",
|
|
389
|
+
* 塞进 mailbox 会污染 inbox_check 的"补漏"语义,让任何 worker 重启
|
|
390
|
+
* 后都看到一堆别的任务的失败 fanout,毫无相关性。
|
|
391
|
+
* - completed 路径完全静默:worker 自己的 task_complete + work note 已经覆盖。
|
|
392
|
+
* - failed/cancelled 必通知:用 user_intervention 类型,让 worker 立刻注入到上下文。
|
|
393
|
+
* - 没有 active team / 没有 running worker → 默默跳过。
|
|
394
|
+
*/
|
|
395
|
+
attachTaskLifecycleToTeamMailbox() {
|
|
396
|
+
const e = this.emitter;
|
|
397
|
+
const notifyTeam = (taskId, status, detail) => {
|
|
398
|
+
const activeTeam = this.activeTeamName;
|
|
399
|
+
if (!activeTeam)
|
|
400
|
+
return;
|
|
401
|
+
const task = this.board.getTask(taskId);
|
|
402
|
+
const agent = task?.assigned_agent || '';
|
|
403
|
+
const subject = task?.subject || taskId;
|
|
404
|
+
const trimmedDetail = detail ? detail.replace(/\s+/g, ' ').slice(0, 160) : '';
|
|
405
|
+
const content = [
|
|
406
|
+
`[任务${status === 'failed' ? '失败' : '已取消'} — 系统通知]`,
|
|
407
|
+
`${taskId}:${subject}`,
|
|
408
|
+
agent ? `执行者:@${agent}` : '',
|
|
409
|
+
trimmedDetail ? `详情:${trimmedDetail}` : '',
|
|
410
|
+
].filter(Boolean).join('\n');
|
|
411
|
+
try {
|
|
412
|
+
const running = this.pool.getRunning();
|
|
413
|
+
for (const handle of running) {
|
|
414
|
+
// 不通知触发任务的 worker 自己(它已经在终态路径里了)
|
|
415
|
+
if (handle.name === agent)
|
|
416
|
+
continue;
|
|
417
|
+
this.bus.send(this.sessionPrefix('system'), this.sessionPrefix(handle.name), 'user_intervention', { _system_notice: true, kind: `task:${status}`, taskId, content });
|
|
418
|
+
}
|
|
419
|
+
}
|
|
420
|
+
catch {
|
|
421
|
+
// 非致命:bus 投递失败不应影响 leader 主循环
|
|
422
|
+
}
|
|
423
|
+
};
|
|
424
|
+
const onFailed = (payload) => {
|
|
425
|
+
notifyTeam(payload.taskId, 'failed', payload.error);
|
|
426
|
+
};
|
|
427
|
+
const onCancelled = (payload) => {
|
|
428
|
+
notifyTeam(payload.taskId, 'cancelled', payload.reason);
|
|
429
|
+
};
|
|
430
|
+
e.on('task:failed', onFailed);
|
|
431
|
+
e.on('task:cancelled', onCancelled);
|
|
432
|
+
const unsub = () => {
|
|
433
|
+
e.off('task:failed', onFailed);
|
|
434
|
+
e.off('task:cancelled', onCancelled);
|
|
435
|
+
};
|
|
436
|
+
this._taskTeamUnsubscribers.push(unsub);
|
|
437
|
+
}
|
|
438
|
+
/**
|
|
439
|
+
* 任务终态时自动回收 task 级 worktree。
|
|
440
|
+
*
|
|
441
|
+
* - completed: 尝试 ff-only merge 到 base branch,成功则 remove worktree + 删分支;
|
|
442
|
+
* merge 失败(非 ff 或 dirty)只记日志,保留 worktree 供 Leader 手动处理。
|
|
443
|
+
* - failed / cancelled: force remove worktree + 删分支(放弃工作)。
|
|
444
|
+
*
|
|
445
|
+
* 所有操作 try-catch 包裹,失败只记日志,不阻塞任务生命周期。
|
|
446
|
+
*/
|
|
447
|
+
attachWorktreeCleanup() {
|
|
448
|
+
const e = this.emitter;
|
|
449
|
+
const cleanupWorktree = async (taskId, kind) => {
|
|
450
|
+
try {
|
|
451
|
+
const repos = new DatabaseRepositoryAdapter(this.db);
|
|
452
|
+
const service = new WorktreeService(repos.worktrees);
|
|
453
|
+
const records = await service.list({ sessionId: this.sessionId, taskId });
|
|
454
|
+
if (records.length === 0)
|
|
455
|
+
return;
|
|
456
|
+
for (const wt of records) {
|
|
457
|
+
if (kind === 'completed') {
|
|
458
|
+
try {
|
|
459
|
+
await service.merge(wt.id, { ffOnly: true, deleteAfterMerge: true });
|
|
460
|
+
leaderLogger.info(`[WorktreeCleanup] task ${taskId} completed: merged & removed worktree ${wt.branch}`);
|
|
461
|
+
}
|
|
462
|
+
catch (mergeErr) {
|
|
463
|
+
// merge 失败(非 ff / dirty / base 不匹配)→ 保留 worktree,供 Leader 手动处理
|
|
464
|
+
leaderLogger.warn(`[WorktreeCleanup] task ${taskId} worktree ${wt.branch} merge failed, keeping for manual review: ${mergeErr instanceof Error ? mergeErr.message : String(mergeErr)}`);
|
|
465
|
+
}
|
|
466
|
+
}
|
|
467
|
+
else {
|
|
468
|
+
// failed / cancelled → force remove + 删分支
|
|
469
|
+
try {
|
|
470
|
+
await service.remove(wt.id, { keepBranch: false });
|
|
471
|
+
leaderLogger.info(`[WorktreeCleanup] task ${taskId} ${kind}: removed worktree ${wt.branch}`);
|
|
472
|
+
}
|
|
473
|
+
catch (removeErr) {
|
|
474
|
+
leaderLogger.warn(`[WorktreeCleanup] task ${taskId} worktree ${wt.branch} remove failed: ${removeErr instanceof Error ? removeErr.message : String(removeErr)}`);
|
|
475
|
+
}
|
|
476
|
+
}
|
|
477
|
+
}
|
|
478
|
+
}
|
|
479
|
+
catch (err) {
|
|
480
|
+
leaderLogger.warn(`[WorktreeCleanup] task ${taskId} cleanup error: ${err instanceof Error ? err.message : String(err)}`);
|
|
481
|
+
}
|
|
482
|
+
};
|
|
483
|
+
const onCompleted = (payload) => {
|
|
484
|
+
void cleanupWorktree(payload.taskId, 'completed');
|
|
485
|
+
};
|
|
486
|
+
const onFailed = (payload) => {
|
|
487
|
+
void cleanupWorktree(payload.taskId, 'failed');
|
|
488
|
+
};
|
|
489
|
+
const onCancelled = (payload) => {
|
|
490
|
+
void cleanupWorktree(payload.taskId, 'cancelled');
|
|
491
|
+
};
|
|
492
|
+
e.on('task:completed', onCompleted);
|
|
493
|
+
e.on('task:failed', onFailed);
|
|
494
|
+
e.on('task:cancelled', onCancelled);
|
|
495
|
+
const unsub = () => {
|
|
496
|
+
e.off('task:completed', onCompleted);
|
|
497
|
+
e.off('task:failed', onFailed);
|
|
498
|
+
e.off('task:cancelled', onCancelled);
|
|
499
|
+
};
|
|
500
|
+
this._taskTeamUnsubscribers.push(unsub);
|
|
501
|
+
}
|
|
502
|
+
constructor(config) {
|
|
503
|
+
this.sessionId = config.sessionId;
|
|
504
|
+
this.llm = config.llm;
|
|
505
|
+
this.toolRegistry = config.toolRegistry;
|
|
506
|
+
this.board = config.board;
|
|
507
|
+
this.board.setContractReadinessResolver((task) => this.resolveTaskContractReadiness(task));
|
|
508
|
+
this.bus = config.bus;
|
|
509
|
+
this.pool = config.pool;
|
|
510
|
+
this.tracker = config.tracker;
|
|
511
|
+
this.workspace = config.workspace;
|
|
512
|
+
this.db = config.db;
|
|
513
|
+
this.emitter = config.emitter;
|
|
514
|
+
this.model = config.model;
|
|
515
|
+
const persistedControlMode = this.db.getSessionState(this.sessionId, SESSION_KEYS.CONTROL_MODE);
|
|
516
|
+
this.controlMode = persistedControlMode === 'eternal' ? 'eternal' : 'manual';
|
|
517
|
+
// 恢复 active team:只信任显式持久化值,不从 mailbox 猜测唯一 team。
|
|
518
|
+
try {
|
|
519
|
+
const persistedActiveTeam = this.db.getSessionState(this.sessionId, SESSION_KEYS.LEADER_ACTIVE_TEAM);
|
|
520
|
+
const candidate = typeof persistedActiveTeam === 'string' ? persistedActiveTeam.trim() : '';
|
|
521
|
+
if (candidate) {
|
|
522
|
+
try {
|
|
523
|
+
const mailbox = getTeamMailbox();
|
|
524
|
+
if (mailbox.teamExists(candidate, this.sessionId)) {
|
|
525
|
+
this.activeTeamName = candidate;
|
|
526
|
+
}
|
|
527
|
+
else {
|
|
528
|
+
this.activeTeamName = null;
|
|
529
|
+
void this.db.setSessionState(this.sessionId, SESSION_KEYS.LEADER_ACTIVE_TEAM, '');
|
|
530
|
+
}
|
|
531
|
+
}
|
|
532
|
+
catch {
|
|
533
|
+
// mailbox 暂未就绪 — 信任持久化值,待首次 dispatch 时再校验
|
|
534
|
+
this.activeTeamName = candidate;
|
|
535
|
+
}
|
|
536
|
+
}
|
|
537
|
+
}
|
|
538
|
+
catch { /* tolerate */ }
|
|
539
|
+
this.customPrompt = config.customPrompt;
|
|
540
|
+
this.defaultSkillsContent = config.defaultSkillsContent || '';
|
|
541
|
+
this.workflowManager = config.workflowManager;
|
|
542
|
+
this.workflowEngine = config.workflowEngine;
|
|
543
|
+
this.scheduledTaskManager = config.scheduledTaskManager;
|
|
544
|
+
// Populate skills catalog for Leader awareness (if not provided externally)
|
|
545
|
+
if (!this.defaultSkillsContent) {
|
|
546
|
+
try {
|
|
547
|
+
const disabledNames = resolveDisabledSkillNames();
|
|
548
|
+
const skills = collectAvailableSkills(this.workspace, { disabledNames });
|
|
549
|
+
if (skills.length > 0) {
|
|
550
|
+
const lines = skills.map(s => `- **${s.name}** [${s.source}]: ${s.summary || '(no description)'}`);
|
|
551
|
+
this.defaultSkillsContent = lines.join('\n');
|
|
552
|
+
}
|
|
553
|
+
}
|
|
554
|
+
catch {
|
|
555
|
+
// Non-fatal: Leader will operate without skill catalog
|
|
556
|
+
}
|
|
557
|
+
}
|
|
558
|
+
this.permManager = new LeaderPermissionManager({
|
|
559
|
+
sessionId: this.sessionId,
|
|
560
|
+
db: this.db,
|
|
561
|
+
emitter: this.emitter,
|
|
562
|
+
bus: this.bus,
|
|
563
|
+
workspace: this.workspace,
|
|
564
|
+
setWaitingForUser: (waiting) => { this.waitingForUser = waiting; },
|
|
565
|
+
addAndPersistMessage: (msg) => {
|
|
566
|
+
this.addMessage(msg);
|
|
567
|
+
this.db.saveConversationMessage(this.sessionId, this.conversation[this.conversation.length - 1]);
|
|
568
|
+
},
|
|
569
|
+
});
|
|
570
|
+
// progressInvariant needs leaderThinkAndAct which is defined on this — bind lazily
|
|
571
|
+
this.progressInvariant = new LeaderProgressInvariant({
|
|
572
|
+
sessionId: this.sessionId,
|
|
573
|
+
db: this.db,
|
|
574
|
+
emitter: this.emitter,
|
|
575
|
+
board: this.board,
|
|
576
|
+
pool: this.pool,
|
|
577
|
+
isFinished: () => this.finished,
|
|
578
|
+
isWaitingForUser: () => this.waitingForUser,
|
|
579
|
+
isPendingReview: () => this.pendingReview,
|
|
580
|
+
isEternalMode: () => this.isEternalMode(),
|
|
581
|
+
isLeaderRunning: () => this.running && !this.finished,
|
|
582
|
+
getConversation: () => this.conversation,
|
|
583
|
+
getConversationLength: () => this.conversation.length,
|
|
584
|
+
addAndPersistMessage: async (msg) => {
|
|
585
|
+
this.addMessage(msg);
|
|
586
|
+
await this.db.saveConversationMessage(this.sessionId, this.conversation[this.conversation.length - 1]);
|
|
587
|
+
},
|
|
588
|
+
leaderThinkAndAct: () => this.leaderThinkAndAct(),
|
|
589
|
+
setWaitingForUser: async (waiting) => {
|
|
590
|
+
this.waitingForUser = waiting;
|
|
591
|
+
await this.db.setSessionState(this.sessionId, SESSION_KEYS.LEADER_WAITING_FOR_USER, waiting ? 'true' : 'false');
|
|
592
|
+
},
|
|
593
|
+
recordTokenUsage: (_usage) => {
|
|
594
|
+
// Token tracking delegated to EternalLoop — LeaderAgent layer is intentionally a no-op.
|
|
595
|
+
// EternalLoop has its own recordTokenUsage via its deps, this is just to satisfy the interface.
|
|
596
|
+
},
|
|
597
|
+
dispatchReadyTasks: async () => {
|
|
598
|
+
// 所有派发决策必须经过 Leader LLM,不再自动 tick scheduler。
|
|
599
|
+
// Intentional no-op: auto-dispatch path retired in favor of explicit Leader LLM decisions.
|
|
600
|
+
return 0;
|
|
601
|
+
},
|
|
602
|
+
getReadyTaskCount: () => this.board.getReadyTasks().filter(t => t.status === 'dispatchable').length,
|
|
603
|
+
// ─── EternalLoop silence-gate 接线 ───
|
|
604
|
+
getBlackboardCounts: () => {
|
|
605
|
+
const graph = this.leaderBlackboard?.blackboardGraph;
|
|
606
|
+
if (!graph)
|
|
607
|
+
return null;
|
|
608
|
+
try {
|
|
609
|
+
const snapshot = graph.getSnapshot(this.sessionId);
|
|
610
|
+
return { nodes: snapshot.nodes.length, edges: snapshot.edges.length };
|
|
611
|
+
}
|
|
612
|
+
catch { /* expected: blackboard not initialized yet */
|
|
613
|
+
return null;
|
|
614
|
+
}
|
|
615
|
+
},
|
|
616
|
+
getScratchpadDigest: () => this.lastScratchpadReviewDigest,
|
|
617
|
+
getRecentConversationDigest: () => {
|
|
618
|
+
// 复用 NextSpeakerPolicy 同款 summarizer 思路;这里直接拼后 6 条非 system 消息
|
|
619
|
+
const recent = this.conversation
|
|
620
|
+
.filter((m) => m.role !== 'system')
|
|
621
|
+
.slice(-6)
|
|
622
|
+
.map((m) => `[${m.role}] ${typeof m.content === 'string' ? m.content.slice(0, 200) : '(structured)'}`)
|
|
623
|
+
.join('\n');
|
|
624
|
+
return recent || '(none)';
|
|
625
|
+
},
|
|
626
|
+
getEternalJudgeLlm: () => {
|
|
627
|
+
try {
|
|
628
|
+
return this.llm;
|
|
629
|
+
}
|
|
630
|
+
catch { /* expected: llm getter may throw before init */
|
|
631
|
+
return null;
|
|
632
|
+
}
|
|
633
|
+
},
|
|
634
|
+
getEternalJudgeModel: () => this.model || null,
|
|
635
|
+
yieldEternalToUser: async (reason) => {
|
|
636
|
+
leaderLogger.info(`[EternalLoop] yielding to user: ${reason}`);
|
|
637
|
+
if (!this.waitingForUser) {
|
|
638
|
+
this.waitingForUser = true;
|
|
639
|
+
await this.db.setSessionState(this.sessionId, SESSION_KEYS.LEADER_WAITING_FOR_USER, 'true');
|
|
640
|
+
}
|
|
641
|
+
this.emitter.emit('leader:status', {
|
|
642
|
+
sessionId: this.sessionId,
|
|
643
|
+
status: '等待用户输入...',
|
|
644
|
+
});
|
|
645
|
+
},
|
|
646
|
+
});
|
|
647
|
+
this.workOrchestrator = new LeaderWorkOrchestrator({
|
|
648
|
+
sessionId: this.sessionId,
|
|
649
|
+
db: this.db,
|
|
650
|
+
board: this.board,
|
|
651
|
+
pool: this.pool,
|
|
652
|
+
emitter: this.emitter,
|
|
653
|
+
bus: this.bus,
|
|
654
|
+
getExecutionMode: () => this.executionMode,
|
|
655
|
+
isEternalMode: () => this.isEternalMode(),
|
|
656
|
+
isFinished: () => this.finished,
|
|
657
|
+
isWaitingForUser: () => this.waitingForUser,
|
|
658
|
+
setWaitingForUser: async (waiting) => {
|
|
659
|
+
this.waitingForUser = waiting;
|
|
660
|
+
await this.db.setSessionState(this.sessionId, SESSION_KEYS.LEADER_WAITING_FOR_USER, waiting ? 'true' : 'false');
|
|
661
|
+
},
|
|
662
|
+
isPendingReview: () => this.pendingReview,
|
|
663
|
+
getPendingPermissionRequest: () => this.permManager.pendingPermissionRequest,
|
|
664
|
+
getPendingUserInput: () => this.pendingUserInput,
|
|
665
|
+
getConversation: () => this.conversation,
|
|
666
|
+
addAndPersistMessage: async (msg) => {
|
|
667
|
+
this.addMessage(msg);
|
|
668
|
+
await this.db.saveConversationMessage(this.sessionId, this.conversation[this.conversation.length - 1]);
|
|
669
|
+
},
|
|
670
|
+
leaderThinkAndAct: () => this.leaderThinkAndAct(),
|
|
671
|
+
getLastOpenWorkRecoveryFingerprint: () => this.lastOpenWorkRecoveryFingerprint,
|
|
672
|
+
setLastOpenWorkRecoveryFingerprint: (v) => { this.lastOpenWorkRecoveryFingerprint = v; },
|
|
673
|
+
getOpenWorkRecoveryAttempts: () => this.openWorkRecoveryAttempts,
|
|
674
|
+
setOpenWorkRecoveryAttempts: (v) => { this.openWorkRecoveryAttempts = v; },
|
|
675
|
+
getLastOpenWorkRecoveryAtMs: () => this.lastOpenWorkRecoveryAtMs,
|
|
676
|
+
setLastOpenWorkRecoveryAtMs: (v) => { this.lastOpenWorkRecoveryAtMs = v; },
|
|
677
|
+
openWorkRecoveryMaxAttempts: LeaderAgent.OPEN_WORK_RECOVERY_MAX_ATTEMPTS,
|
|
678
|
+
getOrchestrationRuntime: () => this.orchestrationRuntime,
|
|
679
|
+
getLeaderBlackboard: () => this.leaderBlackboard,
|
|
680
|
+
getDispatchDecisionCoordinator: () => this.dispatchDecisionCoordinator,
|
|
681
|
+
getRepairEngine: () => this.repairEngine,
|
|
682
|
+
getDeterministicAcceptance: () => this.deterministicAcceptance,
|
|
683
|
+
getSharedLedger: () => this.sharedLedger,
|
|
684
|
+
persistImplementationArtifact: (input) => this.persistImplementationArtifact(input),
|
|
685
|
+
addMessage: (msg) => this.addMessage(msg),
|
|
686
|
+
captureBughuntWorkerEvidence: (input) => this.captureBughuntWorkerEvidence(input),
|
|
687
|
+
recordAgentOutcome: (agentName, taskId, outcome) => this.recordAgentOutcome(agentName, taskId, outcome),
|
|
688
|
+
getPendingAgentCompletionSignals: () => this.pendingAgentCompletionSignals,
|
|
689
|
+
setPendingAgentCompletionSignals: (signals) => { this.pendingAgentCompletionSignals = signals; },
|
|
690
|
+
getLeaderBusName: () => this.leaderBusName,
|
|
691
|
+
clearSoftWaitingForUser: (reason) => this.clearSoftWaitingForUser(reason),
|
|
692
|
+
setDelegateMode: (reason) => this.setDelegateMode(reason),
|
|
693
|
+
acceptWorkerTaskResult: (input) => this.acceptWorkerTaskResult(input),
|
|
694
|
+
});
|
|
695
|
+
this.bus.register(this.leaderBusName);
|
|
696
|
+
this.toolsExecutor = new LeaderToolsExecutor(this);
|
|
697
|
+
registerLeaderMetaTools(this.toolRegistry);
|
|
698
|
+
this.workNoteManager = new WorkNoteManager(join(this.workspace, '.lingxiao'));
|
|
699
|
+
// TeamSynchronizer 需要黑板图来检测 verdict/contradicts 冲突;
|
|
700
|
+
// leaderBlackboard 的 graph 在 enableBlackboardGraph() 内部才创建,
|
|
701
|
+
// 此处先用 null 构造,等 graph 就绪后再 setGraph 注入。
|
|
702
|
+
this.teamSynchronizer = new TeamSynchronizer(this.workNoteManager, this.sessionId);
|
|
703
|
+
this.roleRegistry = new AgentRoleRegistry();
|
|
704
|
+
// 任务终态自动通知 team mailbox
|
|
705
|
+
this.attachTaskLifecycleToTeamMailbox();
|
|
706
|
+
// 任务终态自动回收 task 级 worktree(防止分支堆积)
|
|
707
|
+
this.attachWorktreeCleanup();
|
|
708
|
+
const leaderInitContextLimit = resolveModelContextLimit({
|
|
709
|
+
providerCtx: getContextWindowSizeFromProvider(this.model),
|
|
710
|
+
modelInfoCtx: getModelDevInfo(this.model)?.contextLimit,
|
|
711
|
+
configuredCtx: globalConfig.llm.context_max_tokens,
|
|
712
|
+
fallback: LLM.CONTEXT_MAX_TOKENS,
|
|
713
|
+
});
|
|
714
|
+
this.contextManager = new ContextManager(leaderInitContextLimit, this.model, this.sessionId, this.db, this.createLeaderEventStreamClient('Leader-ContextManager'), this.emitter, {
|
|
715
|
+
kind: 'leader',
|
|
716
|
+
workspace: this.workspace,
|
|
717
|
+
}, createLlmGuard);
|
|
718
|
+
this.orchestrationRuntime = new OrchestrationRuntime({
|
|
719
|
+
sessionId: this.sessionId,
|
|
720
|
+
emitter: this.emitter,
|
|
721
|
+
getTasks: () => this.board.getAllTasks(),
|
|
722
|
+
// 把 verdict 真写回 task.orchestration.verdict + DB —— 让 reject/repair 路径生效
|
|
723
|
+
setOrchestrationVerdict: (taskId, verdict) => this.board.setOrchestrationVerdict(taskId, verdict),
|
|
724
|
+
createFollowupTask: (input) => {
|
|
725
|
+
const taskId = this.board.nextTaskId();
|
|
726
|
+
// 防御性 guard:如果 nextTaskId 意外返回了与 blockedBy 中相同的 ID(自依赖),
|
|
727
|
+
// 强制跳过该 ID 再取一个。正常情况下 nextTaskId 的 while 循环已处理此问题,
|
|
728
|
+
// 但在极端时序下(如 DB 恢复后 taskCounter 未同步)仍可能发生。
|
|
729
|
+
const blockedBy = input.blockedBy ?? [];
|
|
730
|
+
let safeTaskId = taskId;
|
|
731
|
+
if (blockedBy.includes(safeTaskId)) {
|
|
732
|
+
// nextTaskId 已有 while(this.tasks.has) 保护,但自依赖检查不在其中。
|
|
733
|
+
// 强制递增直到不再与任何 blockedBy 冲突。
|
|
734
|
+
do {
|
|
735
|
+
safeTaskId = this.board.nextTaskId();
|
|
736
|
+
} while (blockedBy.includes(safeTaskId));
|
|
737
|
+
}
|
|
738
|
+
const task = this.board.createTask(safeTaskId, input.subject, input.description, input.agentType, blockedBy, [], undefined, input.context, { orchestration: input.orchestration });
|
|
739
|
+
return task.id;
|
|
740
|
+
},
|
|
741
|
+
});
|
|
742
|
+
this.directToolsExecutor = new LeaderDirectToolsExecutor({
|
|
743
|
+
toolRegistry: this.toolRegistry,
|
|
744
|
+
db: this.db,
|
|
745
|
+
sessionId: this.sessionId,
|
|
746
|
+
workspace: this.workspace,
|
|
747
|
+
emitter: this.emitter,
|
|
748
|
+
bus: this.bus,
|
|
749
|
+
contextManager: this.contextManager,
|
|
750
|
+
llm: this.createLeaderEventStreamClient('Leader-DirectTools'),
|
|
751
|
+
model: this.model,
|
|
752
|
+
getModel: () => this.model,
|
|
753
|
+
workflowManager: this.workflowManager,
|
|
754
|
+
workflowEngine: this.workflowEngine,
|
|
755
|
+
scheduledTaskManager: this.scheduledTaskManager,
|
|
756
|
+
// 黑板在本构造函数后段才 init(line ~778),用 getter 惰性解析,
|
|
757
|
+
// 让 Leader 调用 blackboard(action="...") 统一入口时能拿到 graph。
|
|
758
|
+
getBlackboardGraph: () => this.leaderBlackboard?.blackboardGraph ?? null,
|
|
759
|
+
});
|
|
760
|
+
this.healthMonitor = new AgentHealthMonitor(this.emitter,
|
|
761
|
+
// supervCoordinator 在此之后才初始化,使用延迟引用确保安全
|
|
762
|
+
(report) => { if (this.supervCoordinator)
|
|
763
|
+
this.supervCoordinator.handleHealthReport(report); }, {
|
|
764
|
+
pollIntervalMs: HEALTH_POLL_INTERVAL_SECONDS * 1000,
|
|
765
|
+
stallThresholdMs: HEALTH_STALL_THRESHOLD_SECONDS * 1000,
|
|
766
|
+
stuckThresholdMs: HEALTH_STUCK_THRESHOLD_SECONDS * 1000,
|
|
767
|
+
runawayThresholdMs: HEALTH_RUNAWAY_THRESHOLD_SECONDS * 1000,
|
|
768
|
+
// heartbeatLivenessMs 不暴露为 config:固定 90s(3× worker 30s 心跳)走 DEFAULT,
|
|
769
|
+
// 仅在 runaway 级别作「进程死活」二分门(见 assessAgentHealth)。
|
|
770
|
+
nudgeCooldownMs: HEALTH_NUDGE_COOLDOWN_SECONDS * 1000,
|
|
771
|
+
maxNudgeBeforeEscalation: HEALTH_MAX_NUDGE_BEFORE_ESCALATION,
|
|
772
|
+
});
|
|
773
|
+
this.supervCoordinator = new LeaderSupervisionCoordinator({
|
|
774
|
+
sessionId: this.sessionId,
|
|
775
|
+
pool: this.pool,
|
|
776
|
+
emitter: this.emitter,
|
|
777
|
+
bus: this.bus,
|
|
778
|
+
healthMonitor: this.healthMonitor,
|
|
779
|
+
workNoteManager: this.workNoteManager,
|
|
780
|
+
teamSynchronizer: this.teamSynchronizer,
|
|
781
|
+
supervisionConfig: this.supervisionConfig,
|
|
782
|
+
getSupervisionState: () => this.supervisionState,
|
|
783
|
+
setSupervisionState: (s) => { this.supervisionState = s; },
|
|
784
|
+
getConversation: () => this.conversation,
|
|
785
|
+
setConversation: (msgs) => { this.conversation = msgs; },
|
|
786
|
+
getContextManager: () => this.contextManager,
|
|
787
|
+
getDb: () => this.db,
|
|
788
|
+
getPendingAgentCompletionSignals: () => this.pendingAgentCompletionSignals,
|
|
789
|
+
addPendingAgentCompletionSignal: (signal) => { this.pendingAgentCompletionSignals.push(signal); },
|
|
790
|
+
interruptCurrentRound: (reason) => this.interruptCurrentRound(reason),
|
|
791
|
+
onProgressUpdate: (progressAtMs) => { this.progressInvariant.lastProgressAtMs = progressAtMs; },
|
|
792
|
+
saveConversationMessage: (msg) => { this.db.saveConversationMessage(this.sessionId, msg); },
|
|
793
|
+
});
|
|
794
|
+
// 消息处理在 run() 主循环中通过 poll() 完成,无需额外 subscribe
|
|
795
|
+
this.supervCoordinator.subscribeAgentActivityEvents();
|
|
796
|
+
this.supervCoordinator.subscribeContextOverflow();
|
|
797
|
+
this.executionController = new LeaderExecutionController({
|
|
798
|
+
sessionId: this.sessionId,
|
|
799
|
+
db: this.db,
|
|
800
|
+
emitter: this.emitter,
|
|
801
|
+
directToolsExecutor: this.directToolsExecutor,
|
|
802
|
+
hasRunningAgents: () => this.hasRunningAgents(),
|
|
803
|
+
getBoard: () => this.board,
|
|
804
|
+
getTracker: () => this.tracker,
|
|
805
|
+
getExecutionMode: () => this.executionMode,
|
|
806
|
+
setExecutionMode: (mode) => { this.executionMode = mode; },
|
|
807
|
+
getExecutionReason: () => this.executionReason,
|
|
808
|
+
setExecutionReason: (reason) => { this.executionReason = reason; },
|
|
809
|
+
// 黑板 init 在本构造函数后段才发生,用 getter 惰性解析就绪状态,
|
|
810
|
+
// 关闭时从 Leader 工具集剔除黑板写入工具,避免调用必然失败的工具。
|
|
811
|
+
getBlackboardEnabled: () => this.leaderBlackboard?.isEnabled() ?? false,
|
|
812
|
+
});
|
|
813
|
+
this.reloadBuiltinRoles();
|
|
814
|
+
this.thinkingEngine = new LeaderThinkingEngine({
|
|
815
|
+
sessionId: this.sessionId,
|
|
816
|
+
llm: this.llm,
|
|
817
|
+
model: this.model,
|
|
818
|
+
db: this.db,
|
|
819
|
+
emitter: this.emitter,
|
|
820
|
+
tracker: this.tracker,
|
|
821
|
+
contextManager: this.contextManager,
|
|
822
|
+
streamBufferFlushThreshold: globalConfig.leader.stream_buffer_flush_threshold,
|
|
823
|
+
getConversation: () => this.conversation,
|
|
824
|
+
setConversation: (msgs) => { this.conversation = msgs; },
|
|
825
|
+
addMessage: (msg) => this.addMessage(msg),
|
|
826
|
+
syncSystemPrompt: () => this.syncSystemPromptForCurrentMode(),
|
|
827
|
+
getModel: () => this.model,
|
|
828
|
+
setModel: (model) => {
|
|
829
|
+
this.model = model;
|
|
830
|
+
const ctxLimit = resolveModelContextLimit({
|
|
831
|
+
providerCtx: getContextWindowSizeFromProvider(model),
|
|
832
|
+
modelInfoCtx: getModelDevInfo(model)?.contextLimit,
|
|
833
|
+
configuredCtx: globalConfig.llm.context_max_tokens,
|
|
834
|
+
});
|
|
835
|
+
this.contextManager.updateModel(model, ctxLimit);
|
|
836
|
+
},
|
|
837
|
+
getActiveToolDefinitions: () => this.getActiveToolDefinitions(),
|
|
838
|
+
getCurrentLlmAbortController: () => this.currentLlmAbortController,
|
|
839
|
+
setCurrentLlmAbortController: (ctrl) => { this.currentLlmAbortController = ctrl; },
|
|
840
|
+
isFinished: () => this.finished,
|
|
841
|
+
isWaitingForUser: () => this.waitingForUser,
|
|
842
|
+
setWaitingForUser: (v) => { this.waitingForUser = v; },
|
|
843
|
+
isUserInterruptPending: () => this.userInterruptPending,
|
|
844
|
+
isToolUseSuppressedForCurrentTurn: () => this.isToolUseSuppressedForCurrentTurn(),
|
|
845
|
+
isPendingReview: () => this.pendingReview,
|
|
846
|
+
setIsBusy: (v) => { this.isBusy = v; },
|
|
847
|
+
getLastProgressAtMs: () => this.progressInvariant.lastProgressAtMs,
|
|
848
|
+
setLastProgressAtMs: (v) => { this.progressInvariant.lastProgressAtMs = v; },
|
|
849
|
+
getRawXmlRetryCount: () => this.rawXmlRetryCount,
|
|
850
|
+
setRawXmlRetryCount: (v) => { this.rawXmlRetryCount = v; },
|
|
851
|
+
getEmptyResponseRetryCount: () => this.emptyResponseRetryCount,
|
|
852
|
+
setEmptyResponseRetryCount: (v) => { this.emptyResponseRetryCount = v; },
|
|
853
|
+
getLlmErrorRetryCount: () => this.llmErrorRetryCount,
|
|
854
|
+
setLlmErrorRetryCount: (v) => { this.llmErrorRetryCount = v; },
|
|
855
|
+
getLlmMaxErrorRetries: () => this.LLM_MAX_ERROR_RETRIES,
|
|
856
|
+
getTurnCount: () => this.turnCount,
|
|
857
|
+
getNudgeMessage: () => this.nudgeMessage,
|
|
858
|
+
clearNudgeMessage: () => { this.nudgeMessage = null; },
|
|
859
|
+
drainPendingUserMessages: () => this.drainPendingUserMessagesIntoConversation(),
|
|
860
|
+
hasPendingTasks: () => this.hasPendingTasks(),
|
|
861
|
+
hasDispatchableWork: () => this.board.getDispatchable().length > 0,
|
|
862
|
+
isEternalMode: () => this.isEternalMode(),
|
|
863
|
+
getCollaborationMode: () => resolveModeRuntimeProjection({
|
|
864
|
+
sessionId: this.sessionId,
|
|
865
|
+
db: this.db,
|
|
866
|
+
blackboardAvailable: this.isBlackboardEnabled(),
|
|
867
|
+
permissionSummary: this.getInteractionSnapshot().permissionSummary,
|
|
868
|
+
}).collaboration.mode,
|
|
869
|
+
hasExplicitUserGate: () => this.hasExplicitUserGate(),
|
|
870
|
+
getPendingAgentCompletionSignals: () => this.pendingAgentCompletionSignals,
|
|
871
|
+
isAgentCompletionPending: () => this.pendingAgentCompletionSignals.length > 0,
|
|
872
|
+
getBoardTaskCount: () => this.board.getAllTasks().length,
|
|
873
|
+
getTaskById: (taskId) => this.board.getTask(taskId),
|
|
874
|
+
peekNextTaskIds: (count) => this.board.peekNextTaskIds(count),
|
|
875
|
+
getActiveTeam: () => this.activeTeamName,
|
|
876
|
+
getRunningAgentsCount: () => typeof this.pool.getRunning === 'function' ? this.pool.getRunning().length : 0,
|
|
877
|
+
getAllTasks: () => this.board.getAllTasks(),
|
|
878
|
+
getActiveTaskId: () => {
|
|
879
|
+
const running = typeof this.pool.getRunning === 'function' ? this.pool.getRunning() : [];
|
|
880
|
+
return running.length > 0 ? running[0].taskId : undefined;
|
|
881
|
+
},
|
|
882
|
+
executeToolCallsBatch: (toolCalls) => this.executeToolCallsBatch(toolCalls),
|
|
883
|
+
maybeContinueFromStopHook: (final) => this.maybeContinueFromStopHook(final),
|
|
884
|
+
appendRuntimeContextManifestIfChanged: () => this.appendRuntimeContextManifestIfChanged(),
|
|
885
|
+
appendContextMemoryIfChanged: () => this.appendContextMemoryIfChanged(),
|
|
886
|
+
createFileSnapshot: async (turnCount, label) => {
|
|
887
|
+
try {
|
|
888
|
+
if (!this.fileChangesApi) {
|
|
889
|
+
const { FileChangesApi } = await import('../web-server/FileChangesApi.js');
|
|
890
|
+
const { DatabaseRepositoryAdapter } = await import('../core/DatabaseRepositories.js');
|
|
891
|
+
this.fileChangesApi = new FileChangesApi(new DatabaseRepositoryAdapter(this.db));
|
|
892
|
+
}
|
|
893
|
+
await this.fileChangesApi.createSnapshot(this.sessionId, `[turn:${turnCount}] ${label}`);
|
|
894
|
+
}
|
|
895
|
+
catch { /* non-critical */ }
|
|
896
|
+
},
|
|
897
|
+
getBlackboardAnalysis: () => this.getBlackboardAnalysis(),
|
|
898
|
+
getSharedLedgerContext: () => {
|
|
899
|
+
const entries = this.sharedLedger.getCompactionSafeEntries();
|
|
900
|
+
if (entries.length === 0)
|
|
901
|
+
return null;
|
|
902
|
+
return this.sharedLedger.formatForContext(entries);
|
|
903
|
+
},
|
|
904
|
+
upsertSystemSlot: (matcher, content) => this.upsertRuntimeSystemSlot(matcher, content),
|
|
905
|
+
compactContext: () => this.compactContext(),
|
|
906
|
+
});
|
|
907
|
+
// ─── 黑板架构初始化(feature flag + mode policy) ───
|
|
908
|
+
this.ensureFullBlackboardInitialized();
|
|
909
|
+
// ─── 0→1 交付引擎: 契约热同步 ───
|
|
910
|
+
this.contractHotSync = new ContractHotSync(this.sharedLedger, this.bus, this.sessionId);
|
|
911
|
+
this.contractHotSync.start();
|
|
912
|
+
// ─── 统一调度器 — 唯一 worker dispatch 入口 ───
|
|
913
|
+
this.scheduler = new UnifiedScheduler({
|
|
914
|
+
sessionId: this.sessionId,
|
|
915
|
+
board: this.board,
|
|
916
|
+
pool: this.pool,
|
|
917
|
+
emitter: this.emitter,
|
|
918
|
+
dispatchTask: (task, opts) => this.runScheduledDispatch(task, opts),
|
|
919
|
+
config: {
|
|
920
|
+
maxWorkers: globalConfig.agents.max_concurrent,
|
|
921
|
+
maxProjectWorkers: globalConfig.agents.max_concurrent,
|
|
922
|
+
},
|
|
923
|
+
});
|
|
924
|
+
// ─── 派发决策协调器 — 依赖解锁/队友完成后提醒 Leader 显式处置 ───
|
|
925
|
+
this.dispatchDecisionCoordinator = new DispatchDecisionCoordinator({
|
|
926
|
+
sessionId: this.sessionId,
|
|
927
|
+
board: this.board,
|
|
928
|
+
emitter: this.emitter,
|
|
929
|
+
requestLeaderDecision: (tasks) => this.requestLeaderDispatchDecision(tasks),
|
|
930
|
+
getDispatchFingerprintContext: () => {
|
|
931
|
+
const modes = resolveModeRuntimeProjection({
|
|
932
|
+
sessionId: this.sessionId,
|
|
933
|
+
db: this.db,
|
|
934
|
+
blackboardAvailable: Boolean(this.leaderBlackboard),
|
|
935
|
+
permissionSummary: this.getInteractionSnapshot().permissionSummary,
|
|
936
|
+
});
|
|
937
|
+
return {
|
|
938
|
+
collaborationMode: modes.collaboration.mode,
|
|
939
|
+
routePreference: modes.route.preference,
|
|
940
|
+
activeTeamName: modes.collaboration.activeTeamName ?? this.activeTeamName,
|
|
941
|
+
};
|
|
942
|
+
},
|
|
943
|
+
});
|
|
944
|
+
// ─── 配置热加载:health/probe 参数变更时尝试更新运行时状态 ───
|
|
945
|
+
// AgentHealthMonitor 和 LeaderSupervisionCoordinator 的内部 config 在构造时固定,
|
|
946
|
+
// 无法从外部原地更新。此处注册 onConfigReload 记录日志,提示部分配置
|
|
947
|
+
// 需要新 session 才能完全生效;同时 syncDerivedConstants 已在 config.ts
|
|
948
|
+
// 的 refreshRuntimeConfig 中调用,LEADER_MAX_TOOL_ROUNDS / MAX_CONVERSATION_MESSAGES
|
|
949
|
+
// 等 let 变量会自动更新,leaderThinkAndAct 和 trimConversationBuffer 在下次
|
|
950
|
+
// 调用时自动读取新值。
|
|
951
|
+
this._configReloadUnsubscribe = onConfigReload((cfg) => {
|
|
952
|
+
try {
|
|
953
|
+
// 检测 health/probe 配置是否发生变化
|
|
954
|
+
const healthChanged = cfg.health.poll_interval_seconds !== HEALTH_POLL_INTERVAL_SECONDS ||
|
|
955
|
+
cfg.health.stall_threshold_seconds !== HEALTH_STALL_THRESHOLD_SECONDS ||
|
|
956
|
+
cfg.health.stuck_threshold_seconds !== HEALTH_STUCK_THRESHOLD_SECONDS ||
|
|
957
|
+
cfg.health.runaway_threshold_seconds !== HEALTH_RUNAWAY_THRESHOLD_SECONDS ||
|
|
958
|
+
cfg.health.nudge_cooldown_seconds !== HEALTH_NUDGE_COOLDOWN_SECONDS ||
|
|
959
|
+
cfg.health.max_nudge_before_escalation !== HEALTH_MAX_NUDGE_BEFORE_ESCALATION;
|
|
960
|
+
const probeChanged = cfg.leader.probe_silence_seconds !== LEADER_PROBE_SILENCE_SECONDS ||
|
|
961
|
+
cfg.leader.probe_max_interval_seconds !== LEADER_PROBE_MAX_INTERVAL_SECONDS ||
|
|
962
|
+
cfg.leader.probe_backoff_multiplier !== LEADER_PROBE_BACKOFF_MULTIPLIER ||
|
|
963
|
+
cfg.leader.idle_warning_seconds !== LEADER_IDLE_WARNING_SECONDS;
|
|
964
|
+
if (healthChanged || probeChanged) {
|
|
965
|
+
leaderLogger.warn(`[LeaderAgent] health/probe 配置已热加载,但 AgentHealthMonitor 和 SupervisionCoordinator 的内部 config 在构造时固定。` +
|
|
966
|
+
`部分参数(poll interval、stall/stuck/runaway 阈值、probe 间隔等)需要新 session 才能完全生效。` +
|
|
967
|
+
`LEADER_MAX_TOOL_ROUNDS / MAX_CONVERSATION_MESSAGES 等 let 变量已通过 syncDerivedConstants 自动更新。`);
|
|
968
|
+
}
|
|
969
|
+
}
|
|
970
|
+
catch (e) {
|
|
971
|
+
leaderLogger.warn(`[LeaderAgent] onConfigReload 回调异常: ${e}`);
|
|
972
|
+
}
|
|
973
|
+
});
|
|
974
|
+
}
|
|
975
|
+
ensureFullBlackboardInitialized() {
|
|
976
|
+
if (this.leaderBlackboard)
|
|
977
|
+
return;
|
|
978
|
+
// 黑板初始化下沉到 LeaderBlackboard.initializeIfApplicable — 事件订阅/契约落盘/图桥接
|
|
979
|
+
// 全部在子模块内完成,原 LA 只负责注入依赖(active team provider / workflowEngine /
|
|
980
|
+
// teamSynchronizer / refreshContractBoundTasks)并把退订函数并入 _taskTeamUnsubscribers。
|
|
981
|
+
this.leaderBlackboard = LeaderBlackboard.initializeIfApplicable({
|
|
982
|
+
db: this.db,
|
|
983
|
+
emitter: this.emitter,
|
|
984
|
+
sessionId: this.sessionId,
|
|
985
|
+
pool: this.pool,
|
|
986
|
+
workspace: this.workspace,
|
|
987
|
+
activeTeamProvider: () => this.activeTeamName,
|
|
988
|
+
permissionSummary: this.getInteractionSnapshot().permissionSummary,
|
|
989
|
+
workflowEngine: this.workflowEngine,
|
|
990
|
+
teamSynchronizer: this.teamSynchronizer,
|
|
991
|
+
refreshContractBoundTasks: (event) => this.refreshContractBoundTasks(event),
|
|
992
|
+
unsubscribersSink: this._taskTeamUnsubscribers,
|
|
993
|
+
ledger: this.sharedLedger,
|
|
994
|
+
});
|
|
995
|
+
}
|
|
996
|
+
/**
|
|
997
|
+
* 把需要显式派发决策的任务交回 Leader:注入 system 提示并触发下一轮思考。
|
|
998
|
+
* 这是重构前 LeaderAgent 主循环「已解锁可调度」提示路径的复用入口。
|
|
999
|
+
*/
|
|
1000
|
+
requestLeaderDispatchDecision(tasks) {
|
|
1001
|
+
if (tasks.length === 0)
|
|
1002
|
+
return;
|
|
1003
|
+
try {
|
|
1004
|
+
// 去重:5s 内同一批任务 id 不重复注入(事件驱动 + 主循环兜底可能撞车)
|
|
1005
|
+
const sig = tasks.map(t => t.id).sort().join(',');
|
|
1006
|
+
const now = Date.now();
|
|
1007
|
+
if (this.lastLeaderDecisionSig
|
|
1008
|
+
&& this.lastLeaderDecisionSig.sig === sig
|
|
1009
|
+
&& now - this.lastLeaderDecisionSig.at < 5000) {
|
|
1010
|
+
return;
|
|
1011
|
+
}
|
|
1012
|
+
this.lastLeaderDecisionSig = { sig, at: now };
|
|
1013
|
+
const dispatchMsg = '以下任务已解锁可调度:\n'
|
|
1014
|
+
+ tasks.map(t => `- [${t.id}] ${t.subject} (类型=${t.agent_type}${t.preferred_agent_name ? `, 预绑定=@${t.preferred_agent_name}` : ''})\n`).join('')
|
|
1015
|
+
+ '强制要求:对每个就绪任务,要么立刻派发(建/复用 worker 调度),要么逐条给出可核验的暂不派理由(依赖未真正满足 / 并发预算已满 / 需用户决策等)。'
|
|
1016
|
+
+ '就绪任务的处理口径:已解锁任务需要派发动作或具体暂缓依据;监控纪律只约束运行中的 agent。';
|
|
1017
|
+
this.addMessage({ role: 'system', content: dispatchMsg });
|
|
1018
|
+
void this.db.saveConversationMessage(this.sessionId, { role: 'system', content: dispatchMsg });
|
|
1019
|
+
}
|
|
1020
|
+
catch (err) {
|
|
1021
|
+
leaderLogger.warn(`[DispatchDecision] requestLeaderDispatchDecision 失败: ${err instanceof Error ? err.message : String(err)}`);
|
|
1022
|
+
}
|
|
1023
|
+
}
|
|
1024
|
+
/**
|
|
1025
|
+
* 调度器派发 hook — 把 TaskBoard task 物化为运行中的 worker。
|
|
1026
|
+
*
|
|
1027
|
+
* 调用约定:
|
|
1028
|
+
* - scheduler 已经在 budget / 单调度入口语义上做完检查;这里只负责把 task 转成 worker。
|
|
1029
|
+
* - 失败返回 false,scheduler 会回滚 budget;不抛错以避免 tick 循环失败。
|
|
1030
|
+
*/
|
|
1031
|
+
async runScheduledDispatch(task, opts) {
|
|
1032
|
+
if (!this.dispatchDecisionCoordinator)
|
|
1033
|
+
return false;
|
|
1034
|
+
return this.dispatchDecisionCoordinator.dispatchScheduledTask(task, opts, {
|
|
1035
|
+
sessionId: this.sessionId,
|
|
1036
|
+
db: this.db,
|
|
1037
|
+
roleRegistry: this.roleRegistry,
|
|
1038
|
+
pool: this.pool,
|
|
1039
|
+
board: this.board,
|
|
1040
|
+
bus: this.bus,
|
|
1041
|
+
permissionSummary: () => this.getInteractionSnapshot().permissionSummary,
|
|
1042
|
+
isBlackboardEnabled: () => this.isBlackboardEnabled(),
|
|
1043
|
+
getActiveTeam: () => this.getActiveTeam(),
|
|
1044
|
+
sessionPrefix: (name) => this.sessionPrefix(name),
|
|
1045
|
+
registerAgentHealth: (agentId, name, roleType) => this.registerAgentHealth(agentId, name, roleType),
|
|
1046
|
+
transitionHandleToStopped: transitionLeaderAgentHandleToStopped,
|
|
1047
|
+
});
|
|
1048
|
+
}
|
|
1049
|
+
toLeaderSupervisionAgents(handles) {
|
|
1050
|
+
return this.supervCoordinator.toLeaderSupervisionAgents(handles);
|
|
1051
|
+
}
|
|
1052
|
+
getLeaderSupervisionEvaluation(running) {
|
|
1053
|
+
return this.supervCoordinator.getLeaderSupervisionEvaluation(running);
|
|
1054
|
+
}
|
|
1055
|
+
getLeaderSupervisionWaitTimeoutMs(running) {
|
|
1056
|
+
return this.supervCoordinator.getLeaderSupervisionWaitTimeoutMs(running);
|
|
1057
|
+
}
|
|
1058
|
+
_unsubscribeAgentActivityEvents() {
|
|
1059
|
+
this.supervCoordinator.unsubscribeAgentActivityEvents();
|
|
1060
|
+
}
|
|
1061
|
+
markLeaderSupervisionProgress(progressAtMs = Date.now()) {
|
|
1062
|
+
this.supervCoordinator.markLeaderSupervisionProgress(progressAtMs);
|
|
1063
|
+
}
|
|
1064
|
+
surfaceIdleWarnings(idleAgents, nowMs = Date.now()) {
|
|
1065
|
+
this.supervCoordinator.surfaceIdleWarnings(idleAgents, nowMs);
|
|
1066
|
+
}
|
|
1067
|
+
getPermissionContext() {
|
|
1068
|
+
return this.permManager.getPermissionContext();
|
|
1069
|
+
}
|
|
1070
|
+
loadPermissionContextFromState() {
|
|
1071
|
+
this.permManager.loadPermissionContextFromState();
|
|
1072
|
+
}
|
|
1073
|
+
applyPermissionUpdates(updates, destination = 'session') {
|
|
1074
|
+
return this.permManager.applyPermissionUpdates(updates, destination);
|
|
1075
|
+
}
|
|
1076
|
+
requestPermissionUpdate(payload) {
|
|
1077
|
+
return this.permManager.requestPermissionUpdate(payload, this.isEternalMode());
|
|
1078
|
+
}
|
|
1079
|
+
getControlMode() {
|
|
1080
|
+
return this.controlMode;
|
|
1081
|
+
}
|
|
1082
|
+
isEternalMode() {
|
|
1083
|
+
return this.controlMode === 'eternal';
|
|
1084
|
+
}
|
|
1085
|
+
async setControlMode(mode) {
|
|
1086
|
+
if (mode !== 'manual' && mode !== 'eternal') {
|
|
1087
|
+
return { ok: false, message: `invalid control mode: ${String(mode)}` };
|
|
1088
|
+
}
|
|
1089
|
+
const previousMode = this.controlMode;
|
|
1090
|
+
if (previousMode === mode) {
|
|
1091
|
+
return { ok: true, message: `control mode already ${mode}` };
|
|
1092
|
+
}
|
|
1093
|
+
this.controlMode = mode;
|
|
1094
|
+
await this.db.setSessionState(this.sessionId, SESSION_KEYS.CONTROL_MODE, mode);
|
|
1095
|
+
// 切回 manual:解绑 EternalLoop 的 7 个事件监听 + 上锁,避免 listener 残留 / 旧 silence state 在下次切回 eternal 时复活
|
|
1096
|
+
// 切到 eternal:让 progressInvariant 主动重新绑定(兼容运行时第一次开启)+ 把卡住的非 bypass 权限请求批准回放
|
|
1097
|
+
if (mode === 'manual') {
|
|
1098
|
+
this.progressInvariant.disposeEternalListeners();
|
|
1099
|
+
// 切回 manual 时若当前还有 in-flight patrol LLM round,立即 abort,
|
|
1100
|
+
// 否则用户切回手动后还会经历"最后一轮自驱"才停下,违反"立即生效"预期。
|
|
1101
|
+
// 注意:仅在原先是 eternal 时 abort——如果原本就是 manual(重复切换),
|
|
1102
|
+
// 当前 LLM 必然是用户触发的,不应打断。
|
|
1103
|
+
if (previousMode === 'eternal' && this.currentLlmAbortController) {
|
|
1104
|
+
try {
|
|
1105
|
+
this.currentLlmAbortController.abort('control mode switched to manual');
|
|
1106
|
+
leaderLogger.info('[ControlMode] 切回 manual 时 abort 当前 patrol LLM round');
|
|
1107
|
+
}
|
|
1108
|
+
catch {
|
|
1109
|
+
/* abort 异常可吞 */
|
|
1110
|
+
}
|
|
1111
|
+
}
|
|
1112
|
+
}
|
|
1113
|
+
else {
|
|
1114
|
+
this.progressInvariant.rebindEternalListenersIfActive();
|
|
1115
|
+
const replayed = this.permManager.replayPendingOnEternalEnable();
|
|
1116
|
+
if (replayed > 0) {
|
|
1117
|
+
leaderLogger.info(`[ControlMode] 切到 eternal 时回放并自动批准 ${replayed} 条卡住的权限请求`);
|
|
1118
|
+
}
|
|
1119
|
+
}
|
|
1120
|
+
this.emitter.emit('leader:control_mode_changed', {
|
|
1121
|
+
sessionId: this.sessionId,
|
|
1122
|
+
mode,
|
|
1123
|
+
previousMode,
|
|
1124
|
+
});
|
|
1125
|
+
return { ok: true, message: `control mode changed to ${mode}` };
|
|
1126
|
+
}
|
|
1127
|
+
resolvePendingPermissionFromUserInput(content) {
|
|
1128
|
+
return this.permManager.resolvePendingPermissionFromUserInput(content);
|
|
1129
|
+
}
|
|
1130
|
+
/**
|
|
1131
|
+
* 从 Web UI 直接解决权限请求(绕过文本输入解析)
|
|
1132
|
+
* 由 AcpHandler 调用,当用户在 Web UI 点击批准/拒绝时触发
|
|
1133
|
+
*/
|
|
1134
|
+
resolvePermissionFromWebUI(requestId, decision) {
|
|
1135
|
+
this.permManager.resolvePermissionFromWebUI(requestId, decision);
|
|
1136
|
+
}
|
|
1137
|
+
getActiveToolDefinitions() {
|
|
1138
|
+
if (this.isToolUseSuppressedForCurrentTurn()) {
|
|
1139
|
+
return [];
|
|
1140
|
+
}
|
|
1141
|
+
return this.executionController.getActiveToolDefinitions();
|
|
1142
|
+
}
|
|
1143
|
+
isToolUseSuppressedForCurrentTurn() {
|
|
1144
|
+
const suppressedRaw = this.db.getSessionState(this.sessionId, SESSION_KEYS.TOOL_USE_SUPPRESSION_TURN_ID);
|
|
1145
|
+
const currentRaw = this.db.getSessionState(this.sessionId, SESSION_KEYS.CURRENT_USER_TURN_ID);
|
|
1146
|
+
const suppressedTurn = typeof suppressedRaw === 'number' ? suppressedRaw : typeof suppressedRaw === 'string' ? Number(suppressedRaw) : NaN;
|
|
1147
|
+
const currentTurn = typeof currentRaw === 'number' ? currentRaw : typeof currentRaw === 'string' ? Number(currentRaw) : NaN;
|
|
1148
|
+
return Number.isFinite(suppressedTurn) && suppressedTurn > 0 && Number.isFinite(currentTurn) && Math.trunc(suppressedTurn) === Math.trunc(currentTurn);
|
|
1149
|
+
}
|
|
1150
|
+
setExecutionRoute(decision) {
|
|
1151
|
+
this.executionController.setExecutionRoute(decision);
|
|
1152
|
+
}
|
|
1153
|
+
chooseExecutionRoute(intentProfile) {
|
|
1154
|
+
return this.executionController.chooseExecutionRoute(intentProfile);
|
|
1155
|
+
}
|
|
1156
|
+
beginUserTurn() {
|
|
1157
|
+
this.turnCount++;
|
|
1158
|
+
this.db.setSessionState(this.sessionId, SESSION_KEYS.CURRENT_USER_TURN_ID, this.turnCount);
|
|
1159
|
+
this.db.deleteSessionState(this.sessionId, SESSION_KEYS.CAPABILITY_INTENT_PROFILE);
|
|
1160
|
+
this.db.deleteSessionState(this.sessionId, SESSION_KEYS.CAPABILITY_INTENT_TURN_ID);
|
|
1161
|
+
this.db.deleteSessionState(this.sessionId, SESSION_KEYS.AUTONOMY_DECISION_TRACE);
|
|
1162
|
+
if (this.db.getSessionState(this.sessionId, SESSION_KEYS.TOOL_USE_SUPPRESSION_PENDING) === 'true') {
|
|
1163
|
+
this.db.setSessionState(this.sessionId, SESSION_KEYS.TOOL_USE_SUPPRESSION_TURN_ID, this.turnCount);
|
|
1164
|
+
this.db.deleteSessionState(this.sessionId, SESSION_KEYS.TOOL_USE_SUPPRESSION_PENDING);
|
|
1165
|
+
}
|
|
1166
|
+
else {
|
|
1167
|
+
this.db.deleteSessionState(this.sessionId, SESSION_KEYS.TOOL_USE_SUPPRESSION_TURN_ID);
|
|
1168
|
+
}
|
|
1169
|
+
return this.turnCount;
|
|
1170
|
+
}
|
|
1171
|
+
setDelegateMode(reason) {
|
|
1172
|
+
this.executionController.setDelegateMode(reason);
|
|
1173
|
+
}
|
|
1174
|
+
/** Active team for this session (null when no team has been created yet). */
|
|
1175
|
+
getActiveTeam() {
|
|
1176
|
+
return this.activeTeamName;
|
|
1177
|
+
}
|
|
1178
|
+
/**
|
|
1179
|
+
* Set / clear the active team name for this session and persist to session_state.
|
|
1180
|
+
* dispatch_agent uses this with the explicit TeamMemberRegistry roster.
|
|
1181
|
+
*/
|
|
1182
|
+
setActiveTeam(teamName) {
|
|
1183
|
+
this.activeTeamName = teamName;
|
|
1184
|
+
try {
|
|
1185
|
+
if (teamName) {
|
|
1186
|
+
void this.db.setSessionState(this.sessionId, SESSION_KEYS.LEADER_ACTIVE_TEAM, teamName);
|
|
1187
|
+
void this.db.setSessionState(this.sessionId, SESSION_KEYS.COLLABORATION_MODE, 'team');
|
|
1188
|
+
}
|
|
1189
|
+
else {
|
|
1190
|
+
void this.db.setSessionState(this.sessionId, SESSION_KEYS.LEADER_ACTIVE_TEAM, '');
|
|
1191
|
+
void this.db.setSessionState(this.sessionId, SESSION_KEYS.COLLABORATION_MODE, 'solo');
|
|
1192
|
+
}
|
|
1193
|
+
}
|
|
1194
|
+
catch { /* tolerate */ }
|
|
1195
|
+
if (teamName) {
|
|
1196
|
+
this.ensureFullBlackboardInitialized();
|
|
1197
|
+
}
|
|
1198
|
+
}
|
|
1199
|
+
async acceptWorkerTaskResult(input) {
|
|
1200
|
+
const queued = this.workerResultQueue.then(() => this.processWorkerTaskResult(input));
|
|
1201
|
+
this.workerResultQueue = queued.catch((error) => {
|
|
1202
|
+
leaderLogger.error('[Leader] worker 回执处理失败:', error);
|
|
1203
|
+
});
|
|
1204
|
+
return queued;
|
|
1205
|
+
}
|
|
1206
|
+
async processWorkerTaskResult(input) {
|
|
1207
|
+
return this.workOrchestrator.processWorkerTaskResult(input);
|
|
1208
|
+
}
|
|
1209
|
+
/**
|
|
1210
|
+
* Attribute a task's terminal outcome to the agent that ran it (N5-A task_outcome).
|
|
1211
|
+
* Recorded at the true terminal points (completeTask / failTask), not at receipt entry,
|
|
1212
|
+
* so an orchestration-rejected 'completed' that gets redispatched does NOT inflate the
|
|
1213
|
+
* success count. Best-effort: never blocks receipt handling. The ref matches the
|
|
1214
|
+
* agent_spawned埋点 (agents/<name>) so usage + outcome correlate per agent.
|
|
1215
|
+
*/
|
|
1216
|
+
recordAgentOutcome(agentName, taskId, outcome) {
|
|
1217
|
+
try {
|
|
1218
|
+
const clean = (agentName || '').replace(/^[^:]+:/, '');
|
|
1219
|
+
if (!clean)
|
|
1220
|
+
return;
|
|
1221
|
+
new AssetUsageStore(join(this.workspace, '.lingxiao')).recordUsage({
|
|
1222
|
+
assetRef: `agents/${clean}`,
|
|
1223
|
+
outcome,
|
|
1224
|
+
taskId,
|
|
1225
|
+
sessionId: this.sessionId,
|
|
1226
|
+
timestamp: Date.now(),
|
|
1227
|
+
});
|
|
1228
|
+
}
|
|
1229
|
+
catch { /* usage tracking is best-effort, never blocks receipt handling */ }
|
|
1230
|
+
}
|
|
1231
|
+
captureBughuntWorkerEvidence(input) {
|
|
1232
|
+
try {
|
|
1233
|
+
captureBughuntEvidence(this.db, {
|
|
1234
|
+
taskId: input.taskId,
|
|
1235
|
+
status: input.exitReason,
|
|
1236
|
+
result: input.result,
|
|
1237
|
+
agentName: input.agentName,
|
|
1238
|
+
sessionId: this.sessionId,
|
|
1239
|
+
workspace: this.workspace,
|
|
1240
|
+
});
|
|
1241
|
+
}
|
|
1242
|
+
catch (error) {
|
|
1243
|
+
leaderLogger.debug('[Bughunt] evidence extraction skipped:', error);
|
|
1244
|
+
}
|
|
1245
|
+
// P5: worker terminal → 回写对应 DAG node 为 completed,解锁后继节点的 blocked_by。
|
|
1246
|
+
// 单一真相源:ledger.dag 是调度核心,TaskBoard task 是执行投影(node.task_id ↔ task.id)。
|
|
1247
|
+
try {
|
|
1248
|
+
const ledger = readBughuntLedger(this.db, this.sessionId);
|
|
1249
|
+
if (ledger) {
|
|
1250
|
+
const dagNode = ledger.dag.find((n) => n.task_id === input.taskId);
|
|
1251
|
+
if (dagNode) {
|
|
1252
|
+
updateBughuntDagNode(this.db, this.sessionId, dagNode.id, { status: 'completed' });
|
|
1253
|
+
}
|
|
1254
|
+
}
|
|
1255
|
+
}
|
|
1256
|
+
catch (error) {
|
|
1257
|
+
leaderLogger.debug('[Bughunt] DAG node writeback skipped:', error);
|
|
1258
|
+
}
|
|
1259
|
+
}
|
|
1260
|
+
async consumePendingAgentCompletionsIntoConversation() {
|
|
1261
|
+
return this.workOrchestrator.consumePendingAgentCompletionsIntoConversation();
|
|
1262
|
+
}
|
|
1263
|
+
/**
|
|
1264
|
+
* 任务完成时落盘 Implementation 报告,便于 Leader / 下游 agent 通过
|
|
1265
|
+
* session_artifacts 工具读取真实交付内容(结果摘要 + scratchpad 尾巴)。
|
|
1266
|
+
*/
|
|
1267
|
+
persistImplementationArtifact(input) {
|
|
1268
|
+
try {
|
|
1269
|
+
const task = this.board.getTask(input.taskId);
|
|
1270
|
+
const paths = Workspace.getSessionArtifactPaths(this.sessionId, this.workspace);
|
|
1271
|
+
// 去掉 session 前缀(bus sender 是 sessionId:agentName)
|
|
1272
|
+
const localAgent = (input.agentName ?? task?.assigned_agent ?? 'unknown').replace(/^[^:]+:/, '');
|
|
1273
|
+
const md = buildImplementationContent({
|
|
1274
|
+
taskId: input.taskId,
|
|
1275
|
+
agentName: localAgent,
|
|
1276
|
+
result: typeof input.result === 'string' ? input.result : JSON.stringify(input.result),
|
|
1277
|
+
workspace: this.workspace,
|
|
1278
|
+
sessionId: this.sessionId,
|
|
1279
|
+
task,
|
|
1280
|
+
});
|
|
1281
|
+
mkdirSync(paths.implementationsDir, { recursive: true });
|
|
1282
|
+
const safeId = input.taskId.replace(/[^a-zA-Z0-9._-]/g, '_');
|
|
1283
|
+
writeFileSync(join(paths.implementationsDir, `${safeId}.md`), md, 'utf-8');
|
|
1284
|
+
}
|
|
1285
|
+
catch (error) {
|
|
1286
|
+
leaderLogger.warn(`[Leader] persist implementation artifact failed (task=${input.taskId}): ${error instanceof Error ? error.message : String(error)}`);
|
|
1287
|
+
}
|
|
1288
|
+
}
|
|
1289
|
+
/**
|
|
1290
|
+
* LeaderContextBuilder 依赖句柄:经 getter 闭包捕获运行期才初始化的实例字段,
|
|
1291
|
+
* 避免在构造期(字段尚未赋值)即解析。fingerprint 状态与上下文装配逻辑均下沉至 builder。
|
|
1292
|
+
*/
|
|
1293
|
+
buildContextBuilderDeps() {
|
|
1294
|
+
return {
|
|
1295
|
+
sessionId: this.sessionId,
|
|
1296
|
+
model: this.model,
|
|
1297
|
+
workspace: this.workspace,
|
|
1298
|
+
getPendingAgentCompletionSignals: () => this.pendingAgentCompletionSignals,
|
|
1299
|
+
getPool: () => this.pool,
|
|
1300
|
+
getBoard: () => this.board,
|
|
1301
|
+
getWorkOrchestrator: () => this.workOrchestrator,
|
|
1302
|
+
getContextManager: () => this.contextManager,
|
|
1303
|
+
getLeaderBlackboard: () => this.leaderBlackboard,
|
|
1304
|
+
getWorkNoteManager: () => this.workNoteManager,
|
|
1305
|
+
getOriginalGoal: () => this.originalGoal,
|
|
1306
|
+
getActiveTeamName: () => this.activeTeamName,
|
|
1307
|
+
isBlackboardEnabled: () => this.isBlackboardEnabled(),
|
|
1308
|
+
getPermissionSummary: () => this.getInteractionSnapshot().permissionSummary,
|
|
1309
|
+
getDb: () => this.db,
|
|
1310
|
+
addMessage: (msg) => this.addMessage(msg),
|
|
1311
|
+
upsertSystemSlot: (matcher, content) => this.upsertRuntimeSystemSlot(matcher, content),
|
|
1312
|
+
};
|
|
1313
|
+
}
|
|
1314
|
+
buildRuntimeStateSection() {
|
|
1315
|
+
return this.contextBuilder.buildRuntimeStateSection();
|
|
1316
|
+
}
|
|
1317
|
+
buildLeaderLiveRuntimeAwareness() {
|
|
1318
|
+
return this.contextBuilder.buildLeaderLiveRuntimeAwareness();
|
|
1319
|
+
}
|
|
1320
|
+
appendRuntimeContextManifestIfChanged() {
|
|
1321
|
+
return this.contextBuilder.appendRuntimeContextManifestIfChanged();
|
|
1322
|
+
}
|
|
1323
|
+
async appendContextMemoryIfChanged() {
|
|
1324
|
+
return this.contextBuilder.appendContextMemoryIfChanged();
|
|
1325
|
+
}
|
|
1326
|
+
hasNonTerminalTasks() {
|
|
1327
|
+
return this.workOrchestrator.hasNonTerminalTasks();
|
|
1328
|
+
}
|
|
1329
|
+
hasExplicitUserGate() {
|
|
1330
|
+
return this.workOrchestrator.hasExplicitUserGate();
|
|
1331
|
+
}
|
|
1332
|
+
async maybeDriveOpenWork() {
|
|
1333
|
+
return this.workOrchestrator.maybeDriveOpenWork();
|
|
1334
|
+
}
|
|
1335
|
+
reconcileRecoveringTasks() {
|
|
1336
|
+
return this.workOrchestrator.reconcileRecoveringTasks();
|
|
1337
|
+
}
|
|
1338
|
+
getRecoveryStatusSummary() {
|
|
1339
|
+
return this.workOrchestrator.getRecoveryStatusSummary();
|
|
1340
|
+
}
|
|
1341
|
+
async maybeFinalizeCompletedSession() {
|
|
1342
|
+
return this.workOrchestrator.maybeFinalizeCompletedSession();
|
|
1343
|
+
}
|
|
1344
|
+
async maybeContinueFromStopHook(final) {
|
|
1345
|
+
return this.workOrchestrator.maybeContinueFromStopHook(final);
|
|
1346
|
+
}
|
|
1347
|
+
resolveRoleCapability(input) {
|
|
1348
|
+
const disabledNames = resolveDisabledSkillNames();
|
|
1349
|
+
const availableSkills = collectAvailableSkills(this.workspace, { disabledNames });
|
|
1350
|
+
const userRequestedSkillNames = Array.from(new Set([
|
|
1351
|
+
...resolveExplicitSkillMentions(input.roleDescription, availableSkills),
|
|
1352
|
+
...resolveExplicitSkillMentions(input.systemPrompt, availableSkills),
|
|
1353
|
+
]));
|
|
1354
|
+
return resolveDynamicRoleCapability({
|
|
1355
|
+
roleName: input.roleName,
|
|
1356
|
+
baseRoleName: input.baseRoleName,
|
|
1357
|
+
roleDescription: input.roleDescription,
|
|
1358
|
+
systemPrompt: input.systemPrompt,
|
|
1359
|
+
requestedTools: input.tools,
|
|
1360
|
+
availableSkills,
|
|
1361
|
+
requestedSkillNames: input.requestedSkillNames,
|
|
1362
|
+
userRequestedSkillNames,
|
|
1363
|
+
});
|
|
1364
|
+
}
|
|
1365
|
+
selectSkillsForRole(input) {
|
|
1366
|
+
return this.resolveRoleCapability(input).skillNames;
|
|
1367
|
+
}
|
|
1368
|
+
/**
|
|
1369
|
+
* 注册系统预置角色
|
|
1370
|
+
*/
|
|
1371
|
+
registerBuiltinRoles() {
|
|
1372
|
+
// 读取 prompt overrides 并应用
|
|
1373
|
+
const promptOverrides = globalConfig.prompts?.overrides || {};
|
|
1374
|
+
const buildWorkerPromptMap = (defaults) => {
|
|
1375
|
+
const result = { ...defaults };
|
|
1376
|
+
for (const [key, override] of Object.entries(promptOverrides)) {
|
|
1377
|
+
if (key in result && override) {
|
|
1378
|
+
result[key] = { zh: override, en: override };
|
|
1379
|
+
}
|
|
1380
|
+
}
|
|
1381
|
+
return result;
|
|
1382
|
+
};
|
|
1383
|
+
const roles = collectBuiltinRoles({
|
|
1384
|
+
prompts: buildWorkerPromptMap({
|
|
1385
|
+
research: RESEARCH_SYSTEM_PROMPT_BY_LOCALE,
|
|
1386
|
+
explore: EXPLORE_SYSTEM_PROMPT_BY_LOCALE,
|
|
1387
|
+
coding: CODING_SYSTEM_PROMPT_BY_LOCALE,
|
|
1388
|
+
verify: VERIFY_SYSTEM_PROMPT_BY_LOCALE,
|
|
1389
|
+
review: REVIEW_SYSTEM_PROMPT_BY_LOCALE,
|
|
1390
|
+
frontend: FRONTEND_SYSTEM_PROMPT_BY_LOCALE,
|
|
1391
|
+
backend: BACKEND_SYSTEM_PROMPT_BY_LOCALE,
|
|
1392
|
+
fullstack: FULLSTACK_SYSTEM_PROMPT_BY_LOCALE,
|
|
1393
|
+
qa: QA_SYSTEM_PROMPT_BY_LOCALE,
|
|
1394
|
+
ux_designer: UX_DESIGNER_SYSTEM_PROMPT_BY_LOCALE,
|
|
1395
|
+
planner: PLANNER_SYSTEM_PROMPT_BY_LOCALE,
|
|
1396
|
+
evaluator: EVALUATOR_SYSTEM_PROMPT_BY_LOCALE,
|
|
1397
|
+
architect: ARCHITECT_SYSTEM_PROMPT_BY_LOCALE,
|
|
1398
|
+
}),
|
|
1399
|
+
externalCodingPrompt: CODING_SYSTEM_PROMPT_BY_LOCALE,
|
|
1400
|
+
availability: getExternalAgentAvailability(),
|
|
1401
|
+
descriptions: {
|
|
1402
|
+
claudeCoding: t('external_agent.role.claude_coding.description'),
|
|
1403
|
+
codexCoding: t('external_agent.role.codex_coding.description'),
|
|
1404
|
+
},
|
|
1405
|
+
});
|
|
1406
|
+
// 应用全局 settings.json 里的 roles 配置(基础工具开关 + 每角色 tools_added/removed)。
|
|
1407
|
+
const rolesCfg = globalConfig.roles;
|
|
1408
|
+
const adjusted = applyRoleToolsConfigMap(roles, {
|
|
1409
|
+
basicToolsEnabled: rolesCfg?.basic_tools_enabled !== false,
|
|
1410
|
+
overrides: rolesCfg?.overrides,
|
|
1411
|
+
});
|
|
1412
|
+
for (const role of adjusted) {
|
|
1413
|
+
this.roleRegistry.register(role);
|
|
1414
|
+
}
|
|
1415
|
+
}
|
|
1416
|
+
/**
|
|
1417
|
+
* 热加载:重新计算 settings.json 中 `roles.basic_tools_enabled` / `roles.overrides`
|
|
1418
|
+
* 对内置角色 tools 的影响,覆写 RoleRegistry 里 createdBy='system' 的条目。
|
|
1419
|
+
*
|
|
1420
|
+
* 不动自定义角色(createdBy='llm'/'user')。已派出的 worker 仍持有旧 tools 快照,
|
|
1421
|
+
* 新 dispatch 的 worker 通过 RoleRegistry.get(name).tools 自动取到新值。
|
|
1422
|
+
*/
|
|
1423
|
+
reloadBuiltinRoles() {
|
|
1424
|
+
this.registerBuiltinRoles();
|
|
1425
|
+
this.registerCustomAgentRoles();
|
|
1426
|
+
}
|
|
1427
|
+
registerCustomAgentRoles() {
|
|
1428
|
+
const disabledNames = resolveDisabledSkillNames();
|
|
1429
|
+
const availableSkills = collectAvailableSkills(this.workspace, { disabledNames });
|
|
1430
|
+
const service = new AgentDefinitionService({ workspace: this.workspace });
|
|
1431
|
+
const rolesCfg = globalConfig.roles;
|
|
1432
|
+
const adjusted = applyRoleToolsConfigMap(service.listAgentRoles(availableSkills), {
|
|
1433
|
+
basicToolsEnabled: rolesCfg?.basic_tools_enabled !== false,
|
|
1434
|
+
overrides: rolesCfg?.overrides,
|
|
1435
|
+
});
|
|
1436
|
+
for (const role of adjusted) {
|
|
1437
|
+
this.roleRegistry.register(role);
|
|
1438
|
+
}
|
|
1439
|
+
}
|
|
1440
|
+
/**
|
|
1441
|
+
* 添加消息到对话历史,带 Ring Buffer 保护
|
|
1442
|
+
*/
|
|
1443
|
+
addMessage(msg) {
|
|
1444
|
+
ensureMessageTimestamp(msg);
|
|
1445
|
+
this.conversation.push(msg);
|
|
1446
|
+
this.conversation = trimConversationBuffer(this.conversation, MAX_CONVERSATION_MESSAGES, MAX_CONVERSATION_BYTES);
|
|
1447
|
+
}
|
|
1448
|
+
/**
|
|
1449
|
+
* 获取系统提示(稳定核心 — 可被 Anthropic cache 缓存)
|
|
1450
|
+
*/
|
|
1451
|
+
getSystemPrompt() {
|
|
1452
|
+
const locale = getPromptLocale();
|
|
1453
|
+
const modes = resolveModeRuntimeProjection({
|
|
1454
|
+
sessionId: this.sessionId,
|
|
1455
|
+
db: this.db,
|
|
1456
|
+
blackboardAvailable: this.isBlackboardEnabled(),
|
|
1457
|
+
permissionSummary: this.getInteractionSnapshot().permissionSummary,
|
|
1458
|
+
});
|
|
1459
|
+
const promptProfile = modes.workflow.enabled
|
|
1460
|
+
? 'workflow'
|
|
1461
|
+
: modes.collaboration.mode === 'team'
|
|
1462
|
+
? 'team'
|
|
1463
|
+
: 'solo';
|
|
1464
|
+
const promptKey = `leader_${promptProfile}`;
|
|
1465
|
+
const promptOverrides = globalConfig.prompts?.overrides || {};
|
|
1466
|
+
const leaderOverride = promptOverrides[promptKey];
|
|
1467
|
+
return buildLeaderSystemPrompt({
|
|
1468
|
+
template: leaderOverride || this.customPrompt || getLeaderSystemPrompt(locale, promptProfile),
|
|
1469
|
+
availableRoles: this.roleRegistry.toLLMContext(),
|
|
1470
|
+
sessionId: this.sessionId,
|
|
1471
|
+
workspace: this.workspace,
|
|
1472
|
+
sessionScopeSection: buildSessionScopeSection({
|
|
1473
|
+
workspace: this.workspace,
|
|
1474
|
+
sessionId: this.sessionId,
|
|
1475
|
+
}),
|
|
1476
|
+
skillsContent: this.defaultSkillsContent,
|
|
1477
|
+
locale,
|
|
1478
|
+
});
|
|
1479
|
+
}
|
|
1480
|
+
/**
|
|
1481
|
+
* Keep the primary Leader system prompt aligned with runtime mode changes.
|
|
1482
|
+
*
|
|
1483
|
+
* Existing sessions may switch Solo/Team/Workflow after the first system
|
|
1484
|
+
* message has already been persisted. The runtime LLM input should reflect
|
|
1485
|
+
* the current mode immediately, while the historical conversation table
|
|
1486
|
+
* remains append-only.
|
|
1487
|
+
*/
|
|
1488
|
+
hashContextContent(content) {
|
|
1489
|
+
return createHash('sha1').update(contentToPlainText(content)).digest('hex').slice(0, 16);
|
|
1490
|
+
}
|
|
1491
|
+
syncSystemPromptForCurrentMode() {
|
|
1492
|
+
const prompt = this.getSystemPrompt();
|
|
1493
|
+
const firstSystemIndex = this.conversation.findIndex((message) => message.role === 'system');
|
|
1494
|
+
if (firstSystemIndex >= 0) {
|
|
1495
|
+
if (this.conversation[firstSystemIndex]?.content !== prompt) {
|
|
1496
|
+
const previous = this.conversation[firstSystemIndex]?.content;
|
|
1497
|
+
this.conversation[firstSystemIndex] = {
|
|
1498
|
+
...this.conversation[firstSystemIndex],
|
|
1499
|
+
content: prompt,
|
|
1500
|
+
};
|
|
1501
|
+
this.emitter.emit('context:mutation', {
|
|
1502
|
+
sessionId: this.sessionId,
|
|
1503
|
+
source: 'leader_system_prompt_sync',
|
|
1504
|
+
operation: 'replace',
|
|
1505
|
+
slot: 'leader_primary_system',
|
|
1506
|
+
oldHash: this.hashContextContent(previous),
|
|
1507
|
+
newHash: this.hashContextContent(prompt),
|
|
1508
|
+
oldLength: contentToPlainText(previous).length,
|
|
1509
|
+
newLength: prompt.length,
|
|
1510
|
+
changed: true,
|
|
1511
|
+
reason: 'primary_system_prompt_changed',
|
|
1512
|
+
});
|
|
1513
|
+
}
|
|
1514
|
+
return;
|
|
1515
|
+
}
|
|
1516
|
+
this.conversation.unshift({
|
|
1517
|
+
role: 'system',
|
|
1518
|
+
content: prompt,
|
|
1519
|
+
timestamp: Date.now() / 1000,
|
|
1520
|
+
});
|
|
1521
|
+
this.emitter.emit('context:mutation', {
|
|
1522
|
+
sessionId: this.sessionId,
|
|
1523
|
+
source: 'leader_system_prompt_sync',
|
|
1524
|
+
operation: 'append',
|
|
1525
|
+
slot: 'leader_primary_system',
|
|
1526
|
+
oldHash: null,
|
|
1527
|
+
newHash: this.hashContextContent(prompt),
|
|
1528
|
+
oldLength: 0,
|
|
1529
|
+
newLength: prompt.length,
|
|
1530
|
+
changed: true,
|
|
1531
|
+
reason: 'primary_system_prompt_inserted',
|
|
1532
|
+
});
|
|
1533
|
+
this.conversation = trimConversationBuffer(this.conversation, MAX_CONVERSATION_MESSAGES, MAX_CONVERSATION_BYTES);
|
|
1534
|
+
}
|
|
1535
|
+
/**
|
|
1536
|
+
* Leader 侧状态镜像类 system 槽位(每轮刷新、最新值即权威)。
|
|
1537
|
+
* upsertRuntimeSystemSlot / collapseLeaderSystemSlots 据此做单槽 in-place 更新,
|
|
1538
|
+
* 治本「每轮 append manifest/黑板分析堆积占满上下文」。与 mode hint 同契约:只改内存
|
|
1539
|
+
* 运行时视图,DB 保持 append-only(manifest 是可重算状态镜像,崩溃/审计无损)。
|
|
1540
|
+
*/
|
|
1541
|
+
static LEADER_SYSTEM_SLOTS = [
|
|
1542
|
+
{ kind: 'manifestSlot', slot: 'leader_runtime' },
|
|
1543
|
+
{ kind: 'manifestSlot', slot: 'leader_memory' },
|
|
1544
|
+
{ kind: 'manifestSlot', slot: 'leader_init' },
|
|
1545
|
+
{ kind: 'prefix', prefix: '## 黑板图分析(自动注入' },
|
|
1546
|
+
];
|
|
1547
|
+
/**
|
|
1548
|
+
* 单槽 in-place system 注入(状态镜像类)。命中同槽覆盖内容 + collapse 残留,无匹配 append。
|
|
1549
|
+
* 只改 this.conversation 内存视图,不落库(同 pruneStaleModeHints / syncSystemPromptForCurrentMode 契约)。
|
|
1550
|
+
*/
|
|
1551
|
+
upsertRuntimeSystemSlot(matcher, content) {
|
|
1552
|
+
const slot = matcher.kind === 'manifestSlot' ? matcher.slot : matcher.prefix;
|
|
1553
|
+
const before = this.conversation.find((message) => message.role === 'system' && (matcher.kind === 'manifestSlot'
|
|
1554
|
+
? contentToPlainText(message.content).includes(`slot=${matcher.slot}`)
|
|
1555
|
+
: contentToPlainText(message.content).trimStart().startsWith(matcher.prefix)));
|
|
1556
|
+
const result = upsertSystemSlot(this.conversation, matcher, content);
|
|
1557
|
+
if (result.messages !== this.conversation) {
|
|
1558
|
+
this.conversation = trimConversationBuffer(result.messages, MAX_CONVERSATION_MESSAGES, MAX_CONVERSATION_BYTES);
|
|
1559
|
+
}
|
|
1560
|
+
if (result.changed) {
|
|
1561
|
+
this.emitter.emit('context:mutation', {
|
|
1562
|
+
sessionId: this.sessionId,
|
|
1563
|
+
source: 'leader_runtime_system_slot',
|
|
1564
|
+
operation: before ? 'replace' : 'append',
|
|
1565
|
+
slot,
|
|
1566
|
+
oldHash: before ? this.hashContextContent(before.content) : null,
|
|
1567
|
+
newHash: this.hashContextContent(content),
|
|
1568
|
+
oldLength: before ? contentToPlainText(before.content).length : 0,
|
|
1569
|
+
newLength: content.length,
|
|
1570
|
+
changed: true,
|
|
1571
|
+
reason: 'system_slot_upsert',
|
|
1572
|
+
});
|
|
1573
|
+
}
|
|
1574
|
+
return result.changed;
|
|
1575
|
+
}
|
|
1576
|
+
/**
|
|
1577
|
+
* 收敛 conversation 中 append-only 累积的所有状态镜像槽位(每个槽只留最后一条)。
|
|
1578
|
+
* resume 从 DB 重建带回的历史残留在此一次性收敛(治本 R1)。
|
|
1579
|
+
*/
|
|
1580
|
+
collapseLeaderSystemSlots() {
|
|
1581
|
+
const collapsed = collapseSystemSlots(this.conversation, LeaderAgent.LEADER_SYSTEM_SLOTS);
|
|
1582
|
+
if (collapsed !== this.conversation) {
|
|
1583
|
+
this.conversation = collapsed;
|
|
1584
|
+
}
|
|
1585
|
+
}
|
|
1586
|
+
/**
|
|
1587
|
+
* 模式切换(solo↔team / execution route)后立即对齐运行时 Leader 上下文。
|
|
1588
|
+
*
|
|
1589
|
+
* 由 SessionManagerRuntime.setCollaborationMode / setExecutionRoutePreference 在写 DB 后调用,
|
|
1590
|
+
* 覆盖 Web/CLI/TUI 全部切换入口——切换不再「等下一条用户消息触发 think 才生效」。
|
|
1591
|
+
*
|
|
1592
|
+
* 纯同步、不触发 think(避免空转 ping LLM,见 leader-keeps-pinging-llm 教训):
|
|
1593
|
+
* - syncSystemPromptForCurrentMode: 重写 conversation[0] 主 system prompt 为当前 mode profile;
|
|
1594
|
+
* - pruneStaleModeHints: 移除切换前 append-only 残留的旧 mode hint,刷新保留的最新 hint
|
|
1595
|
+
* (含新 route 偏好 section),消除「旧 [Solo 模式] 与新 [Team 模式] 并存」的注入冲突。
|
|
1596
|
+
*
|
|
1597
|
+
* Node 单线程下它只能在 think 的 await 让出点(LLM in-flight)插入;已发请求用旧快照不受影响,
|
|
1598
|
+
* 下一轮 think 读新数组。session 未加载时调用方已跳过(DB 是真理,下次加载/resume 首轮 think 对齐)。
|
|
1599
|
+
*/
|
|
1600
|
+
applyRuntimeModeChange() {
|
|
1601
|
+
this.syncSystemPromptForCurrentMode();
|
|
1602
|
+
this.pruneStaleModeHints();
|
|
1603
|
+
}
|
|
1604
|
+
/**
|
|
1605
|
+
* 修剪 conversation 中 append-only 累积的 mode hint system 消息:只保留最后一条并刷新为当前
|
|
1606
|
+
* getTeamModeHint()(反映最新 collaboration mode + route 偏好),移除切换前残留的旧 hint。
|
|
1607
|
+
* 仅修剪内存运行时视图;DB 历史(leader_conversation 表)保持 append-only 不动。
|
|
1608
|
+
* 识别用内容指纹(isModeHintContent)而非 metadata——表无 metadata 列,resume 重建后仍可识别。
|
|
1609
|
+
*/
|
|
1610
|
+
pruneStaleModeHints() {
|
|
1611
|
+
const hintIndices = [];
|
|
1612
|
+
for (let i = 0; i < this.conversation.length; i++) {
|
|
1613
|
+
const message = this.conversation[i];
|
|
1614
|
+
if (message.role === 'system' && isModeHintContent(message.content)) {
|
|
1615
|
+
hintIndices.push(i);
|
|
1616
|
+
}
|
|
1617
|
+
}
|
|
1618
|
+
if (hintIndices.length === 0) {
|
|
1619
|
+
// 无 hint:不动(下次 think 入口或用户消息时会追加当前 mode 的新 hint)。
|
|
1620
|
+
return;
|
|
1621
|
+
}
|
|
1622
|
+
// 多条 hint 时,移除除最后一条外的所有旧 hint(切换前残留)。
|
|
1623
|
+
if (hintIndices.length > 1) {
|
|
1624
|
+
const keepOriginalIndex = hintIndices[hintIndices.length - 1];
|
|
1625
|
+
this.conversation = this.conversation.filter((message, i) => message.role !== 'system' || !isModeHintContent(message.content) || i === keepOriginalIndex);
|
|
1626
|
+
}
|
|
1627
|
+
// 刷新保留的 hint 为当前最新内容(mode/route 变化都要反映)。
|
|
1628
|
+
const latest = this.getTeamModeHint();
|
|
1629
|
+
if (latest) {
|
|
1630
|
+
const keepIndex = this.conversation.findIndex((message) => message.role === 'system' && isModeHintContent(message.content));
|
|
1631
|
+
if (keepIndex >= 0 && this.conversation[keepIndex].content !== latest) {
|
|
1632
|
+
this.conversation[keepIndex] = {
|
|
1633
|
+
...this.conversation[keepIndex],
|
|
1634
|
+
content: latest,
|
|
1635
|
+
};
|
|
1636
|
+
}
|
|
1637
|
+
}
|
|
1638
|
+
}
|
|
1639
|
+
/**
|
|
1640
|
+
* 获取动态上下文(Context Manifest dynamic context)— 作为独立 system 消息注入
|
|
1641
|
+
* 避免动态内容变化导致 Anthropic prompt cache 失效。
|
|
1642
|
+
*
|
|
1643
|
+
* 实现已下沉至 LeaderContextBuilder.getDynamicContext()(含「当前使命」锚点置顶 +
|
|
1644
|
+
* A2 token 预算门:超 context window 60% 时按优先级丢弃低优 fragment,mission 必留)。
|
|
1645
|
+
*/
|
|
1646
|
+
getDynamicContext() {
|
|
1647
|
+
return this.contextBuilder.getDynamicContext();
|
|
1648
|
+
}
|
|
1649
|
+
/**
|
|
1650
|
+
* Build the per-turn team-mode hint shown to the Leader before each user
|
|
1651
|
+
* message. 实现已下沉至 LeaderContextBuilder.getTeamModeHint()。
|
|
1652
|
+
*/
|
|
1653
|
+
getTeamModeHint() {
|
|
1654
|
+
return this.contextBuilder.getTeamModeHint();
|
|
1655
|
+
}
|
|
1656
|
+
get isRunning() {
|
|
1657
|
+
return this.running && !this.finished;
|
|
1658
|
+
}
|
|
1659
|
+
markWaitingForUser(waiting) {
|
|
1660
|
+
this.waitingForUser = waiting;
|
|
1661
|
+
}
|
|
1662
|
+
/**
|
|
1663
|
+
* 标记当前正在等待的用户输入(硬用户门)。
|
|
1664
|
+
* ask_user 必须调用它把内存 pendingUserInput 与 DB 写入对齐,
|
|
1665
|
+
* 否则 hasExplicitUserGate() 读到内存为 null,主循环 un-latch 守卫
|
|
1666
|
+
* 会把"等用户回答"误判成"软空闲等待"并继续偷跑派活。
|
|
1667
|
+
*/
|
|
1668
|
+
markPendingUserInput(input) {
|
|
1669
|
+
this.pendingUserInput = input;
|
|
1670
|
+
}
|
|
1671
|
+
markPendingReview(pending) {
|
|
1672
|
+
this.pendingReview = pending;
|
|
1673
|
+
}
|
|
1674
|
+
async approvePlanInternally() {
|
|
1675
|
+
this.pendingReview = false;
|
|
1676
|
+
this.planApproved = true;
|
|
1677
|
+
await this.db.setSessionState(this.sessionId, SESSION_KEYS.LEADER_PENDING_REVIEW, 'false');
|
|
1678
|
+
await this.db.setSessionState(this.sessionId, SESSION_KEYS.LEADER_PLAN_APPROVED, 'true');
|
|
1679
|
+
this.emitter.emit('leader:plan_approved', { sessionId: this.sessionId });
|
|
1680
|
+
}
|
|
1681
|
+
markFinished() {
|
|
1682
|
+
this.finished = true;
|
|
1683
|
+
}
|
|
1684
|
+
/**
|
|
1685
|
+
* 切换当前会话使用的模型(立即生效,下一轮 LLM 调用使用新模型)
|
|
1686
|
+
*/
|
|
1687
|
+
setModel(modelId, options) {
|
|
1688
|
+
if (!modelId) {
|
|
1689
|
+
return { ok: false, message: 'modelId 不能为空' };
|
|
1690
|
+
}
|
|
1691
|
+
const normalizedModelId = modelId.trim();
|
|
1692
|
+
try {
|
|
1693
|
+
getModelManager().getModelByIdStrict(normalizedModelId);
|
|
1694
|
+
}
|
|
1695
|
+
catch (error) {
|
|
1696
|
+
const available = getModelManager().getAllModels().map(model => model.id).join(', ') || '无';
|
|
1697
|
+
return {
|
|
1698
|
+
ok: false,
|
|
1699
|
+
message: `${error instanceof Error ? error.message : String(error)} 可用模型: ${available}`,
|
|
1700
|
+
};
|
|
1701
|
+
}
|
|
1702
|
+
const prev = this.model;
|
|
1703
|
+
this.model = normalizedModelId;
|
|
1704
|
+
if (options?.persistSessionState !== false) {
|
|
1705
|
+
void this.db.setSessionState(this.sessionId, SESSION_KEYS.CURRENT_MODEL, normalizedModelId);
|
|
1706
|
+
}
|
|
1707
|
+
// 同步更新 contextManager 的 context window 大小
|
|
1708
|
+
// 优先级:ModelManager 用户配置 > ModelsDevRegistry > 保持现有值
|
|
1709
|
+
const contextLimit = resolveModelContextLimit({
|
|
1710
|
+
providerCtx: getContextWindowSizeFromProvider(normalizedModelId),
|
|
1711
|
+
modelInfoCtx: getModelDevInfo(normalizedModelId)?.contextLimit,
|
|
1712
|
+
configuredCtx: globalConfig.llm.context_max_tokens,
|
|
1713
|
+
});
|
|
1714
|
+
this.contextManager.updateModel(normalizedModelId, contextLimit);
|
|
1715
|
+
leaderLogger.info(`模型已切换: ${prev} → ${normalizedModelId}${contextLimit ? ` (ctx ${Math.round(contextLimit / 1000)}K)` : ''}`);
|
|
1716
|
+
this.emitter.emit('leader:status', {
|
|
1717
|
+
sessionId: this.sessionId,
|
|
1718
|
+
status: `模型已切换为 ${normalizedModelId}${contextLimit ? ` · 上下文窗口 ${Math.round(contextLimit / 1000)}K` : ''}`,
|
|
1719
|
+
});
|
|
1720
|
+
return { ok: true, message: `模型已切换为 ${normalizedModelId}` };
|
|
1721
|
+
}
|
|
1722
|
+
/**
|
|
1723
|
+
* 切换权限模式(strict / dev / networked / yolo)
|
|
1724
|
+
*/
|
|
1725
|
+
setPermissionMode(mode) {
|
|
1726
|
+
if (!isPermissionMode(mode)) {
|
|
1727
|
+
return { ok: false, message: `无效的权限模式: ${mode},有效值: strict, dev, networked, yolo` };
|
|
1728
|
+
}
|
|
1729
|
+
const permissionMode = mode;
|
|
1730
|
+
this.applyPermissionUpdates([{ type: 'setMode', mode: permissionMode }], 'session');
|
|
1731
|
+
leaderLogger.info(`权限模式已切换: ${mode}`);
|
|
1732
|
+
return { ok: true, message: `权限模式已切换为 ${mode}` };
|
|
1733
|
+
}
|
|
1734
|
+
/**
|
|
1735
|
+
* 处理用户输入
|
|
1736
|
+
*/
|
|
1737
|
+
async handleUserInput(content) {
|
|
1738
|
+
if (this.waitingForUser) {
|
|
1739
|
+
this.waitingForUser = false;
|
|
1740
|
+
this.pendingUserInput = content;
|
|
1741
|
+
this.addMessage({
|
|
1742
|
+
role: 'user',
|
|
1743
|
+
content: content,
|
|
1744
|
+
});
|
|
1745
|
+
// 用户重新发消息时重置所有 Circuit Breaker:
|
|
1746
|
+
// CB OPEN 后系统停下等待用户,用户回来时 provider 可能已恢复,
|
|
1747
|
+
// 不应让上一代失败计数继续阻塞新请求。
|
|
1748
|
+
_resetAllCircuitBreakers();
|
|
1749
|
+
this.llmErrorRetryCount = 0;
|
|
1750
|
+
leaderLogger.info('[LeaderAgent] 用户重新发消息,已重置 Circuit Breaker 和 LLM 重试计数');
|
|
1751
|
+
}
|
|
1752
|
+
}
|
|
1753
|
+
/**
|
|
1754
|
+
* 执行工具调用
|
|
1755
|
+
*/
|
|
1756
|
+
async executeToolCall(toolCall) {
|
|
1757
|
+
const { name, arguments: argsStr } = toolCall.function;
|
|
1758
|
+
let args;
|
|
1759
|
+
try {
|
|
1760
|
+
args = JSON.parse(argsStr);
|
|
1761
|
+
}
|
|
1762
|
+
catch (error) {
|
|
1763
|
+
return `ERROR: 工具参数 JSON 解析失败: ${error instanceof Error ? error.message : String(error)}\n原始参数: ${argsStr.slice(0, 500)}`;
|
|
1764
|
+
}
|
|
1765
|
+
// 为 shell 工具注入用户中断信号
|
|
1766
|
+
if (name === 'shell') {
|
|
1767
|
+
args._abortSignal = this.userInterruptController.signal;
|
|
1768
|
+
}
|
|
1769
|
+
const heartbeat = startToolProgressHeartbeat({
|
|
1770
|
+
emitter: this.emitter,
|
|
1771
|
+
toolCall,
|
|
1772
|
+
sessionId: this.sessionId,
|
|
1773
|
+
scope: 'leader',
|
|
1774
|
+
});
|
|
1775
|
+
try {
|
|
1776
|
+
const registeredTool = this.toolRegistry.get(name);
|
|
1777
|
+
if (registeredTool?.scope === 'leader') {
|
|
1778
|
+
const result = await this.toolRegistry.execute(name, args, {
|
|
1779
|
+
db: this.db,
|
|
1780
|
+
sessionId: this.sessionId,
|
|
1781
|
+
agentId: 'leader',
|
|
1782
|
+
agentName: 'leader',
|
|
1783
|
+
workspace: this.workspace,
|
|
1784
|
+
emitter: this.emitter,
|
|
1785
|
+
bus: this.bus,
|
|
1786
|
+
permissionContext: this.permManager.permissionContext,
|
|
1787
|
+
llm: this.createLeaderEventStreamClient('Leader-MetaTools'),
|
|
1788
|
+
model: this.model,
|
|
1789
|
+
leaderToolsExecutor: this.toolsExecutor,
|
|
1790
|
+
toolRegistry: this.toolRegistry,
|
|
1791
|
+
blackboardGraph: this.leaderBlackboard?.blackboardGraph ?? undefined,
|
|
1792
|
+
toolCallId: toolCall.id,
|
|
1793
|
+
});
|
|
1794
|
+
if (!result.success)
|
|
1795
|
+
return `ERROR: ${result.error || 'unknown error'}`;
|
|
1796
|
+
return typeof result.data === 'string' ? result.data : JSON.stringify(result.data, null, 2);
|
|
1797
|
+
}
|
|
1798
|
+
const directExec = await this.directToolsExecutor.executeStructured(name, args, this.permManager.permissionContext, toolCall.id);
|
|
1799
|
+
// team_manage(create/delete) 走 ToolRegistry 后,需要在 Leader 侧同步 active team 状态
|
|
1800
|
+
// 使用结构化 ok 判定,避免对字符串前缀做关键词正则
|
|
1801
|
+
const teamManageAction = name === 'team_manage' ? String(args.action || '').trim() : '';
|
|
1802
|
+
if (name === 'team_manage' && teamManageAction === 'create') {
|
|
1803
|
+
const teamName = String(args.team_name || '').trim();
|
|
1804
|
+
if (teamName && directExec.ok)
|
|
1805
|
+
this.setActiveTeam(teamName);
|
|
1806
|
+
}
|
|
1807
|
+
else if (name === 'team_manage' && teamManageAction === 'delete') {
|
|
1808
|
+
const teamName = String(args.team_name || '').trim();
|
|
1809
|
+
if (teamName && directExec.ok && this.getActiveTeam() === teamName)
|
|
1810
|
+
this.setActiveTeam(null);
|
|
1811
|
+
}
|
|
1812
|
+
return directExec.ok ? directExec.content : `ERROR: ${directExec.content}`;
|
|
1813
|
+
}
|
|
1814
|
+
finally {
|
|
1815
|
+
heartbeat.stop();
|
|
1816
|
+
}
|
|
1817
|
+
}
|
|
1818
|
+
canBatchExecuteToolCalls(toolCalls) {
|
|
1819
|
+
return canBatchExecuteToolCallsFn(toolCalls, LEADER_PARALLEL_SAFE_TOOLS);
|
|
1820
|
+
}
|
|
1821
|
+
async executeToolCallsBatch(toolCalls) {
|
|
1822
|
+
return runToolCallsBatch(toolCalls, (toolCall) => this.executeToolCall(toolCall), LEADER_PARALLEL_SAFE_TOOLS);
|
|
1823
|
+
}
|
|
1824
|
+
createToolScheduler(input) {
|
|
1825
|
+
return this.thinkingEngine.createToolScheduler(input);
|
|
1826
|
+
}
|
|
1827
|
+
createLeaderEventStreamClient(actorLabel, hooks) {
|
|
1828
|
+
// NOTE: called during constructor before thinkingEngine is initialized,
|
|
1829
|
+
// so we call createEventStreamClient directly instead of delegating.
|
|
1830
|
+
return createEventStreamClient({
|
|
1831
|
+
actorLabel,
|
|
1832
|
+
llm: this.llm,
|
|
1833
|
+
classifyError: classifyLLMError,
|
|
1834
|
+
hooks,
|
|
1835
|
+
gatewayContext: {
|
|
1836
|
+
actorType: 'leader',
|
|
1837
|
+
actorLabel,
|
|
1838
|
+
purpose: 'leader',
|
|
1839
|
+
sessionId: this.sessionId,
|
|
1840
|
+
},
|
|
1841
|
+
});
|
|
1842
|
+
}
|
|
1843
|
+
async monitorUserInterventionDuringInFlight(input) {
|
|
1844
|
+
return this.thinkingEngine.monitorUserInterventionDuringInFlight(input);
|
|
1845
|
+
}
|
|
1846
|
+
/**
|
|
1847
|
+
* 处理 LLM 响应
|
|
1848
|
+
*/
|
|
1849
|
+
async processResponse(response) {
|
|
1850
|
+
return this.thinkingEngine.processResponse(response);
|
|
1851
|
+
}
|
|
1852
|
+
isUserInterventionMessage(message) {
|
|
1853
|
+
const sender = String(message.from ?? '');
|
|
1854
|
+
return message.type === 'user_intervention' && (sender === 'user' || sender.endsWith(':user'));
|
|
1855
|
+
}
|
|
1856
|
+
async clearConsumedUserInputState() {
|
|
1857
|
+
this.pendingUserInput = null;
|
|
1858
|
+
this.db.deleteSessionState(this.sessionId, SESSION_KEYS.PENDING_USER_INPUT);
|
|
1859
|
+
const gate = this.db.getSessionState(this.sessionId, SESSION_KEYS.PENDING_USER_GATE);
|
|
1860
|
+
if (gate && typeof gate === 'object' && !Array.isArray(gate) && gate.kind === 'ask_user') {
|
|
1861
|
+
this.db.deleteSessionState(this.sessionId, SESSION_KEYS.PENDING_USER_GATE);
|
|
1862
|
+
}
|
|
1863
|
+
}
|
|
1864
|
+
async clearSoftWaitingForUser(reason) {
|
|
1865
|
+
if (!this.waitingForUser)
|
|
1866
|
+
return false;
|
|
1867
|
+
if (this.hasExplicitUserGate()) {
|
|
1868
|
+
leaderLogger.debug(`[Leader] keep waiting_for_user during ${reason}: explicit user gate is active`);
|
|
1869
|
+
return false;
|
|
1870
|
+
}
|
|
1871
|
+
this.waitingForUser = false;
|
|
1872
|
+
await this.db.setSessionState(this.sessionId, SESSION_KEYS.LEADER_WAITING_FOR_USER, 'false');
|
|
1873
|
+
return true;
|
|
1874
|
+
}
|
|
1875
|
+
handleLeaderP0Message(data) {
|
|
1876
|
+
this.getLeaderP0Handler().handle(data);
|
|
1877
|
+
}
|
|
1878
|
+
/** 懒构造 P0 处理器 — 事件订阅/优先级/时序全部下沉到子模块,行为不变 */
|
|
1879
|
+
getLeaderP0Handler() {
|
|
1880
|
+
if (!this._leaderP0Handler) {
|
|
1881
|
+
this._leaderP0Handler = new LeaderP0Handler({
|
|
1882
|
+
sessionId: this.sessionId,
|
|
1883
|
+
leaderBusName: this.leaderBusName,
|
|
1884
|
+
emitter: this.emitter,
|
|
1885
|
+
permManager: this.permManager,
|
|
1886
|
+
// 主循环会用 .filter(...) 重新赋值该数组,必须走 getter 取活引用
|
|
1887
|
+
pendingAgentCompletionSignals: () => this.pendingAgentCompletionSignals,
|
|
1888
|
+
isEternalMode: () => this.isEternalMode(),
|
|
1889
|
+
isBusy: () => this.isBusy,
|
|
1890
|
+
waitingForUser: () => this.waitingForUser,
|
|
1891
|
+
setDelegateMode: (reason) => this.setDelegateMode(reason),
|
|
1892
|
+
clearSoftWaitingForUser: (reason) => this.clearSoftWaitingForUser(reason),
|
|
1893
|
+
interruptCurrentRound: (reason) => this.interruptCurrentRound(reason),
|
|
1894
|
+
setUserInterruptPending: (value) => { this.userInterruptPending = value; },
|
|
1895
|
+
stripSessionPrefix,
|
|
1896
|
+
});
|
|
1897
|
+
}
|
|
1898
|
+
return this._leaderP0Handler;
|
|
1899
|
+
}
|
|
1900
|
+
/**
|
|
1901
|
+
* Leader 主循环 - 完整复刻 Python 版本
|
|
1902
|
+
*
|
|
1903
|
+
* 单飞锁(P0 #2):stop() 只置 finished=true 不会 await run() 退出,紧跟的 sendUserInput
|
|
1904
|
+
* 在 isRunning=false 后会再次 launchLeaderDetached,导致并发两份 run() 共享 conversation /
|
|
1905
|
+
* userMessageQueue / abortController,会出现:监听器双倍订阅、消息错位、conversation 交错。
|
|
1906
|
+
* 这里入口检测:若旧 run() 仍未 settle,直接复用其 Promise,外部仍能 await 同一结果。
|
|
1907
|
+
*/
|
|
1908
|
+
startRun(initialPrompt, resume = false, recoveredTasks) {
|
|
1909
|
+
const promise = this._runImpl(initialPrompt, resume, recoveredTasks);
|
|
1910
|
+
this.currentRunPromise = promise;
|
|
1911
|
+
// 无论 settle 成功/失败都要清理,否则下一次 run() 永远复用旧 Promise
|
|
1912
|
+
promise.finally(() => {
|
|
1913
|
+
if (this.currentRunPromise === promise) {
|
|
1914
|
+
this.currentRunPromise = null;
|
|
1915
|
+
}
|
|
1916
|
+
}).catch(() => { });
|
|
1917
|
+
return promise;
|
|
1918
|
+
}
|
|
1919
|
+
async run(initialPrompt, resume = false, recoveredTasks) {
|
|
1920
|
+
if (this.currentRunPromise) {
|
|
1921
|
+
if (this.finished) {
|
|
1922
|
+
if (!this.pendingRunRestartPromise) {
|
|
1923
|
+
const previousRun = this.currentRunPromise;
|
|
1924
|
+
leaderLogger.warn('[run] 上一次 run() 已被中断但仍在收尾,等待清理后重启 Leader');
|
|
1925
|
+
let queuedRestart;
|
|
1926
|
+
queuedRestart = previousRun
|
|
1927
|
+
.catch((error) => {
|
|
1928
|
+
leaderLogger.warn(`[run] 被中断的上一轮在重启前结束为异常: ${error instanceof Error ? error.message : String(error)}`);
|
|
1929
|
+
})
|
|
1930
|
+
.then(() => {
|
|
1931
|
+
if (this.currentRunPromise === previousRun) {
|
|
1932
|
+
this.currentRunPromise = null;
|
|
1933
|
+
}
|
|
1934
|
+
return this.startRun(initialPrompt, resume, recoveredTasks);
|
|
1935
|
+
})
|
|
1936
|
+
.finally(() => {
|
|
1937
|
+
if (this.pendingRunRestartPromise === queuedRestart) {
|
|
1938
|
+
this.pendingRunRestartPromise = null;
|
|
1939
|
+
}
|
|
1940
|
+
});
|
|
1941
|
+
this.pendingRunRestartPromise = queuedRestart;
|
|
1942
|
+
}
|
|
1943
|
+
else {
|
|
1944
|
+
leaderLogger.warn('[run] Leader 重启已排队,复用排队重启 Promise');
|
|
1945
|
+
}
|
|
1946
|
+
return this.pendingRunRestartPromise;
|
|
1947
|
+
}
|
|
1948
|
+
leaderLogger.warn('[run] 上一次 run() 仍未结束,复用现有 Promise(避免并发主循环)');
|
|
1949
|
+
return this.currentRunPromise;
|
|
1950
|
+
}
|
|
1951
|
+
return this.startRun(initialPrompt, resume, recoveredTasks);
|
|
1952
|
+
}
|
|
1953
|
+
async _runImpl(initialPrompt, resume = false, recoveredTasks) {
|
|
1954
|
+
this.finished = false;
|
|
1955
|
+
this.running = true;
|
|
1956
|
+
// 重置 abort controller,确保重启后的 LLM call 不会因旧的已 abort controller 立刻失败
|
|
1957
|
+
this.currentLlmAbortController = null;
|
|
1958
|
+
this.healthMonitor.start();
|
|
1959
|
+
// 段1: 事件订阅(bus/blackboard/orchestration/plugin/tools/roles)统一收口到 setupRunListeners,
|
|
1960
|
+
// 返回 unsubscribe 句柄数组,由 run 的 finally 块逐个退订。行为与原内联订阅完全一致。
|
|
1961
|
+
const runListenerUnsubs = this._runImpl_setupRunListeners();
|
|
1962
|
+
try {
|
|
1963
|
+
await this._runImpl_initializeSession(initialPrompt, resume, recoveredTasks);
|
|
1964
|
+
// 主循环
|
|
1965
|
+
let loopCount = 0;
|
|
1966
|
+
let pollCount = 0;
|
|
1967
|
+
// 启动 Watchdog 看门狗
|
|
1968
|
+
this.startWatchdog();
|
|
1969
|
+
while (!this.finished) {
|
|
1970
|
+
loopCount++;
|
|
1971
|
+
// 每轮重建段间共享的可变状态(段3 产出消息,段5 产出 completion 跟踪,段6 读取)。
|
|
1972
|
+
const frame = {
|
|
1973
|
+
allMsgs: [],
|
|
1974
|
+
agentMsgs: [],
|
|
1975
|
+
consumedCompletionKeys: new Set(),
|
|
1976
|
+
pendingReportsToInject: [],
|
|
1977
|
+
};
|
|
1978
|
+
const loopPollControl = await this._runImpl_loopPollAndStatus(frame, pollCount);
|
|
1979
|
+
if (loopPollControl !== 'next') {
|
|
1980
|
+
if (loopPollControl === 'break')
|
|
1981
|
+
break;
|
|
1982
|
+
continue;
|
|
1983
|
+
}
|
|
1984
|
+
this.clearUserInterruptPending();
|
|
1985
|
+
const userMsgControl = await this._runImpl_consumeUserMessages(frame);
|
|
1986
|
+
if (userMsgControl !== 'next') {
|
|
1987
|
+
if (userMsgControl === 'break')
|
|
1988
|
+
break;
|
|
1989
|
+
continue;
|
|
1990
|
+
}
|
|
1991
|
+
const agentReportControl = await this._runImpl_consumeAgentReports(frame);
|
|
1992
|
+
if (agentReportControl !== 'next') {
|
|
1993
|
+
if (agentReportControl === 'break')
|
|
1994
|
+
break;
|
|
1995
|
+
continue;
|
|
1996
|
+
}
|
|
1997
|
+
const dispatchControl = await this._runImpl_dispatchAndFinalize(frame, loopCount);
|
|
1998
|
+
if (dispatchControl !== 'next') {
|
|
1999
|
+
if (dispatchControl === 'break')
|
|
2000
|
+
break;
|
|
2001
|
+
continue;
|
|
2002
|
+
}
|
|
2003
|
+
}
|
|
2004
|
+
return 'Leader finished';
|
|
2005
|
+
}
|
|
2006
|
+
catch (err) {
|
|
2007
|
+
// A4: 主循环未预期异常(逃出每轮迭代 try/catch 的)——原 try/finally 无 catch,
|
|
2008
|
+
// 异常静默上抛且 leader 卡在 running=false/finished=false 的 limbo(不可重启、不可观测)。
|
|
2009
|
+
// 这里:置终态(finished=true 让 run() 重启路径可用)+ emit leader:error(SseBridge 已订阅,广播到 Web UI)+ 记日志,再上抛保调用方 reject 契约。
|
|
2010
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
2011
|
+
leaderLogger.error(`[Leader] 主循环未预期异常(session=${this.sessionId}): ${msg}`);
|
|
2012
|
+
this.finished = true;
|
|
2013
|
+
try {
|
|
2014
|
+
this.emitter.emit('leader:error', {
|
|
2015
|
+
sessionId: this.sessionId,
|
|
2016
|
+
error: { message: `Leader 主循环未预期异常: ${msg}`, name: 'LeaderRunError', errorKind: 'fatal' },
|
|
2017
|
+
});
|
|
2018
|
+
}
|
|
2019
|
+
catch { /* tolerate emit failure */ }
|
|
2020
|
+
throw err;
|
|
2021
|
+
}
|
|
2022
|
+
finally {
|
|
2023
|
+
// 段1 返回的 unsubscribe 句柄,逐个退订,顺序与原内联 finally 一致。
|
|
2024
|
+
for (const unsub of runListenerUnsubs) {
|
|
2025
|
+
try {
|
|
2026
|
+
unsub();
|
|
2027
|
+
}
|
|
2028
|
+
catch (err) {
|
|
2029
|
+
leaderLogger.warn(`[Leader] run listener unsubscribe failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
2030
|
+
}
|
|
2031
|
+
}
|
|
2032
|
+
this.stopWatchdog();
|
|
2033
|
+
this._unsubscribeAgentActivityEvents();
|
|
2034
|
+
this.healthMonitor.stop();
|
|
2035
|
+
this.running = false;
|
|
2036
|
+
}
|
|
2037
|
+
}
|
|
2038
|
+
/**
|
|
2039
|
+
* 段1: _runImpl 启动时注册的事件订阅(bus/blackboard/orchestration/plugin/tools/roles)。
|
|
2040
|
+
*
|
|
2041
|
+
* 返回 unsubscribe 句柄数组,_runImpl 的 finally 块逐个退订。行为与原内联订阅完全一致 ——
|
|
2042
|
+
* 仅是物理搬运,无任何逻辑变更。顺序即退订顺序(bugHunt→crash→plugin→tools→roles→
|
|
2043
|
+
* orchestration run_state→orchestration event_rejected),与原 finally 一一对应。
|
|
2044
|
+
*/
|
|
2045
|
+
_runImpl_setupRunListeners() {
|
|
2046
|
+
// 监听 agent 紧急消息(P0 user_intervention),中断当前 LLM round
|
|
2047
|
+
// 参考介入机制:agent 通过 send_message 发送 help/error/flag 时,立即唤醒 Leader
|
|
2048
|
+
const busP0Unsub = this.emitter.subscribe('message:bus:priority', (data) => {
|
|
2049
|
+
this.handleLeaderP0Message(data);
|
|
2050
|
+
});
|
|
2051
|
+
// 监听 agent 崩溃事件
|
|
2052
|
+
// 不在这里 abort 当前 LLM:abort 会丢弃模型已生成的 partial 输出。
|
|
2053
|
+
// 实际 crash 路径会通过 AgentPool.markAgentFailed → bus 投递 task_failed
|
|
2054
|
+
// → handleLeaderP0Message → mergeAgentCompletionSignal 进入 pending 队列,
|
|
2055
|
+
// LeaderThinkingEngine 在每轮 LLM 结束后 break 即可。
|
|
2056
|
+
const crashUnsub = this.emitter.subscribe('agent:crashed', (data) => {
|
|
2057
|
+
if (this.isBusy) {
|
|
2058
|
+
leaderLogger.debug(`[Recovery] Agent @${data.name} ${data.status},等待当前 LLM round 自然结束`);
|
|
2059
|
+
}
|
|
2060
|
+
});
|
|
2061
|
+
// 监听插件开关事件(BugHunt / Office / Workflow 模式切换)
|
|
2062
|
+
const pluginToggleUnsub = this.emitter.subscribe('plugin:toggled', (data) => {
|
|
2063
|
+
if (data.sessionId && data.sessionId !== this.sessionId)
|
|
2064
|
+
return;
|
|
2065
|
+
if (data.pluginId === 'bughunt') {
|
|
2066
|
+
this.executionController.setBugHuntMode(data.enabled);
|
|
2067
|
+
leaderLogger.info(`BugHunt mode ${data.enabled ? 'enabled' : 'disabled'}`);
|
|
2068
|
+
}
|
|
2069
|
+
if (data.pluginId === 'office') {
|
|
2070
|
+
this.executionController.setOfficeMode(data.enabled);
|
|
2071
|
+
leaderLogger.info(`Office mode ${data.enabled ? 'enabled' : 'disabled'}`);
|
|
2072
|
+
}
|
|
2073
|
+
if (data.pluginId === 'workflow') {
|
|
2074
|
+
this.executionController.setWorkflowMode(data.enabled);
|
|
2075
|
+
leaderLogger.info(`Workflow mode ${data.enabled ? 'enabled' : 'disabled'}`);
|
|
2076
|
+
}
|
|
2077
|
+
});
|
|
2078
|
+
// 监听用户工具变更事件(CRUD via /api/v1/tools)
|
|
2079
|
+
// Registry 已在 ToolsRoutes 内同步更新,这里仅做日志 + 失效缓存提示。
|
|
2080
|
+
// Leader 每轮都通过 toolRegistry.getDefinitions(toolNames) 取最新工具表,
|
|
2081
|
+
// 因此主进程 leader 的下一次 LLM round 自动看到新工具/失去被禁工具。
|
|
2082
|
+
const toolsChangedUnsub = this.emitter.subscribe('tools:changed', (data) => {
|
|
2083
|
+
const action = data?.action ?? 'unknown';
|
|
2084
|
+
const name = data?.name ?? 'unknown';
|
|
2085
|
+
leaderLogger.info(`[Tools] registry change: ${action} ${name}`);
|
|
2086
|
+
});
|
|
2087
|
+
// 监听 roles 配置变更(PATCH /api/v1/roles 触发)
|
|
2088
|
+
// 重新读 runtimeConfig.roles 并把内置角色的 tools 重新计算后写回 RoleRegistry。
|
|
2089
|
+
// 自定义角色(createdBy !== 'system')保持不动;overrides 不影响它们。
|
|
2090
|
+
// 已经派出的 worker 仍持有旧 role tools 快照,新派 worker 立刻取到新值。
|
|
2091
|
+
const rolesChangedUnsub = this.emitter.subscribe('roles:changed', (data) => {
|
|
2092
|
+
try {
|
|
2093
|
+
refreshRuntimeConfig();
|
|
2094
|
+
this.reloadBuiltinRoles();
|
|
2095
|
+
leaderLogger.info(`[Roles] reloaded after action=${data.action}${data.name ? ` name=${data.name}` : ''}`);
|
|
2096
|
+
}
|
|
2097
|
+
catch (error) {
|
|
2098
|
+
leaderLogger.error(`[Roles] reload failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
2099
|
+
}
|
|
2100
|
+
});
|
|
2101
|
+
const orchestrationRunStateUnsub = this.emitter.subscribe('orchestration:run_state', (data) => {
|
|
2102
|
+
if (data.sessionId && data.sessionId !== this.sessionId)
|
|
2103
|
+
return;
|
|
2104
|
+
const isTerminal = isRunTerminalStatus(data.status);
|
|
2105
|
+
if (!data.bottleneck && !isTerminal)
|
|
2106
|
+
return;
|
|
2107
|
+
const parts = [`[Orchestration] status=${data.status} gen=${data.generation}`];
|
|
2108
|
+
parts.push(`nodes=${data.completedNodes}/${data.totalNodes}`);
|
|
2109
|
+
if (data.failedNodes)
|
|
2110
|
+
parts.push(`failed=${data.failedNodes}`);
|
|
2111
|
+
if (data.blockedNodes)
|
|
2112
|
+
parts.push(`blocked=${data.blockedNodes}`);
|
|
2113
|
+
if (data.bottleneck)
|
|
2114
|
+
parts.push(`bottleneck=${data.bottleneck}`);
|
|
2115
|
+
if (data.summary)
|
|
2116
|
+
parts.push(`summary=${data.summary}`);
|
|
2117
|
+
this.addMessage({ role: 'system', content: parts.join(' ') });
|
|
2118
|
+
});
|
|
2119
|
+
const orchestrationRejectUnsub = this.emitter.subscribe('orchestration:event_rejected', (data) => {
|
|
2120
|
+
if (data.sessionId && data.sessionId !== this.sessionId)
|
|
2121
|
+
return;
|
|
2122
|
+
this.addMessage({
|
|
2123
|
+
role: 'system',
|
|
2124
|
+
content: `[Orchestration] event_rejected eventType=${data.eventType} eventId=${data.eventId} reason=${data.reason ?? 'unknown'}`,
|
|
2125
|
+
});
|
|
2126
|
+
});
|
|
2127
|
+
return [
|
|
2128
|
+
busP0Unsub,
|
|
2129
|
+
crashUnsub,
|
|
2130
|
+
pluginToggleUnsub,
|
|
2131
|
+
toolsChangedUnsub,
|
|
2132
|
+
rolesChangedUnsub,
|
|
2133
|
+
orchestrationRunStateUnsub,
|
|
2134
|
+
orchestrationRejectUnsub,
|
|
2135
|
+
];
|
|
2136
|
+
}
|
|
2137
|
+
/**
|
|
2138
|
+
* 段2: 会话恢复 + 消息回放 + 首轮系统提示。
|
|
2139
|
+
*
|
|
2140
|
+
* resume 分支:从 db 回放 conversation,恢复 leader 运行态(waitingForUser/pendingReview/
|
|
2141
|
+
* planApproved/executionMode/customRoles/pendingPermission 等),重置 recoveredTasks 为可
|
|
2142
|
+
* 重新派发。新会话分支:注入 system prompt + dynamic context,把 initialPrompt 锚定为
|
|
2143
|
+
* originalGoal(防漂移),首轮 leaderThinkAndAct。
|
|
2144
|
+
*
|
|
2145
|
+
* 纯物理搬运自原 _runImpl 的 try 块开头,行为零变更。
|
|
2146
|
+
*/
|
|
2147
|
+
async _runImpl_initializeSession(initialPrompt, resume, recoveredTasks) {
|
|
2148
|
+
if (resume) {
|
|
2149
|
+
this.conversation = this.db.getConversationMessages(this.sessionId);
|
|
2150
|
+
// 治标层:自愈历史里的「中断孤儿」——assistant 发起 tool_call 但 tool result 因进程
|
|
2151
|
+
// 在工具执行中途崩溃/被杀而永久缺失(assistant 已落库、result 未落库)。补明确语义
|
|
2152
|
+
// 占位并事务重写,从此该段历史自洽,provider 边界 sanitizer 不再每次反复合成
|
|
2153
|
+
// [tool result missing]。与治本层(LeaderToolDispatch 原子批写)互补:
|
|
2154
|
+
// 治本杜绝新裂缝、治标一次性自愈既有脏历史。
|
|
2155
|
+
const { healed, addedCount } = healInterruptedToolCalls(this.conversation);
|
|
2156
|
+
if (addedCount > 0) {
|
|
2157
|
+
leaderLogger.warn(`[ResumeHeal] 检测到 ${addedCount} 个中断孤儿 tool_call(缺配对 tool result),补占位并重写 leader_conversation`);
|
|
2158
|
+
this.conversation = resequenceTimestampsForPersistence(healed);
|
|
2159
|
+
this.db.replaceConversation(this.sessionId, this.conversation);
|
|
2160
|
+
}
|
|
2161
|
+
// 治本 R1:resume 从 append-only DB 重建会带回历史多条 manifest/黑板分析残留,
|
|
2162
|
+
// 一次性收敛成每槽一条(manifest 是状态镜像,最新值即权威,旧条无信息价值)。
|
|
2163
|
+
this.collapseLeaderSystemSlots();
|
|
2164
|
+
if (initialPrompt) {
|
|
2165
|
+
const newMsg = {
|
|
2166
|
+
role: 'user',
|
|
2167
|
+
content: initialPrompt,
|
|
2168
|
+
};
|
|
2169
|
+
this.addMessage(newMsg);
|
|
2170
|
+
this.db.saveConversationMessage(this.sessionId, newMsg);
|
|
2171
|
+
}
|
|
2172
|
+
if (this.conversation.length === 0) {
|
|
2173
|
+
this.conversation = [{
|
|
2174
|
+
role: 'system',
|
|
2175
|
+
content: this.getSystemPrompt(),
|
|
2176
|
+
}];
|
|
2177
|
+
// 统一 Context Manifest 动态上下文作为独立 system 消息
|
|
2178
|
+
const dynCtx = this.getDynamicContext();
|
|
2179
|
+
if (dynCtx) {
|
|
2180
|
+
// leader_init 槽 in-place 注入(带 slot 标记),单槽不堆积。
|
|
2181
|
+
this.upsertRuntimeSystemSlot({ kind: 'manifestSlot', slot: 'leader_init' }, dynCtx);
|
|
2182
|
+
}
|
|
2183
|
+
if (initialPrompt) {
|
|
2184
|
+
this.addMessage({
|
|
2185
|
+
role: 'user',
|
|
2186
|
+
content: initialPrompt,
|
|
2187
|
+
});
|
|
2188
|
+
}
|
|
2189
|
+
for (const message of this.conversation) {
|
|
2190
|
+
this.db.saveConversationMessage(this.sessionId, message);
|
|
2191
|
+
}
|
|
2192
|
+
}
|
|
2193
|
+
const state = await this.db.getSessionState(this.sessionId, SESSION_KEYS.LEADER_WAITING_FOR_USER);
|
|
2194
|
+
this.waitingForUser = state === 'true';
|
|
2195
|
+
this.loadPermissionContextFromState();
|
|
2196
|
+
const pendingReview = await this.db.getSessionState(this.sessionId, SESSION_KEYS.LEADER_PENDING_REVIEW);
|
|
2197
|
+
this.pendingReview = pendingReview === 'true';
|
|
2198
|
+
const planApproved = await this.db.getSessionState(this.sessionId, SESSION_KEYS.LEADER_PLAN_APPROVED);
|
|
2199
|
+
this.planApproved = planApproved === 'true';
|
|
2200
|
+
const scratchpadDigest = await this.db.getSessionState(this.sessionId, SESSION_KEYS.LEADER_LAST_SCRATCHPAD_REVIEW_DIGEST);
|
|
2201
|
+
this.lastScratchpadReviewDigest = typeof scratchpadDigest === 'string' ? scratchpadDigest : null;
|
|
2202
|
+
const executionMode = await this.db.getSessionState(this.sessionId, SESSION_KEYS.LEADER_EXECUTION_MODE);
|
|
2203
|
+
const executionReason = await this.db.getSessionState(this.sessionId, SESSION_KEYS.LEADER_EXECUTION_REASON);
|
|
2204
|
+
if (typeof executionMode === 'string' && (executionMode === 'direct' || executionMode === 'hybrid' || executionMode === 'delegate')) {
|
|
2205
|
+
this.executionMode = executionMode;
|
|
2206
|
+
}
|
|
2207
|
+
if (typeof executionReason === 'string' && executionReason.trim()) {
|
|
2208
|
+
this.executionReason = executionReason;
|
|
2209
|
+
}
|
|
2210
|
+
const pendingPermission = await this.db.getSessionState(this.sessionId, SESSION_KEYS.PENDING_PERMISSION_REQUEST);
|
|
2211
|
+
if (pendingPermission && typeof pendingPermission === 'object') {
|
|
2212
|
+
this.permManager.pendingPermissionRequest = pendingPermission;
|
|
2213
|
+
}
|
|
2214
|
+
if (this.waitingForUser) {
|
|
2215
|
+
const pendingInput = await this.db.getSessionState(this.sessionId, SESSION_KEYS.PENDING_USER_INPUT);
|
|
2216
|
+
if (pendingInput) {
|
|
2217
|
+
this.pendingUserInput = pendingInput;
|
|
2218
|
+
}
|
|
2219
|
+
}
|
|
2220
|
+
const customRoles = this.db.getSessionState(this.sessionId, SESSION_KEYS.CUSTOM_ROLES);
|
|
2221
|
+
if (customRoles && typeof customRoles === 'object') {
|
|
2222
|
+
this.roleRegistry.loadFromDict(customRoles);
|
|
2223
|
+
}
|
|
2224
|
+
else if (typeof customRoles === 'string') {
|
|
2225
|
+
try {
|
|
2226
|
+
this.roleRegistry.loadFromDict(JSON.parse(customRoles));
|
|
2227
|
+
}
|
|
2228
|
+
catch (error) {
|
|
2229
|
+
leaderLogger.error(`恢复自定义角色失败: ${error instanceof Error ? error.message : String(error)}`);
|
|
2230
|
+
}
|
|
2231
|
+
}
|
|
2232
|
+
if (this.pendingReview) {
|
|
2233
|
+
const pendingPlan = this.db.getSessionState(this.sessionId, SESSION_KEYS.PENDING_PLAN);
|
|
2234
|
+
if (pendingPlan) {
|
|
2235
|
+
this.emitter.emit('plan:submitted', {
|
|
2236
|
+
sessionId: this.sessionId,
|
|
2237
|
+
plan: pendingPlan,
|
|
2238
|
+
});
|
|
2239
|
+
}
|
|
2240
|
+
}
|
|
2241
|
+
if (recoveredTasks && recoveredTasks.length > 0) {
|
|
2242
|
+
// 重置被中断任务为 pending,准备重新 dispatch
|
|
2243
|
+
for (const recoveredTask of recoveredTasks) {
|
|
2244
|
+
const task = this.board.getTask(recoveredTask.id);
|
|
2245
|
+
if (!task)
|
|
2246
|
+
continue;
|
|
2247
|
+
this.board.prepareTaskForRedispatch(task.id, '会话中断后恢复');
|
|
2248
|
+
}
|
|
2249
|
+
// 仅作为本次运行的上下文注入,不写入会话历史,避免污染真实对话记录
|
|
2250
|
+
const taskList = recoveredTasks.map(t => `- [${t.id}] ${t.subject}`).join('\n');
|
|
2251
|
+
const resumeMsg = {
|
|
2252
|
+
role: 'system',
|
|
2253
|
+
content: [
|
|
2254
|
+
`[系统] 检测到 ${recoveredTasks.length} 个在中断前未完成的任务,已重置为可重新派发状态:`,
|
|
2255
|
+
taskList,
|
|
2256
|
+
'',
|
|
2257
|
+
'请结合用户当前消息与 task board 状态决定下一步;面向用户时直接给出当前可执行结论。',
|
|
2258
|
+
].join('\n'),
|
|
2259
|
+
};
|
|
2260
|
+
this.addMessage(resumeMsg);
|
|
2261
|
+
}
|
|
2262
|
+
await this.tracker.loadHistory(this.sessionId);
|
|
2263
|
+
if (resume && this.board.allTerminal() && this.pool.getRunning().length === 0) {
|
|
2264
|
+
leaderLogger.info('恢复已完成会话,等待用户输入新指令');
|
|
2265
|
+
this.waitingForUser = true;
|
|
2266
|
+
this.emitter.emit('leader:status', {
|
|
2267
|
+
sessionId: this.sessionId,
|
|
2268
|
+
status: 'Idle (已完成,等待新指令)',
|
|
2269
|
+
});
|
|
2270
|
+
this.emitter.emit('leader:busy', {
|
|
2271
|
+
sessionId: this.sessionId,
|
|
2272
|
+
isBusy: false,
|
|
2273
|
+
queueLength: 0,
|
|
2274
|
+
});
|
|
2275
|
+
}
|
|
2276
|
+
}
|
|
2277
|
+
else {
|
|
2278
|
+
this.conversation = [];
|
|
2279
|
+
this.loadPermissionContextFromState();
|
|
2280
|
+
this.setExecutionRoute({
|
|
2281
|
+
mode: 'direct',
|
|
2282
|
+
reason: '新会话默认先由 Leader 直接理解并处理用户请求。',
|
|
2283
|
+
});
|
|
2284
|
+
this.addMessage({
|
|
2285
|
+
role: 'system',
|
|
2286
|
+
content: this.getSystemPrompt(),
|
|
2287
|
+
});
|
|
2288
|
+
// 统一 Context Manifest 动态上下文作为独立 system 消息
|
|
2289
|
+
const dynamicCtx = this.getDynamicContext();
|
|
2290
|
+
if (dynamicCtx) {
|
|
2291
|
+
// leader_init 槽 in-place 注入(带 slot 标记),单槽不堆积。
|
|
2292
|
+
this.upsertRuntimeSystemSlot({ kind: 'manifestSlot', slot: 'leader_init' }, dynamicCtx);
|
|
2293
|
+
}
|
|
2294
|
+
if (initialPrompt) {
|
|
2295
|
+
// 防漂移:捕获原始用户任务文本,供每轮「当前使命」锚点置顶(见 getDynamicContext)。
|
|
2296
|
+
const goalText = typeof initialPrompt === 'string'
|
|
2297
|
+
? initialPrompt
|
|
2298
|
+
: contentToPlainText(initialPrompt);
|
|
2299
|
+
this.originalGoal = goalText?.trim() ? goalText.trim().slice(0, 500) : null;
|
|
2300
|
+
this.beginUserTurn();
|
|
2301
|
+
// Orchestration 不再在用户消息进来时自动启动;Leader 在 leaderThinkAndAct 中
|
|
2302
|
+
// 通过任务图与节点元数据自行决定是否进入统一编排内核。
|
|
2303
|
+
this.setExecutionRoute(this.chooseExecutionRoute(null));
|
|
2304
|
+
const teamHint = this.getTeamModeHint();
|
|
2305
|
+
if (teamHint) {
|
|
2306
|
+
this.addMessage({ role: 'system', content: teamHint });
|
|
2307
|
+
}
|
|
2308
|
+
this.addMessage({
|
|
2309
|
+
role: 'user',
|
|
2310
|
+
content: this.buildInitialUserContent(initialPrompt),
|
|
2311
|
+
});
|
|
2312
|
+
}
|
|
2313
|
+
for (const message of this.conversation) {
|
|
2314
|
+
this.db.saveConversationMessage(this.sessionId, message);
|
|
2315
|
+
}
|
|
2316
|
+
if (initialPrompt) {
|
|
2317
|
+
this.emitter.emit('leader:status', {
|
|
2318
|
+
sessionId: this.sessionId,
|
|
2319
|
+
status: 'Thinking...',
|
|
2320
|
+
});
|
|
2321
|
+
try {
|
|
2322
|
+
if (!this.fileChangesApi) {
|
|
2323
|
+
const { FileChangesApi } = await import('../web-server/FileChangesApi.js');
|
|
2324
|
+
const { DatabaseRepositoryAdapter } = await import('../core/DatabaseRepositories.js');
|
|
2325
|
+
this.fileChangesApi = new FileChangesApi(new DatabaseRepositoryAdapter(this.db));
|
|
2326
|
+
}
|
|
2327
|
+
const preview = typeof initialPrompt === 'string' ? initialPrompt.slice(0, 60) : '[task]';
|
|
2328
|
+
await this.fileChangesApi.createSnapshot(this.sessionId, `[turn:${this.turnCount}] Turn ${this.turnCount}: ${preview}`);
|
|
2329
|
+
}
|
|
2330
|
+
catch { /* non-critical */ }
|
|
2331
|
+
try {
|
|
2332
|
+
await this.leaderThinkAndAct();
|
|
2333
|
+
}
|
|
2334
|
+
catch (err) {
|
|
2335
|
+
leaderLogger.error('leaderThinkAndAct failed:', err);
|
|
2336
|
+
this.emitter.emit('leader:error', { sessionId: this.sessionId, error: err });
|
|
2337
|
+
}
|
|
2338
|
+
finally {
|
|
2339
|
+
this.emitRoundComplete('initial_prompt');
|
|
2340
|
+
}
|
|
2341
|
+
}
|
|
2342
|
+
}
|
|
2343
|
+
}
|
|
2344
|
+
/**
|
|
2345
|
+
* 段3: 主循环顶部 —— 运行中 agent 状态显示 + 消息轮询 + 用户消息入队 + 超时唤醒/抢占。
|
|
2346
|
+
*
|
|
2347
|
+
* 行为与原 _runImpl 内联段完全一致。写入 frame.allMsgs / frame.agentMsgs 供后续段读取。
|
|
2348
|
+
* 原段内 maybeDriveOpenWork 后的 continue 改为 return 'continue',由 _runImpl 解释。
|
|
2349
|
+
*/
|
|
2350
|
+
async _runImpl_loopPollAndStatus(frame, pollCount) {
|
|
2351
|
+
// 混合唤醒:事件驱动 (即时) + 超时巡检 (30s)
|
|
2352
|
+
const runningAgents = this.pool.getRunning();
|
|
2353
|
+
if (this.pendingReview) {
|
|
2354
|
+
// 等待用户审批方案,不发送状态更新
|
|
2355
|
+
}
|
|
2356
|
+
else if (runningAgents.length > 0) {
|
|
2357
|
+
// 有 Agent 正在运行,显示运行中的 Agent 信息
|
|
2358
|
+
const agentNames = runningAgents.map(a => a.name);
|
|
2359
|
+
let statusMsg;
|
|
2360
|
+
if (agentNames.length === 1) {
|
|
2361
|
+
statusMsg = `⏳ ${agentNames[0]} 工作中...`;
|
|
2362
|
+
}
|
|
2363
|
+
else {
|
|
2364
|
+
statusMsg = `⏳ ${agentNames.length} 个 Agent 工作中:${agentNames.slice(0, 3).join(', ')}${agentNames.length > 3 ? '...' : ''}`;
|
|
2365
|
+
}
|
|
2366
|
+
this.emitter.emit('leader:status', {
|
|
2367
|
+
sessionId: this.sessionId,
|
|
2368
|
+
status: statusMsg,
|
|
2369
|
+
pollCount,
|
|
2370
|
+
runningAgents: agentNames,
|
|
2371
|
+
});
|
|
2372
|
+
}
|
|
2373
|
+
let waitTimeoutMs = 30000;
|
|
2374
|
+
if (this.waitingForUser) {
|
|
2375
|
+
waitTimeoutMs = 60000;
|
|
2376
|
+
}
|
|
2377
|
+
else if (runningAgents.length > 0) {
|
|
2378
|
+
waitTimeoutMs = this.getLeaderSupervisionWaitTimeoutMs(runningAgents);
|
|
2379
|
+
}
|
|
2380
|
+
// allMsgs 由 frame.allMsgs 承载(段间共享)
|
|
2381
|
+
// 统一消息轮询:让 P0 agent 消息(task_complete/task_failed)与 user 消息同轮处理。
|
|
2382
|
+
//
|
|
2383
|
+
// 历史实现里,userMessageQueue 非空时连 poll 都跳过,导致 worker 在该轮发出的
|
|
2384
|
+
// task_complete 要等下一轮才被捕获,造成 "leader 被叫醒只 check 不反馈" 的滞后假象。
|
|
2385
|
+
//
|
|
2386
|
+
// 现行:
|
|
2387
|
+
// - userQueue 已有积压且不在评审:跳过 race-wait(避免给已排队的用户消息多加 30s 延迟),
|
|
2388
|
+
// 但仍 poll 一次,确保已到达 bus 的 agent 消息被同轮拉走。
|
|
2389
|
+
// - 其余情况:race-wait(关键消息即时唤醒 / 常规消息阻塞等待)后再 poll。
|
|
2390
|
+
const skipWait = this.userMessageQueue.length > 0 && !this.pendingReview;
|
|
2391
|
+
if (!skipWait) {
|
|
2392
|
+
const criticalPromise = this.bus.waitForCriticalMessage(this.leaderBusName, waitTimeoutMs);
|
|
2393
|
+
const regularPromise = this.bus.waitForMessage(this.leaderBusName, waitTimeoutMs);
|
|
2394
|
+
await Promise.race([criticalPromise, regularPromise]);
|
|
2395
|
+
}
|
|
2396
|
+
frame.allMsgs = await this.bus.poll(this.leaderBusName);
|
|
2397
|
+
const userMsgs = frame.allMsgs.filter(m => this.isUserInterventionMessage(m));
|
|
2398
|
+
frame.agentMsgs = frame.allMsgs.filter(m => !this.isUserInterventionMessage(m));
|
|
2399
|
+
// 新到的用户消息全部入队,延迟判断是否立即处理还是排队
|
|
2400
|
+
if (userMsgs.length > 0) {
|
|
2401
|
+
for (const um of userMsgs) {
|
|
2402
|
+
this.userMessageQueue.push(um);
|
|
2403
|
+
}
|
|
2404
|
+
// 如果队列中有超过一条消息(意味着某些消息必须排队等待),通知 TUI
|
|
2405
|
+
if (this.userMessageQueue.length > 1) {
|
|
2406
|
+
this.emitter.emit('leader:message_queued', {
|
|
2407
|
+
sessionId: this.sessionId,
|
|
2408
|
+
queueLength: this.userMessageQueue.length,
|
|
2409
|
+
});
|
|
2410
|
+
leaderLogger.debug(`用户消息入队,队列长度: ${this.userMessageQueue.length}`);
|
|
2411
|
+
}
|
|
2412
|
+
}
|
|
2413
|
+
// 只有当确实有消息需要处理时才显示 Processing 状态
|
|
2414
|
+
// 超时唤醒(无消息)时应保持/恢复等待状态
|
|
2415
|
+
if (frame.allMsgs.length > 0) {
|
|
2416
|
+
this.emitter.emit('leader:status', {
|
|
2417
|
+
sessionId: this.sessionId,
|
|
2418
|
+
status: '处理新事件...',
|
|
2419
|
+
});
|
|
2420
|
+
}
|
|
2421
|
+
else if (!this.pendingReview && this.pool.getRunning().length === 0) {
|
|
2422
|
+
const preemptiveUserMsgs = this.bus
|
|
2423
|
+
.pollByType(this.leaderBusName, ['user_intervention'])
|
|
2424
|
+
.filter(m => this.isUserInterventionMessage(m));
|
|
2425
|
+
if (preemptiveUserMsgs.length > 0) {
|
|
2426
|
+
this.userMessageQueue.push(...preemptiveUserMsgs);
|
|
2427
|
+
this.emitter.emit('leader:status', {
|
|
2428
|
+
sessionId: this.sessionId,
|
|
2429
|
+
status: t('leader.status.processing_user_input'),
|
|
2430
|
+
});
|
|
2431
|
+
}
|
|
2432
|
+
else {
|
|
2433
|
+
const recoverySummary = this.getRecoveryStatusSummary();
|
|
2434
|
+
if (await this.maybeDriveOpenWork()) {
|
|
2435
|
+
if (!this.waitingForUser) {
|
|
2436
|
+
return 'continue';
|
|
2437
|
+
}
|
|
2438
|
+
}
|
|
2439
|
+
// 自动唤醒条件收紧:仅当真有 running agent 或 dispatchable/running 任务时才主动 LLM。
|
|
2440
|
+
// 老逻辑用 !this.board.allTerminal() — 把"还有终态以外的任务"都算作要推进,
|
|
2441
|
+
// 导致空闲会话在每次 30s 巡检都 ping 一次 LLM。
|
|
2442
|
+
//
|
|
2443
|
+
// 控制模式守卫:inline 自驱与 maybeDriveOpenWork 同属"自治找活",只在 eternal
|
|
2444
|
+
// 下允许。manual / 默认模式即便有未完成任务,也只回到等待状态,由 worker 汇报
|
|
2445
|
+
// 或用户消息驱动 —— 关掉 eternal 后绝不残留无限自驱。
|
|
2446
|
+
const hasOpenWork = this.hasPendingTasks() || this.hasRunningAgents();
|
|
2447
|
+
if (this.isEternalMode() && !this.waitingForUser && hasOpenWork) {
|
|
2448
|
+
leaderLogger.info('[Leader] maybeDriveOpenWork 已耗尽,主动触发 leaderThinkAndAct');
|
|
2449
|
+
await this.leaderThinkAndAct();
|
|
2450
|
+
}
|
|
2451
|
+
else if (this.isEternalMode() && !this.waitingForUser) {
|
|
2452
|
+
// Eternal 模式有 goal 但 hasOpenWork=false 时,走 patrol 让 LLM 规划下一步
|
|
2453
|
+
const patrolled = await this.progressInvariant.maybeEternalIdlePatrol();
|
|
2454
|
+
if (!patrolled) {
|
|
2455
|
+
this.emitter.emit('leader:status', {
|
|
2456
|
+
sessionId: this.sessionId,
|
|
2457
|
+
status: getPromptCatalog().leader.eternalGoal.statusStandby,
|
|
2458
|
+
});
|
|
2459
|
+
}
|
|
2460
|
+
}
|
|
2461
|
+
else {
|
|
2462
|
+
// 超时唤醒且无消息、无运行中 Agent → 回到等待状态
|
|
2463
|
+
this.emitter.emit('leader:status', {
|
|
2464
|
+
sessionId: this.sessionId,
|
|
2465
|
+
status: '等待用户输入...',
|
|
2466
|
+
});
|
|
2467
|
+
this.emitter.emit('leader:busy', {
|
|
2468
|
+
sessionId: this.sessionId,
|
|
2469
|
+
isBusy: false,
|
|
2470
|
+
queueLength: 0,
|
|
2471
|
+
});
|
|
2472
|
+
}
|
|
2473
|
+
}
|
|
2474
|
+
}
|
|
2475
|
+
return 'next';
|
|
2476
|
+
}
|
|
2477
|
+
/**
|
|
2478
|
+
* 段4: 用户消息消费 + permission 解决 + COMPACT + 评审批准/拒绝 + waitingForUser 门控。
|
|
2479
|
+
* 行为与原内联段一致。原段内 continue 改为 return 'continue';评审内层 for-break 保持不变。
|
|
2480
|
+
*/
|
|
2481
|
+
async _runImpl_consumeUserMessages(frame) {
|
|
2482
|
+
// 1. 优先处理用户介入 / 回复(从队列取消息,FIFO)
|
|
2483
|
+
// 条件收紧:仅 pendingAgentCompletionSignals(task_complete/task_failed)优先级极高,
|
|
2484
|
+
// 必须抢在用户消息之前处理以维持任务状态一致性。frame.agentMsgs(report/finding 等一般消息)
|
|
2485
|
+
// 不再阻塞用户消息,避免"有 worker 持续汇报时用户输入无限排队"。
|
|
2486
|
+
if (this.userMessageQueue.length > 0 && !this.pendingReview && this.pendingAgentCompletionSignals.length === 0) {
|
|
2487
|
+
// Eternal silence lock 必须在处理用户消息前主动解锁,
|
|
2488
|
+
// 否则刚收到的用户输入会被 fingerprint 锁挡掉一轮 patrol。
|
|
2489
|
+
this.progressInvariant.invalidateEternalSilenceLock?.('user_message');
|
|
2490
|
+
// ★ 修复:一次性处理队列中的所有用户消息,避免用户连发N条要分N轮处理
|
|
2491
|
+
const allUserMessages = [];
|
|
2492
|
+
while (this.userMessageQueue.length > 0) {
|
|
2493
|
+
allUserMessages.push(this.userMessageQueue.shift());
|
|
2494
|
+
}
|
|
2495
|
+
// 通知 TUI 队列已清空
|
|
2496
|
+
this.emitter.emit('leader:message_dequeued', {
|
|
2497
|
+
sessionId: this.sessionId,
|
|
2498
|
+
queueLength: 0,
|
|
2499
|
+
});
|
|
2500
|
+
const msg = allUserMessages[0];
|
|
2501
|
+
const content = contentToPlainText(msg.payload);
|
|
2502
|
+
if (this.waitingForUser) {
|
|
2503
|
+
leaderLogger.info(`收到用户介入消息,立即处理: ${content.substring(0, 50)}...`);
|
|
2504
|
+
this.waitingForUser = false;
|
|
2505
|
+
await this.db.setSessionState(this.sessionId, SESSION_KEYS.LEADER_WAITING_FOR_USER, 'false');
|
|
2506
|
+
await this.clearConsumedUserInputState();
|
|
2507
|
+
const msgContentInner = msg.payload ?? '';
|
|
2508
|
+
this.beginUserTurn();
|
|
2509
|
+
// Orchestration 触发改由 Leader 在编排内核里通过任务图节点决定
|
|
2510
|
+
this.setExecutionRoute(this.chooseExecutionRoute(null));
|
|
2511
|
+
const teamHintInner = this.getTeamModeHint();
|
|
2512
|
+
if (teamHintInner) {
|
|
2513
|
+
this.addMessage({ role: 'system', content: teamHintInner });
|
|
2514
|
+
}
|
|
2515
|
+
this.addMessage({ role: 'user', content: msgContentInner });
|
|
2516
|
+
await this.db.saveConversationMessage(this.sessionId, {
|
|
2517
|
+
role: 'user',
|
|
2518
|
+
content: msgContentInner,
|
|
2519
|
+
});
|
|
2520
|
+
// ★ 修复:追加队列中剩余的所有用户消息(索引1到末尾),让 LLM 一次性看到全部输入
|
|
2521
|
+
for (let i = 1; i < allUserMessages.length; i++) {
|
|
2522
|
+
const extraMsg = allUserMessages[i];
|
|
2523
|
+
const extraContent = extraMsg.payload ?? '';
|
|
2524
|
+
if (isEmptyContent(extraContent))
|
|
2525
|
+
continue;
|
|
2526
|
+
this.addMessage({ role: 'user', content: extraContent });
|
|
2527
|
+
await this.db.saveConversationMessage(this.sessionId, { role: 'user', content: extraContent });
|
|
2528
|
+
leaderLogger.info(`追加用户消息 ${i + 1}/${allUserMessages.length}: ${contentToPlainText(extraContent).substring(0, 50)}...`);
|
|
2529
|
+
}
|
|
2530
|
+
try {
|
|
2531
|
+
if (!this.fileChangesApi) {
|
|
2532
|
+
const { FileChangesApi } = await import('../web-server/FileChangesApi.js');
|
|
2533
|
+
const { DatabaseRepositoryAdapter } = await import('../core/DatabaseRepositories.js');
|
|
2534
|
+
this.fileChangesApi = new FileChangesApi(new DatabaseRepositoryAdapter(this.db));
|
|
2535
|
+
}
|
|
2536
|
+
const preview = typeof msgContentInner === 'string' ? msgContentInner.slice(0, 60) : '[message]';
|
|
2537
|
+
await this.fileChangesApi.createSnapshot(this.sessionId, `[turn:${this.turnCount}] Turn ${this.turnCount}: ${preview}`);
|
|
2538
|
+
}
|
|
2539
|
+
catch { /* non-critical */ }
|
|
2540
|
+
try {
|
|
2541
|
+
await this.leaderThinkAndAct();
|
|
2542
|
+
}
|
|
2543
|
+
catch (err) {
|
|
2544
|
+
leaderLogger.error('leaderThinkAndAct failed:', err);
|
|
2545
|
+
this.emitter.emit('leader:error', { sessionId: this.sessionId, error: err });
|
|
2546
|
+
}
|
|
2547
|
+
finally {
|
|
2548
|
+
this.emitRoundComplete('user_intervention');
|
|
2549
|
+
}
|
|
2550
|
+
if (this.waitingForUser) {
|
|
2551
|
+
return 'continue';
|
|
2552
|
+
}
|
|
2553
|
+
return 'continue';
|
|
2554
|
+
}
|
|
2555
|
+
const permissionResolution = this.resolvePendingPermissionFromUserInput(content);
|
|
2556
|
+
if (permissionResolution === 'resolved') {
|
|
2557
|
+
this.waitingForUser = false;
|
|
2558
|
+
await this.db.setSessionState(this.sessionId, SESSION_KEYS.LEADER_WAITING_FOR_USER, 'false');
|
|
2559
|
+
return 'continue';
|
|
2560
|
+
}
|
|
2561
|
+
if (permissionResolution === 'pending') {
|
|
2562
|
+
return 'continue';
|
|
2563
|
+
}
|
|
2564
|
+
// 检查是否是 COMPACT 指令
|
|
2565
|
+
if (content.toUpperCase() === 'COMPACT') {
|
|
2566
|
+
leaderLogger.info('收到 COMPACT 指令,执行手动压缩');
|
|
2567
|
+
await this.compactContext();
|
|
2568
|
+
return 'continue';
|
|
2569
|
+
}
|
|
2570
|
+
leaderLogger.debug(`收到用户消息 (介入/回复): ${content.substring(0, 50)}...`);
|
|
2571
|
+
this.waitingForUser = false;
|
|
2572
|
+
await this.db.setSessionState(this.sessionId, SESSION_KEYS.LEADER_WAITING_FOR_USER, 'false');
|
|
2573
|
+
await this.clearConsumedUserInputState();
|
|
2574
|
+
const msgContent = msg.payload ?? '';
|
|
2575
|
+
this.beginUserTurn();
|
|
2576
|
+
// Orchestration 触发改由 Leader 在编排内核里通过任务图节点决定
|
|
2577
|
+
this.setExecutionRoute(this.chooseExecutionRoute(null));
|
|
2578
|
+
const teamHint = this.getTeamModeHint();
|
|
2579
|
+
if (teamHint) {
|
|
2580
|
+
this.addMessage({ role: 'system', content: teamHint });
|
|
2581
|
+
}
|
|
2582
|
+
this.addMessage({ role: 'user', content: msgContent });
|
|
2583
|
+
await this.db.saveConversationMessage(this.sessionId, { role: 'user', content: msgContent });
|
|
2584
|
+
// ★ 修复:追加队列中剩余的所有用户消息(索引1到末尾),让 LLM 一次性看到全部输入
|
|
2585
|
+
for (let i = 1; i < allUserMessages.length; i++) {
|
|
2586
|
+
const extraMsg = allUserMessages[i];
|
|
2587
|
+
const extraContent = extraMsg.payload ?? '';
|
|
2588
|
+
if (isEmptyContent(extraContent))
|
|
2589
|
+
continue;
|
|
2590
|
+
this.addMessage({ role: 'user', content: extraContent });
|
|
2591
|
+
await this.db.saveConversationMessage(this.sessionId, { role: 'user', content: extraContent });
|
|
2592
|
+
leaderLogger.info(`追加用户消息 ${i + 1}/${allUserMessages.length}: ${contentToPlainText(extraContent).substring(0, 50)}...`);
|
|
2593
|
+
}
|
|
2594
|
+
try {
|
|
2595
|
+
if (!this.fileChangesApi) {
|
|
2596
|
+
const { FileChangesApi } = await import('../web-server/FileChangesApi.js');
|
|
2597
|
+
const { DatabaseRepositoryAdapter } = await import('../core/DatabaseRepositories.js');
|
|
2598
|
+
this.fileChangesApi = new FileChangesApi(new DatabaseRepositoryAdapter(this.db));
|
|
2599
|
+
}
|
|
2600
|
+
const preview = typeof msgContent === 'string' ? msgContent.slice(0, 60) : '[message]';
|
|
2601
|
+
await this.fileChangesApi.createSnapshot(this.sessionId, `[turn:${this.turnCount}] Turn ${this.turnCount}: ${preview}`);
|
|
2602
|
+
}
|
|
2603
|
+
catch { /* non-critical */ }
|
|
2604
|
+
try {
|
|
2605
|
+
await this.leaderThinkAndAct();
|
|
2606
|
+
}
|
|
2607
|
+
catch (err) {
|
|
2608
|
+
leaderLogger.error('leaderThinkAndAct failed:', err);
|
|
2609
|
+
this.emitter.emit('leader:error', { sessionId: this.sessionId, error: err });
|
|
2610
|
+
}
|
|
2611
|
+
finally {
|
|
2612
|
+
this.emitRoundComplete('user_message');
|
|
2613
|
+
}
|
|
2614
|
+
if (this.waitingForUser) {
|
|
2615
|
+
return 'continue';
|
|
2616
|
+
}
|
|
2617
|
+
return 'continue';
|
|
2618
|
+
}
|
|
2619
|
+
const hasCompletionToProcess = this.pendingAgentCompletionSignals.length > 0 ||
|
|
2620
|
+
frame.agentMsgs.some((msg) => {
|
|
2621
|
+
const controlMessage = readAgentControlMessage(msg);
|
|
2622
|
+
return controlMessage?.kind === 'task_complete' || controlMessage?.kind === 'task_failed';
|
|
2623
|
+
});
|
|
2624
|
+
// 2. 检查评审状态
|
|
2625
|
+
if (this.pendingReview && !hasCompletionToProcess) {
|
|
2626
|
+
// ★ 修复:一次性处理队列中的所有评审消息
|
|
2627
|
+
const allReviewMessages = [];
|
|
2628
|
+
while (this.userMessageQueue.length > 0) {
|
|
2629
|
+
allReviewMessages.push(this.userMessageQueue.shift());
|
|
2630
|
+
}
|
|
2631
|
+
if (allReviewMessages.length === 0) {
|
|
2632
|
+
return 'continue';
|
|
2633
|
+
}
|
|
2634
|
+
// 通知 TUI 队列已清空
|
|
2635
|
+
this.emitter.emit('leader:message_dequeued', {
|
|
2636
|
+
sessionId: this.sessionId,
|
|
2637
|
+
queueLength: 0,
|
|
2638
|
+
});
|
|
2639
|
+
const reviewMsgsForLoop = allReviewMessages;
|
|
2640
|
+
for (const msg of reviewMsgsForLoop) {
|
|
2641
|
+
const content = contentToPlainText(msg.payload);
|
|
2642
|
+
const normalized = content.trim().toLowerCase();
|
|
2643
|
+
if (normalized === '/approve') {
|
|
2644
|
+
leaderLogger.info('用户批准方案,继续执行');
|
|
2645
|
+
this.pendingReview = false;
|
|
2646
|
+
await this.db.setSessionState(this.sessionId, SESSION_KEYS.LEADER_PENDING_REVIEW, 'false');
|
|
2647
|
+
this.planApproved = true;
|
|
2648
|
+
await this.db.setSessionState(this.sessionId, SESSION_KEYS.LEADER_PLAN_APPROVED, 'true');
|
|
2649
|
+
this.emitter.emit('leader:plan_approved', { sessionId: this.sessionId });
|
|
2650
|
+
// 发送通知
|
|
2651
|
+
this.emitter.emit('notification:new', {
|
|
2652
|
+
sessionId: this.sessionId,
|
|
2653
|
+
id: `plan_approved_${this.sessionId}_${Date.now()}`,
|
|
2654
|
+
type: 'plan_approved',
|
|
2655
|
+
priority: 'important',
|
|
2656
|
+
title: '方案已批准',
|
|
2657
|
+
message: '用户已批准执行方案,团队开始执行任务',
|
|
2658
|
+
timestamp: Date.now(),
|
|
2659
|
+
read: false,
|
|
2660
|
+
});
|
|
2661
|
+
await this.db.setSessionState(this.sessionId, 'running', 'approved');
|
|
2662
|
+
this.addMessage({
|
|
2663
|
+
role: 'user',
|
|
2664
|
+
content: '用户已批准方案,请开始执行。',
|
|
2665
|
+
});
|
|
2666
|
+
await this.db.saveConversationMessage(this.sessionId, {
|
|
2667
|
+
role: 'user',
|
|
2668
|
+
content: '用户已批准方案,请开始执行。',
|
|
2669
|
+
});
|
|
2670
|
+
try {
|
|
2671
|
+
await this.leaderThinkAndAct();
|
|
2672
|
+
}
|
|
2673
|
+
catch (err) {
|
|
2674
|
+
leaderLogger.error('leaderThinkAndAct failed:', err);
|
|
2675
|
+
this.emitter.emit('leader:error', { sessionId: this.sessionId, error: err });
|
|
2676
|
+
}
|
|
2677
|
+
finally {
|
|
2678
|
+
this.emitRoundComplete('plan_approved');
|
|
2679
|
+
}
|
|
2680
|
+
}
|
|
2681
|
+
else {
|
|
2682
|
+
leaderLogger.info(`收到用户评审意见:${content}`);
|
|
2683
|
+
this.pendingReview = false;
|
|
2684
|
+
await this.db.setSessionState(this.sessionId, SESSION_KEYS.LEADER_PENDING_REVIEW, 'false');
|
|
2685
|
+
this.emitter.emit('leader:plan_rejected', { sessionId: this.sessionId, feedback: content });
|
|
2686
|
+
this.addMessage({
|
|
2687
|
+
role: 'user',
|
|
2688
|
+
content: `[评审意见]: ${content}\n请根据意见调整方案。`,
|
|
2689
|
+
});
|
|
2690
|
+
await this.db.saveConversationMessage(this.sessionId, {
|
|
2691
|
+
role: 'user',
|
|
2692
|
+
content: `[评审意见]: ${content}`,
|
|
2693
|
+
});
|
|
2694
|
+
try {
|
|
2695
|
+
await this.leaderThinkAndAct();
|
|
2696
|
+
}
|
|
2697
|
+
catch (err) {
|
|
2698
|
+
leaderLogger.error('leaderThinkAndAct failed:', err);
|
|
2699
|
+
this.emitter.emit('leader:error', { sessionId: this.sessionId, error: err });
|
|
2700
|
+
}
|
|
2701
|
+
finally {
|
|
2702
|
+
this.emitRoundComplete('plan_rejected');
|
|
2703
|
+
}
|
|
2704
|
+
}
|
|
2705
|
+
break; // 每次只处理一条评审消息
|
|
2706
|
+
}
|
|
2707
|
+
if (this.pendingReview) {
|
|
2708
|
+
return 'continue';
|
|
2709
|
+
}
|
|
2710
|
+
}
|
|
2711
|
+
// 清除 waitingForUser 只应在有实质性工作要推进时
|
|
2712
|
+
// LLM 刚回复完设置的 waitingForUser 不应被清除,应等待用户输入
|
|
2713
|
+
// 先调和恢复中的任务(将 recovering task 重置为 pending),再检查是否有可派发工作
|
|
2714
|
+
this.reconcileRecoveringTasks();
|
|
2715
|
+
if (this.waitingForUser && !this.hasExplicitUserGate() && !this.board.allTerminal()) {
|
|
2716
|
+
// 只有当有待派发任务且之前是因为 agent 事件被打断等待状态时,才恢复推进。
|
|
2717
|
+
// 但:若这批 dispatchable 任务 Leader 上一轮已经"看过并决定等待"(指纹未变),
|
|
2718
|
+
// 就不要把它从 waitingForUser 里拽回来 —— 否则非 eternal 模式下只要存在一个
|
|
2719
|
+
// Leader 有意不派发的 dispatchable 任务,主循环就会每轮 un-latch → think →
|
|
2720
|
+
// 重新 latch → 再 un-latch,表现为无限请求 LLM。集合变化才重新驱动一次。
|
|
2721
|
+
const dispatchable = this.board.getDispatchable();
|
|
2722
|
+
const dispatchableSig = dispatchable.map(t => t.id).sort().join(',');
|
|
2723
|
+
const hasRecoverableWork = dispatchable.length > 0;
|
|
2724
|
+
if (hasRecoverableWork && dispatchableSig !== this.waitedDispatchableSig) {
|
|
2725
|
+
this.waitingForUser = false;
|
|
2726
|
+
await this.db.setSessionState(this.sessionId, SESSION_KEYS.LEADER_WAITING_FOR_USER, 'false');
|
|
2727
|
+
}
|
|
2728
|
+
}
|
|
2729
|
+
if (this.waitingForUser && frame.agentMsgs.length === 0 && this.pendingAgentCompletionSignals.length === 0) {
|
|
2730
|
+
return 'continue';
|
|
2731
|
+
}
|
|
2732
|
+
return 'next';
|
|
2733
|
+
}
|
|
2734
|
+
/**
|
|
2735
|
+
* 段5: agent 消息消费 + worker completion signal 注入 + dispatch directive。
|
|
2736
|
+
* 行为与原内联段一致。产出 frame.consumedCompletionKeys / frame.pendingReportsToInject 供段6 读取。
|
|
2737
|
+
* 段内 while-level continue/break 改为返回控制指令;for-内层 continue 保持。
|
|
2738
|
+
*/
|
|
2739
|
+
async _runImpl_consumeAgentReports(frame) {
|
|
2740
|
+
// 3. 批量处理各 Agent 的报告 / 消息
|
|
2741
|
+
let combinedAgentReport = '';
|
|
2742
|
+
// 是否含 actionable 事件(任务终态 / 权限请求 / 健康严重 / worker 求助 help|error|flag)。
|
|
2743
|
+
// 仅 actionable 才起一轮 leaderThinkAndAct;纯进展(report/finding)只并入上下文,
|
|
2744
|
+
// 不为每条 worker 汇报单独 ping LLM —— 否则 Leader"只是监控等待"也会被刷起 think。
|
|
2745
|
+
// 分类规则集中在 isActionableAgentBusMessage(AgentProtocol),此处只做聚合。
|
|
2746
|
+
let hasActionableAgentReport = frame.agentMsgs.some(m => isActionableAgentBusMessage(m));
|
|
2747
|
+
frame.consumedCompletionKeys = new Set();
|
|
2748
|
+
const completionKey = (signal) => `${signal.agentName ?? ''}\u0000${signal.taskId}\u0000${signal.taskRunGeneration ?? 'legacy'}\u0000${signal.exitReason}`;
|
|
2749
|
+
// 本轮刚落终态的任务(completed/failed)。用于在 reportMsg 里把它们锚定为
|
|
2750
|
+
// terminal —— 防止 Leader 把刚完成的任务幻觉成"还在跑 / 刚起步"。
|
|
2751
|
+
const justTerminatedTasks = [];
|
|
2752
|
+
let combinedRecoveryReport = '';
|
|
2753
|
+
for (const msg of frame.agentMsgs) {
|
|
2754
|
+
const content = contentToPlainText(msg.payload);
|
|
2755
|
+
const controlMessage = readAgentControlMessage(msg);
|
|
2756
|
+
if (msg.type === 'eternal_goal_set') {
|
|
2757
|
+
const payload = msg.payload;
|
|
2758
|
+
const goal = typeof payload.goal === 'string' ? payload.goal.trim() : contentToPlainText(msg.payload).trim();
|
|
2759
|
+
combinedAgentReport += [
|
|
2760
|
+
'',
|
|
2761
|
+
'--- Eternal Goal 已设置/更新(系统事件)---',
|
|
2762
|
+
`goal: ${goal || '(empty)'}`,
|
|
2763
|
+
'这是 Goal Mode 的启动/变更事件,不是普通进展汇报。',
|
|
2764
|
+
'请立即围绕该 goal 判断下一步:需要规划就 plan/create_task,需要实现就直接改或派发,需要验证就运行测试;不要只回复“已保存”。',
|
|
2765
|
+
'后续所有自主行动都必须优先服务这个 goal,直到 complete_eternal_goal、pause 或 clear。',
|
|
2766
|
+
].join('\n') + '\n';
|
|
2767
|
+
continue;
|
|
2768
|
+
}
|
|
2769
|
+
if (controlMessage?.kind === 'permission_request') {
|
|
2770
|
+
const payload = controlMessage;
|
|
2771
|
+
// 注册到 PermManager 的 pendingWorkerRequests,确保后续 permission_response
|
|
2772
|
+
// 能精确回到对应 worker(即便 LLM 后续介入修改也能反查)。
|
|
2773
|
+
const enriched = {
|
|
2774
|
+
...payload,
|
|
2775
|
+
workerName: payload.workerName || stripSessionPrefix(this.sessionId, msg.from),
|
|
2776
|
+
};
|
|
2777
|
+
// 直接由 PermManager 触发用户审批弹窗(或 eternal 自动放行),
|
|
2778
|
+
// 不再依赖 Leader LLM 主动调 request_permission_update——
|
|
2779
|
+
// 后者在 LLM 走神 / 上下文阻塞时会让 worker 卡死等不到响应。
|
|
2780
|
+
// Leader LLM 仍然会从 combinedAgentReport 看到这次审批事件,可在响应里向用户解释。
|
|
2781
|
+
const directOutcome = this.permManager.receiveWorkerPermissionRequest(enriched, this.isEternalMode());
|
|
2782
|
+
this.setDelegateMode(`收到来自 @${msg.from} 的权限请求,已直送用户审批。`);
|
|
2783
|
+
combinedAgentReport += `\n--- 来自 Agent @${msg.from} 的权限请求(已直送用户)---\n` +
|
|
2784
|
+
`tool: ${payload.toolName}\n` +
|
|
2785
|
+
`reason: ${payload.reason}\n` +
|
|
2786
|
+
`worker_name: ${enriched.workerName}\n` +
|
|
2787
|
+
`request_id: ${payload.requestId}\n` +
|
|
2788
|
+
`outcome: ${directOutcome.split('\n')[0]}\n` +
|
|
2789
|
+
'系统已自动向用户发起审批,无需再调 request_permission_update。\n' +
|
|
2790
|
+
'可向用户简要说明 worker 为何需要该权限,或继续调度其他可推进的任务。\n';
|
|
2791
|
+
continue;
|
|
2792
|
+
}
|
|
2793
|
+
if (controlMessage?.kind === 'agent_health_critical') {
|
|
2794
|
+
const stall = typeof controlMessage.stallSeconds === 'number'
|
|
2795
|
+
? `, stall=${controlMessage.stallSeconds}s`
|
|
2796
|
+
: '';
|
|
2797
|
+
combinedAgentReport += [
|
|
2798
|
+
'',
|
|
2799
|
+
`--- Agent @${controlMessage.agentName} 健康严重事件 ---`,
|
|
2800
|
+
`task: ${controlMessage.taskId}`,
|
|
2801
|
+
`status: ${controlMessage.status}`,
|
|
2802
|
+
`action: ${controlMessage.action}${stall}`,
|
|
2803
|
+
`reason: ${controlMessage.reason}`,
|
|
2804
|
+
'请立即根据 recovery record / task board 决定重派、接管、取消或向用户升级。',
|
|
2805
|
+
].join('\n') + '\n';
|
|
2806
|
+
continue;
|
|
2807
|
+
}
|
|
2808
|
+
if (controlMessage?.kind === 'worker_recovery') {
|
|
2809
|
+
combinedRecoveryReport += `\n${formatWorkerRecoveryPayload(controlMessage)}\n`;
|
|
2810
|
+
continue;
|
|
2811
|
+
}
|
|
2812
|
+
if (controlMessage?.kind === 'task_complete' || controlMessage?.kind === 'task_failed') {
|
|
2813
|
+
const exitReason = controlMessage.kind === 'task_complete' ? 'completed' : 'failed';
|
|
2814
|
+
const taskId = controlMessage.taskId;
|
|
2815
|
+
const result = controlMessage.kind === 'task_complete'
|
|
2816
|
+
? controlMessage.result
|
|
2817
|
+
: controlMessage.error;
|
|
2818
|
+
try {
|
|
2819
|
+
await this.acceptWorkerTaskResult({
|
|
2820
|
+
taskId,
|
|
2821
|
+
taskRunGeneration: controlMessage.taskRunGeneration,
|
|
2822
|
+
status: 'terminal',
|
|
2823
|
+
exitReason,
|
|
2824
|
+
result,
|
|
2825
|
+
agentName: msg.from,
|
|
2826
|
+
summary: controlMessage.kind === 'task_complete' ? controlMessage.summary : undefined,
|
|
2827
|
+
verdict: controlMessage.kind === 'task_complete' ? controlMessage.verdict : undefined,
|
|
2828
|
+
artifacts: controlMessage.kind === 'task_complete' ? controlMessage.artifacts : undefined,
|
|
2829
|
+
verification: controlMessage.kind === 'task_complete' ? controlMessage.verification : undefined,
|
|
2830
|
+
evidence_refs: controlMessage.kind === 'task_complete' ? controlMessage.evidence_refs : undefined,
|
|
2831
|
+
contract_compliance: controlMessage.kind === 'task_complete' ? controlMessage.contract_compliance : undefined,
|
|
2832
|
+
next_steps: controlMessage.kind === 'task_complete' ? controlMessage.next_steps : undefined,
|
|
2833
|
+
blocked_by_discovery: controlMessage.kind === 'task_complete' ? controlMessage.blocked_by_discovery : undefined,
|
|
2834
|
+
needs_leader_coordination: controlMessage.kind === 'task_complete' ? controlMessage.needs_leader_coordination : undefined,
|
|
2835
|
+
toolTrace: controlMessage.kind === 'task_complete' ? controlMessage.toolTrace : undefined,
|
|
2836
|
+
});
|
|
2837
|
+
}
|
|
2838
|
+
catch (err) {
|
|
2839
|
+
leaderLogger.error(`[Leader] acceptWorkerTaskResult 异常 (task=${taskId}): ${err instanceof Error ? err.message : String(err)}`);
|
|
2840
|
+
}
|
|
2841
|
+
// Drain the matching signal from the completion queue
|
|
2842
|
+
this.pendingAgentCompletionSignals = this.pendingAgentCompletionSignals.filter(s => completionKey(s) !== completionKey({
|
|
2843
|
+
agentName: msg.from,
|
|
2844
|
+
taskId,
|
|
2845
|
+
taskRunGeneration: controlMessage.taskRunGeneration,
|
|
2846
|
+
exitReason,
|
|
2847
|
+
}));
|
|
2848
|
+
frame.consumedCompletionKeys.add(completionKey({
|
|
2849
|
+
agentName: msg.from,
|
|
2850
|
+
taskId,
|
|
2851
|
+
taskRunGeneration: controlMessage.taskRunGeneration,
|
|
2852
|
+
exitReason,
|
|
2853
|
+
}));
|
|
2854
|
+
justTerminatedTasks.push({ taskId, exitReason });
|
|
2855
|
+
leaderLogger.info(`Agent @${msg.from} 报告任务 ${taskId} ${exitReason}`);
|
|
2856
|
+
// 强注入统一 Cross-Agent Artifact Awareness,合并 attempt_completion 与框架 toolTrace。
|
|
2857
|
+
const digest = formatWorkerCompletion({
|
|
2858
|
+
result,
|
|
2859
|
+
summary: controlMessage.kind === 'task_complete' ? controlMessage.summary : undefined,
|
|
2860
|
+
artifacts: controlMessage.kind === 'task_complete' ? controlMessage.artifacts : undefined,
|
|
2861
|
+
verification: controlMessage.kind === 'task_complete' ? controlMessage.verification : undefined,
|
|
2862
|
+
evidence_refs: controlMessage.kind === 'task_complete' ? controlMessage.evidence_refs : undefined,
|
|
2863
|
+
contract_compliance: controlMessage.kind === 'task_complete' ? controlMessage.contract_compliance : undefined,
|
|
2864
|
+
next_steps: controlMessage.kind === 'task_complete' ? controlMessage.next_steps : undefined,
|
|
2865
|
+
blocked_by_discovery: controlMessage.kind === 'task_complete' ? controlMessage.blocked_by_discovery : undefined,
|
|
2866
|
+
needs_leader_coordination: controlMessage.kind === 'task_complete' ? controlMessage.needs_leader_coordination : undefined,
|
|
2867
|
+
toolTrace: controlMessage.kind === 'task_complete' ? controlMessage.toolTrace : undefined,
|
|
2868
|
+
}, { agentName: msg.from ?? 'unknown', taskId, exitReason });
|
|
2869
|
+
combinedAgentReport += `\n${digest.block}\n`;
|
|
2870
|
+
}
|
|
2871
|
+
else {
|
|
2872
|
+
// 区分 actionable 求助 vs 纯进展汇报(分类见 isActionableAgentBusMessage):
|
|
2873
|
+
// - worker 的 help/error/flag 走 bus type='user_intervention'(sender 是 worker 不是 user,
|
|
2874
|
+
// 故没被 isUserInterventionMessage 归为用户介入)→ 需要 Leader 处理,actionable。
|
|
2875
|
+
// - report/finding 走 bus type='message' → 纯进展,只并入上下文,不单独起一轮 think。
|
|
2876
|
+
const isWorkerEscalation = msg.type === 'user_intervention';
|
|
2877
|
+
leaderLogger.debug(`收到 Agent @${msg.from} 的${isWorkerEscalation ? '求助' : '普通'}消息`);
|
|
2878
|
+
combinedAgentReport += `\n--- 来自 Agent @${msg.from} 的消息 ---\n${content}\n`;
|
|
2879
|
+
}
|
|
2880
|
+
}
|
|
2881
|
+
frame.pendingReportsToInject = this.pendingAgentCompletionSignals.filter((signal) => {
|
|
2882
|
+
if (!signal.result)
|
|
2883
|
+
return false;
|
|
2884
|
+
return !frame.consumedCompletionKeys.has(completionKey(signal));
|
|
2885
|
+
});
|
|
2886
|
+
for (const signal of frame.pendingReportsToInject) {
|
|
2887
|
+
try {
|
|
2888
|
+
await this.acceptWorkerTaskResult({
|
|
2889
|
+
taskId: signal.taskId,
|
|
2890
|
+
taskRunGeneration: signal.taskRunGeneration,
|
|
2891
|
+
status: 'terminal',
|
|
2892
|
+
exitReason: signal.exitReason,
|
|
2893
|
+
result: signal.result || '',
|
|
2894
|
+
agentName: signal.agentName,
|
|
2895
|
+
summary: signal.summary,
|
|
2896
|
+
verdict: signal.verdict,
|
|
2897
|
+
artifacts: signal.artifacts,
|
|
2898
|
+
verification: signal.verification,
|
|
2899
|
+
evidence_refs: signal.evidence_refs,
|
|
2900
|
+
contract_compliance: signal.contract_compliance,
|
|
2901
|
+
next_steps: signal.next_steps,
|
|
2902
|
+
blocked_by_discovery: signal.blocked_by_discovery,
|
|
2903
|
+
needs_leader_coordination: signal.needs_leader_coordination,
|
|
2904
|
+
toolTrace: signal.toolTrace,
|
|
2905
|
+
});
|
|
2906
|
+
}
|
|
2907
|
+
catch (err) {
|
|
2908
|
+
leaderLogger.error(`[Leader] acceptWorkerTaskResult 异常 (pending task=${signal.taskId}): ${err instanceof Error ? err.message : String(err)}`);
|
|
2909
|
+
}
|
|
2910
|
+
leaderLogger.info(`Agent @${signal.agentName} pending report injected for task ${signal.taskId} ${signal.exitReason}`);
|
|
2911
|
+
hasActionableAgentReport = true;
|
|
2912
|
+
justTerminatedTasks.push({ taskId: signal.taskId, exitReason: signal.exitReason });
|
|
2913
|
+
// pending 信号来自 P0 合并队列,没有结构化字段,至少用统一渲染保持一致格式。
|
|
2914
|
+
const pendingDigest = formatWorkerCompletion({
|
|
2915
|
+
result: signal.result || '',
|
|
2916
|
+
summary: signal.summary,
|
|
2917
|
+
verdict: signal.verdict,
|
|
2918
|
+
artifacts: signal.artifacts,
|
|
2919
|
+
verification: signal.verification,
|
|
2920
|
+
evidence_refs: signal.evidence_refs,
|
|
2921
|
+
contract_compliance: signal.contract_compliance,
|
|
2922
|
+
next_steps: signal.next_steps,
|
|
2923
|
+
blocked_by_discovery: signal.blocked_by_discovery,
|
|
2924
|
+
needs_leader_coordination: signal.needs_leader_coordination,
|
|
2925
|
+
toolTrace: signal.toolTrace,
|
|
2926
|
+
}, { agentName: signal.agentName, taskId: signal.taskId, exitReason: signal.exitReason });
|
|
2927
|
+
combinedAgentReport += `\n${pendingDigest.block}\n`;
|
|
2928
|
+
}
|
|
2929
|
+
if (frame.pendingReportsToInject.length > 0) {
|
|
2930
|
+
const injectedKeys = new Set(frame.pendingReportsToInject.map(s => completionKey(s)));
|
|
2931
|
+
this.pendingAgentCompletionSignals = this.pendingAgentCompletionSignals.filter(s => !injectedKeys.has(completionKey(s)));
|
|
2932
|
+
}
|
|
2933
|
+
if (frame.agentMsgs.length > 0) {
|
|
2934
|
+
this.markLeaderSupervisionProgress();
|
|
2935
|
+
}
|
|
2936
|
+
const actionableContextReport = [combinedAgentReport, combinedRecoveryReport].filter(Boolean).join('\n');
|
|
2937
|
+
if (actionableContextReport && hasActionableAgentReport) {
|
|
2938
|
+
this.setDelegateMode('当前正在处理 worker 汇报,Leader 进入委派验收模式。');
|
|
2939
|
+
const clearedWaitingForAgentReport = await this.clearSoftWaitingForUser('agent_report');
|
|
2940
|
+
if (clearedWaitingForAgentReport) {
|
|
2941
|
+
leaderLogger.debug('Agent 事件打断了等待用户状态');
|
|
2942
|
+
}
|
|
2943
|
+
// 立即发送状态
|
|
2944
|
+
this.emitter.emit('leader:status', {
|
|
2945
|
+
sessionId: this.sessionId,
|
|
2946
|
+
status: '处理 Worker 汇报...',
|
|
2947
|
+
});
|
|
2948
|
+
// 完成回执已被 acceptWorkerTaskResult 落为 terminal,被依赖任务在此刻解锁。
|
|
2949
|
+
// 主动把「刚解锁的就绪任务」摆到 Leader 面前并强制正面处置——否则 Leader 会
|
|
2950
|
+
// drift 进"agent 刚起步、按监控纪律不打扰",把本可立即推进的 ready 任务晾着。
|
|
2951
|
+
// 监控纪律只约束「运行中的 agent」,不适用于完成回执后新解锁的 dispatchable 任务。
|
|
2952
|
+
let dispatchDirective = '';
|
|
2953
|
+
try {
|
|
2954
|
+
// 先锚定本轮刚落终态的任务,杜绝 Leader 把刚完成的任务幻觉成"还在跑/刚起步"。
|
|
2955
|
+
// (现实 bug:Diego 的 T-20 已 completed,Leader 仍说"T-20 在跑,刚起步不久,按纪律不轮询"。)
|
|
2956
|
+
if (justTerminatedTasks.length > 0) {
|
|
2957
|
+
const terminatedList = justTerminatedTasks
|
|
2958
|
+
.map(t => `[${t.taskId}] ${t.exitReason === 'completed' ? '已完成' : '失败'}`)
|
|
2959
|
+
.join('、');
|
|
2960
|
+
dispatchDirective += `\n\n✓ 本轮已落终态:${terminatedList}。它们已是 terminal,请据此验收、解锁后续任务或收口。`;
|
|
2961
|
+
}
|
|
2962
|
+
let readyAfterCompletion = this.board.getDispatchable();
|
|
2963
|
+
if (readyAfterCompletion.length > 0 && this.dispatchDecisionCoordinator) {
|
|
2964
|
+
await this.dispatchDecisionCoordinator.notifyLeaderOfDispatchable();
|
|
2965
|
+
readyAfterCompletion = this.board.getDispatchable();
|
|
2966
|
+
}
|
|
2967
|
+
if (readyAfterCompletion.length > 0) {
|
|
2968
|
+
const list = readyAfterCompletion
|
|
2969
|
+
.map(t => `- [${t.id}] ${t.subject} (类型=${t.agent_type}${t.preferred_agent_name ? `, 预绑定=@${t.preferred_agent_name}` : ''})`)
|
|
2970
|
+
.join('\n');
|
|
2971
|
+
dispatchDirective += `\n\n⚠ 本次完成回执仍有 ${readyAfterCompletion.length} 个就绪任务需要 Leader 决策:\n${list}\n`
|
|
2972
|
+
+ '强制要求:对上述每个就绪任务,要么立刻派发(建/复用 worker 调度),要么在本轮回复中逐条说明为何暂不派(依赖未真正满足 / 并发预算已满 / 需用户决策等具体可核验理由)。'
|
|
2973
|
+
+ '就绪任务的处理口径:已解锁任务需要派发动作或具体暂缓依据;监控纪律只约束运行中的 agent。';
|
|
2974
|
+
}
|
|
2975
|
+
else if (this.board.allTerminal() && this.pool.getRunning().length === 0) {
|
|
2976
|
+
// 无就绪任务且全部终态、无运行中 agent:这是真正的收尾点。明确告诉 Leader
|
|
2977
|
+
// 做收口动作(验收 / 清理 team / 总结),而不是继续"等待完成信号"。
|
|
2978
|
+
dispatchDirective += '\n\nℹ 任务板已全部终态、无运行中 agent、无新解锁就绪任务——这是收尾点:请做最终验收 / 清理 team / 给用户完整收口总结。';
|
|
2979
|
+
}
|
|
2980
|
+
}
|
|
2981
|
+
catch (err) {
|
|
2982
|
+
leaderLogger.debug(`[Leader] 计算完成后就绪任务失败: ${err instanceof Error ? err.message : String(err)}`);
|
|
2983
|
+
}
|
|
2984
|
+
const reportMsg = renderContextManifest({
|
|
2985
|
+
scope: 'leader',
|
|
2986
|
+
sessionId: this.sessionId,
|
|
2987
|
+
sections: [
|
|
2988
|
+
...(combinedAgentReport ? [{ title: 'Worker Completion Artifacts', content: combinedAgentReport }] : []),
|
|
2989
|
+
...(combinedRecoveryReport ? [{ title: 'Worker Recovery Required', content: combinedRecoveryReport }] : []),
|
|
2990
|
+
{
|
|
2991
|
+
title: 'Leader Verification Directive',
|
|
2992
|
+
content: `评估恢复事件并决定下一步。【硬性前提】对涉及 worker_recovery 的任务,先用 list_runtime_agents 或当前 Leader Runtime State 确认目标 agent 是否仍存在、是否 active,以及 recoveryLineage / consecutiveRespawnFailures;只有目标 agent 在当前 runtime agents 中存在且仍 active 时,才调用 check_agent_progress 做深查。若恢复报告里的 agent 名已不在当前 runtime agents 中,禁止拿旧名反复调用 check_agent_progress;应改用 list_runtime_agents 返回的真实 agent 名、任务板状态和 auto_retry_scheduled 结果判断等待/接管/重派。worker_recovery 表示任务未完成,不得当作 completed;若 auto_retry_scheduled=true 且新 worker 仍在运行,等待并验收,不要重复 dispatch;若 llm_error_kind 为 request_timeout/network_error 等瞬时类,属 provider 抖动,倾向等待而非重派;仅当当前 active agent 的 check_agent_progress 显示确无进展/卡死,或 list_runtime_agents 显示自动重派失败/无 active worker,才显式重派、接管、阻塞或升级给用户。如本次任务产出了重要的架构决策、技术选型、用户偏好或关键发现,请调用 learn_soul 写入对应的项目级/用户级长期记忆。${dispatchDirective}`,
|
|
2993
|
+
},
|
|
2994
|
+
],
|
|
2995
|
+
});
|
|
2996
|
+
this.addMessage({ role: 'system', content: reportMsg });
|
|
2997
|
+
await this.db.saveConversationMessage(this.sessionId, { role: 'system', content: reportMsg });
|
|
2998
|
+
if (this.hasExplicitUserGate()) {
|
|
2999
|
+
this.emitter.emit('leader:status', {
|
|
3000
|
+
sessionId: this.sessionId,
|
|
3001
|
+
status: '等待用户输入...',
|
|
3002
|
+
});
|
|
3003
|
+
return 'continue';
|
|
3004
|
+
}
|
|
3005
|
+
try {
|
|
3006
|
+
await this.leaderThinkAndAct();
|
|
3007
|
+
}
|
|
3008
|
+
catch (err) {
|
|
3009
|
+
leaderLogger.error('leaderThinkAndAct failed:', err);
|
|
3010
|
+
this.emitter.emit('leader:error', { sessionId: this.sessionId, error: err });
|
|
3011
|
+
}
|
|
3012
|
+
finally {
|
|
3013
|
+
this.emitRoundComplete('agent_report');
|
|
3014
|
+
}
|
|
3015
|
+
}
|
|
3016
|
+
else if (combinedAgentReport) {
|
|
3017
|
+
// 纯进展汇报(report/finding):不为每条 worker 汇报单独起一轮 LLM。
|
|
3018
|
+
// 仅把进展并入对话上下文,留待下一次"真正需要思考"的轮次(任务终态 / 用户输入 /
|
|
3019
|
+
// 求助)一并消费——这样 Leader 说了"持续监控、不介入"就真的不再 ping LLM。
|
|
3020
|
+
// 不清 waitingForUser:派发后等待 worker 完成是正常 idle 态。
|
|
3021
|
+
const noteMsg = `[Worker 进展汇报,仅供参考,无需立即行动]\n${combinedAgentReport}`;
|
|
3022
|
+
this.addMessage({ role: 'system', content: noteMsg });
|
|
3023
|
+
await this.db.saveConversationMessage(this.sessionId, { role: 'system', content: noteMsg });
|
|
3024
|
+
leaderLogger.debug('收到纯进展汇报,已并入上下文,不触发 leaderThinkAndAct');
|
|
3025
|
+
}
|
|
3026
|
+
if (this.finished) {
|
|
3027
|
+
return 'break';
|
|
3028
|
+
}
|
|
3029
|
+
return 'next';
|
|
3030
|
+
}
|
|
3031
|
+
/**
|
|
3032
|
+
* 段6: 健康巡检 + 派发触发(dispatchable) + 终局判定 + 永驻巡逻 + 监督 idle + 进度停滞检测。
|
|
3033
|
+
* 行为与原内联段一致。无内层循环,原 while-level continue/break 全部转为返回控制指令。
|
|
3034
|
+
*/
|
|
3035
|
+
async _runImpl_dispatchAndFinalize(frame, loopCount) {
|
|
3036
|
+
// P3.5: Agent 健康巡检 + 主动轮询进度
|
|
3037
|
+
const running = this.pool.getRunning();
|
|
3038
|
+
const receivedCompletionMsg = frame.allMsgs.some(m => !this.isUserInterventionMessage(m) && isTaskTerminalControlMessage(m)) || frame.consumedCompletionKeys.size > 0 || frame.pendingReportsToInject.length > 0
|
|
3039
|
+
|| this.pendingAgentCompletionSignals.length > 0;
|
|
3040
|
+
if (running.length > 0 && !receivedCompletionMsg) {
|
|
3041
|
+
const supervision = this.getLeaderSupervisionEvaluation(running);
|
|
3042
|
+
if (supervision.decision.type === 'warn_idle') {
|
|
3043
|
+
this.surfaceIdleWarnings(supervision.decision.idleAgents);
|
|
3044
|
+
return 'continue';
|
|
3045
|
+
}
|
|
3046
|
+
if (this.finished) {
|
|
3047
|
+
return 'break';
|
|
3048
|
+
}
|
|
3049
|
+
if (!this.waitingForUser) {
|
|
3050
|
+
return 'continue';
|
|
3051
|
+
}
|
|
3052
|
+
}
|
|
3053
|
+
// 收到完成消息 或 没有 Agent 运行中 → 继续往下检查任务状态
|
|
3054
|
+
this.reconcileRecoveringTasks();
|
|
3055
|
+
// 检查是否有可调度任务
|
|
3056
|
+
const dispatchable = this.board.getDispatchable();
|
|
3057
|
+
if (dispatchable.length > 0) {
|
|
3058
|
+
leaderLogger.debug(`有 ${dispatchable.length} 个任务可调度`);
|
|
3059
|
+
// 所有就绪任务都必须由 Leader 显式 dispatch 或说明暂缓理由。
|
|
3060
|
+
// 协调器只负责注入决策提示,不会启动 worker。
|
|
3061
|
+
if (this.dispatchDecisionCoordinator) {
|
|
3062
|
+
try {
|
|
3063
|
+
await this.dispatchDecisionCoordinator.notifyLeaderOfDispatchable();
|
|
3064
|
+
}
|
|
3065
|
+
catch (err) {
|
|
3066
|
+
leaderLogger.warn(`[DispatchDecision] 主循环 notifyLeaderOfDispatchable 异常: ${err instanceof Error ? err.message : String(err)}`);
|
|
3067
|
+
}
|
|
3068
|
+
}
|
|
3069
|
+
else {
|
|
3070
|
+
this.requestLeaderDispatchDecision(dispatchable);
|
|
3071
|
+
}
|
|
3072
|
+
{
|
|
3073
|
+
const dispatchableSigBefore = dispatchable.map(t => t.id).sort().join(',');
|
|
3074
|
+
try {
|
|
3075
|
+
await this.leaderThinkAndAct();
|
|
3076
|
+
}
|
|
3077
|
+
catch (err) {
|
|
3078
|
+
leaderLogger.error('leaderThinkAndAct failed:', err);
|
|
3079
|
+
this.emitter.emit('leader:error', { sessionId: this.sessionId, error: err });
|
|
3080
|
+
}
|
|
3081
|
+
finally {
|
|
3082
|
+
this.emitRoundComplete('dispatchable_tasks');
|
|
3083
|
+
}
|
|
3084
|
+
if (this.finished) {
|
|
3085
|
+
return 'break';
|
|
3086
|
+
}
|
|
3087
|
+
if (!this.waitingForUser) {
|
|
3088
|
+
// Leader 仍活跃(在派发 / 继续推进):清掉"已等待集合"标记,
|
|
3089
|
+
// 让后续真实变化能正常驱动。
|
|
3090
|
+
this.waitedDispatchableSig = null;
|
|
3091
|
+
return 'continue';
|
|
3092
|
+
}
|
|
3093
|
+
// Leader 思考后选择等待(未派发这批 dispatchable):记住这批集合的指纹,
|
|
3094
|
+
// 主循环顶部的 un-latch 守卫据此不再为同一不变集合反复唤醒 think。
|
|
3095
|
+
// 非 eternal 模式下这是杜绝"无限请求 LLM"的关键。
|
|
3096
|
+
this.waitedDispatchableSig = dispatchableSigBefore;
|
|
3097
|
+
}
|
|
3098
|
+
}
|
|
3099
|
+
// 所有任务完成且没有 Agent 运行时,进入等待用户输入状态
|
|
3100
|
+
// 但如果还有待处理的 agent completion 信号(P0 handler 已入队但主循环尚未消费),
|
|
3101
|
+
// 跳过此分支让下一轮循环正常处理这些信号——否则会过早进入 idle/finalize。
|
|
3102
|
+
if (this.board.allTerminal() && this.pool.getRunning().length === 0
|
|
3103
|
+
&& this.pendingAgentCompletionSignals.length === 0) {
|
|
3104
|
+
if (this.finished) {
|
|
3105
|
+
return 'break';
|
|
3106
|
+
}
|
|
3107
|
+
const reviewedScratchpad = await this.maybeReviewScratchpadTailWork();
|
|
3108
|
+
if (reviewedScratchpad) {
|
|
3109
|
+
if (this.finished) {
|
|
3110
|
+
return 'break';
|
|
3111
|
+
}
|
|
3112
|
+
return 'continue';
|
|
3113
|
+
}
|
|
3114
|
+
if (await this.maybeFinalizeCompletedSession()) {
|
|
3115
|
+
return 'break';
|
|
3116
|
+
}
|
|
3117
|
+
// Eternal 模式有 goal 时不进 idle,走 patrol 让 LLM 持续推进目标
|
|
3118
|
+
if (this.isEternalMode()) {
|
|
3119
|
+
const patrolled = await this.progressInvariant.maybeEternalIdlePatrol();
|
|
3120
|
+
if (patrolled) {
|
|
3121
|
+
return 'continue';
|
|
3122
|
+
}
|
|
3123
|
+
}
|
|
3124
|
+
if (!this.waitingForUser) {
|
|
3125
|
+
leaderLogger.info('所有任务已完成,进入空闲等待状态');
|
|
3126
|
+
this.waitingForUser = true;
|
|
3127
|
+
await this.db.setSessionState(this.sessionId, SESSION_KEYS.LEADER_WAITING_FOR_USER, 'true');
|
|
3128
|
+
this.emitter.emit('leader:status', {
|
|
3129
|
+
sessionId: this.sessionId,
|
|
3130
|
+
status: 'Idle',
|
|
3131
|
+
});
|
|
3132
|
+
this.emitter.emit('leader:busy', {
|
|
3133
|
+
sessionId: this.sessionId,
|
|
3134
|
+
isBusy: false,
|
|
3135
|
+
queueLength: 0,
|
|
3136
|
+
});
|
|
3137
|
+
}
|
|
3138
|
+
}
|
|
3139
|
+
// 进度哈希检测:每轮末尾计算,连续停滞则注入破局
|
|
3140
|
+
this.checkProgressStagnation();
|
|
3141
|
+
if (loopCount % 10 === 0) {
|
|
3142
|
+
leaderLogger.debug(`主循环运行中... (第${loopCount}轮)`);
|
|
3143
|
+
}
|
|
3144
|
+
return 'next';
|
|
3145
|
+
}
|
|
3146
|
+
/**
|
|
3147
|
+
* 停止 Leader
|
|
3148
|
+
*/
|
|
3149
|
+
stop() {
|
|
3150
|
+
this.finished = true;
|
|
3151
|
+
this.isBusy = false;
|
|
3152
|
+
this.currentLlmAbortController?.abort();
|
|
3153
|
+
// 不清除 controller:保持 abort 状态,防止 stop() 后的下次 LLM call 继续执行
|
|
3154
|
+
// 释放派发决策协调器的事件订阅,避免 stop 后残留 listener
|
|
3155
|
+
try {
|
|
3156
|
+
this.dispatchDecisionCoordinator?.dispose();
|
|
3157
|
+
}
|
|
3158
|
+
catch { /* tolerate */ }
|
|
3159
|
+
}
|
|
3160
|
+
/**
|
|
3161
|
+
* 实例终结清理:退订所有构造器级(不随 run() 重注册)的事件监听器,断开对共享 emitter 的引用。
|
|
3162
|
+
*
|
|
3163
|
+
* H1 修复:LeaderAgent 在构造器中创建并订阅共享 emitter 的子系统——
|
|
3164
|
+
* - attachTaskLifecycleToTeamMailbox 注册的 task:failed / task:cancelled(_taskTeamUnsubscribers)
|
|
3165
|
+
* - orchestrationRuntime(task:created/updated/assigned/completed/failed/cancelled)
|
|
3166
|
+
* - leaderBlackboard(task:created/updated/completed/failed)
|
|
3167
|
+
* - scheduler / dispatchDecisionCoordinator(task:failed 等调度触发器)
|
|
3168
|
+
* 这些监听器均在构造器注册一次、不随 run() 重入而重注册。历史上 dispose 仅退订
|
|
3169
|
+
* dispatchDecisionCoordinator,其余从不退订——同进程会话重建(resumeSession 造新 LeaderAgent)会在
|
|
3170
|
+
* 同一共享 emitter 上持续累积监听器,泄漏监听器及对 leader/board/bus 的引用。
|
|
3171
|
+
*
|
|
3172
|
+
* dispose() 隐含 stop():先停止主循环(含 dispatchDecisionCoordinator.dispose),再退订其余实例级监听器。
|
|
3173
|
+
* 可安全重复调用(幂等)。
|
|
3174
|
+
*/
|
|
3175
|
+
dispose() {
|
|
3176
|
+
this.stop();
|
|
3177
|
+
this.board.setContractReadinessResolver(undefined);
|
|
3178
|
+
// 退订 attachTaskLifecycleToTeamMailbox 注册的团队通知监听器
|
|
3179
|
+
for (const off of this._taskTeamUnsubscribers) {
|
|
3180
|
+
try {
|
|
3181
|
+
off();
|
|
3182
|
+
}
|
|
3183
|
+
catch { /* tolerate:单个退订失败不应阻断其余退订 */ }
|
|
3184
|
+
}
|
|
3185
|
+
this._taskTeamUnsubscribers = [];
|
|
3186
|
+
// 退订配置热加载回调,防止监听器泄漏
|
|
3187
|
+
if (this._configReloadUnsubscribe) {
|
|
3188
|
+
try {
|
|
3189
|
+
this._configReloadUnsubscribe();
|
|
3190
|
+
}
|
|
3191
|
+
catch { /* tolerate */ }
|
|
3192
|
+
this._configReloadUnsubscribe = null;
|
|
3193
|
+
}
|
|
3194
|
+
// 退订 eternal 模式绑定的共享 emitter 监听器(task:completed 等),防止 dispose 后泄漏
|
|
3195
|
+
try {
|
|
3196
|
+
this.progressInvariant?.disposeEternalListeners();
|
|
3197
|
+
}
|
|
3198
|
+
catch { /* tolerate */ }
|
|
3199
|
+
// 退订 supervCoordinator 注册的 agent:completed/failed 等活动事件监听器
|
|
3200
|
+
try {
|
|
3201
|
+
this.supervCoordinator?.unsubscribeAgentActivityEvents();
|
|
3202
|
+
}
|
|
3203
|
+
catch { /* tolerate */ }
|
|
3204
|
+
// 退订 LeaderAgent 拥有的、订阅共享 emitter 的子系统(与现有 run-scoped 退订并列,
|
|
3205
|
+
// 但这些是 constructor-scoped,必须在实例终结时统一释放)。
|
|
3206
|
+
try {
|
|
3207
|
+
this.orchestrationRuntime?.dispose();
|
|
3208
|
+
}
|
|
3209
|
+
catch { /* tolerate */ }
|
|
3210
|
+
try {
|
|
3211
|
+
this.leaderBlackboard?.dispose();
|
|
3212
|
+
}
|
|
3213
|
+
catch { /* tolerate */ }
|
|
3214
|
+
try {
|
|
3215
|
+
this.scheduler?.dispose();
|
|
3216
|
+
}
|
|
3217
|
+
catch { /* tolerate */ }
|
|
3218
|
+
// dispatchDecisionCoordinator 已在 stop() 中 dispose;此处兜底重复调用幂等无副作用
|
|
3219
|
+
try {
|
|
3220
|
+
this.dispatchDecisionCoordinator?.dispose();
|
|
3221
|
+
}
|
|
3222
|
+
catch { /* tolerate */ }
|
|
3223
|
+
}
|
|
3224
|
+
/**
|
|
3225
|
+
* 用户新输入到达时,只中断当前 LLM round,不结束 Leader 主循环。
|
|
3226
|
+
* 主循环随后会从 MessageBus 读取 user_intervention,并按最高优先级处理。
|
|
3227
|
+
*/
|
|
3228
|
+
/**
|
|
3229
|
+
* 泛化中断方法:中断当前 LLM round,不结束 Leader 主循环。
|
|
3230
|
+
* @param reason 中断原因:'user_input' | 'agent_completion'
|
|
3231
|
+
*/
|
|
3232
|
+
interruptCurrentRound(reason = 'user_input') {
|
|
3233
|
+
this.userInterruptPending = reason === 'user_input';
|
|
3234
|
+
this.currentLlmAbortController?.abort();
|
|
3235
|
+
this.userInterruptController.abort();
|
|
3236
|
+
leaderLogger.debug(`[Interrupt] 原因: ${reason}`);
|
|
3237
|
+
}
|
|
3238
|
+
/**
|
|
3239
|
+
* 非打断式用户指导:注入消息到下一轮 LLM 调用,不中断当前思考。
|
|
3240
|
+
* 用户可以通过这种方式给 Leader 补充信息、调整方向,而不需要打断正在进行的工作。
|
|
3241
|
+
*/
|
|
3242
|
+
nudgeLeader(message) {
|
|
3243
|
+
if (this.nudgeMessage) {
|
|
3244
|
+
// 已有未消费的 nudge,追加而非覆盖
|
|
3245
|
+
this.nudgeMessage += '\n' + message;
|
|
3246
|
+
}
|
|
3247
|
+
else {
|
|
3248
|
+
this.nudgeMessage = message;
|
|
3249
|
+
}
|
|
3250
|
+
leaderLogger.info(`[Nudge] 收到非打断式指导(将在下轮 LLM 调用时注入)`);
|
|
3251
|
+
this.emitter.emit('leader:status', {
|
|
3252
|
+
sessionId: this.sessionId,
|
|
3253
|
+
status: `💬 收到用户指导,将在下轮处理...`,
|
|
3254
|
+
});
|
|
3255
|
+
}
|
|
3256
|
+
/** 是否有待处理的 Agent 完成信号 */
|
|
3257
|
+
isAgentCompletionPending() {
|
|
3258
|
+
return this.pendingAgentCompletionSignals.length > 0;
|
|
3259
|
+
}
|
|
3260
|
+
/**
|
|
3261
|
+
* 在 LLM 调用前排空 bus 上已到达但尚未消费的 user_intervention 消息,
|
|
3262
|
+
* 直接注入为 user role 对话,让下一轮 LLM 立即看到用户输入并回复。
|
|
3263
|
+
*
|
|
3264
|
+
* 触发场景:用户在 Leader busy 期间用 interrupt:false 投递的"非打断式"消息。
|
|
3265
|
+
* 历史上这条路径只设置 nudgeMessage(注入为 system role),并且依赖外层
|
|
3266
|
+
* 主循环把 userMessageQueue 单独喂回 leaderThinkAndAct;当 leaderThinkAndAct
|
|
3267
|
+
* 已经在 AgentCore 多轮里运行时,bus 上的用户消息要等当前完整 think-and-act
|
|
3268
|
+
* 全部退出才被处理,体感就是"用户发了消息但 Leader 不答"。
|
|
3269
|
+
*
|
|
3270
|
+
* 现在:每轮 runRound 开始前,主动 poll bus,把用户消息原封不动以
|
|
3271
|
+
* role=user 注入对话;下一次 LLM 调用会立刻看到并回复。
|
|
3272
|
+
*
|
|
3273
|
+
* 返回 true 表示注入了至少一条用户消息。
|
|
3274
|
+
*/
|
|
3275
|
+
async drainPendingUserMessagesIntoConversation() {
|
|
3276
|
+
if (!this.bus)
|
|
3277
|
+
return false;
|
|
3278
|
+
const pendingUser = this.bus
|
|
3279
|
+
.pollByType(this.leaderBusName, ['user_intervention'])
|
|
3280
|
+
.filter(m => this.isUserInterventionMessage(m));
|
|
3281
|
+
if (pendingUser.length === 0)
|
|
3282
|
+
return false;
|
|
3283
|
+
let injected = 0;
|
|
3284
|
+
for (const msg of pendingUser) {
|
|
3285
|
+
const content = msg.payload ?? '';
|
|
3286
|
+
if (isEmptyContent(content))
|
|
3287
|
+
continue;
|
|
3288
|
+
this.beginUserTurn();
|
|
3289
|
+
this.setExecutionRoute(this.chooseExecutionRoute(null));
|
|
3290
|
+
this.addMessage({ role: 'user', content });
|
|
3291
|
+
try {
|
|
3292
|
+
await this.db.saveConversationMessage(this.sessionId, { role: 'user', content });
|
|
3293
|
+
}
|
|
3294
|
+
catch { /* persist 失败不阻塞推进 */ }
|
|
3295
|
+
injected += 1;
|
|
3296
|
+
}
|
|
3297
|
+
if (injected > 0) {
|
|
3298
|
+
// 用户消息进来后必须重置 waiting/pending review 等用户门,否则 LLM
|
|
3299
|
+
// 这一轮会被 Planning Gate / askUser 等闸门挡住而不回复。
|
|
3300
|
+
if (this.waitingForUser) {
|
|
3301
|
+
this.waitingForUser = false;
|
|
3302
|
+
await this.db.setSessionState(this.sessionId, SESSION_KEYS.LEADER_WAITING_FOR_USER, 'false');
|
|
3303
|
+
}
|
|
3304
|
+
await this.clearConsumedUserInputState();
|
|
3305
|
+
leaderLogger.info(`[NonInterrupt] LLM 调用前注入 ${injected} 条用户消息(非打断式)`);
|
|
3306
|
+
this.emitter.emit('leader:status', {
|
|
3307
|
+
sessionId: this.sessionId,
|
|
3308
|
+
status: '已收到用户消息,下一轮立即回复...',
|
|
3309
|
+
});
|
|
3310
|
+
}
|
|
3311
|
+
return injected > 0;
|
|
3312
|
+
}
|
|
3313
|
+
isUserInterruptPending() {
|
|
3314
|
+
return this.userInterruptPending;
|
|
3315
|
+
}
|
|
3316
|
+
clearUserInterruptPending() {
|
|
3317
|
+
this.userInterruptPending = false;
|
|
3318
|
+
}
|
|
3319
|
+
// ─────────────────────────────────────────────────────────────────────
|
|
3320
|
+
// Progress Invariant + Watchdog + Eternal Patrol — delegated to progressInvariant
|
|
3321
|
+
// ─────────────────────────────────────────────────────────────────────
|
|
3322
|
+
checkProgressStagnation() {
|
|
3323
|
+
this.progressInvariant.checkProgressStagnation();
|
|
3324
|
+
}
|
|
3325
|
+
/**
|
|
3326
|
+
* 标记进度更新时间(在每次成功推进时调用)
|
|
3327
|
+
*/
|
|
3328
|
+
markLeaderProgress() {
|
|
3329
|
+
this.progressInvariant.markProgress();
|
|
3330
|
+
}
|
|
3331
|
+
startWatchdog() {
|
|
3332
|
+
this.progressInvariant.startWatchdog();
|
|
3333
|
+
}
|
|
3334
|
+
stopWatchdog() {
|
|
3335
|
+
this.progressInvariant.stopWatchdog();
|
|
3336
|
+
}
|
|
3337
|
+
async maybeReviewScratchpadTailWork() {
|
|
3338
|
+
const summary = await collectScratchpadFollowUps({
|
|
3339
|
+
workspace: this.workspace,
|
|
3340
|
+
sessionId: this.sessionId,
|
|
3341
|
+
llm: this.llm,
|
|
3342
|
+
model: this.model,
|
|
3343
|
+
llmGuardFactory: createLlmGuard,
|
|
3344
|
+
});
|
|
3345
|
+
if (!summary) {
|
|
3346
|
+
return false;
|
|
3347
|
+
}
|
|
3348
|
+
if (summary.digest === this.lastScratchpadReviewDigest) {
|
|
3349
|
+
return false;
|
|
3350
|
+
}
|
|
3351
|
+
this.lastScratchpadReviewDigest = summary.digest;
|
|
3352
|
+
await this.db.setSessionState(this.sessionId, SESSION_KEYS.LEADER_LAST_SCRATCHPAD_REVIEW_DIGEST, summary.digest);
|
|
3353
|
+
const reviewPrompt = [
|
|
3354
|
+
summary.report,
|
|
3355
|
+
'',
|
|
3356
|
+
'请判断这些收尾项是否需要转化为补充任务、补充验证,或明确声明无需继续处理。',
|
|
3357
|
+
'在给出“全部完成”的最终结论前,必须先处理这些尾巴。',
|
|
3358
|
+
].join('\n');
|
|
3359
|
+
this.addMessage({
|
|
3360
|
+
role: 'system',
|
|
3361
|
+
content: reviewPrompt,
|
|
3362
|
+
});
|
|
3363
|
+
await this.db.saveConversationMessage(this.sessionId, {
|
|
3364
|
+
role: 'system',
|
|
3365
|
+
content: reviewPrompt,
|
|
3366
|
+
});
|
|
3367
|
+
try {
|
|
3368
|
+
await this.leaderThinkAndAct();
|
|
3369
|
+
}
|
|
3370
|
+
catch (err) {
|
|
3371
|
+
leaderLogger.error('leaderThinkAndAct failed:', err);
|
|
3372
|
+
this.emitter.emit('leader:error', { sessionId: this.sessionId, error: err });
|
|
3373
|
+
}
|
|
3374
|
+
finally {
|
|
3375
|
+
this.emitRoundComplete('plan_review');
|
|
3376
|
+
}
|
|
3377
|
+
return true;
|
|
3378
|
+
}
|
|
3379
|
+
/**
|
|
3380
|
+
* Leader 思考和行动循环
|
|
3381
|
+
*/
|
|
3382
|
+
async leaderThinkAndAct(maxToolRounds = LEADER_MAX_TOOL_ROUNDS) {
|
|
3383
|
+
this.clearUserInterruptPending();
|
|
3384
|
+
// 每轮思考前重置用户中断控制器,确保新一轮的 shell 命令可以被正确中断
|
|
3385
|
+
this.userInterruptController = new AbortController();
|
|
3386
|
+
await this.consumePendingAgentCompletionsIntoConversation();
|
|
3387
|
+
// 派发由 Leader 通过 dispatch_agent 显式触发,
|
|
3388
|
+
// think 入口不再隐式 scheduler.tick —— 避免 Leader 还没说话就被
|
|
3389
|
+
// 自动派出去的任务抢跑。
|
|
3390
|
+
return this.thinkingEngine.leaderThinkAndAct(maxToolRounds);
|
|
3391
|
+
}
|
|
3392
|
+
/**
|
|
3393
|
+
* 获取当前消息数
|
|
3394
|
+
*/
|
|
3395
|
+
getMessageCount() {
|
|
3396
|
+
return this.conversation.length;
|
|
3397
|
+
}
|
|
3398
|
+
/**
|
|
3399
|
+
* 获取角色注册表
|
|
3400
|
+
*/
|
|
3401
|
+
getRoleRegistry() {
|
|
3402
|
+
return this.roleRegistry;
|
|
3403
|
+
}
|
|
3404
|
+
/**
|
|
3405
|
+
* 获取工具注册表(公开访问)
|
|
3406
|
+
*/
|
|
3407
|
+
getToolRegistry() {
|
|
3408
|
+
return this.toolRegistry;
|
|
3409
|
+
}
|
|
3410
|
+
getContextManager() {
|
|
3411
|
+
return this.contextManager;
|
|
3412
|
+
}
|
|
3413
|
+
setConversation(messages) {
|
|
3414
|
+
this.conversation = messages;
|
|
3415
|
+
}
|
|
3416
|
+
/**
|
|
3417
|
+
* 主动压缩 Leader 上下文:先把当前 conversation 同步到 ContextManager,
|
|
3418
|
+
* 触发强制压缩,再把压缩后的消息回写到 conversation。
|
|
3419
|
+
*
|
|
3420
|
+
* 三处入口(TUI dispatcher、Web AcpHandler、HTTP SessionRoutes、COMPACT 字符串)
|
|
3421
|
+
* 都必须走这一个方法,禁止直接调 contextManager.forceCompact() 而不回写。
|
|
3422
|
+
*/
|
|
3423
|
+
async compactContext() {
|
|
3424
|
+
const oldLength = this.conversation.length;
|
|
3425
|
+
const oldHash = this.hashContextContent(this.conversation.map((message) => contentToPlainText(message.content)).join('\n'));
|
|
3426
|
+
this.contextManager.setMessages(this.conversation);
|
|
3427
|
+
const result = await this.contextManager.forceCompact();
|
|
3428
|
+
this.conversation = this.contextManager.getMessages();
|
|
3429
|
+
const newHash = this.hashContextContent(this.conversation.map((message) => contentToPlainText(message.content)).join('\n'));
|
|
3430
|
+
this.emitter.emit('context:mutation', {
|
|
3431
|
+
sessionId: this.sessionId,
|
|
3432
|
+
source: 'leader_compact_context',
|
|
3433
|
+
operation: 'compact',
|
|
3434
|
+
oldHash,
|
|
3435
|
+
newHash,
|
|
3436
|
+
oldLength,
|
|
3437
|
+
newLength: this.conversation.length,
|
|
3438
|
+
changed: oldHash !== newHash || oldLength !== this.conversation.length,
|
|
3439
|
+
reason: result.compacted ? 'context_compacted' : 'compact_noop',
|
|
3440
|
+
});
|
|
3441
|
+
return result;
|
|
3442
|
+
}
|
|
3443
|
+
getContextRuntimeState() {
|
|
3444
|
+
return this.contextManager.getRuntimeState();
|
|
3445
|
+
}
|
|
3446
|
+
getEternalRuntimeSnapshot() {
|
|
3447
|
+
return this.progressInvariant.getEternalRuntimeSnapshot();
|
|
3448
|
+
}
|
|
3449
|
+
invalidateEternalSilenceLock(reason) {
|
|
3450
|
+
this.progressInvariant.invalidateEternalSilenceLock(reason);
|
|
3451
|
+
}
|
|
3452
|
+
publishAssistantOutput(content, reasoningContent) {
|
|
3453
|
+
const text = String(content || '').trim();
|
|
3454
|
+
if (!text) {
|
|
3455
|
+
return;
|
|
3456
|
+
}
|
|
3457
|
+
const assistantMessage = {
|
|
3458
|
+
role: 'assistant',
|
|
3459
|
+
content: text,
|
|
3460
|
+
};
|
|
3461
|
+
this.addMessage(assistantMessage);
|
|
3462
|
+
this.db.saveConversationMessage(this.sessionId, assistantMessage);
|
|
3463
|
+
this.emitter.emit('leader:text', {
|
|
3464
|
+
sessionId: this.sessionId,
|
|
3465
|
+
content: text,
|
|
3466
|
+
reasoningContent,
|
|
3467
|
+
});
|
|
3468
|
+
}
|
|
3469
|
+
/**
|
|
3470
|
+
* 获取当前交互运行时快照
|
|
3471
|
+
*/
|
|
3472
|
+
getInteractionSnapshot() {
|
|
3473
|
+
return {
|
|
3474
|
+
running: this.running,
|
|
3475
|
+
busy: this.isBusy,
|
|
3476
|
+
finished: this.finished,
|
|
3477
|
+
waitingForUser: this.waitingForUser,
|
|
3478
|
+
pendingReview: this.pendingReview,
|
|
3479
|
+
planApproved: this.planApproved,
|
|
3480
|
+
executionMode: this.executionMode,
|
|
3481
|
+
executionReason: this.executionReason,
|
|
3482
|
+
permissionSummary: summarizePermissionContextForDisplay(this.permManager.permissionContext),
|
|
3483
|
+
pendingPermissionRequest: this.permManager.pendingPermissionRequest,
|
|
3484
|
+
leaderModel: this.model,
|
|
3485
|
+
agentModel: this.pool?.getModel?.() ?? undefined,
|
|
3486
|
+
};
|
|
3487
|
+
}
|
|
3488
|
+
/**
|
|
3489
|
+
* 检查是否有未完成的任务
|
|
3490
|
+
*/
|
|
3491
|
+
hasPendingTasks() {
|
|
3492
|
+
const tasks = this.board.getAllTasks();
|
|
3493
|
+
return tasks.some((t) => t.status === 'dispatchable' || t.status === 'running');
|
|
3494
|
+
}
|
|
3495
|
+
/**
|
|
3496
|
+
* 检查是否有运行的 Agent
|
|
3497
|
+
*/
|
|
3498
|
+
hasRunningAgents() {
|
|
3499
|
+
return typeof this.pool?.getRunning === 'function'
|
|
3500
|
+
? this.pool.getRunning().length > 0
|
|
3501
|
+
: false;
|
|
3502
|
+
}
|
|
3503
|
+
/**
|
|
3504
|
+
* 将 Agent 注册到健康巡检系统(供 LeaderTools 等外部调用)
|
|
3505
|
+
*/
|
|
3506
|
+
registerAgentHealth(agentId, name, roleType) {
|
|
3507
|
+
this.healthMonitor.registerAgent(agentId, name, roleType);
|
|
3508
|
+
}
|
|
3509
|
+
}
|
|
3510
|
+
export default LeaderAgent;
|
|
3511
|
+
//# sourceMappingURL=LeaderAgent.js.map
|