autobyteus 1.2.1__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 +19 -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 +69 -59
- 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/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 -183
- 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 -223
- autobyteus/agent/streaming/stream_events.py +3 -140
- 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 +1 -2
- autobyteus/agent_team/bootstrap_steps/team_context_initialization_step.py +4 -4
- 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 +9 -6
- 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 +6 -6
- autobyteus/agent_team/streaming/agent_team_stream_event_payloads.py +4 -4
- autobyteus/agent_team/streaming/agent_team_stream_events.py +3 -3
- 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/task_notification_mode.py +19 -0
- autobyteus/agent_team/utils/wait_for_idle.py +4 -4
- autobyteus/cli/agent_cli.py +18 -10
- autobyteus/cli/agent_team_tui/app.py +14 -11
- autobyteus/cli/agent_team_tui/state.py +13 -15
- autobyteus/cli/agent_team_tui/widgets/agent_list_sidebar.py +15 -15
- autobyteus/cli/agent_team_tui/widgets/focus_pane.py +143 -36
- autobyteus/cli/agent_team_tui/widgets/renderables.py +1 -1
- autobyteus/cli/agent_team_tui/widgets/shared.py +25 -25
- 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 +11 -18
- 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/autobyteus_audio_client.py +19 -5
- autobyteus/multimedia/audio/api/gemini_audio_client.py +108 -16
- autobyteus/multimedia/audio/audio_client_factory.py +47 -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/tools/todo_tools/add_todo.py +2 -2
- autobyteus/task_management/tools/todo_tools/create_todo_list.py +2 -2
- autobyteus/task_management/tools/todo_tools/update_todo_status.py +2 -2
- autobyteus/tools/__init__.py +34 -47
- autobyteus/tools/base_tool.py +7 -0
- autobyteus/tools/file/__init__.py +2 -6
- autobyteus/tools/file/patch_file.py +149 -0
- autobyteus/tools/file/read_file.py +36 -5
- autobyteus/tools/file/write_file.py +4 -1
- autobyteus/tools/functional_tool.py +43 -6
- 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/types.py +61 -0
- autobyteus/tools/multimedia/audio_tools.py +70 -17
- autobyteus/tools/multimedia/download_media_tool.py +18 -4
- autobyteus/tools/multimedia/image_tools.py +246 -62
- 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 +43 -2
- 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/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 +3 -9
- 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.1.dist-info → autobyteus-1.2.3.dist-info}/WHEEL +1 -1
- {autobyteus-1.2.1.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/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/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/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 -84
- autobyteus/tools/browser/standalone/web_page_pdf_generator.py +0 -101
- autobyteus/tools/browser/standalone/webpage_image_downloader.py +0 -169
- autobyteus/tools/browser/standalone/webpage_reader.py +0 -105
- autobyteus/tools/browser/standalone/webpage_screenshot_taker.py +0 -105
- autobyteus/tools/file/edit_file.py +0 -200
- autobyteus/tools/file/list_directory.py +0 -168
- autobyteus/tools/file/search_files.py +0 -188
- autobyteus/tools/timer.py +0 -175
- 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.1.dist-info/METADATA +0 -205
- autobyteus-1.2.1.dist-info/RECORD +0 -511
- examples/__init__.py +0 -1
- examples/agent_team/__init__.py +0 -1
- examples/discover_phase_transitions.py +0 -104
- examples/run_agentic_software_engineer.py +0 -239
- 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/{tools/browser/session_aware → skills}/__init__.py +0 -0
- /autobyteus/tools/{browser/session_aware/factory → skill}/__init__.py +0 -0
- {autobyteus-1.2.1.dist-info → autobyteus-1.2.3.dist-info}/licenses/LICENSE +0 -0
|
@@ -5,13 +5,13 @@ 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
|
-
|
|
8
|
+
AgentTeamStatusUpdateData, AgentEventRebroadcastPayload,
|
|
9
9
|
SubTeamEventRebroadcastPayload, TaskPlanEventPayload
|
|
10
10
|
)
|
|
11
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
17
|
AgentTeamStreamDataPayload = Union[TeamSpecificPayload, AgentEventRebroadcastPayload, SubTeamEventRebroadcastPayload, TaskPlanEventPayload]
|
|
@@ -32,7 +32,7 @@ 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
37
|
is_task_plan_event = self.event_source_type == "TASK_PLAN"
|
|
38
38
|
is_task_plan_payload = isinstance(self.data, BaseTaskPlanEvent)
|
|
@@ -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)
|
|
@@ -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):
|
|
@@ -22,3 +23,21 @@ class TaskNotificationMode(str, Enum):
|
|
|
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,11 +135,11 @@ 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']:
|
|
@@ -147,13 +150,13 @@ class AgentTeamApp(App):
|
|
|
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]]):
|
|
@@ -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
|
)
|
|
@@ -7,15 +7,15 @@ import copy
|
|
|
7
7
|
|
|
8
8
|
from autobyteus.agent.context import AgentConfig
|
|
9
9
|
from autobyteus.agent_team.agent_team import AgentTeam
|
|
10
|
-
from autobyteus.agent.
|
|
11
|
-
from autobyteus.agent_team.
|
|
10
|
+
from autobyteus.agent.status.status_enum import AgentStatus
|
|
11
|
+
from autobyteus.agent_team.status.agent_team_status import AgentTeamStatus
|
|
12
12
|
from autobyteus.agent.streaming.stream_events import StreamEvent as AgentStreamEvent, StreamEventType as AgentStreamEventType
|
|
13
13
|
from autobyteus.agent.streaming.stream_event_payloads import (
|
|
14
|
-
|
|
15
|
-
|
|
14
|
+
AgentStatusUpdateData, ToolInvocationApprovalRequestedData,
|
|
15
|
+
AssistantCompleteResponseData
|
|
16
16
|
)
|
|
17
17
|
from autobyteus.agent_team.streaming.agent_team_stream_events import AgentTeamStreamEvent
|
|
18
|
-
from autobyteus.agent_team.streaming.agent_team_stream_event_payloads import AgentEventRebroadcastPayload, SubTeamEventRebroadcastPayload,
|
|
18
|
+
from autobyteus.agent_team.streaming.agent_team_stream_event_payloads import AgentEventRebroadcastPayload, SubTeamEventRebroadcastPayload, AgentTeamStatusUpdateData
|
|
19
19
|
from autobyteus.task_management.task import Task
|
|
20
20
|
from autobyteus.task_management.events import TasksCreatedEvent, TaskStatusUpdatedEvent
|
|
21
21
|
from autobyteus.task_management.base_task_plan import TaskStatus
|
|
@@ -39,8 +39,8 @@ class TUIStateStore:
|
|
|
39
39
|
|
|
40
40
|
self._node_roles: Dict[str, str] = self._extract_node_roles(team)
|
|
41
41
|
self._nodes: Dict[str, Any] = self._initialize_root_node()
|
|
42
|
-
self.
|
|
43
|
-
self.
|
|
42
|
+
self._agent_statuses: Dict[str, AgentStatus] = {}
|
|
43
|
+
self._team_statuses: Dict[str, AgentTeamStatus] = {self.team_name: AgentTeamStatus.UNINITIALIZED}
|
|
44
44
|
self._agent_event_history: Dict[str, List[AgentStreamEvent]] = {}
|
|
45
45
|
self._team_event_history: Dict[str, List[AgentTeamStreamEvent]] = {self.team_name: []}
|
|
46
46
|
self._pending_approvals: Dict[str, ToolInvocationApprovalRequestedData] = {}
|
|
@@ -75,8 +75,8 @@ class TUIStateStore:
|
|
|
75
75
|
def process_event(self, event: AgentTeamStreamEvent):
|
|
76
76
|
self.version += 1 # Increment on any event to signal a change
|
|
77
77
|
|
|
78
|
-
if event.event_source_type == "TEAM" and isinstance(event.data,
|
|
79
|
-
self.
|
|
78
|
+
if event.event_source_type == "TEAM" and isinstance(event.data, AgentTeamStatusUpdateData):
|
|
79
|
+
self._team_statuses[self.team_name] = event.data.new_status
|
|
80
80
|
|
|
81
81
|
self._process_event_recursively(event, self.team_name)
|
|
82
82
|
|
|
@@ -121,11 +121,9 @@ class TUIStateStore:
|
|
|
121
121
|
else: logger.error(f"Cannot add agent node '{agent_name}': parent '{parent_name}' not found.")
|
|
122
122
|
self._agent_event_history[agent_name].append(agent_event)
|
|
123
123
|
|
|
124
|
-
if agent_event.event_type == AgentStreamEventType.
|
|
125
|
-
self.
|
|
124
|
+
if agent_event.event_type == AgentStreamEventType.AGENT_STATUS_UPDATED:
|
|
125
|
+
self._agent_statuses[agent_name] = agent_event.data.new_status
|
|
126
126
|
if agent_name in self._pending_approvals: del self._pending_approvals[agent_name]
|
|
127
|
-
elif agent_event.event_type == AgentStreamEventType.AGENT_IDLE:
|
|
128
|
-
self._agent_phases[agent_name] = AgentOperationalPhase.IDLE
|
|
129
127
|
elif agent_event.event_type == AgentStreamEventType.TOOL_INVOCATION_APPROVAL_REQUESTED:
|
|
130
128
|
self._pending_approvals[agent_name] = agent_event.data
|
|
131
129
|
|
|
@@ -136,8 +134,8 @@ class TUIStateStore:
|
|
|
136
134
|
if not self._find_node(sub_team_name):
|
|
137
135
|
role = self._node_roles.get(sub_team_name, "Sub-Team")
|
|
138
136
|
self._add_node(sub_team_name, {"type": "subteam", "name": sub_team_name, "role": role, "children": {}}, parent_name)
|
|
139
|
-
if sub_team_event.event_source_type == "TEAM" and isinstance(sub_team_event.data,
|
|
140
|
-
self.
|
|
137
|
+
if sub_team_event.event_source_type == "TEAM" and isinstance(sub_team_event.data, AgentTeamStatusUpdateData):
|
|
138
|
+
self._team_statuses[sub_team_name] = sub_team_event.data.new_status
|
|
141
139
|
self._process_event_recursively(sub_team_event, parent_name=sub_team_name)
|
|
142
140
|
|
|
143
141
|
def _add_node(self, node_name: str, node_data: Dict, parent_name: str):
|
|
@@ -10,10 +10,10 @@ from textual.widgets import Static, Tree
|
|
|
10
10
|
from textual.widgets.tree import TreeNode
|
|
11
11
|
from textual.containers import Vertical
|
|
12
12
|
|
|
13
|
-
from autobyteus.agent.
|
|
14
|
-
from autobyteus.agent_team.
|
|
13
|
+
from autobyteus.agent.status.status_enum import AgentStatus
|
|
14
|
+
from autobyteus.agent_team.status.agent_team_status import AgentTeamStatus
|
|
15
15
|
from .shared import (
|
|
16
|
-
|
|
16
|
+
AGENT_STATUS_ICONS, TEAM_STATUS_ICONS, SUB_TEAM_ICON,
|
|
17
17
|
TEAM_ICON, SPEAKING_ICON, DEFAULT_ICON
|
|
18
18
|
)
|
|
19
19
|
from .logo import Logo
|
|
@@ -45,19 +45,19 @@ class AgentListSidebar(Static):
|
|
|
45
45
|
self.post_message(self.NodeSelected(event.node.data))
|
|
46
46
|
event.stop()
|
|
47
47
|
|
|
48
|
-
def _build_label(self, name: str, node_data: Dict,
|
|
48
|
+
def _build_label(self, name: str, node_data: Dict, agent_statuses: Dict, team_statuses: Dict, speaking_agents: Dict) -> str:
|
|
49
49
|
"""Constructs the display label for a tree node."""
|
|
50
50
|
node_type = node_data["type"]
|
|
51
51
|
icon = DEFAULT_ICON
|
|
52
52
|
|
|
53
53
|
if node_type == "agent":
|
|
54
|
-
|
|
55
|
-
icon = SPEAKING_ICON if speaking_agents.get(name) else
|
|
54
|
+
status = agent_statuses.get(name, AgentStatus.UNINITIALIZED)
|
|
55
|
+
icon = SPEAKING_ICON if speaking_agents.get(name) else AGENT_STATUS_ICONS.get(status, DEFAULT_ICON)
|
|
56
56
|
label = f"{icon} {name}"
|
|
57
57
|
elif node_type in ["team", "subteam"]:
|
|
58
|
-
|
|
58
|
+
status = team_statuses.get(name, AgentTeamStatus.UNINITIALIZED)
|
|
59
59
|
default_icon = TEAM_ICON if node_type == "team" else SUB_TEAM_ICON
|
|
60
|
-
icon =
|
|
60
|
+
icon = TEAM_STATUS_ICONS.get(status, default_icon)
|
|
61
61
|
role = node_data.get("role")
|
|
62
62
|
label = f"{icon} {role or name}"
|
|
63
63
|
if role and role != name:
|
|
@@ -67,7 +67,7 @@ class AgentListSidebar(Static):
|
|
|
67
67
|
|
|
68
68
|
return label
|
|
69
69
|
|
|
70
|
-
def update_tree(self, tree_data: Dict,
|
|
70
|
+
def update_tree(self, tree_data: Dict, agent_statuses: Dict[str, AgentStatus], team_statuses: Dict[str, AgentTeamStatus], speaking_agents: Dict[str, bool]):
|
|
71
71
|
"""
|
|
72
72
|
Performs an in-place update of the tree to reflect the new state,
|
|
73
73
|
avoiding a full rebuild for better performance and preserving UI state like expansion.
|
|
@@ -82,17 +82,17 @@ class AgentListSidebar(Static):
|
|
|
82
82
|
root_node_data = tree_data[root_name]
|
|
83
83
|
|
|
84
84
|
# Kick off the recursive update from the root.
|
|
85
|
-
self._update_node_recursively(tree.root, root_node_data,
|
|
85
|
+
self._update_node_recursively(tree.root, root_node_data, agent_statuses, team_statuses, speaking_agents)
|
|
86
86
|
|
|
87
87
|
# Ensure the root is expanded on the first run.
|
|
88
88
|
if not tree.root.is_expanded:
|
|
89
89
|
tree.root.expand()
|
|
90
90
|
|
|
91
|
-
def _update_node_recursively(self, ui_node: TreeNode, node_data: Dict,
|
|
91
|
+
def _update_node_recursively(self, ui_node: TreeNode, node_data: Dict, agent_statuses: Dict, team_statuses: Dict, speaking_agents: Dict):
|
|
92
92
|
"""Recursively updates a node and reconciles its children."""
|
|
93
93
|
# 1. Update the current node's label and data
|
|
94
94
|
name = node_data['name']
|
|
95
|
-
label = self._build_label(name, node_data,
|
|
95
|
+
label = self._build_label(name, node_data, agent_statuses, team_statuses, speaking_agents)
|
|
96
96
|
ui_node.set_label(label)
|
|
97
97
|
ui_node.data = node_data
|
|
98
98
|
self._node_map[name] = ui_node # Ensure map is always up-to-date
|
|
@@ -106,10 +106,10 @@ class AgentListSidebar(Static):
|
|
|
106
106
|
if child_name in existing_ui_children_by_name:
|
|
107
107
|
# Node exists, so we recursively update it
|
|
108
108
|
child_ui_node = existing_ui_children_by_name[child_name]
|
|
109
|
-
self._update_node_recursively(child_ui_node, child_data,
|
|
109
|
+
self._update_node_recursively(child_ui_node, child_data, agent_statuses, team_statuses, speaking_agents)
|
|
110
110
|
else:
|
|
111
111
|
# Node is new, so we add it
|
|
112
|
-
new_child_label = self._build_label(child_name, child_data,
|
|
112
|
+
new_child_label = self._build_label(child_name, child_data, agent_statuses, team_statuses, speaking_agents)
|
|
113
113
|
is_leaf = child_data.get("children", {}) == {} and child_data['type'] == 'agent'
|
|
114
114
|
|
|
115
115
|
if is_leaf:
|
|
@@ -117,7 +117,7 @@ class AgentListSidebar(Static):
|
|
|
117
117
|
else:
|
|
118
118
|
new_ui_node = ui_node.add(new_child_label, data=child_data)
|
|
119
119
|
# Since this is a new branch, we must build its children too
|
|
120
|
-
self._update_node_recursively(new_ui_node, child_data,
|
|
120
|
+
self._update_node_recursively(new_ui_node, child_data, agent_statuses, team_statuses, speaking_agents)
|
|
121
121
|
|
|
122
122
|
self._node_map[child_name] = new_ui_node
|
|
123
123
|
|