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,7 @@ from .agent_team_event_stream import AgentTeamEventStream
|
|
|
7
7
|
from .agent_team_stream_events import AgentTeamStreamEvent, AgentTeamStreamDataPayload
|
|
8
8
|
from .agent_team_stream_event_payloads import (
|
|
9
9
|
BaseTeamSpecificPayload,
|
|
10
|
-
|
|
10
|
+
AgentTeamStatusUpdateData,
|
|
11
11
|
AgentEventRebroadcastPayload,
|
|
12
12
|
)
|
|
13
13
|
from .agent_event_bridge import AgentEventBridge
|
|
@@ -19,7 +19,7 @@ __all__ = [
|
|
|
19
19
|
"AgentTeamStreamEvent",
|
|
20
20
|
"AgentTeamStreamDataPayload",
|
|
21
21
|
"BaseTeamSpecificPayload",
|
|
22
|
-
"
|
|
22
|
+
"AgentTeamStatusUpdateData",
|
|
23
23
|
"AgentEventRebroadcastPayload",
|
|
24
24
|
"AgentEventBridge",
|
|
25
25
|
"AgentEventMultiplexer",
|
|
@@ -4,10 +4,10 @@ from typing import Optional, Dict, Any, TYPE_CHECKING
|
|
|
4
4
|
|
|
5
5
|
from autobyteus.events.event_emitter import EventEmitter
|
|
6
6
|
from autobyteus.events.event_types import EventType
|
|
7
|
-
from autobyteus.agent_team.
|
|
7
|
+
from autobyteus.agent_team.status.agent_team_status import AgentTeamStatus
|
|
8
8
|
from autobyteus.agent.streaming.stream_events import StreamEvent as AgentStreamEvent
|
|
9
|
-
from .agent_team_stream_events import AgentTeamStreamEvent, AgentEventRebroadcastPayload,
|
|
10
|
-
from autobyteus.task_management.events import
|
|
9
|
+
from .agent_team_stream_events import AgentTeamStreamEvent, AgentEventRebroadcastPayload, AgentTeamStatusUpdateData, SubTeamEventRebroadcastPayload
|
|
10
|
+
from autobyteus.task_management.events import BaseTaskPlanEvent
|
|
11
11
|
|
|
12
12
|
if TYPE_CHECKING:
|
|
13
13
|
from autobyteus.agent_team.runtime.agent_team_runtime import AgentTeamRuntime
|
|
@@ -32,14 +32,14 @@ class AgentTeamExternalEventNotifier(EventEmitter):
|
|
|
32
32
|
"""
|
|
33
33
|
self.emit(EventType.TEAM_STREAM_EVENT, payload=event)
|
|
34
34
|
|
|
35
|
-
def
|
|
35
|
+
def notify_status_updated(self, new_status: AgentTeamStatus, old_status: Optional[AgentTeamStatus], extra_data: Optional[Dict[str, Any]] = None):
|
|
36
36
|
"""
|
|
37
|
-
Notifies of an agent team
|
|
37
|
+
Notifies of an agent team status update by creating and emitting a
|
|
38
38
|
'TEAM' sourced event.
|
|
39
39
|
"""
|
|
40
|
-
payload_dict = { "
|
|
40
|
+
payload_dict = { "new_status": new_status, "old_status": old_status, "error_message": extra_data.get("error_message") if extra_data else None }
|
|
41
41
|
filtered_payload_dict = {k: v for k, v in payload_dict.items() if v is not None}
|
|
42
|
-
event = AgentTeamStreamEvent(team_id=self.team_id, event_source_type="TEAM", data=
|
|
42
|
+
event = AgentTeamStreamEvent(team_id=self.team_id, event_source_type="TEAM", data=AgentTeamStatusUpdateData(**filtered_payload_dict))
|
|
43
43
|
self._emit_event(event)
|
|
44
44
|
|
|
45
45
|
def publish_agent_event(self, agent_name: str, agent_event: AgentStreamEvent):
|
|
@@ -56,9 +56,9 @@ class AgentTeamExternalEventNotifier(EventEmitter):
|
|
|
56
56
|
event = AgentTeamStreamEvent(team_id=self.team_id, event_source_type="SUB_TEAM", data=SubTeamEventRebroadcastPayload(sub_team_node_name=sub_team_node_name, sub_team_event=sub_team_event))
|
|
57
57
|
self._emit_event(event)
|
|
58
58
|
|
|
59
|
-
def
|
|
59
|
+
def handle_and_publish_task_plan_event(self, payload: BaseTaskPlanEvent, **kwargs):
|
|
60
60
|
"""
|
|
61
|
-
Listener for
|
|
61
|
+
Listener for TaskPlan events. It wraps the event and publishes it on the main team stream.
|
|
62
62
|
"""
|
|
63
|
-
event = AgentTeamStreamEvent(team_id=self.team_id, event_source_type="
|
|
63
|
+
event = AgentTeamStreamEvent(team_id=self.team_id, event_source_type="TASK_PLAN", data=payload)
|
|
64
64
|
self._emit_event(event)
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
# file: autobyteus/autobyteus/agent_team/streaming/agent_team_stream_event_payloads.py
|
|
2
2
|
from typing import Optional, Any
|
|
3
3
|
from pydantic import BaseModel, Field
|
|
4
|
-
from autobyteus.agent_team.
|
|
4
|
+
from autobyteus.agent_team.status.agent_team_status import AgentTeamStatus
|
|
5
5
|
from autobyteus.agent.streaming.stream_events import StreamEvent as AgentStreamEvent
|
|
6
|
-
from autobyteus.task_management.events import
|
|
6
|
+
from autobyteus.task_management.events import TasksCreatedEvent, TaskStatusUpdatedEvent
|
|
7
7
|
# Need to use a forward reference string to avoid circular import at runtime
|
|
8
8
|
from typing import TYPE_CHECKING, Union
|
|
9
9
|
if TYPE_CHECKING:
|
|
@@ -13,9 +13,9 @@ if TYPE_CHECKING:
|
|
|
13
13
|
class BaseTeamSpecificPayload(BaseModel):
|
|
14
14
|
pass
|
|
15
15
|
|
|
16
|
-
class
|
|
17
|
-
|
|
18
|
-
|
|
16
|
+
class AgentTeamStatusUpdateData(BaseTeamSpecificPayload):
|
|
17
|
+
new_status: AgentTeamStatus
|
|
18
|
+
old_status: Optional[AgentTeamStatus] = None
|
|
19
19
|
error_message: Optional[str] = None
|
|
20
20
|
|
|
21
21
|
# --- Payload for events originating from the "AGENT" source ---
|
|
@@ -28,5 +28,5 @@ class SubTeamEventRebroadcastPayload(BaseModel):
|
|
|
28
28
|
sub_team_node_name: str # The friendly name of the sub-team node
|
|
29
29
|
sub_team_event: "AgentTeamStreamEvent" = Field(..., description="The original, unmodified event from the sub-team's stream")
|
|
30
30
|
|
|
31
|
-
# --- Payload for events originating from the "
|
|
32
|
-
|
|
31
|
+
# --- Payload for events originating from the "TASK_PLAN" source ---
|
|
32
|
+
TaskPlanEventPayload = Union[TasksCreatedEvent, TaskStatusUpdatedEvent]
|
|
@@ -5,22 +5,22 @@ from typing import Literal, Union
|
|
|
5
5
|
from pydantic import BaseModel, Field, model_validator
|
|
6
6
|
|
|
7
7
|
from .agent_team_stream_event_payloads import (
|
|
8
|
-
|
|
9
|
-
SubTeamEventRebroadcastPayload,
|
|
8
|
+
AgentTeamStatusUpdateData, AgentEventRebroadcastPayload,
|
|
9
|
+
SubTeamEventRebroadcastPayload, TaskPlanEventPayload
|
|
10
10
|
)
|
|
11
|
-
from autobyteus.task_management.events import
|
|
11
|
+
from autobyteus.task_management.events import BaseTaskPlanEvent
|
|
12
12
|
|
|
13
13
|
# A union of all possible payloads for a "TEAM" sourced event.
|
|
14
|
-
TeamSpecificPayload = Union[
|
|
14
|
+
TeamSpecificPayload = Union[AgentTeamStatusUpdateData]
|
|
15
15
|
|
|
16
16
|
# The top-level discriminated union for the main event stream's payload.
|
|
17
|
-
AgentTeamStreamDataPayload = Union[TeamSpecificPayload, AgentEventRebroadcastPayload, SubTeamEventRebroadcastPayload,
|
|
17
|
+
AgentTeamStreamDataPayload = Union[TeamSpecificPayload, AgentEventRebroadcastPayload, SubTeamEventRebroadcastPayload, TaskPlanEventPayload]
|
|
18
18
|
|
|
19
19
|
class AgentTeamStreamEvent(BaseModel):
|
|
20
20
|
event_id: str = Field(default_factory=lambda: str(uuid.uuid4()))
|
|
21
21
|
timestamp: datetime.datetime = Field(default_factory=datetime.datetime.utcnow)
|
|
22
22
|
team_id: str
|
|
23
|
-
event_source_type: Literal["TEAM", "AGENT", "SUB_TEAM", "
|
|
23
|
+
event_source_type: Literal["TEAM", "AGENT", "SUB_TEAM", "TASK_PLAN"]
|
|
24
24
|
data: AgentTeamStreamDataPayload
|
|
25
25
|
|
|
26
26
|
@model_validator(mode='after')
|
|
@@ -32,10 +32,10 @@ class AgentTeamStreamEvent(BaseModel):
|
|
|
32
32
|
is_sub_team_payload = isinstance(self.data, SubTeamEventRebroadcastPayload)
|
|
33
33
|
|
|
34
34
|
is_team_event = self.event_source_type == "TEAM"
|
|
35
|
-
is_team_payload = isinstance(self.data,
|
|
35
|
+
is_team_payload = isinstance(self.data, AgentTeamStatusUpdateData)
|
|
36
36
|
|
|
37
|
-
|
|
38
|
-
|
|
37
|
+
is_task_plan_event = self.event_source_type == "TASK_PLAN"
|
|
38
|
+
is_task_plan_payload = isinstance(self.data, BaseTaskPlanEvent)
|
|
39
39
|
|
|
40
40
|
if is_agent_event and not is_agent_payload:
|
|
41
41
|
raise ValueError("event_source_type is 'AGENT' but data is not an AgentEventRebroadcastPayload")
|
|
@@ -46,8 +46,8 @@ class AgentTeamStreamEvent(BaseModel):
|
|
|
46
46
|
if is_team_event and not is_team_payload:
|
|
47
47
|
raise ValueError("event_source_type is 'TEAM' but data is not a valid team-specific payload")
|
|
48
48
|
|
|
49
|
-
if
|
|
50
|
-
raise ValueError("event_source_type is '
|
|
49
|
+
if is_task_plan_event and not is_task_plan_payload:
|
|
50
|
+
raise ValueError("event_source_type is 'TASK_PLAN' but data is not a BaseTaskPlanEvent instance")
|
|
51
51
|
|
|
52
52
|
return self
|
|
53
53
|
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
# file: autobyteus/autobyteus/agent_team/system_prompt_processor/team_manifest_injector_processor.py
|
|
2
|
+
import logging
|
|
3
|
+
from typing import Dict, List, TYPE_CHECKING
|
|
4
|
+
|
|
5
|
+
from autobyteus.agent.system_prompt_processor.base_processor import BaseSystemPromptProcessor
|
|
6
|
+
from autobyteus.agent_team.context import AgentTeamConfig
|
|
7
|
+
|
|
8
|
+
if TYPE_CHECKING:
|
|
9
|
+
from autobyteus.tools.base_tool import BaseTool
|
|
10
|
+
from autobyteus.agent.context import AgentContext
|
|
11
|
+
from autobyteus.agent_team.context.agent_team_context import AgentTeamContext
|
|
12
|
+
|
|
13
|
+
logger = logging.getLogger(__name__)
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class TeamManifestInjectorProcessor(BaseSystemPromptProcessor):
|
|
17
|
+
"""
|
|
18
|
+
Injects a team manifest into the system prompt for agents that belong to a team.
|
|
19
|
+
If the prompt contains {{team}}, the placeholder is replaced. Otherwise, the
|
|
20
|
+
manifest is appended as a dedicated section.
|
|
21
|
+
"""
|
|
22
|
+
|
|
23
|
+
@classmethod
|
|
24
|
+
def get_name(cls) -> str:
|
|
25
|
+
return "TeamManifestInjector"
|
|
26
|
+
|
|
27
|
+
@classmethod
|
|
28
|
+
def get_order(cls) -> int:
|
|
29
|
+
return 450
|
|
30
|
+
|
|
31
|
+
def process(
|
|
32
|
+
self,
|
|
33
|
+
system_prompt: str,
|
|
34
|
+
tool_instances: Dict[str, 'BaseTool'],
|
|
35
|
+
agent_id: str,
|
|
36
|
+
context: 'AgentContext',
|
|
37
|
+
) -> str:
|
|
38
|
+
team_context = context.custom_data.get("team_context")
|
|
39
|
+
if team_context is None:
|
|
40
|
+
logger.debug(f"Agent '{agent_id}': No team_context found; skipping team manifest injection.")
|
|
41
|
+
return system_prompt
|
|
42
|
+
|
|
43
|
+
manifest = self._generate_team_manifest(team_context, exclude_name=context.config.name)
|
|
44
|
+
|
|
45
|
+
if "{{team}}" in system_prompt:
|
|
46
|
+
logger.info(f"Agent '{agent_id}': Replacing {{team}} placeholder with team manifest.")
|
|
47
|
+
return system_prompt.replace("{{team}}", manifest)
|
|
48
|
+
|
|
49
|
+
logger.info(f"Agent '{agent_id}': Appending team manifest to system prompt.")
|
|
50
|
+
return system_prompt + "\n\n## Team Manifest\n\n" + manifest
|
|
51
|
+
|
|
52
|
+
def _generate_team_manifest(self, context: 'AgentTeamContext', exclude_name: str) -> str:
|
|
53
|
+
"""
|
|
54
|
+
Builds a manifest string of all team members except the given agent.
|
|
55
|
+
Includes sub-teams so agents see the full collaboration surface.
|
|
56
|
+
"""
|
|
57
|
+
prompt_parts: List[str] = []
|
|
58
|
+
|
|
59
|
+
for node in sorted(list(context.config.nodes), key=lambda n: n.name):
|
|
60
|
+
if node.name == exclude_name:
|
|
61
|
+
continue
|
|
62
|
+
|
|
63
|
+
node_def = node.node_definition
|
|
64
|
+
description = "No description available."
|
|
65
|
+
|
|
66
|
+
if hasattr(node_def, "description") and isinstance(node_def.description, str):
|
|
67
|
+
description = node_def.description
|
|
68
|
+
elif isinstance(node_def, AgentTeamConfig):
|
|
69
|
+
description = node_def.role or node_def.description
|
|
70
|
+
|
|
71
|
+
prompt_parts.append(f"- name: {node.name}\n description: {description}")
|
|
72
|
+
|
|
73
|
+
if not prompt_parts:
|
|
74
|
+
return "You are working alone. You have no team members to delegate to."
|
|
75
|
+
|
|
76
|
+
return "\n".join(prompt_parts)
|
|
@@ -31,7 +31,7 @@ class ActivationPolicy:
|
|
|
31
31
|
def reset(self):
|
|
32
32
|
"""
|
|
33
33
|
Resets the activation state. This should be called when a new batch of
|
|
34
|
-
tasks is published to the task
|
|
34
|
+
tasks is published to the task plan, signifying a new plan or a
|
|
35
35
|
significant change in scope.
|
|
36
36
|
"""
|
|
37
37
|
logger.info(f"Team '{self._team_id}': ActivationPolicy state has been reset. All agents are now considered inactive.")
|
|
@@ -3,39 +3,39 @@ import logging
|
|
|
3
3
|
from typing import Union, TYPE_CHECKING
|
|
4
4
|
|
|
5
5
|
from autobyteus.events.event_types import EventType
|
|
6
|
-
from autobyteus.task_management.events import
|
|
7
|
-
from autobyteus.task_management.
|
|
6
|
+
from autobyteus.task_management.events import TasksCreatedEvent, TaskStatusUpdatedEvent
|
|
7
|
+
from autobyteus.task_management.base_task_plan import TaskStatus
|
|
8
8
|
|
|
9
9
|
# Import the new, separated components
|
|
10
10
|
from .activation_policy import ActivationPolicy
|
|
11
11
|
from .task_activator import TaskActivator
|
|
12
12
|
|
|
13
13
|
if TYPE_CHECKING:
|
|
14
|
-
from autobyteus.task_management.
|
|
14
|
+
from autobyteus.task_management.base_task_plan import BaseTaskPlan
|
|
15
15
|
from autobyteus.agent_team.context.team_manager import TeamManager
|
|
16
16
|
|
|
17
17
|
logger = logging.getLogger(__name__)
|
|
18
18
|
|
|
19
19
|
class SystemEventDrivenAgentTaskNotifier:
|
|
20
20
|
"""
|
|
21
|
-
An internal component that monitors a
|
|
21
|
+
An internal component that monitors a TaskPlan and orchestrates agent
|
|
22
22
|
activation based on task runnability.
|
|
23
23
|
|
|
24
24
|
This class acts as a conductor, delegating the logic for *when* to activate
|
|
25
25
|
to an ActivationPolicy and the action of *how* to activate to a TaskActivator.
|
|
26
26
|
"""
|
|
27
|
-
def __init__(self,
|
|
27
|
+
def __init__(self, task_plan: 'BaseTaskPlan', team_manager: 'TeamManager'):
|
|
28
28
|
"""
|
|
29
29
|
Initializes the SystemEventDrivenAgentTaskNotifier.
|
|
30
30
|
|
|
31
31
|
Args:
|
|
32
|
-
|
|
32
|
+
task_plan: The team's shared task plan instance.
|
|
33
33
|
team_manager: The team's manager for activating agents.
|
|
34
34
|
"""
|
|
35
|
-
if not
|
|
36
|
-
raise ValueError("
|
|
35
|
+
if not task_plan or not team_manager:
|
|
36
|
+
raise ValueError("TaskPlan and TeamManager are required for the notifier.")
|
|
37
37
|
|
|
38
|
-
self.
|
|
38
|
+
self._task_plan = task_plan
|
|
39
39
|
self._team_manager = team_manager
|
|
40
40
|
|
|
41
41
|
# Instantiate the components that hold the actual logic and action
|
|
@@ -46,27 +46,27 @@ class SystemEventDrivenAgentTaskNotifier:
|
|
|
46
46
|
|
|
47
47
|
def start_monitoring(self):
|
|
48
48
|
"""
|
|
49
|
-
Subscribes to task
|
|
49
|
+
Subscribes to task plan events to begin monitoring for runnable tasks.
|
|
50
50
|
"""
|
|
51
|
-
self.
|
|
52
|
-
self.
|
|
53
|
-
logger.info(f"Team '{self._team_manager.team_id}': Task notifier orchestrator is now monitoring
|
|
51
|
+
self._task_plan.subscribe(EventType.TASK_PLAN_TASKS_CREATED, self._handle_tasks_changed)
|
|
52
|
+
self._task_plan.subscribe(EventType.TASK_PLAN_STATUS_UPDATED, self._handle_tasks_changed)
|
|
53
|
+
logger.info(f"Team '{self._team_manager.team_id}': Task notifier orchestrator is now monitoring TaskPlan events.")
|
|
54
54
|
|
|
55
|
-
async def _handle_tasks_changed(self, payload: Union[
|
|
55
|
+
async def _handle_tasks_changed(self, payload: Union[TasksCreatedEvent, TaskStatusUpdatedEvent], **kwargs):
|
|
56
56
|
"""
|
|
57
|
-
Orchestrates the agent activation workflow upon any change to the task
|
|
57
|
+
Orchestrates the agent activation workflow upon any change to the task plan.
|
|
58
58
|
"""
|
|
59
59
|
team_id = self._team_manager.team_id
|
|
60
|
-
logger.info(f"Team '{team_id}': Task
|
|
60
|
+
logger.info(f"Team '{team_id}': Task plan changed ({type(payload).__name__}). Orchestrating activation check.")
|
|
61
61
|
|
|
62
62
|
# If a new batch of tasks was added, it's a new "wave" of work.
|
|
63
63
|
# We must reset the policy's memory of who has been activated.
|
|
64
|
-
if isinstance(payload,
|
|
65
|
-
logger.info(f"Team '{team_id}': New tasks
|
|
64
|
+
if isinstance(payload, TasksCreatedEvent):
|
|
65
|
+
logger.info(f"Team '{team_id}': New tasks created. Resetting activation policy.")
|
|
66
66
|
self._policy.reset()
|
|
67
67
|
|
|
68
|
-
# 1. DATA FETCHING: Get the current state of runnable tasks from the
|
|
69
|
-
runnable_tasks = self.
|
|
68
|
+
# 1. DATA FETCHING: Get the current state of runnable tasks from the plan.
|
|
69
|
+
runnable_tasks = self._task_plan.get_next_runnable_tasks()
|
|
70
70
|
|
|
71
71
|
if not runnable_tasks:
|
|
72
72
|
logger.debug(f"Team '{team_id}': No runnable tasks found after change. No action needed.")
|
|
@@ -87,8 +87,8 @@ class SystemEventDrivenAgentTaskNotifier:
|
|
|
87
87
|
agent_runnable_tasks = [t for t in runnable_tasks if t.assignee_name == agent_name]
|
|
88
88
|
for task in agent_runnable_tasks:
|
|
89
89
|
# We only need to queue tasks that are NOT_STARTED.
|
|
90
|
-
if self.
|
|
91
|
-
self.
|
|
90
|
+
if self._task_plan.task_statuses.get(task.task_id) == TaskStatus.NOT_STARTED:
|
|
91
|
+
self._task_plan.update_task_status(
|
|
92
92
|
task_id=task.task_id,
|
|
93
93
|
status=TaskStatus.QUEUED,
|
|
94
94
|
agent_name="SystemTaskNotifier"
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
"""
|
|
3
3
|
Defines the enum for controlling how task notifications are handled in an agent team.
|
|
4
4
|
"""
|
|
5
|
+
import os
|
|
5
6
|
from enum import Enum
|
|
6
7
|
|
|
7
8
|
class TaskNotificationMode(str, Enum):
|
|
@@ -16,9 +17,27 @@ class TaskNotificationMode(str, Enum):
|
|
|
16
17
|
|
|
17
18
|
SYSTEM_EVENT_DRIVEN = "system_event_driven"
|
|
18
19
|
"""
|
|
19
|
-
In this mode, the agent team framework automatically monitors the
|
|
20
|
+
In this mode, the agent team framework automatically monitors the TaskPlan
|
|
20
21
|
and sends notifications to agents when their assigned tasks become runnable.
|
|
21
22
|
"""
|
|
22
23
|
|
|
23
24
|
def __str__(self) -> str:
|
|
24
25
|
return self.value
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
ENV_TASK_NOTIFICATION_MODE = "AUTOBYTEUS_TASK_NOTIFICATION_MODE"
|
|
29
|
+
DEFAULT_TASK_NOTIFICATION_MODE = TaskNotificationMode.AGENT_MANUAL_NOTIFICATION
|
|
30
|
+
_VALID_TASK_NOTIFICATION_MODES = {mode.value: mode for mode in TaskNotificationMode}
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
def resolve_task_notification_mode() -> TaskNotificationMode:
|
|
34
|
+
"""
|
|
35
|
+
Resolve task notification mode from environment.
|
|
36
|
+
|
|
37
|
+
Env var: AUTOBYTEUS_TASK_NOTIFICATION_MODE
|
|
38
|
+
"""
|
|
39
|
+
raw_value = os.getenv(ENV_TASK_NOTIFICATION_MODE)
|
|
40
|
+
if not raw_value:
|
|
41
|
+
return DEFAULT_TASK_NOTIFICATION_MODE
|
|
42
|
+
normalized = raw_value.strip().lower()
|
|
43
|
+
return _VALID_TASK_NOTIFICATION_MODES.get(normalized, DEFAULT_TASK_NOTIFICATION_MODE)
|
|
@@ -4,7 +4,7 @@ import logging
|
|
|
4
4
|
from typing import TYPE_CHECKING
|
|
5
5
|
|
|
6
6
|
from autobyteus.agent_team.streaming.agent_team_event_stream import AgentTeamEventStream
|
|
7
|
-
from autobyteus.agent_team.
|
|
7
|
+
from autobyteus.agent_team.status.agent_team_status import AgentTeamStatus
|
|
8
8
|
|
|
9
9
|
if TYPE_CHECKING:
|
|
10
10
|
from autobyteus.agent_team.agent_team import AgentTeam
|
|
@@ -14,10 +14,10 @@ logger = logging.getLogger(__name__)
|
|
|
14
14
|
async def _wait_loop(streamer: AgentTeamEventStream, team_id: str):
|
|
15
15
|
"""Internal helper to listen for the IDLE or ERROR event."""
|
|
16
16
|
async for event in streamer.all_events():
|
|
17
|
-
if event.event_source_type == "TEAM" and event.data.
|
|
17
|
+
if event.event_source_type == "TEAM" and event.data.new_status == AgentTeamStatus.IDLE:
|
|
18
18
|
logger.info(f"Team '{team_id}' has become idle.")
|
|
19
19
|
return
|
|
20
|
-
if event.event_source_type == "TEAM" and event.data.
|
|
20
|
+
if event.event_source_type == "TEAM" and event.data.new_status == AgentTeamStatus.ERROR:
|
|
21
21
|
error_message = f"Team '{team_id}' entered an error state while waiting for idle: {event.data.error_message}"
|
|
22
22
|
logger.error(error_message)
|
|
23
23
|
raise RuntimeError(error_message)
|
|
@@ -34,7 +34,7 @@ async def wait_for_team_to_be_idle(team: 'AgentTeam', timeout: float = 60.0):
|
|
|
34
34
|
asyncio.TimeoutError: If the team does not become idle within the timeout period.
|
|
35
35
|
RuntimeError: If the team enters an error state.
|
|
36
36
|
"""
|
|
37
|
-
if team.
|
|
37
|
+
if team.get_current_status() == AgentTeamStatus.IDLE:
|
|
38
38
|
return
|
|
39
39
|
|
|
40
40
|
logger.info(f"Waiting for team '{team.team_id}' to become idle (timeout: {timeout}s)...")
|
autobyteus/cli/agent_cli.py
CHANGED
|
@@ -70,16 +70,24 @@ async def run(agent: Agent, show_tool_logs: bool = True, show_token_usage: bool
|
|
|
70
70
|
agent_turn_complete_event.clear()
|
|
71
71
|
|
|
72
72
|
if cli_display.pending_approval_data:
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
73
|
+
approval_prompt = cli_display.get_approval_prompt()
|
|
74
|
+
if approval_prompt:
|
|
75
|
+
approval_input = await asyncio.get_event_loop().run_in_executor(None, lambda: input(approval_prompt))
|
|
76
|
+
approval_input = approval_input.strip().lower()
|
|
77
|
+
|
|
78
|
+
approval_data = cli_display.pending_approval_data
|
|
79
|
+
cli_display.clear_pending_approval()
|
|
80
|
+
|
|
81
|
+
is_approved = approval_input in ["y", "yes"]
|
|
82
|
+
reason = "User approved via CLI"
|
|
83
|
+
|
|
84
|
+
if not is_approved:
|
|
85
|
+
reason_input = await asyncio.get_event_loop().run_in_executor(None, lambda: input("Reason (optional): "))
|
|
86
|
+
reason = reason_input.strip()
|
|
87
|
+
if not reason:
|
|
88
|
+
reason = "User denied via CLI"
|
|
89
|
+
|
|
90
|
+
await agent.post_tool_execution_approval(approval_data.invocation_id, is_approved, reason)
|
|
83
91
|
|
|
84
92
|
else:
|
|
85
93
|
sys.stdout.write("You: ")
|
|
@@ -13,11 +13,12 @@ from textual.widgets import Header, Static
|
|
|
13
13
|
from textual.reactive import reactive
|
|
14
14
|
|
|
15
15
|
from autobyteus.agent_team.agent_team import AgentTeam
|
|
16
|
+
from autobyteus.agent_team.status.agent_team_status import AgentTeamStatus
|
|
16
17
|
from autobyteus.agent_team.streaming.agent_team_event_stream import AgentTeamEventStream
|
|
17
18
|
from autobyteus.agent.message.agent_input_user_message import AgentInputUserMessage
|
|
18
19
|
from autobyteus.agent.streaming.stream_events import StreamEventType as AgentStreamEventType
|
|
19
|
-
from autobyteus.
|
|
20
|
-
from autobyteus.agent_team.streaming.agent_team_stream_event_payloads import AgentEventRebroadcastPayload,
|
|
20
|
+
from autobyteus.agent_team.streaming.agent_team_stream_events import AgentTeamStreamEvent
|
|
21
|
+
from autobyteus.agent_team.streaming.agent_team_stream_event_payloads import AgentEventRebroadcastPayload, SubTeamEventRebroadcastPayload, AgentTeamStatusUpdateData
|
|
21
22
|
|
|
22
23
|
from .state import TUIStateStore
|
|
23
24
|
from .widgets.agent_list_sidebar import AgentListSidebar
|
|
@@ -104,7 +105,9 @@ class AgentTeamApp(App):
|
|
|
104
105
|
self._ui_update_pending = True
|
|
105
106
|
|
|
106
107
|
# 3. Handle real-time, incremental updates directly.
|
|
107
|
-
if isinstance(event.data,
|
|
108
|
+
if event.event_source_type == "TEAM" and isinstance(event.data, AgentTeamStatusUpdateData):
|
|
109
|
+
self.store._team_statuses[self.team.name] = event.data.new_status
|
|
110
|
+
elif isinstance(event.data, AgentEventRebroadcastPayload):
|
|
108
111
|
payload = event.data
|
|
109
112
|
agent_name = payload.agent_name
|
|
110
113
|
agent_event = payload.agent_event
|
|
@@ -132,28 +135,28 @@ class AgentTeamApp(App):
|
|
|
132
135
|
focus_pane = self.query_one(FocusPane)
|
|
133
136
|
|
|
134
137
|
tree_data = self.store.get_tree_data()
|
|
135
|
-
|
|
136
|
-
|
|
138
|
+
agent_statuses = self.store._agent_statuses
|
|
139
|
+
team_statuses = self.store._team_statuses
|
|
137
140
|
speaking_agents = self.store._speaking_agents
|
|
138
141
|
|
|
139
|
-
sidebar.update_tree(tree_data,
|
|
142
|
+
sidebar.update_tree(tree_data, agent_statuses, team_statuses, speaking_agents)
|
|
140
143
|
|
|
141
144
|
focused_data = self.focused_node_data
|
|
142
145
|
if focused_data and focused_data.get("type") in ['team', 'subteam']:
|
|
143
146
|
node_name = focused_data['name']
|
|
144
|
-
task_plan = self.store.
|
|
145
|
-
task_statuses = self.store.
|
|
147
|
+
task_plan = self.store.get_task_plan_tasks(node_name)
|
|
148
|
+
task_statuses = self.store.get_task_plan_statuses(node_name)
|
|
146
149
|
await focus_pane.update_content(
|
|
147
150
|
node_data=focused_data,
|
|
148
151
|
history=[], # No history for teams
|
|
149
152
|
pending_approval=None,
|
|
150
|
-
|
|
151
|
-
|
|
153
|
+
all_agent_statuses=agent_statuses,
|
|
154
|
+
all_team_statuses=team_statuses,
|
|
152
155
|
task_plan=task_plan,
|
|
153
156
|
task_statuses=task_statuses
|
|
154
157
|
)
|
|
155
158
|
elif focused_data and focused_data.get("type") == 'agent':
|
|
156
|
-
focus_pane.update_current_node_status(
|
|
159
|
+
focus_pane.update_current_node_status(agent_statuses, team_statuses)
|
|
157
160
|
|
|
158
161
|
|
|
159
162
|
async def watch_focused_node_data(self, new_node_data: Optional[Dict[str, Any]]):
|
|
@@ -169,8 +172,8 @@ class AgentTeamApp(App):
|
|
|
169
172
|
task_plan = None
|
|
170
173
|
task_statuses = None
|
|
171
174
|
if node_type in ['team', 'subteam']:
|
|
172
|
-
task_plan = self.store.
|
|
173
|
-
task_statuses = self.store.
|
|
175
|
+
task_plan = self.store.get_task_plan_tasks(node_name)
|
|
176
|
+
task_statuses = self.store.get_task_plan_statuses(node_name)
|
|
174
177
|
|
|
175
178
|
sidebar = self.query_one(AgentListSidebar)
|
|
176
179
|
focus_pane = self.query_one(FocusPane)
|
|
@@ -179,8 +182,8 @@ class AgentTeamApp(App):
|
|
|
179
182
|
node_data=new_node_data,
|
|
180
183
|
history=history,
|
|
181
184
|
pending_approval=pending_approval,
|
|
182
|
-
|
|
183
|
-
|
|
185
|
+
all_agent_statuses=self.store._agent_statuses,
|
|
186
|
+
all_team_statuses=self.store._team_statuses,
|
|
184
187
|
task_plan=task_plan,
|
|
185
188
|
task_statuses=task_statuses
|
|
186
189
|
)
|