autobyteus 1.2.0__py3-none-any.whl → 1.2.3__py3-none-any.whl
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.
- autobyteus/agent/agent.py +15 -5
- autobyteus/agent/bootstrap_steps/__init__.py +1 -3
- autobyteus/agent/bootstrap_steps/agent_bootstrapper.py +3 -59
- autobyteus/agent/bootstrap_steps/base_bootstrap_step.py +1 -4
- autobyteus/agent/bootstrap_steps/mcp_server_prewarming_step.py +1 -3
- autobyteus/agent/bootstrap_steps/system_prompt_processing_step.py +16 -13
- autobyteus/agent/bootstrap_steps/workspace_context_initialization_step.py +2 -4
- autobyteus/agent/context/agent_config.py +43 -20
- autobyteus/agent/context/agent_context.py +23 -18
- autobyteus/agent/context/agent_runtime_state.py +23 -19
- autobyteus/agent/events/__init__.py +16 -1
- autobyteus/agent/events/agent_events.py +43 -3
- autobyteus/agent/events/agent_input_event_queue_manager.py +79 -26
- autobyteus/agent/events/event_store.py +57 -0
- autobyteus/agent/events/notifiers.py +74 -60
- autobyteus/agent/events/worker_event_dispatcher.py +21 -64
- autobyteus/agent/factory/agent_factory.py +52 -0
- autobyteus/agent/handlers/__init__.py +2 -0
- autobyteus/agent/handlers/approved_tool_invocation_event_handler.py +51 -34
- autobyteus/agent/handlers/bootstrap_event_handler.py +155 -0
- autobyteus/agent/handlers/inter_agent_message_event_handler.py +10 -0
- autobyteus/agent/handlers/lifecycle_event_logger.py +19 -11
- autobyteus/agent/handlers/llm_complete_response_received_event_handler.py +10 -15
- autobyteus/agent/handlers/llm_user_message_ready_event_handler.py +188 -48
- autobyteus/agent/handlers/tool_execution_approval_event_handler.py +0 -10
- autobyteus/agent/handlers/tool_invocation_request_event_handler.py +53 -48
- autobyteus/agent/handlers/tool_result_event_handler.py +7 -8
- autobyteus/agent/handlers/user_input_message_event_handler.py +10 -3
- autobyteus/agent/input_processor/memory_ingest_input_processor.py +40 -0
- autobyteus/agent/lifecycle/__init__.py +12 -0
- autobyteus/agent/lifecycle/base_processor.py +109 -0
- autobyteus/agent/lifecycle/events.py +35 -0
- autobyteus/agent/lifecycle/processor_definition.py +36 -0
- autobyteus/agent/lifecycle/processor_registry.py +106 -0
- autobyteus/agent/llm_request_assembler.py +98 -0
- autobyteus/agent/llm_response_processor/__init__.py +1 -8
- autobyteus/agent/message/context_file_type.py +1 -1
- autobyteus/agent/message/send_message_to.py +5 -4
- autobyteus/agent/runtime/agent_runtime.py +29 -21
- autobyteus/agent/runtime/agent_worker.py +98 -19
- autobyteus/agent/shutdown_steps/__init__.py +2 -0
- autobyteus/agent/shutdown_steps/agent_shutdown_orchestrator.py +2 -0
- autobyteus/agent/shutdown_steps/tool_cleanup_step.py +58 -0
- autobyteus/agent/status/__init__.py +14 -0
- autobyteus/agent/status/manager.py +93 -0
- autobyteus/agent/status/status_deriver.py +96 -0
- autobyteus/agent/{phases/phase_enum.py → status/status_enum.py} +16 -16
- autobyteus/agent/status/status_update_utils.py +73 -0
- autobyteus/agent/streaming/__init__.py +52 -5
- autobyteus/agent/streaming/adapters/__init__.py +18 -0
- autobyteus/agent/streaming/adapters/invocation_adapter.py +184 -0
- autobyteus/agent/streaming/adapters/tool_call_parsing.py +163 -0
- autobyteus/agent/streaming/adapters/tool_syntax_registry.py +67 -0
- autobyteus/agent/streaming/agent_event_stream.py +3 -178
- autobyteus/agent/streaming/api_tool_call/__init__.py +16 -0
- autobyteus/agent/streaming/api_tool_call/file_content_streamer.py +56 -0
- autobyteus/agent/streaming/api_tool_call/json_string_field_extractor.py +175 -0
- autobyteus/agent/streaming/api_tool_call_streaming_response_handler.py +4 -0
- autobyteus/agent/streaming/events/__init__.py +6 -0
- autobyteus/agent/streaming/events/stream_event_payloads.py +284 -0
- autobyteus/agent/streaming/events/stream_events.py +141 -0
- autobyteus/agent/streaming/handlers/__init__.py +15 -0
- autobyteus/agent/streaming/handlers/api_tool_call_streaming_response_handler.py +303 -0
- autobyteus/agent/streaming/handlers/parsing_streaming_response_handler.py +107 -0
- autobyteus/agent/streaming/handlers/pass_through_streaming_response_handler.py +107 -0
- autobyteus/agent/streaming/handlers/streaming_handler_factory.py +177 -0
- autobyteus/agent/streaming/handlers/streaming_response_handler.py +58 -0
- autobyteus/agent/streaming/parser/__init__.py +61 -0
- autobyteus/agent/streaming/parser/event_emitter.py +181 -0
- autobyteus/agent/streaming/parser/events.py +4 -0
- autobyteus/agent/streaming/parser/invocation_adapter.py +4 -0
- autobyteus/agent/streaming/parser/json_parsing_strategies/__init__.py +19 -0
- autobyteus/agent/streaming/parser/json_parsing_strategies/base.py +32 -0
- autobyteus/agent/streaming/parser/json_parsing_strategies/default.py +34 -0
- autobyteus/agent/streaming/parser/json_parsing_strategies/gemini.py +31 -0
- autobyteus/agent/streaming/parser/json_parsing_strategies/openai.py +64 -0
- autobyteus/agent/streaming/parser/json_parsing_strategies/registry.py +75 -0
- autobyteus/agent/streaming/parser/parser_context.py +227 -0
- autobyteus/agent/streaming/parser/parser_factory.py +132 -0
- autobyteus/agent/streaming/parser/sentinel_format.py +7 -0
- autobyteus/agent/streaming/parser/state_factory.py +62 -0
- autobyteus/agent/streaming/parser/states/__init__.py +1 -0
- autobyteus/agent/streaming/parser/states/base_state.py +60 -0
- autobyteus/agent/streaming/parser/states/custom_xml_tag_run_bash_parsing_state.py +38 -0
- autobyteus/agent/streaming/parser/states/custom_xml_tag_write_file_parsing_state.py +55 -0
- autobyteus/agent/streaming/parser/states/delimited_content_state.py +146 -0
- autobyteus/agent/streaming/parser/states/json_initialization_state.py +144 -0
- autobyteus/agent/streaming/parser/states/json_tool_parsing_state.py +137 -0
- autobyteus/agent/streaming/parser/states/sentinel_content_state.py +30 -0
- autobyteus/agent/streaming/parser/states/sentinel_initialization_state.py +117 -0
- autobyteus/agent/streaming/parser/states/text_state.py +78 -0
- autobyteus/agent/streaming/parser/states/xml_patch_file_tool_parsing_state.py +328 -0
- autobyteus/agent/streaming/parser/states/xml_run_bash_tool_parsing_state.py +129 -0
- autobyteus/agent/streaming/parser/states/xml_tag_initialization_state.py +151 -0
- autobyteus/agent/streaming/parser/states/xml_tool_parsing_state.py +63 -0
- autobyteus/agent/streaming/parser/states/xml_write_file_tool_parsing_state.py +343 -0
- autobyteus/agent/streaming/parser/strategies/__init__.py +17 -0
- autobyteus/agent/streaming/parser/strategies/base.py +24 -0
- autobyteus/agent/streaming/parser/strategies/json_tool_strategy.py +26 -0
- autobyteus/agent/streaming/parser/strategies/registry.py +28 -0
- autobyteus/agent/streaming/parser/strategies/sentinel_strategy.py +23 -0
- autobyteus/agent/streaming/parser/strategies/xml_tag_strategy.py +21 -0
- autobyteus/agent/streaming/parser/stream_scanner.py +167 -0
- autobyteus/agent/streaming/parser/streaming_parser.py +212 -0
- autobyteus/agent/streaming/parser/tool_call_parsing.py +4 -0
- autobyteus/agent/streaming/parser/tool_constants.py +7 -0
- autobyteus/agent/streaming/parser/tool_syntax_registry.py +4 -0
- autobyteus/agent/streaming/parser/xml_tool_parsing_state_registry.py +55 -0
- autobyteus/agent/streaming/parsing_streaming_response_handler.py +4 -0
- autobyteus/agent/streaming/pass_through_streaming_response_handler.py +4 -0
- autobyteus/agent/streaming/queue_streamer.py +3 -57
- autobyteus/agent/streaming/segments/__init__.py +5 -0
- autobyteus/agent/streaming/segments/segment_events.py +81 -0
- autobyteus/agent/streaming/stream_event_payloads.py +2 -198
- autobyteus/agent/streaming/stream_events.py +3 -128
- autobyteus/agent/streaming/streaming_handler_factory.py +4 -0
- autobyteus/agent/streaming/streaming_response_handler.py +4 -0
- autobyteus/agent/streaming/streams/__init__.py +5 -0
- autobyteus/agent/streaming/streams/agent_event_stream.py +197 -0
- autobyteus/agent/streaming/utils/__init__.py +5 -0
- autobyteus/agent/streaming/utils/queue_streamer.py +59 -0
- autobyteus/agent/system_prompt_processor/__init__.py +2 -0
- autobyteus/agent/system_prompt_processor/available_skills_processor.py +96 -0
- autobyteus/agent/system_prompt_processor/base_processor.py +1 -1
- autobyteus/agent/system_prompt_processor/processor_meta.py +15 -2
- autobyteus/agent/system_prompt_processor/tool_manifest_injector_processor.py +39 -58
- autobyteus/agent/token_budget.py +56 -0
- autobyteus/agent/tool_execution_result_processor/memory_ingest_tool_result_processor.py +29 -0
- autobyteus/agent/tool_invocation.py +16 -40
- autobyteus/agent/tool_invocation_preprocessor/__init__.py +9 -0
- autobyteus/agent/tool_invocation_preprocessor/base_preprocessor.py +45 -0
- autobyteus/agent/tool_invocation_preprocessor/processor_definition.py +15 -0
- autobyteus/agent/tool_invocation_preprocessor/processor_meta.py +33 -0
- autobyteus/agent/tool_invocation_preprocessor/processor_registry.py +60 -0
- autobyteus/agent/utils/wait_for_idle.py +12 -14
- autobyteus/agent/workspace/base_workspace.py +6 -27
- autobyteus/agent_team/agent_team.py +3 -3
- autobyteus/agent_team/agent_team_builder.py +1 -41
- autobyteus/agent_team/bootstrap_steps/__init__.py +0 -4
- autobyteus/agent_team/bootstrap_steps/agent_configuration_preparation_step.py +8 -18
- autobyteus/agent_team/bootstrap_steps/agent_team_bootstrapper.py +4 -16
- autobyteus/agent_team/bootstrap_steps/base_agent_team_bootstrap_step.py +1 -2
- autobyteus/agent_team/bootstrap_steps/coordinator_initialization_step.py +1 -2
- autobyteus/agent_team/bootstrap_steps/task_notifier_initialization_step.py +5 -6
- autobyteus/agent_team/bootstrap_steps/team_context_initialization_step.py +15 -15
- autobyteus/agent_team/context/agent_team_config.py +6 -3
- autobyteus/agent_team/context/agent_team_context.py +25 -3
- autobyteus/agent_team/context/agent_team_runtime_state.py +11 -8
- autobyteus/agent_team/events/__init__.py +11 -0
- autobyteus/agent_team/events/agent_team_event_dispatcher.py +22 -9
- autobyteus/agent_team/events/agent_team_events.py +16 -0
- autobyteus/agent_team/events/event_store.py +57 -0
- autobyteus/agent_team/factory/agent_team_factory.py +8 -0
- autobyteus/agent_team/handlers/inter_agent_message_request_event_handler.py +18 -2
- autobyteus/agent_team/handlers/lifecycle_agent_team_event_handler.py +21 -5
- autobyteus/agent_team/handlers/process_user_message_event_handler.py +17 -8
- autobyteus/agent_team/handlers/tool_approval_team_event_handler.py +19 -4
- autobyteus/agent_team/runtime/agent_team_runtime.py +41 -10
- autobyteus/agent_team/runtime/agent_team_worker.py +69 -5
- autobyteus/agent_team/status/__init__.py +14 -0
- autobyteus/agent_team/status/agent_team_status.py +18 -0
- autobyteus/agent_team/status/agent_team_status_manager.py +33 -0
- autobyteus/agent_team/status/status_deriver.py +62 -0
- autobyteus/agent_team/status/status_update_utils.py +42 -0
- autobyteus/agent_team/streaming/__init__.py +2 -2
- autobyteus/agent_team/streaming/agent_team_event_notifier.py +10 -10
- autobyteus/agent_team/streaming/agent_team_stream_event_payloads.py +7 -7
- autobyteus/agent_team/streaming/agent_team_stream_events.py +11 -11
- autobyteus/agent_team/system_prompt_processor/__init__.py +6 -0
- autobyteus/agent_team/system_prompt_processor/team_manifest_injector_processor.py +76 -0
- autobyteus/agent_team/task_notification/activation_policy.py +1 -1
- autobyteus/agent_team/task_notification/system_event_driven_agent_task_notifier.py +22 -22
- autobyteus/agent_team/task_notification/task_notification_mode.py +20 -1
- autobyteus/agent_team/utils/wait_for_idle.py +4 -4
- autobyteus/cli/agent_cli.py +18 -10
- autobyteus/cli/agent_team_tui/app.py +18 -15
- autobyteus/cli/agent_team_tui/state.py +21 -23
- autobyteus/cli/agent_team_tui/widgets/agent_list_sidebar.py +15 -15
- autobyteus/cli/agent_team_tui/widgets/focus_pane.py +146 -39
- autobyteus/cli/agent_team_tui/widgets/renderables.py +1 -1
- autobyteus/cli/agent_team_tui/widgets/shared.py +26 -26
- autobyteus/cli/agent_team_tui/widgets/{task_board_panel.py → task_plan_panel.py} +5 -5
- autobyteus/cli/cli_display.py +193 -44
- autobyteus/cli/workflow_tui/app.py +9 -10
- autobyteus/cli/workflow_tui/state.py +14 -16
- autobyteus/cli/workflow_tui/widgets/agent_list_sidebar.py +15 -15
- autobyteus/cli/workflow_tui/widgets/focus_pane.py +137 -35
- autobyteus/cli/workflow_tui/widgets/renderables.py +1 -1
- autobyteus/cli/workflow_tui/widgets/shared.py +25 -25
- autobyteus/clients/autobyteus_client.py +94 -1
- autobyteus/events/event_types.py +15 -21
- autobyteus/llm/api/autobyteus_llm.py +33 -29
- autobyteus/llm/api/claude_llm.py +142 -36
- autobyteus/llm/api/gemini_llm.py +163 -59
- autobyteus/llm/api/grok_llm.py +1 -1
- autobyteus/llm/api/minimax_llm.py +26 -0
- autobyteus/llm/api/mistral_llm.py +113 -87
- autobyteus/llm/api/ollama_llm.py +9 -42
- autobyteus/llm/api/openai_compatible_llm.py +127 -91
- autobyteus/llm/api/openai_llm.py +3 -3
- autobyteus/llm/api/openai_responses_llm.py +324 -0
- autobyteus/llm/api/zhipu_llm.py +21 -2
- autobyteus/llm/autobyteus_provider.py +70 -60
- autobyteus/llm/base_llm.py +85 -81
- autobyteus/llm/converters/__init__.py +14 -0
- autobyteus/llm/converters/anthropic_tool_call_converter.py +37 -0
- autobyteus/llm/converters/gemini_tool_call_converter.py +57 -0
- autobyteus/llm/converters/mistral_tool_call_converter.py +37 -0
- autobyteus/llm/converters/openai_tool_call_converter.py +38 -0
- autobyteus/llm/extensions/base_extension.py +6 -12
- autobyteus/llm/extensions/token_usage_tracking_extension.py +45 -18
- autobyteus/llm/llm_factory.py +282 -204
- autobyteus/llm/lmstudio_provider.py +60 -49
- autobyteus/llm/models.py +35 -2
- autobyteus/llm/ollama_provider.py +60 -49
- autobyteus/llm/ollama_provider_resolver.py +0 -1
- autobyteus/llm/prompt_renderers/__init__.py +19 -0
- autobyteus/llm/prompt_renderers/anthropic_prompt_renderer.py +104 -0
- autobyteus/llm/prompt_renderers/autobyteus_prompt_renderer.py +19 -0
- autobyteus/llm/prompt_renderers/base_prompt_renderer.py +10 -0
- autobyteus/llm/prompt_renderers/gemini_prompt_renderer.py +63 -0
- autobyteus/llm/prompt_renderers/mistral_prompt_renderer.py +87 -0
- autobyteus/llm/prompt_renderers/ollama_prompt_renderer.py +51 -0
- autobyteus/llm/prompt_renderers/openai_chat_renderer.py +97 -0
- autobyteus/llm/prompt_renderers/openai_responses_renderer.py +101 -0
- autobyteus/llm/providers.py +1 -3
- autobyteus/llm/token_counter/claude_token_counter.py +56 -25
- autobyteus/llm/token_counter/mistral_token_counter.py +12 -8
- autobyteus/llm/token_counter/openai_token_counter.py +24 -5
- autobyteus/llm/token_counter/token_counter_factory.py +12 -5
- autobyteus/llm/utils/llm_config.py +6 -12
- autobyteus/llm/utils/media_payload_formatter.py +27 -20
- autobyteus/llm/utils/messages.py +55 -3
- autobyteus/llm/utils/response_types.py +3 -0
- autobyteus/llm/utils/tool_call_delta.py +31 -0
- autobyteus/memory/__init__.py +32 -0
- autobyteus/memory/active_transcript.py +69 -0
- autobyteus/memory/compaction/__init__.py +9 -0
- autobyteus/memory/compaction/compaction_result.py +8 -0
- autobyteus/memory/compaction/compactor.py +89 -0
- autobyteus/memory/compaction/summarizer.py +11 -0
- autobyteus/memory/compaction_snapshot_builder.py +84 -0
- autobyteus/memory/memory_manager.py +183 -0
- autobyteus/memory/models/__init__.py +14 -0
- autobyteus/memory/models/episodic_item.py +41 -0
- autobyteus/memory/models/memory_types.py +7 -0
- autobyteus/memory/models/raw_trace_item.py +79 -0
- autobyteus/memory/models/semantic_item.py +41 -0
- autobyteus/memory/models/tool_interaction.py +20 -0
- autobyteus/memory/policies/__init__.py +5 -0
- autobyteus/memory/policies/compaction_policy.py +16 -0
- autobyteus/memory/retrieval/__init__.py +7 -0
- autobyteus/memory/retrieval/memory_bundle.py +11 -0
- autobyteus/memory/retrieval/retriever.py +13 -0
- autobyteus/memory/store/__init__.py +7 -0
- autobyteus/memory/store/base_store.py +14 -0
- autobyteus/memory/store/file_store.py +98 -0
- autobyteus/memory/tool_interaction_builder.py +46 -0
- autobyteus/memory/turn_tracker.py +9 -0
- autobyteus/multimedia/audio/api/__init__.py +3 -2
- autobyteus/multimedia/audio/api/autobyteus_audio_client.py +19 -5
- autobyteus/multimedia/audio/api/gemini_audio_client.py +108 -16
- autobyteus/multimedia/audio/api/openai_audio_client.py +112 -0
- autobyteus/multimedia/audio/audio_client_factory.py +84 -9
- autobyteus/multimedia/audio/audio_model.py +2 -1
- autobyteus/multimedia/image/api/autobyteus_image_client.py +19 -5
- autobyteus/multimedia/image/api/gemini_image_client.py +38 -17
- autobyteus/multimedia/image/api/openai_image_client.py +125 -43
- autobyteus/multimedia/image/autobyteus_image_provider.py +2 -1
- autobyteus/multimedia/image/image_client_factory.py +47 -15
- autobyteus/multimedia/image/image_model.py +5 -2
- autobyteus/multimedia/providers.py +3 -2
- autobyteus/skills/loader.py +71 -0
- autobyteus/skills/model.py +11 -0
- autobyteus/skills/registry.py +70 -0
- autobyteus/task_management/__init__.py +43 -20
- autobyteus/task_management/{base_task_board.py → base_task_plan.py} +16 -13
- autobyteus/task_management/converters/__init__.py +2 -2
- autobyteus/task_management/converters/{task_board_converter.py → task_plan_converter.py} +13 -13
- autobyteus/task_management/events.py +7 -7
- autobyteus/task_management/{in_memory_task_board.py → in_memory_task_plan.py} +34 -22
- autobyteus/task_management/schemas/__init__.py +3 -0
- autobyteus/task_management/schemas/task_status_report.py +2 -2
- autobyteus/task_management/schemas/todo_definition.py +15 -0
- autobyteus/task_management/todo.py +29 -0
- autobyteus/task_management/todo_list.py +75 -0
- autobyteus/task_management/tools/__init__.py +24 -8
- autobyteus/task_management/tools/task_tools/__init__.py +19 -0
- autobyteus/task_management/tools/{assign_task_to.py → task_tools/assign_task_to.py} +18 -18
- autobyteus/task_management/tools/{publish_task.py → task_tools/create_task.py} +16 -18
- autobyteus/task_management/tools/{publish_tasks.py → task_tools/create_tasks.py} +19 -19
- autobyteus/task_management/tools/{get_my_tasks.py → task_tools/get_my_tasks.py} +15 -15
- autobyteus/task_management/tools/{get_task_board_status.py → task_tools/get_task_plan_status.py} +16 -16
- autobyteus/task_management/tools/{update_task_status.py → task_tools/update_task_status.py} +16 -16
- autobyteus/task_management/tools/todo_tools/__init__.py +18 -0
- autobyteus/task_management/tools/todo_tools/add_todo.py +78 -0
- autobyteus/task_management/tools/todo_tools/create_todo_list.py +79 -0
- autobyteus/task_management/tools/todo_tools/get_todo_list.py +55 -0
- autobyteus/task_management/tools/todo_tools/update_todo_status.py +85 -0
- autobyteus/tools/__init__.py +43 -52
- autobyteus/tools/base_tool.py +7 -0
- autobyteus/tools/file/__init__.py +9 -0
- autobyteus/tools/file/patch_file.py +149 -0
- autobyteus/tools/file/{file_reader.py → read_file.py} +38 -7
- autobyteus/tools/file/{file_writer.py → write_file.py} +7 -4
- autobyteus/tools/functional_tool.py +53 -14
- autobyteus/tools/mcp/__init__.py +2 -0
- autobyteus/tools/mcp/config_service.py +5 -1
- autobyteus/tools/mcp/server/__init__.py +2 -0
- autobyteus/tools/mcp/server/http_managed_mcp_server.py +1 -1
- autobyteus/tools/mcp/server/websocket_managed_mcp_server.py +141 -0
- autobyteus/tools/mcp/server_instance_manager.py +8 -1
- autobyteus/tools/mcp/tool.py +3 -3
- autobyteus/tools/mcp/tool_registrar.py +5 -2
- autobyteus/tools/mcp/types.py +61 -0
- autobyteus/tools/multimedia/__init__.py +2 -1
- autobyteus/tools/multimedia/audio_tools.py +72 -19
- autobyteus/tools/{download_media_tool.py → multimedia/download_media_tool.py} +21 -7
- autobyteus/tools/multimedia/image_tools.py +248 -64
- autobyteus/tools/multimedia/media_reader_tool.py +1 -1
- autobyteus/tools/operation_executor/journal_manager.py +107 -0
- autobyteus/tools/operation_executor/operation_event_buffer.py +57 -0
- autobyteus/tools/operation_executor/operation_event_producer.py +29 -0
- autobyteus/tools/operation_executor/operation_executor.py +58 -0
- autobyteus/tools/registry/tool_definition.py +108 -14
- autobyteus/tools/registry/tool_registry.py +29 -0
- autobyteus/tools/search/__init__.py +17 -0
- autobyteus/tools/search/base_strategy.py +35 -0
- autobyteus/tools/search/client.py +24 -0
- autobyteus/tools/search/factory.py +81 -0
- autobyteus/tools/search/google_cse_strategy.py +68 -0
- autobyteus/tools/search/providers.py +10 -0
- autobyteus/tools/search/serpapi_strategy.py +65 -0
- autobyteus/tools/search/serper_strategy.py +87 -0
- autobyteus/tools/search_tool.py +83 -0
- autobyteus/tools/skill/load_skill.py +50 -0
- autobyteus/tools/terminal/__init__.py +45 -0
- autobyteus/tools/terminal/ansi_utils.py +32 -0
- autobyteus/tools/terminal/background_process_manager.py +233 -0
- autobyteus/tools/terminal/output_buffer.py +105 -0
- autobyteus/tools/terminal/prompt_detector.py +63 -0
- autobyteus/tools/terminal/pty_session.py +241 -0
- autobyteus/tools/terminal/session_factory.py +20 -0
- autobyteus/tools/terminal/terminal_session_manager.py +226 -0
- autobyteus/tools/terminal/tools/__init__.py +13 -0
- autobyteus/tools/terminal/tools/get_process_output.py +81 -0
- autobyteus/tools/terminal/tools/run_bash.py +109 -0
- autobyteus/tools/terminal/tools/start_background_process.py +104 -0
- autobyteus/tools/terminal/tools/stop_background_process.py +67 -0
- autobyteus/tools/terminal/types.py +54 -0
- autobyteus/tools/terminal/wsl_tmux_session.py +221 -0
- autobyteus/tools/terminal/wsl_utils.py +156 -0
- autobyteus/tools/tool_meta.py +4 -24
- autobyteus/tools/transaction_management/backup_handler.py +48 -0
- autobyteus/tools/transaction_management/operation_lifecycle_manager.py +62 -0
- autobyteus/tools/usage/__init__.py +1 -2
- autobyteus/tools/usage/formatters/__init__.py +17 -1
- autobyteus/tools/usage/formatters/base_formatter.py +8 -0
- autobyteus/tools/usage/formatters/default_xml_schema_formatter.py +2 -2
- autobyteus/tools/usage/formatters/mistral_json_schema_formatter.py +18 -0
- autobyteus/tools/usage/formatters/patch_file_xml_example_formatter.py +64 -0
- autobyteus/tools/usage/formatters/patch_file_xml_schema_formatter.py +31 -0
- autobyteus/tools/usage/formatters/run_bash_xml_example_formatter.py +32 -0
- autobyteus/tools/usage/formatters/run_bash_xml_schema_formatter.py +36 -0
- autobyteus/tools/usage/formatters/write_file_xml_example_formatter.py +53 -0
- autobyteus/tools/usage/formatters/write_file_xml_schema_formatter.py +31 -0
- autobyteus/tools/usage/providers/tool_manifest_provider.py +10 -10
- autobyteus/tools/usage/registries/__init__.py +1 -3
- autobyteus/tools/usage/registries/tool_formatting_registry.py +115 -8
- autobyteus/tools/usage/tool_schema_provider.py +51 -0
- autobyteus/tools/web/__init__.py +4 -0
- autobyteus/tools/web/read_url_tool.py +80 -0
- autobyteus/utils/diff_utils.py +271 -0
- autobyteus/utils/download_utils.py +109 -0
- autobyteus/utils/file_utils.py +57 -2
- autobyteus/utils/gemini_helper.py +56 -0
- autobyteus/utils/gemini_model_mapping.py +71 -0
- autobyteus/utils/llm_output_formatter.py +75 -0
- autobyteus/utils/tool_call_format.py +36 -0
- autobyteus/workflow/agentic_workflow.py +3 -3
- autobyteus/workflow/bootstrap_steps/agent_tool_injection_step.py +2 -2
- autobyteus/workflow/bootstrap_steps/base_workflow_bootstrap_step.py +2 -2
- autobyteus/workflow/bootstrap_steps/coordinator_initialization_step.py +2 -2
- autobyteus/workflow/bootstrap_steps/coordinator_prompt_preparation_step.py +4 -11
- autobyteus/workflow/bootstrap_steps/workflow_bootstrapper.py +6 -6
- autobyteus/workflow/bootstrap_steps/workflow_runtime_queue_initialization_step.py +2 -2
- autobyteus/workflow/context/workflow_context.py +3 -3
- autobyteus/workflow/context/workflow_runtime_state.py +5 -5
- autobyteus/workflow/events/workflow_event_dispatcher.py +5 -5
- autobyteus/workflow/handlers/lifecycle_workflow_event_handler.py +3 -3
- autobyteus/workflow/handlers/process_user_message_event_handler.py +5 -5
- autobyteus/workflow/handlers/tool_approval_workflow_event_handler.py +2 -2
- autobyteus/workflow/runtime/workflow_runtime.py +8 -8
- autobyteus/workflow/runtime/workflow_worker.py +3 -3
- autobyteus/workflow/status/__init__.py +11 -0
- autobyteus/workflow/status/workflow_status.py +19 -0
- autobyteus/workflow/status/workflow_status_manager.py +48 -0
- autobyteus/workflow/streaming/__init__.py +2 -2
- autobyteus/workflow/streaming/workflow_event_notifier.py +7 -7
- autobyteus/workflow/streaming/workflow_stream_event_payloads.py +4 -4
- autobyteus/workflow/streaming/workflow_stream_events.py +3 -3
- autobyteus/workflow/utils/wait_for_idle.py +4 -4
- autobyteus-1.2.3.dist-info/METADATA +293 -0
- autobyteus-1.2.3.dist-info/RECORD +600 -0
- {autobyteus-1.2.0.dist-info → autobyteus-1.2.3.dist-info}/WHEEL +1 -1
- {autobyteus-1.2.0.dist-info → autobyteus-1.2.3.dist-info}/top_level.txt +0 -1
- autobyteus/agent/bootstrap_steps/agent_runtime_queue_initialization_step.py +0 -57
- autobyteus/agent/hooks/__init__.py +0 -16
- autobyteus/agent/hooks/base_phase_hook.py +0 -78
- autobyteus/agent/hooks/hook_definition.py +0 -36
- autobyteus/agent/hooks/hook_meta.py +0 -37
- autobyteus/agent/hooks/hook_registry.py +0 -106
- autobyteus/agent/llm_response_processor/provider_aware_tool_usage_processor.py +0 -103
- autobyteus/agent/phases/__init__.py +0 -18
- autobyteus/agent/phases/discover.py +0 -53
- autobyteus/agent/phases/manager.py +0 -265
- autobyteus/agent/phases/transition_decorator.py +0 -40
- autobyteus/agent/phases/transition_info.py +0 -33
- autobyteus/agent/remote_agent.py +0 -244
- autobyteus/agent/workspace/workspace_definition.py +0 -36
- autobyteus/agent/workspace/workspace_meta.py +0 -37
- autobyteus/agent/workspace/workspace_registry.py +0 -72
- autobyteus/agent_team/bootstrap_steps/agent_team_runtime_queue_initialization_step.py +0 -25
- autobyteus/agent_team/bootstrap_steps/coordinator_prompt_preparation_step.py +0 -85
- autobyteus/agent_team/phases/__init__.py +0 -11
- autobyteus/agent_team/phases/agent_team_operational_phase.py +0 -19
- autobyteus/agent_team/phases/agent_team_phase_manager.py +0 -48
- autobyteus/llm/api/bedrock_llm.py +0 -92
- autobyteus/llm/api/groq_llm.py +0 -94
- autobyteus/llm/api/nvidia_llm.py +0 -108
- autobyteus/llm/utils/token_pricing_config.py +0 -87
- autobyteus/person/examples/sample_persons.py +0 -14
- autobyteus/person/examples/sample_roles.py +0 -14
- autobyteus/person/person.py +0 -29
- autobyteus/person/role.py +0 -14
- autobyteus/rpc/__init__.py +0 -73
- autobyteus/rpc/client/__init__.py +0 -17
- autobyteus/rpc/client/abstract_client_connection.py +0 -124
- autobyteus/rpc/client/client_connection_manager.py +0 -153
- autobyteus/rpc/client/sse_client_connection.py +0 -306
- autobyteus/rpc/client/stdio_client_connection.py +0 -280
- autobyteus/rpc/config/__init__.py +0 -13
- autobyteus/rpc/config/agent_server_config.py +0 -153
- autobyteus/rpc/config/agent_server_registry.py +0 -152
- autobyteus/rpc/hosting.py +0 -244
- autobyteus/rpc/protocol.py +0 -244
- autobyteus/rpc/server/__init__.py +0 -20
- autobyteus/rpc/server/agent_server_endpoint.py +0 -181
- autobyteus/rpc/server/base_method_handler.py +0 -40
- autobyteus/rpc/server/method_handlers.py +0 -259
- autobyteus/rpc/server/sse_server_handler.py +0 -182
- autobyteus/rpc/server/stdio_server_handler.py +0 -151
- autobyteus/rpc/server_main.py +0 -198
- autobyteus/rpc/transport_type.py +0 -13
- autobyteus/tools/bash/__init__.py +0 -2
- autobyteus/tools/bash/bash_executor.py +0 -100
- autobyteus/tools/browser/__init__.py +0 -2
- autobyteus/tools/browser/session_aware/__init__.py +0 -0
- autobyteus/tools/browser/session_aware/browser_session_aware_navigate_to.py +0 -75
- autobyteus/tools/browser/session_aware/browser_session_aware_tool.py +0 -30
- autobyteus/tools/browser/session_aware/browser_session_aware_web_element_trigger.py +0 -154
- autobyteus/tools/browser/session_aware/browser_session_aware_webpage_reader.py +0 -89
- autobyteus/tools/browser/session_aware/browser_session_aware_webpage_screenshot_taker.py +0 -107
- autobyteus/tools/browser/session_aware/factory/__init__.py +0 -0
- autobyteus/tools/browser/session_aware/factory/browser_session_aware_web_element_trigger_factory.py +0 -14
- autobyteus/tools/browser/session_aware/factory/browser_session_aware_webpage_reader_factory.py +0 -26
- autobyteus/tools/browser/session_aware/factory/browser_session_aware_webpage_screenshot_taker_factory.py +0 -14
- autobyteus/tools/browser/session_aware/shared_browser_session.py +0 -11
- autobyteus/tools/browser/session_aware/shared_browser_session_manager.py +0 -25
- autobyteus/tools/browser/session_aware/web_element_action.py +0 -20
- autobyteus/tools/browser/standalone/__init__.py +0 -6
- autobyteus/tools/browser/standalone/factory/__init__.py +0 -0
- autobyteus/tools/browser/standalone/factory/webpage_reader_factory.py +0 -25
- autobyteus/tools/browser/standalone/factory/webpage_screenshot_taker_factory.py +0 -14
- autobyteus/tools/browser/standalone/navigate_to.py +0 -80
- autobyteus/tools/browser/standalone/web_page_pdf_generator.py +0 -97
- autobyteus/tools/browser/standalone/webpage_image_downloader.py +0 -165
- autobyteus/tools/browser/standalone/webpage_reader.py +0 -101
- autobyteus/tools/browser/standalone/webpage_screenshot_taker.py +0 -101
- autobyteus/tools/file/file_editor.py +0 -200
- autobyteus/tools/google_search.py +0 -149
- autobyteus/tools/timer.py +0 -171
- autobyteus/tools/usage/parsers/__init__.py +0 -22
- autobyteus/tools/usage/parsers/_json_extractor.py +0 -99
- autobyteus/tools/usage/parsers/_string_decoders.py +0 -18
- autobyteus/tools/usage/parsers/anthropic_xml_tool_usage_parser.py +0 -10
- autobyteus/tools/usage/parsers/base_parser.py +0 -41
- autobyteus/tools/usage/parsers/default_json_tool_usage_parser.py +0 -83
- autobyteus/tools/usage/parsers/default_xml_tool_usage_parser.py +0 -316
- autobyteus/tools/usage/parsers/exceptions.py +0 -13
- autobyteus/tools/usage/parsers/gemini_json_tool_usage_parser.py +0 -77
- autobyteus/tools/usage/parsers/openai_json_tool_usage_parser.py +0 -149
- autobyteus/tools/usage/parsers/provider_aware_tool_usage_parser.py +0 -59
- autobyteus/tools/usage/registries/tool_usage_parser_registry.py +0 -62
- autobyteus/workflow/phases/__init__.py +0 -11
- autobyteus/workflow/phases/workflow_operational_phase.py +0 -19
- autobyteus/workflow/phases/workflow_phase_manager.py +0 -48
- autobyteus-1.2.0.dist-info/METADATA +0 -205
- autobyteus-1.2.0.dist-info/RECORD +0 -496
- examples/__init__.py +0 -1
- examples/agent_team/__init__.py +0 -1
- examples/discover_phase_transitions.py +0 -104
- examples/run_browser_agent.py +0 -262
- examples/run_google_slides_agent.py +0 -287
- examples/run_mcp_browser_client.py +0 -174
- examples/run_mcp_google_slides_client.py +0 -270
- examples/run_mcp_list_tools.py +0 -189
- examples/run_poem_writer.py +0 -284
- examples/run_sqlite_agent.py +0 -295
- /autobyteus/{person → skills}/__init__.py +0 -0
- /autobyteus/{person/examples → tools/skill}/__init__.py +0 -0
- {autobyteus-1.2.0.dist-info → autobyteus-1.2.3.dist-info}/licenses/LICENSE +0 -0
|
@@ -7,7 +7,6 @@ from autobyteus.agent_team.context.agent_team_config import AgentTeamConfig
|
|
|
7
7
|
from autobyteus.agent_team.context.team_node_config import TeamNodeConfig
|
|
8
8
|
from autobyteus.agent.context.agent_config import AgentConfig
|
|
9
9
|
from autobyteus.agent_team.factory.agent_team_factory import AgentTeamFactory
|
|
10
|
-
from autobyteus.agent_team.task_notification.task_notification_mode import TaskNotificationMode
|
|
11
10
|
|
|
12
11
|
logger = logging.getLogger(__name__)
|
|
13
12
|
|
|
@@ -44,8 +43,6 @@ class AgentTeamBuilder:
|
|
|
44
43
|
self._nodes: Dict[NodeDefinition, List[NodeDefinition]] = {}
|
|
45
44
|
self._coordinator_config: Optional[AgentConfig] = None
|
|
46
45
|
self._added_node_names: Set[str] = set()
|
|
47
|
-
self._task_notification_mode: TaskNotificationMode = TaskNotificationMode.AGENT_MANUAL_NOTIFICATION
|
|
48
|
-
self._use_xml_tool_format: Optional[bool] = None
|
|
49
46
|
logger.info(f"AgentTeamBuilder initialized for team: '{self._name}'.")
|
|
50
47
|
|
|
51
48
|
def add_agent_node(self, agent_config: AgentConfig, dependencies: Optional[List[NodeDefinition]] = None) -> 'AgentTeamBuilder':
|
|
@@ -127,41 +124,6 @@ class AgentTeamBuilder:
|
|
|
127
124
|
logger.debug(f"Set coordinator for team to '{agent_config.name}'.")
|
|
128
125
|
return self
|
|
129
126
|
|
|
130
|
-
def set_task_notification_mode(self, mode: TaskNotificationMode) -> 'AgentTeamBuilder':
|
|
131
|
-
"""
|
|
132
|
-
Sets the task notification mode for the team.
|
|
133
|
-
|
|
134
|
-
Args:
|
|
135
|
-
mode: The desired TaskNotificationMode (AGENT_MANUAL_NOTIFICATION or SYSTEM_EVENT_DRIVEN).
|
|
136
|
-
|
|
137
|
-
Returns:
|
|
138
|
-
The builder instance for fluent chaining.
|
|
139
|
-
"""
|
|
140
|
-
if not isinstance(mode, TaskNotificationMode):
|
|
141
|
-
raise TypeError("mode must be an instance of TaskNotificationMode.")
|
|
142
|
-
self._task_notification_mode = mode
|
|
143
|
-
logger.debug(f"Task notification mode set to '{mode.value}'.")
|
|
144
|
-
return self
|
|
145
|
-
|
|
146
|
-
def set_use_xml_tool_format(self, use_xml: bool) -> 'AgentTeamBuilder':
|
|
147
|
-
"""
|
|
148
|
-
Sets the team-level override for using XML tool format.
|
|
149
|
-
|
|
150
|
-
If set, this will override the setting on all individual agents within the team.
|
|
151
|
-
|
|
152
|
-
Args:
|
|
153
|
-
use_xml: If True, forces the team to use XML format for tool
|
|
154
|
-
definitions and parsing.
|
|
155
|
-
|
|
156
|
-
Returns:
|
|
157
|
-
The builder instance for fluent chaining.
|
|
158
|
-
"""
|
|
159
|
-
if not isinstance(use_xml, bool):
|
|
160
|
-
raise TypeError("use_xml must be a boolean.")
|
|
161
|
-
self._use_xml_tool_format = use_xml
|
|
162
|
-
logger.debug(f"Team-level XML tool format override set to '{use_xml}'.")
|
|
163
|
-
return self
|
|
164
|
-
|
|
165
127
|
def build(self) -> AgentTeam:
|
|
166
128
|
"""
|
|
167
129
|
Constructs and returns the final AgentTeam instance using the
|
|
@@ -194,9 +156,7 @@ class AgentTeamBuilder:
|
|
|
194
156
|
description=self._description,
|
|
195
157
|
role=self._role,
|
|
196
158
|
nodes=tuple(final_nodes),
|
|
197
|
-
coordinator_node=coordinator_node_instance
|
|
198
|
-
task_notification_mode=self._task_notification_mode,
|
|
199
|
-
use_xml_tool_format=self._use_xml_tool_format
|
|
159
|
+
coordinator_node=coordinator_node_instance
|
|
200
160
|
)
|
|
201
161
|
|
|
202
162
|
logger.info(f"AgentTeamConfig created successfully. Name: '{team_config.name}'. Total nodes: {len(final_nodes)}. Coordinator: '{coordinator_node_instance.name}'.")
|
|
@@ -4,20 +4,16 @@ Defines individual, self-contained steps for the agent team bootstrapping proces
|
|
|
4
4
|
"""
|
|
5
5
|
|
|
6
6
|
from autobyteus.agent_team.bootstrap_steps.base_agent_team_bootstrap_step import BaseAgentTeamBootstrapStep
|
|
7
|
-
from autobyteus.agent_team.bootstrap_steps.agent_team_runtime_queue_initialization_step import AgentTeamRuntimeQueueInitializationStep
|
|
8
7
|
from autobyteus.agent_team.bootstrap_steps.team_context_initialization_step import TeamContextInitializationStep
|
|
9
8
|
from autobyteus.agent_team.bootstrap_steps.task_notifier_initialization_step import TaskNotifierInitializationStep
|
|
10
|
-
from autobyteus.agent_team.bootstrap_steps.coordinator_prompt_preparation_step import CoordinatorPromptPreparationStep
|
|
11
9
|
from autobyteus.agent_team.bootstrap_steps.agent_configuration_preparation_step import AgentConfigurationPreparationStep
|
|
12
10
|
from autobyteus.agent_team.bootstrap_steps.coordinator_initialization_step import CoordinatorInitializationStep
|
|
13
11
|
from autobyteus.agent_team.bootstrap_steps.agent_team_bootstrapper import AgentTeamBootstrapper
|
|
14
12
|
|
|
15
13
|
__all__ = [
|
|
16
14
|
"BaseAgentTeamBootstrapStep",
|
|
17
|
-
"AgentTeamRuntimeQueueInitializationStep",
|
|
18
15
|
"TeamContextInitializationStep",
|
|
19
16
|
"TaskNotifierInitializationStep",
|
|
20
|
-
"CoordinatorPromptPreparationStep",
|
|
21
17
|
"AgentConfigurationPreparationStep",
|
|
22
18
|
"CoordinatorInitializationStep",
|
|
23
19
|
"AgentTeamBootstrapper",
|
|
@@ -4,11 +4,10 @@ from typing import TYPE_CHECKING
|
|
|
4
4
|
|
|
5
5
|
from autobyteus.agent_team.bootstrap_steps.base_agent_team_bootstrap_step import BaseAgentTeamBootstrapStep
|
|
6
6
|
from autobyteus.agent.context import AgentConfig
|
|
7
|
-
from autobyteus.
|
|
7
|
+
from autobyteus.agent_team.system_prompt_processor import TeamManifestInjectorProcessor
|
|
8
8
|
|
|
9
9
|
if TYPE_CHECKING:
|
|
10
10
|
from autobyteus.agent_team.context.agent_team_context import AgentTeamContext
|
|
11
|
-
from autobyteus.agent_team.phases.agent_team_phase_manager import AgentTeamPhaseManager
|
|
12
11
|
|
|
13
12
|
logger = logging.getLogger(__name__)
|
|
14
13
|
|
|
@@ -18,7 +17,7 @@ class AgentConfigurationPreparationStep(BaseAgentTeamBootstrapStep):
|
|
|
18
17
|
agent in the team. It injects team-specific context, applies team-level
|
|
19
18
|
settings like tool format overrides, and prepares the final coordinator prompt.
|
|
20
19
|
"""
|
|
21
|
-
async def execute(self, context: 'AgentTeamContext'
|
|
20
|
+
async def execute(self, context: 'AgentTeamContext') -> bool:
|
|
22
21
|
team_id = context.team_id
|
|
23
22
|
logger.info(f"Team '{team_id}': Executing AgentConfigurationPreparationStep to prepare all agent configurations.")
|
|
24
23
|
|
|
@@ -28,8 +27,6 @@ class AgentConfigurationPreparationStep(BaseAgentTeamBootstrapStep):
|
|
|
28
27
|
return False
|
|
29
28
|
|
|
30
29
|
try:
|
|
31
|
-
coordinator_node_config = context.config.coordinator_node
|
|
32
|
-
|
|
33
30
|
for node_config_wrapper in context.config.nodes:
|
|
34
31
|
# This step only configures direct agent members, not sub-teams.
|
|
35
32
|
if node_config_wrapper.is_sub_team:
|
|
@@ -44,13 +41,6 @@ class AgentConfigurationPreparationStep(BaseAgentTeamBootstrapStep):
|
|
|
44
41
|
|
|
45
42
|
final_config = node_definition.copy()
|
|
46
43
|
|
|
47
|
-
# --- Team-level Setting Propagation ---
|
|
48
|
-
# If the team config specifies a tool format, it overrides any agent-level setting.
|
|
49
|
-
if context.config.use_xml_tool_format is not None:
|
|
50
|
-
final_config.use_xml_tool_format = context.config.use_xml_tool_format
|
|
51
|
-
logger.debug(f"Team '{team_id}': Applied team-level use_xml_tool_format={final_config.use_xml_tool_format} to agent '{unique_name}'.")
|
|
52
|
-
|
|
53
|
-
|
|
54
44
|
# --- Shared Context Injection ---
|
|
55
45
|
# The shared context is injected into the initial_custom_data dictionary,
|
|
56
46
|
# which is then used by the AgentFactory to create the AgentRuntimeState.
|
|
@@ -63,12 +53,12 @@ class AgentConfigurationPreparationStep(BaseAgentTeamBootstrapStep):
|
|
|
63
53
|
# The user is now fully responsible for defining all tools an agent needs
|
|
64
54
|
# in its AgentConfig. The framework no longer implicitly injects SendMessageTo.
|
|
65
55
|
|
|
66
|
-
#
|
|
67
|
-
if
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
56
|
+
# Ensure the team manifest processor is attached for team agents.
|
|
57
|
+
if final_config.system_prompt_processors is None:
|
|
58
|
+
final_config.system_prompt_processors = []
|
|
59
|
+
if not any(isinstance(p, TeamManifestInjectorProcessor) for p in final_config.system_prompt_processors):
|
|
60
|
+
final_config.system_prompt_processors.append(TeamManifestInjectorProcessor())
|
|
61
|
+
logger.debug(f"Team '{team_id}': Attached TeamManifestInjectorProcessor for agent '{unique_name}'.")
|
|
72
62
|
|
|
73
63
|
# Store the final, ready-to-use config in the team's state
|
|
74
64
|
context.state.final_agent_configs[unique_name] = final_config
|
|
@@ -3,17 +3,12 @@ import logging
|
|
|
3
3
|
from typing import TYPE_CHECKING, List, Optional
|
|
4
4
|
|
|
5
5
|
from autobyteus.agent_team.bootstrap_steps.base_agent_team_bootstrap_step import BaseAgentTeamBootstrapStep
|
|
6
|
-
from autobyteus.agent_team.bootstrap_steps.agent_team_runtime_queue_initialization_step import AgentTeamRuntimeQueueInitializationStep
|
|
7
6
|
from autobyteus.agent_team.bootstrap_steps.team_context_initialization_step import TeamContextInitializationStep
|
|
8
7
|
from autobyteus.agent_team.bootstrap_steps.task_notifier_initialization_step import TaskNotifierInitializationStep
|
|
9
|
-
from autobyteus.agent_team.bootstrap_steps.coordinator_prompt_preparation_step import CoordinatorPromptPreparationStep
|
|
10
8
|
from autobyteus.agent_team.bootstrap_steps.agent_configuration_preparation_step import AgentConfigurationPreparationStep
|
|
11
9
|
from autobyteus.agent_team.bootstrap_steps.coordinator_initialization_step import CoordinatorInitializationStep
|
|
12
|
-
from autobyteus.agent_team.events.agent_team_events import AgentTeamReadyEvent
|
|
13
|
-
|
|
14
10
|
if TYPE_CHECKING:
|
|
15
11
|
from autobyteus.agent_team.context.agent_team_context import AgentTeamContext
|
|
16
|
-
from autobyteus.agent_team.phases.agent_team_phase_manager import AgentTeamPhaseManager
|
|
17
12
|
|
|
18
13
|
logger = logging.getLogger(__name__)
|
|
19
14
|
|
|
@@ -21,34 +16,27 @@ class AgentTeamBootstrapper:
|
|
|
21
16
|
"""Orchestrates the agent team's bootstrapping process."""
|
|
22
17
|
def __init__(self, steps: Optional[List[BaseAgentTeamBootstrapStep]] = None):
|
|
23
18
|
self.bootstrap_steps = steps or [
|
|
24
|
-
AgentTeamRuntimeQueueInitializationStep(),
|
|
25
19
|
TeamContextInitializationStep(),
|
|
26
20
|
TaskNotifierInitializationStep(),
|
|
27
|
-
CoordinatorPromptPreparationStep(),
|
|
28
21
|
AgentConfigurationPreparationStep(),
|
|
29
22
|
CoordinatorInitializationStep(),
|
|
30
23
|
]
|
|
31
24
|
|
|
32
|
-
async def run(self, context: 'AgentTeamContext'
|
|
25
|
+
async def run(self, context: 'AgentTeamContext') -> bool:
|
|
33
26
|
team_id = context.team_id
|
|
34
|
-
await phase_manager.notify_bootstrapping_started()
|
|
35
27
|
logger.info(f"Team '{team_id}': Bootstrapper starting.")
|
|
36
28
|
|
|
37
29
|
for step in self.bootstrap_steps:
|
|
38
30
|
step_name = step.__class__.__name__
|
|
39
31
|
logger.debug(f"Team '{team_id}': Executing bootstrap step: {step_name}")
|
|
40
|
-
if not await step.execute(context
|
|
32
|
+
if not await step.execute(context):
|
|
41
33
|
error_message = f"Bootstrap step {step_name} failed."
|
|
42
34
|
logger.error(f"Team '{team_id}': {error_message}")
|
|
43
|
-
await phase_manager.notify_error_occurred(error_message, f"Failed during bootstrap step '{step_name}'.")
|
|
44
35
|
return False
|
|
45
36
|
|
|
46
37
|
logger.info(f"Team '{team_id}': All bootstrap steps completed successfully.")
|
|
47
|
-
if context.state.input_event_queues:
|
|
48
|
-
await context.state.input_event_queues.enqueue_internal_system_event(AgentTeamReadyEvent())
|
|
49
|
-
else:
|
|
38
|
+
if not context.state.input_event_queues:
|
|
50
39
|
logger.critical(f"Team '{team_id}': Bootstrap succeeded but queues not available.")
|
|
51
|
-
await phase_manager.notify_error_occurred("Queues unavailable after bootstrap.", "")
|
|
52
40
|
return False
|
|
53
|
-
|
|
41
|
+
|
|
54
42
|
return True
|
|
@@ -5,7 +5,6 @@ from typing import TYPE_CHECKING
|
|
|
5
5
|
|
|
6
6
|
if TYPE_CHECKING:
|
|
7
7
|
from autobyteus.agent_team.context.agent_team_context import AgentTeamContext
|
|
8
|
-
from autobyteus.agent_team.phases.agent_team_phase_manager import AgentTeamPhaseManager
|
|
9
8
|
|
|
10
9
|
logger = logging.getLogger(__name__)
|
|
11
10
|
|
|
@@ -13,7 +12,7 @@ class BaseAgentTeamBootstrapStep(ABC):
|
|
|
13
12
|
"""Abstract base class for individual steps in the agent team bootstrapping process."""
|
|
14
13
|
|
|
15
14
|
@abstractmethod
|
|
16
|
-
async def execute(self, context: 'AgentTeamContext'
|
|
15
|
+
async def execute(self, context: 'AgentTeamContext') -> bool:
|
|
17
16
|
"""
|
|
18
17
|
Executes the bootstrap step.
|
|
19
18
|
|
|
@@ -6,7 +6,6 @@ from autobyteus.agent_team.bootstrap_steps.base_agent_team_bootstrap_step import
|
|
|
6
6
|
|
|
7
7
|
if TYPE_CHECKING:
|
|
8
8
|
from autobyteus.agent_team.context.agent_team_context import AgentTeamContext
|
|
9
|
-
from autobyteus.agent_team.phases.agent_team_phase_manager import AgentTeamPhaseManager
|
|
10
9
|
|
|
11
10
|
logger = logging.getLogger(__name__)
|
|
12
11
|
|
|
@@ -16,7 +15,7 @@ class CoordinatorInitializationStep(BaseAgentTeamBootstrapStep):
|
|
|
16
15
|
using the TeamManager. This ensures the coordinator is ready before the
|
|
17
16
|
agent team becomes idle.
|
|
18
17
|
"""
|
|
19
|
-
async def execute(self, context: 'AgentTeamContext'
|
|
18
|
+
async def execute(self, context: 'AgentTeamContext') -> bool:
|
|
20
19
|
team_id = context.team_id
|
|
21
20
|
logger.info(f"Team '{team_id}': Executing CoordinatorInitializationStep.")
|
|
22
21
|
|
|
@@ -8,7 +8,6 @@ from autobyteus.agent_team.task_notification.system_event_driven_agent_task_noti
|
|
|
8
8
|
|
|
9
9
|
if TYPE_CHECKING:
|
|
10
10
|
from autobyteus.agent_team.context.agent_team_context import AgentTeamContext
|
|
11
|
-
from autobyteus.agent_team.phases.agent_team_phase_manager import AgentTeamPhaseManager
|
|
12
11
|
|
|
13
12
|
logger = logging.getLogger(__name__)
|
|
14
13
|
|
|
@@ -17,7 +16,7 @@ class TaskNotifierInitializationStep(BaseAgentTeamBootstrapStep):
|
|
|
17
16
|
Bootstrap step to initialize the SystemEventDrivenAgentTaskNotifier if the
|
|
18
17
|
team is configured for event-driven notifications.
|
|
19
18
|
"""
|
|
20
|
-
async def execute(self, context: 'AgentTeamContext'
|
|
19
|
+
async def execute(self, context: 'AgentTeamContext') -> bool:
|
|
21
20
|
team_id = context.team_id
|
|
22
21
|
logger.info(f"Team '{team_id}': Executing TaskNotifierInitializationStep.")
|
|
23
22
|
|
|
@@ -27,9 +26,9 @@ class TaskNotifierInitializationStep(BaseAgentTeamBootstrapStep):
|
|
|
27
26
|
|
|
28
27
|
logger.info(f"Team '{team_id}': Mode is SYSTEM_EVENT_DRIVEN. Initializing and activating task notifier.")
|
|
29
28
|
try:
|
|
30
|
-
|
|
31
|
-
if not
|
|
32
|
-
logger.error(f"Team '{team_id}':
|
|
29
|
+
task_plan = context.state.task_plan
|
|
30
|
+
if not task_plan:
|
|
31
|
+
logger.error(f"Team '{team_id}': TaskPlan not found. Cannot initialize task notifier. This step should run after TeamContextInitializationStep.")
|
|
33
32
|
return False
|
|
34
33
|
|
|
35
34
|
team_manager = context.team_manager
|
|
@@ -38,7 +37,7 @@ class TaskNotifierInitializationStep(BaseAgentTeamBootstrapStep):
|
|
|
38
37
|
return False
|
|
39
38
|
|
|
40
39
|
notifier = SystemEventDrivenAgentTaskNotifier(
|
|
41
|
-
|
|
40
|
+
task_plan=task_plan,
|
|
42
41
|
team_manager=team_manager
|
|
43
42
|
)
|
|
44
43
|
notifier.start_monitoring()
|
|
@@ -3,41 +3,41 @@ import logging
|
|
|
3
3
|
from typing import TYPE_CHECKING
|
|
4
4
|
|
|
5
5
|
from autobyteus.agent_team.bootstrap_steps.base_agent_team_bootstrap_step import BaseAgentTeamBootstrapStep
|
|
6
|
-
from autobyteus.task_management import
|
|
6
|
+
from autobyteus.task_management import TaskPlan
|
|
7
7
|
from autobyteus.events.event_types import EventType
|
|
8
8
|
|
|
9
9
|
if TYPE_CHECKING:
|
|
10
10
|
from autobyteus.agent_team.context.agent_team_context import AgentTeamContext
|
|
11
|
-
from autobyteus.agent_team.phases.agent_team_phase_manager import AgentTeamPhaseManager
|
|
12
11
|
|
|
13
12
|
logger = logging.getLogger(__name__)
|
|
14
13
|
|
|
15
14
|
class TeamContextInitializationStep(BaseAgentTeamBootstrapStep):
|
|
16
15
|
"""
|
|
17
16
|
Bootstrap step to initialize shared team context components, such as the
|
|
18
|
-
|
|
17
|
+
TaskPlan, and bridges its events to the team's notifier.
|
|
19
18
|
"""
|
|
20
|
-
async def execute(self, context: 'AgentTeamContext'
|
|
19
|
+
async def execute(self, context: 'AgentTeamContext') -> bool:
|
|
21
20
|
team_id = context.team_id
|
|
22
21
|
logger.info(f"Team '{team_id}': Executing TeamContextInitializationStep.")
|
|
23
22
|
try:
|
|
24
|
-
if context.state.
|
|
25
|
-
|
|
26
|
-
context.state.
|
|
27
|
-
logger.info(f"Team '{team_id}':
|
|
23
|
+
if context.state.task_plan is None:
|
|
24
|
+
task_plan = TaskPlan(team_id=team_id)
|
|
25
|
+
context.state.task_plan = task_plan
|
|
26
|
+
logger.info(f"Team '{team_id}': TaskPlan initialized and attached to team state.")
|
|
28
27
|
|
|
29
|
-
|
|
28
|
+
status_manager = context.status_manager
|
|
29
|
+
notifier = status_manager.notifier if status_manager else None
|
|
30
30
|
if notifier:
|
|
31
31
|
# The notifier, a long-lived component, subscribes to events
|
|
32
|
-
# from the
|
|
33
|
-
notifier.subscribe_from(sender=
|
|
34
|
-
notifier.subscribe_from(sender=
|
|
35
|
-
logger.info(f"Team '{team_id}': Successfully bridged
|
|
32
|
+
# from the task_plan, another long-lived component.
|
|
33
|
+
notifier.subscribe_from(sender=task_plan, event=EventType.TASK_PLAN_TASKS_CREATED, listener=notifier.handle_and_publish_task_plan_event)
|
|
34
|
+
notifier.subscribe_from(sender=task_plan, event=EventType.TASK_PLAN_STATUS_UPDATED, listener=notifier.handle_and_publish_task_plan_event)
|
|
35
|
+
logger.info(f"Team '{team_id}': Successfully bridged TaskPlan events to the team notifier.")
|
|
36
36
|
else:
|
|
37
|
-
logger.warning(f"Team '{team_id}': Notifier not found in
|
|
37
|
+
logger.warning(f"Team '{team_id}': Notifier not found in StatusManager. Cannot bridge TaskPlan events.")
|
|
38
38
|
|
|
39
39
|
else:
|
|
40
|
-
logger.warning(f"Team '{team_id}':
|
|
40
|
+
logger.warning(f"Team '{team_id}': TaskPlan already exists. Skipping initialization.")
|
|
41
41
|
|
|
42
42
|
return True
|
|
43
43
|
except Exception as e:
|
|
@@ -4,7 +4,10 @@ from dataclasses import dataclass, field
|
|
|
4
4
|
from typing import List, Optional, Tuple
|
|
5
5
|
|
|
6
6
|
from autobyteus.agent_team.context.team_node_config import TeamNodeConfig
|
|
7
|
-
from autobyteus.agent_team.task_notification.task_notification_mode import
|
|
7
|
+
from autobyteus.agent_team.task_notification.task_notification_mode import (
|
|
8
|
+
TaskNotificationMode,
|
|
9
|
+
resolve_task_notification_mode,
|
|
10
|
+
)
|
|
8
11
|
|
|
9
12
|
logger = logging.getLogger(__name__)
|
|
10
13
|
|
|
@@ -19,10 +22,10 @@ class AgentTeamConfig:
|
|
|
19
22
|
nodes: Tuple[TeamNodeConfig, ...]
|
|
20
23
|
coordinator_node: TeamNodeConfig
|
|
21
24
|
role: Optional[str] = None
|
|
22
|
-
task_notification_mode: TaskNotificationMode =
|
|
23
|
-
use_xml_tool_format: Optional[bool] = None
|
|
25
|
+
task_notification_mode: TaskNotificationMode = field(init=False)
|
|
24
26
|
|
|
25
27
|
def __post_init__(self):
|
|
28
|
+
object.__setattr__(self, "task_notification_mode", resolve_task_notification_mode())
|
|
26
29
|
if not self.name or not isinstance(self.name, str):
|
|
27
30
|
raise ValueError("The 'name' in AgentTeamConfig must be a non-empty string.")
|
|
28
31
|
if not self.nodes:
|
|
@@ -2,11 +2,15 @@
|
|
|
2
2
|
import logging
|
|
3
3
|
from typing import TYPE_CHECKING, List, Optional, Dict
|
|
4
4
|
|
|
5
|
+
from autobyteus.agent_team.status.agent_team_status import AgentTeamStatus
|
|
6
|
+
|
|
5
7
|
if TYPE_CHECKING:
|
|
6
8
|
from autobyteus.agent_team.context.agent_team_config import AgentTeamConfig
|
|
7
9
|
from autobyteus.agent_team.context.agent_team_runtime_state import AgentTeamRuntimeState
|
|
8
10
|
from autobyteus.agent.agent import Agent
|
|
9
|
-
from autobyteus.agent_team.
|
|
11
|
+
from autobyteus.agent_team.status.agent_team_status_manager import AgentTeamStatusManager
|
|
12
|
+
from autobyteus.agent_team.status.status_deriver import AgentTeamStatusDeriver
|
|
13
|
+
from autobyteus.agent_team.events.event_store import AgentTeamEventStore
|
|
10
14
|
from autobyteus.agent_team.context.team_manager import TeamManager
|
|
11
15
|
from autobyteus.agent_team.streaming.agent_event_multiplexer import AgentEventMultiplexer
|
|
12
16
|
from autobyteus.agent.context import AgentConfig
|
|
@@ -49,8 +53,26 @@ class AgentTeamContext:
|
|
|
49
53
|
return None
|
|
50
54
|
|
|
51
55
|
@property
|
|
52
|
-
def
|
|
53
|
-
return self.state.
|
|
56
|
+
def status_manager(self) -> Optional['AgentTeamStatusManager']:
|
|
57
|
+
return self.state.status_manager_ref
|
|
58
|
+
|
|
59
|
+
@property
|
|
60
|
+
def current_status(self) -> 'AgentTeamStatus':
|
|
61
|
+
return self.state.current_status
|
|
62
|
+
|
|
63
|
+
@current_status.setter
|
|
64
|
+
def current_status(self, value: 'AgentTeamStatus'):
|
|
65
|
+
if not isinstance(value, AgentTeamStatus): # pragma: no cover
|
|
66
|
+
raise TypeError(f"current_status must be an AgentTeamStatus instance. Got {type(value)}")
|
|
67
|
+
self.state.current_status = value
|
|
68
|
+
|
|
69
|
+
@property
|
|
70
|
+
def event_store(self) -> Optional['AgentTeamEventStore']:
|
|
71
|
+
return self.state.event_store
|
|
72
|
+
|
|
73
|
+
@property
|
|
74
|
+
def status_deriver(self) -> Optional['AgentTeamStatusDeriver']:
|
|
75
|
+
return self.state.status_deriver
|
|
54
76
|
|
|
55
77
|
@property
|
|
56
78
|
def team_manager(self) -> Optional['TeamManager']:
|
|
@@ -3,17 +3,19 @@ import logging
|
|
|
3
3
|
from typing import List, Optional, TYPE_CHECKING, Dict
|
|
4
4
|
from dataclasses import dataclass, field
|
|
5
5
|
|
|
6
|
-
from autobyteus.agent_team.
|
|
6
|
+
from autobyteus.agent_team.status.agent_team_status import AgentTeamStatus
|
|
7
7
|
from autobyteus.agent.context import AgentConfig
|
|
8
8
|
|
|
9
9
|
if TYPE_CHECKING:
|
|
10
10
|
from autobyteus.agent.agent import Agent
|
|
11
11
|
from autobyteus.agent_team.events.agent_team_input_event_queue_manager import AgentTeamInputEventQueueManager
|
|
12
|
-
from autobyteus.agent_team.
|
|
12
|
+
from autobyteus.agent_team.events.event_store import AgentTeamEventStore
|
|
13
|
+
from autobyteus.agent_team.status.agent_team_status_manager import AgentTeamStatusManager
|
|
14
|
+
from autobyteus.agent_team.status.status_deriver import AgentTeamStatusDeriver
|
|
13
15
|
from autobyteus.agent_team.context.team_node_config import TeamNodeConfig
|
|
14
16
|
from autobyteus.agent_team.context.team_manager import TeamManager
|
|
15
17
|
from autobyteus.agent_team.streaming.agent_event_multiplexer import AgentEventMultiplexer
|
|
16
|
-
from autobyteus.task_management.
|
|
18
|
+
from autobyteus.task_management.base_task_plan import BaseTaskPlan
|
|
17
19
|
from autobyteus.agent_team.task_notification.system_event_driven_agent_task_notifier import SystemEventDrivenAgentTaskNotifier
|
|
18
20
|
|
|
19
21
|
logger = logging.getLogger(__name__)
|
|
@@ -22,10 +24,9 @@ logger = logging.getLogger(__name__)
|
|
|
22
24
|
class AgentTeamRuntimeState:
|
|
23
25
|
"""Encapsulates the dynamic, stateful data of a running agent team instance."""
|
|
24
26
|
team_id: str
|
|
25
|
-
|
|
27
|
+
current_status: AgentTeamStatus = AgentTeamStatus.UNINITIALIZED
|
|
26
28
|
|
|
27
29
|
# State populated by bootstrap steps
|
|
28
|
-
prepared_coordinator_prompt: Optional[str] = None
|
|
29
30
|
final_agent_configs: Dict[str, 'AgentConfig'] = field(default_factory=dict)
|
|
30
31
|
|
|
31
32
|
# Core services
|
|
@@ -34,11 +35,13 @@ class AgentTeamRuntimeState:
|
|
|
34
35
|
|
|
35
36
|
# Runtime components and references
|
|
36
37
|
input_event_queues: Optional['AgentTeamInputEventQueueManager'] = None
|
|
37
|
-
|
|
38
|
+
status_manager_ref: Optional['AgentTeamStatusManager'] = None
|
|
38
39
|
multiplexer_ref: Optional['AgentEventMultiplexer'] = None
|
|
40
|
+
event_store: Optional['AgentTeamEventStore'] = None
|
|
41
|
+
status_deriver: Optional['AgentTeamStatusDeriver'] = None
|
|
39
42
|
|
|
40
43
|
# Dynamic planning and artifact state
|
|
41
|
-
|
|
44
|
+
task_plan: Optional['BaseTaskPlan'] = None
|
|
42
45
|
|
|
43
46
|
def __post_init__(self):
|
|
44
47
|
if not self.team_id or not isinstance(self.team_id, str):
|
|
@@ -48,7 +51,7 @@ class AgentTeamRuntimeState:
|
|
|
48
51
|
def __repr__(self) -> str:
|
|
49
52
|
agents_count = len(self.team_manager.get_all_agents()) if self.team_manager else 0
|
|
50
53
|
coordinator_set = self.team_manager.coordinator_agent is not None if self.team_manager else False
|
|
51
|
-
return (f"<AgentTeamRuntimeState id='{self.team_id}',
|
|
54
|
+
return (f"<AgentTeamRuntimeState id='{self.team_id}', status='{self.current_status.value}', "
|
|
52
55
|
f"agents_count={agents_count}, coordinator_set={coordinator_set}, "
|
|
53
56
|
f"final_configs_count={len(self.final_agent_configs)}, "
|
|
54
57
|
f"team_manager_set={self.team_manager is not None}>")
|
|
@@ -6,7 +6,11 @@ from autobyteus.agent_team.events.agent_team_events import (
|
|
|
6
6
|
BaseAgentTeamEvent,
|
|
7
7
|
LifecycleAgentTeamEvent,
|
|
8
8
|
OperationalAgentTeamEvent,
|
|
9
|
+
AgentTeamBootstrapStartedEvent,
|
|
9
10
|
AgentTeamReadyEvent,
|
|
11
|
+
AgentTeamIdleEvent,
|
|
12
|
+
AgentTeamShutdownRequestedEvent,
|
|
13
|
+
AgentTeamStoppedEvent,
|
|
10
14
|
AgentTeamErrorEvent,
|
|
11
15
|
ProcessUserMessageEvent,
|
|
12
16
|
InterAgentMessageRequestEvent,
|
|
@@ -14,16 +18,23 @@ from autobyteus.agent_team.events.agent_team_events import (
|
|
|
14
18
|
)
|
|
15
19
|
from autobyteus.agent_team.events.agent_team_event_dispatcher import AgentTeamEventDispatcher
|
|
16
20
|
from autobyteus.agent_team.events.agent_team_input_event_queue_manager import AgentTeamInputEventQueueManager
|
|
21
|
+
from autobyteus.agent_team.events.event_store import AgentTeamEventStore, EventEnvelope
|
|
17
22
|
|
|
18
23
|
__all__ = [
|
|
19
24
|
"BaseAgentTeamEvent",
|
|
20
25
|
"LifecycleAgentTeamEvent",
|
|
21
26
|
"OperationalAgentTeamEvent",
|
|
27
|
+
"AgentTeamBootstrapStartedEvent",
|
|
22
28
|
"AgentTeamReadyEvent",
|
|
29
|
+
"AgentTeamIdleEvent",
|
|
30
|
+
"AgentTeamShutdownRequestedEvent",
|
|
31
|
+
"AgentTeamStoppedEvent",
|
|
23
32
|
"AgentTeamErrorEvent",
|
|
24
33
|
"ProcessUserMessageEvent",
|
|
25
34
|
"InterAgentMessageRequestEvent",
|
|
26
35
|
"ToolApprovalTeamEvent",
|
|
27
36
|
"AgentTeamEventDispatcher",
|
|
28
37
|
"AgentTeamInputEventQueueManager",
|
|
38
|
+
"AgentTeamEventStore",
|
|
39
|
+
"EventEnvelope",
|
|
29
40
|
]
|
|
@@ -3,12 +3,17 @@ import logging
|
|
|
3
3
|
import traceback
|
|
4
4
|
from typing import TYPE_CHECKING
|
|
5
5
|
|
|
6
|
-
from autobyteus.agent_team.events.agent_team_events import
|
|
6
|
+
from autobyteus.agent_team.events.agent_team_events import (
|
|
7
|
+
BaseAgentTeamEvent,
|
|
8
|
+
AgentTeamErrorEvent,
|
|
9
|
+
AgentTeamIdleEvent,
|
|
10
|
+
OperationalAgentTeamEvent,
|
|
11
|
+
)
|
|
12
|
+
from autobyteus.agent_team.status.status_update_utils import apply_event_and_derive_status
|
|
7
13
|
|
|
8
14
|
if TYPE_CHECKING:
|
|
9
15
|
from autobyteus.agent_team.context.agent_team_context import AgentTeamContext
|
|
10
16
|
from autobyteus.agent_team.handlers.agent_team_event_handler_registry import AgentTeamEventHandlerRegistry
|
|
11
|
-
from autobyteus.agent_team.phases.agent_team_phase_manager import AgentTeamPhaseManager
|
|
12
17
|
|
|
13
18
|
logger = logging.getLogger(__name__)
|
|
14
19
|
|
|
@@ -16,24 +21,32 @@ class AgentTeamEventDispatcher:
|
|
|
16
21
|
"""Dispatches agent team events to their appropriate handlers."""
|
|
17
22
|
|
|
18
23
|
def __init__(self,
|
|
19
|
-
event_handler_registry: 'AgentTeamEventHandlerRegistry'
|
|
20
|
-
phase_manager: 'AgentTeamPhaseManager'):
|
|
24
|
+
event_handler_registry: 'AgentTeamEventHandlerRegistry'):
|
|
21
25
|
self.registry = event_handler_registry
|
|
22
|
-
self.phase_manager = phase_manager
|
|
23
26
|
|
|
24
27
|
async def dispatch(self, event: BaseAgentTeamEvent, context: 'AgentTeamContext'):
|
|
25
|
-
handler = self.registry.get_handler(type(event))
|
|
26
28
|
team_id = context.team_id
|
|
27
29
|
|
|
30
|
+
try:
|
|
31
|
+
await apply_event_and_derive_status(event, context)
|
|
32
|
+
except Exception as e: # pragma: no cover
|
|
33
|
+
logger.error(f"Team '{team_id}': Status derivation failed for '{type(event).__name__}': {e}", exc_info=True)
|
|
34
|
+
|
|
35
|
+
handler = self.registry.get_handler(type(event))
|
|
28
36
|
if not handler:
|
|
29
37
|
logger.warning(f"Team '{team_id}': No handler for event '{type(event).__name__}'.")
|
|
30
38
|
return
|
|
31
39
|
|
|
32
40
|
try:
|
|
33
41
|
await handler.handle(event, context)
|
|
34
|
-
if isinstance(event, AgentTeamReadyEvent):
|
|
35
|
-
await self.phase_manager.notify_initialization_complete()
|
|
36
42
|
except Exception as e:
|
|
37
43
|
error_msg = f"Error handling '{type(event).__name__}' in team '{team_id}': {e}"
|
|
38
44
|
logger.error(error_msg, exc_info=True)
|
|
39
|
-
|
|
45
|
+
if context.state.input_event_queues:
|
|
46
|
+
await context.state.input_event_queues.enqueue_internal_system_event(
|
|
47
|
+
AgentTeamErrorEvent(error_message=error_msg, exception_details=traceback.format_exc())
|
|
48
|
+
)
|
|
49
|
+
else:
|
|
50
|
+
if isinstance(event, OperationalAgentTeamEvent):
|
|
51
|
+
if context.state.input_event_queues:
|
|
52
|
+
await context.state.input_event_queues.enqueue_internal_system_event(AgentTeamIdleEvent())
|
|
@@ -17,10 +17,26 @@ class OperationalAgentTeamEvent(BaseAgentTeamEvent):
|
|
|
17
17
|
"""Base class for events related to the agent team's operational logic."""
|
|
18
18
|
|
|
19
19
|
# Specific Events
|
|
20
|
+
@dataclass
|
|
21
|
+
class AgentTeamBootstrapStartedEvent(LifecycleAgentTeamEvent):
|
|
22
|
+
"""Indicates the agent team bootstrap sequence has begun."""
|
|
23
|
+
|
|
20
24
|
@dataclass
|
|
21
25
|
class AgentTeamReadyEvent(LifecycleAgentTeamEvent):
|
|
22
26
|
"""Indicates the agent team has completed bootstrapping and is ready for tasks."""
|
|
23
27
|
|
|
28
|
+
@dataclass
|
|
29
|
+
class AgentTeamIdleEvent(LifecycleAgentTeamEvent):
|
|
30
|
+
"""Indicates the agent team has returned to an idle state after processing."""
|
|
31
|
+
|
|
32
|
+
@dataclass
|
|
33
|
+
class AgentTeamShutdownRequestedEvent(LifecycleAgentTeamEvent):
|
|
34
|
+
"""Indicates a shutdown request has been issued for the agent team."""
|
|
35
|
+
|
|
36
|
+
@dataclass
|
|
37
|
+
class AgentTeamStoppedEvent(LifecycleAgentTeamEvent):
|
|
38
|
+
"""Indicates the agent team has fully stopped."""
|
|
39
|
+
|
|
24
40
|
@dataclass
|
|
25
41
|
class AgentTeamErrorEvent(LifecycleAgentTeamEvent):
|
|
26
42
|
"""Indicates a significant error occurred within the agent team."""
|