autobyteus 1.2.1__py3-none-any.whl → 1.3.0__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 +3 -3
- autobyteus/agent/bootstrap_steps/agent_bootstrapper.py +5 -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/working_context_snapshot_restore_step.py +38 -0
- autobyteus/agent/bootstrap_steps/workspace_context_initialization_step.py +2 -4
- autobyteus/agent/context/agent_config.py +47 -20
- autobyteus/agent/context/agent_context.py +23 -18
- autobyteus/agent/context/agent_runtime_state.py +21 -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 +83 -6
- 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 +44 -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 +82 -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 +35 -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 +205 -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/path_resolver.py +27 -0
- autobyteus/memory/policies/__init__.py +5 -0
- autobyteus/memory/policies/compaction_policy.py +16 -0
- autobyteus/memory/restore/__init__.py +1 -0
- autobyteus/memory/restore/working_context_snapshot_bootstrapper.py +61 -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 +9 -0
- autobyteus/memory/store/base_store.py +14 -0
- autobyteus/memory/store/file_store.py +98 -0
- autobyteus/memory/store/working_context_snapshot_store.py +28 -0
- autobyteus/memory/tool_interaction_builder.py +46 -0
- autobyteus/memory/turn_tracker.py +9 -0
- autobyteus/memory/working_context_snapshot.py +69 -0
- autobyteus/memory/working_context_snapshot_serializer.py +135 -0
- autobyteus/multimedia/audio/api/autobyteus_audio_client.py +19 -5
- autobyteus/multimedia/audio/api/gemini_audio_client.py +109 -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 +39 -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 +64 -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.3.0.dist-info/METADATA +293 -0
- autobyteus-1.3.0.dist-info/RECORD +606 -0
- {autobyteus-1.2.1.dist-info → autobyteus-1.3.0.dist-info}/WHEEL +1 -1
- {autobyteus-1.2.1.dist-info → autobyteus-1.3.0.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.3.0.dist-info}/licenses/LICENSE +0 -0
|
@@ -12,18 +12,19 @@ from textual.message import Message
|
|
|
12
12
|
from textual.widgets import Input, Static, Button
|
|
13
13
|
from textual.containers import VerticalScroll, Horizontal
|
|
14
14
|
|
|
15
|
-
from autobyteus.agent.
|
|
16
|
-
from autobyteus.agent_team.
|
|
15
|
+
from autobyteus.agent.status.status_enum import AgentStatus
|
|
16
|
+
from autobyteus.agent_team.status.agent_team_status import AgentTeamStatus
|
|
17
17
|
from autobyteus.task_management.base_task_plan import TaskStatus
|
|
18
18
|
from autobyteus.task_management.task import Task
|
|
19
19
|
from autobyteus.agent.streaming.stream_events import StreamEvent as AgentStreamEvent, StreamEventType as AgentStreamEventType
|
|
20
20
|
from autobyteus.agent.streaming.stream_event_payloads import (
|
|
21
|
-
|
|
21
|
+
AgentStatusUpdateData, AssistantChunkData, AssistantCompleteResponseData,
|
|
22
22
|
ErrorEventData, ToolInteractionLogEntryData, ToolInvocationApprovalRequestedData, ToolInvocationAutoExecutingData,
|
|
23
|
-
SystemTaskNotificationData
|
|
23
|
+
SystemTaskNotificationData, SegmentEventData
|
|
24
24
|
)
|
|
25
|
+
from autobyteus.agent.streaming.parser.events import SegmentEventType, SegmentType
|
|
25
26
|
from .shared import (
|
|
26
|
-
|
|
27
|
+
AGENT_STATUS_ICONS, TEAM_STATUS_ICONS, SUB_TEAM_ICON, DEFAULT_ICON,
|
|
27
28
|
USER_ICON, ASSISTANT_ICON, TEAM_ICON, AGENT_ICON, SYSTEM_TASK_ICON
|
|
28
29
|
)
|
|
29
30
|
from . import renderables
|
|
@@ -65,6 +66,8 @@ class FocusPane(Static):
|
|
|
65
66
|
# Buffers for batched UI updates to improve performance
|
|
66
67
|
self._reasoning_buffer: str = ""
|
|
67
68
|
self._content_buffer: str = ""
|
|
69
|
+
self._segment_types_by_id: Dict[str, SegmentType] = {}
|
|
70
|
+
self._saw_segment_event: bool = False
|
|
68
71
|
|
|
69
72
|
def compose(self):
|
|
70
73
|
yield Static("Select a node from the sidebar", id="focus-pane-title")
|
|
@@ -89,7 +92,15 @@ class FocusPane(Static):
|
|
|
89
92
|
return
|
|
90
93
|
|
|
91
94
|
is_approved = event.button.id == "approve-btn"
|
|
92
|
-
|
|
95
|
+
|
|
96
|
+
info_input = self.query_one(Input)
|
|
97
|
+
user_reason = info_input.value.strip()
|
|
98
|
+
info_input.value = "" # Clear the input
|
|
99
|
+
|
|
100
|
+
if user_reason:
|
|
101
|
+
reason = user_reason
|
|
102
|
+
else:
|
|
103
|
+
reason = "User approved via TUI." if is_approved else "User denied via TUI."
|
|
93
104
|
|
|
94
105
|
log_container = self.query_one("#focus-pane-log-container")
|
|
95
106
|
approval_text = "APPROVED" if is_approved else "DENIED"
|
|
@@ -121,8 +132,8 @@ class FocusPane(Static):
|
|
|
121
132
|
async def _show_approval_prompt(self):
|
|
122
133
|
if not self._pending_approval_data: return
|
|
123
134
|
input_widget = self.query_one(Input)
|
|
124
|
-
input_widget.placeholder = "
|
|
125
|
-
input_widget.disabled =
|
|
135
|
+
input_widget.placeholder = "Optional: Enter a reason for your decision..."
|
|
136
|
+
input_widget.disabled = False
|
|
126
137
|
button_container = self.query_one("#approval-buttons")
|
|
127
138
|
await button_container.remove_children()
|
|
128
139
|
await button_container.mount(
|
|
@@ -130,7 +141,7 @@ class FocusPane(Static):
|
|
|
130
141
|
Button("Deny", variant="error", id="deny-btn")
|
|
131
142
|
)
|
|
132
143
|
|
|
133
|
-
def _update_title(self,
|
|
144
|
+
def _update_title(self, agent_statuses: Dict[str, AgentStatus], team_statuses: Dict[str, AgentTeamStatus]):
|
|
134
145
|
"""Renders the title of the focus pane with the node's current status."""
|
|
135
146
|
if not self._focused_node_data:
|
|
136
147
|
self.query_one("#focus-pane-title").update("Select a node from the sidebar")
|
|
@@ -141,31 +152,31 @@ class FocusPane(Static):
|
|
|
141
152
|
node_type_str = node_type.replace("_", " ").capitalize()
|
|
142
153
|
|
|
143
154
|
title_icon = DEFAULT_ICON
|
|
144
|
-
|
|
155
|
+
status_str = ""
|
|
145
156
|
|
|
146
157
|
if node_type == 'agent':
|
|
147
158
|
title_icon = AGENT_ICON
|
|
148
|
-
|
|
149
|
-
|
|
159
|
+
status = agent_statuses.get(node_name, AgentStatus.UNINITIALIZED)
|
|
160
|
+
status_str = f" (Status: {status.value})"
|
|
150
161
|
elif node_type == 'subteam':
|
|
151
162
|
title_icon = SUB_TEAM_ICON
|
|
152
|
-
|
|
153
|
-
|
|
163
|
+
status = team_statuses.get(node_name, AgentTeamStatus.UNINITIALIZED)
|
|
164
|
+
status_str = f" (Status: {status.value})"
|
|
154
165
|
elif node_type == 'team':
|
|
155
166
|
title_icon = TEAM_ICON
|
|
156
|
-
|
|
157
|
-
|
|
167
|
+
status = team_statuses.get(node_name, AgentTeamStatus.UNINITIALIZED)
|
|
168
|
+
status_str = f" (Status: {status.value})"
|
|
158
169
|
|
|
159
|
-
self.query_one("#focus-pane-title").update(f"{title_icon} {node_type_str}: [bold]{node_name}[/bold]{
|
|
170
|
+
self.query_one("#focus-pane-title").update(f"{title_icon} {node_type_str}: [bold]{node_name}[/bold]{status_str}")
|
|
160
171
|
|
|
161
|
-
def update_current_node_status(self,
|
|
172
|
+
def update_current_node_status(self, all_agent_statuses: Dict, all_team_statuses: Dict):
|
|
162
173
|
"""A lightweight method to only update the title with the latest status."""
|
|
163
|
-
self._update_title(
|
|
174
|
+
self._update_title(all_agent_statuses, all_team_statuses)
|
|
164
175
|
|
|
165
176
|
async def update_content(self, node_data: Dict[str, Any], history: List[Any],
|
|
166
177
|
pending_approval: Optional[ToolInvocationApprovalRequestedData],
|
|
167
|
-
|
|
168
|
-
|
|
178
|
+
all_agent_statuses: Dict[str, AgentStatus],
|
|
179
|
+
all_team_statuses: Dict[str, AgentTeamStatus],
|
|
169
180
|
task_plan: Optional[List[Task]],
|
|
170
181
|
task_statuses: Optional[Dict[str, TaskStatus]]):
|
|
171
182
|
"""The main method to update the entire pane based on new state."""
|
|
@@ -174,7 +185,7 @@ class FocusPane(Static):
|
|
|
174
185
|
self._focused_node_data = node_data
|
|
175
186
|
self._pending_approval_data = pending_approval
|
|
176
187
|
|
|
177
|
-
self._update_title(
|
|
188
|
+
self._update_title(all_agent_statuses, all_team_statuses)
|
|
178
189
|
|
|
179
190
|
log_container = self.query_one("#focus-pane-log-container")
|
|
180
191
|
await log_container.remove_children()
|
|
@@ -192,23 +203,23 @@ class FocusPane(Static):
|
|
|
192
203
|
if self._pending_approval_data:
|
|
193
204
|
await self._show_approval_prompt()
|
|
194
205
|
elif self._focused_node_data.get("type") in ['team', 'subteam']:
|
|
195
|
-
await self._render_team_dashboard(node_data,
|
|
206
|
+
await self._render_team_dashboard(node_data, all_agent_statuses, all_team_statuses, task_plan, task_statuses)
|
|
196
207
|
|
|
197
|
-
async def _render_team_dashboard(self, node_data: Dict[str, Any],
|
|
198
|
-
|
|
199
|
-
|
|
208
|
+
async def _render_team_dashboard(self, node_data: Dict[str, Any],
|
|
209
|
+
all_agent_statuses: Dict[str, AgentStatus],
|
|
210
|
+
all_team_statuses: Dict[str, AgentTeamStatus],
|
|
200
211
|
task_plan: Optional[List[Task]],
|
|
201
212
|
task_statuses: Optional[Dict[str, TaskStatus]]):
|
|
202
213
|
"""Renders a static summary dashboard for a team or sub-team."""
|
|
203
214
|
log_container = self.query_one("#focus-pane-log-container")
|
|
204
215
|
|
|
205
|
-
|
|
206
|
-
|
|
216
|
+
status = all_team_statuses.get(node_data['name'], AgentTeamStatus.UNINITIALIZED)
|
|
217
|
+
status_icon = TEAM_STATUS_ICONS.get(status, DEFAULT_ICON)
|
|
207
218
|
info_text = Text()
|
|
208
219
|
info_text.append(f"Name: {node_data['name']}\n", style="bold")
|
|
209
220
|
if node_data.get('role'):
|
|
210
221
|
info_text.append(f"Role: {node_data['role']}\n")
|
|
211
|
-
info_text.append(f"Status: {
|
|
222
|
+
info_text.append(f"Status: {status_icon} {status.value}")
|
|
212
223
|
await log_container.mount(Static(Panel(info_text, title="Team Info", border_style="green", title_align="left")))
|
|
213
224
|
|
|
214
225
|
await log_container.mount(TaskPlanPanel(tasks=task_plan, statuses=task_statuses, team_name=node_data['name']))
|
|
@@ -218,13 +229,13 @@ class FocusPane(Static):
|
|
|
218
229
|
team_text = Text()
|
|
219
230
|
for name, child_node in children_data.items():
|
|
220
231
|
if child_node['type'] == 'agent':
|
|
221
|
-
|
|
222
|
-
agent_icon =
|
|
223
|
-
team_text.append(f" ▪ {agent_icon} {name} (Agent): {
|
|
232
|
+
agent_status = all_agent_statuses.get(name, AgentStatus.UNINITIALIZED)
|
|
233
|
+
agent_icon = AGENT_STATUS_ICONS.get(agent_status, DEFAULT_ICON)
|
|
234
|
+
team_text.append(f" ▪ {agent_icon} {name} (Agent): {agent_status.value}\n")
|
|
224
235
|
elif child_node['type'] == 'subteam':
|
|
225
|
-
|
|
226
|
-
wf_icon =
|
|
227
|
-
team_text.append(f" ▪ {wf_icon} {name} (Sub-Team): {
|
|
236
|
+
wf_status = all_team_statuses.get(name, AgentTeamStatus.UNINITIALIZED)
|
|
237
|
+
wf_icon = TEAM_STATUS_ICONS.get(wf_status, SUB_TEAM_ICON)
|
|
238
|
+
team_text.append(f" ▪ {wf_icon} {name} (Sub-Team): {wf_status.value}\n")
|
|
228
239
|
await log_container.mount(Static(Panel(team_text, title="Team Status", border_style="blue", title_align="left")))
|
|
229
240
|
|
|
230
241
|
async def _close_thinking_block(self, scroll: bool = True):
|
|
@@ -252,10 +263,105 @@ class FocusPane(Static):
|
|
|
252
263
|
if scrolled:
|
|
253
264
|
self.query_one("#focus-pane-log-container").scroll_end(animate=False)
|
|
254
265
|
|
|
266
|
+
async def _ensure_thinking_widget(self, log_container: VerticalScroll) -> None:
|
|
267
|
+
if self._thinking_widget is None:
|
|
268
|
+
self.flush_stream_buffers()
|
|
269
|
+
await log_container.mount(Static(""))
|
|
270
|
+
self._thinking_text = Text("<Thinking>\n", style="dim italic cyan")
|
|
271
|
+
self._thinking_widget = Static(self._thinking_text)
|
|
272
|
+
await log_container.mount(self._thinking_widget)
|
|
273
|
+
|
|
274
|
+
async def _ensure_assistant_content_widget(self, log_container: VerticalScroll) -> None:
|
|
275
|
+
if self._assistant_content_widget is None:
|
|
276
|
+
await log_container.mount(Static(""))
|
|
277
|
+
self._assistant_content_text = Text(f"{ASSISTANT_ICON} assistant: ", style="bold green")
|
|
278
|
+
self._assistant_content_widget = Static(self._assistant_content_text)
|
|
279
|
+
await log_container.mount(self._assistant_content_widget)
|
|
280
|
+
|
|
281
|
+
async def _handle_segment_event(self, data: SegmentEventData) -> None:
|
|
282
|
+
log_container = self.query_one("#focus-pane-log-container")
|
|
283
|
+
self._saw_segment_event = True
|
|
284
|
+
try:
|
|
285
|
+
event_type = SegmentEventType(data.event_type)
|
|
286
|
+
except ValueError:
|
|
287
|
+
logger.debug(f"TUI FocusPane: Unknown segment event type '{data.event_type}'.")
|
|
288
|
+
return
|
|
289
|
+
|
|
290
|
+
segment_type = None
|
|
291
|
+
if data.segment_type:
|
|
292
|
+
try:
|
|
293
|
+
segment_type = SegmentType(data.segment_type)
|
|
294
|
+
except ValueError:
|
|
295
|
+
logger.debug(f"TUI FocusPane: Unknown segment type '{data.segment_type}'.")
|
|
296
|
+
|
|
297
|
+
if segment_type is None and data.segment_id in self._segment_types_by_id:
|
|
298
|
+
segment_type = self._segment_types_by_id.get(data.segment_id)
|
|
299
|
+
|
|
300
|
+
metadata = {}
|
|
301
|
+
if isinstance(data.payload, dict):
|
|
302
|
+
metadata = data.payload.get("metadata", {}) or {}
|
|
303
|
+
|
|
304
|
+
if event_type == SegmentEventType.START:
|
|
305
|
+
if segment_type is not None:
|
|
306
|
+
self._segment_types_by_id[data.segment_id] = segment_type
|
|
307
|
+
|
|
308
|
+
if segment_type != SegmentType.REASONING:
|
|
309
|
+
await self._close_thinking_block(scroll=False)
|
|
310
|
+
|
|
311
|
+
if segment_type == SegmentType.REASONING:
|
|
312
|
+
await self._ensure_thinking_widget(log_container)
|
|
313
|
+
return
|
|
314
|
+
|
|
315
|
+
await self._ensure_assistant_content_widget(log_container)
|
|
316
|
+
|
|
317
|
+
if segment_type == SegmentType.WRITE_FILE:
|
|
318
|
+
path = metadata.get("path", "")
|
|
319
|
+
header = f"<write_file path=\"{path}\">" if path else "<write_file>"
|
|
320
|
+
self._content_buffer += f"{header}\n"
|
|
321
|
+
elif segment_type == SegmentType.RUN_BASH:
|
|
322
|
+
self._content_buffer += "<run_bash>\n"
|
|
323
|
+
elif segment_type == SegmentType.TOOL_CALL:
|
|
324
|
+
tool_name = metadata.get("tool_name", "")
|
|
325
|
+
header = f"<tool name=\"{tool_name}\">" if tool_name else "<tool>"
|
|
326
|
+
self._content_buffer += f"{header}\n"
|
|
327
|
+
return
|
|
328
|
+
|
|
329
|
+
if event_type == SegmentEventType.CONTENT:
|
|
330
|
+
delta = ""
|
|
331
|
+
if isinstance(data.payload, dict):
|
|
332
|
+
delta = data.payload.get("delta", "")
|
|
333
|
+
|
|
334
|
+
if segment_type == SegmentType.REASONING:
|
|
335
|
+
await self._ensure_thinking_widget(log_container)
|
|
336
|
+
self._reasoning_buffer += str(delta)
|
|
337
|
+
else:
|
|
338
|
+
await self._ensure_assistant_content_widget(log_container)
|
|
339
|
+
self._content_buffer += str(delta)
|
|
340
|
+
return
|
|
341
|
+
|
|
342
|
+
if event_type == SegmentEventType.END:
|
|
343
|
+
if segment_type == SegmentType.REASONING:
|
|
344
|
+
await self._close_thinking_block()
|
|
345
|
+
self._segment_types_by_id.pop(data.segment_id, None)
|
|
346
|
+
return
|
|
347
|
+
|
|
348
|
+
if segment_type in {SegmentType.WRITE_FILE, SegmentType.RUN_BASH, SegmentType.TOOL_CALL}:
|
|
349
|
+
tag = "write_file" if segment_type == SegmentType.WRITE_FILE else (
|
|
350
|
+
"run_bash" if segment_type == SegmentType.RUN_BASH else "tool"
|
|
351
|
+
)
|
|
352
|
+
self._content_buffer += f"\n</{tag}>\n"
|
|
353
|
+
|
|
354
|
+
self._segment_types_by_id.pop(data.segment_id, None)
|
|
355
|
+
return
|
|
356
|
+
|
|
255
357
|
async def add_agent_event(self, event: AgentStreamEvent):
|
|
256
358
|
log_container = self.query_one("#focus-pane-log-container")
|
|
257
359
|
event_type = event.event_type
|
|
258
360
|
|
|
361
|
+
if event_type == AgentStreamEventType.SEGMENT_EVENT and isinstance(event.data, SegmentEventData):
|
|
362
|
+
await self._handle_segment_event(event.data)
|
|
363
|
+
return
|
|
364
|
+
|
|
259
365
|
if event_type == AgentStreamEventType.ASSISTANT_CHUNK:
|
|
260
366
|
data: AssistantChunkData = event.data
|
|
261
367
|
if data.reasoning:
|
|
@@ -282,12 +388,13 @@ class FocusPane(Static):
|
|
|
282
388
|
await self._close_thinking_block()
|
|
283
389
|
self._assistant_content_widget = None
|
|
284
390
|
self._assistant_content_text = None
|
|
285
|
-
if not was_streaming_content:
|
|
391
|
+
if not self._saw_segment_event and not was_streaming_content:
|
|
286
392
|
renderables_list = renderables.render_assistant_complete_response(event.data)
|
|
287
393
|
if renderables_list:
|
|
288
394
|
await log_container.mount(Static(""))
|
|
289
395
|
for item in renderables_list: await log_container.mount(Static(item))
|
|
290
396
|
log_container.scroll_end(animate=False)
|
|
397
|
+
self._saw_segment_event = False
|
|
291
398
|
return
|
|
292
399
|
|
|
293
400
|
is_stream_breaking_event = event_type in [
|
|
@@ -10,7 +10,7 @@ from rich.text import Text
|
|
|
10
10
|
from rich.panel import Panel
|
|
11
11
|
|
|
12
12
|
from autobyteus.agent.streaming.stream_event_payloads import (
|
|
13
|
-
|
|
13
|
+
AgentStatusUpdateData, AssistantCompleteResponseData,
|
|
14
14
|
ErrorEventData, ToolInteractionLogEntryData, ToolInvocationApprovalRequestedData,
|
|
15
15
|
ToolInvocationAutoExecutingData, SystemTaskNotificationData
|
|
16
16
|
)
|
|
@@ -2,34 +2,34 @@
|
|
|
2
2
|
Shared constants and data for TUI widgets.
|
|
3
3
|
"""
|
|
4
4
|
from typing import Dict
|
|
5
|
-
from autobyteus.agent.
|
|
6
|
-
from autobyteus.agent_team.
|
|
5
|
+
from autobyteus.agent.status.status_enum import AgentStatus
|
|
6
|
+
from autobyteus.agent_team.status.agent_team_status import AgentTeamStatus
|
|
7
7
|
from autobyteus.task_management.base_task_plan import TaskStatus
|
|
8
8
|
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
9
|
+
AGENT_STATUS_ICONS: Dict[AgentStatus, str] = {
|
|
10
|
+
AgentStatus.UNINITIALIZED: "⚪",
|
|
11
|
+
AgentStatus.BOOTSTRAPPING: "⏳",
|
|
12
|
+
AgentStatus.IDLE: "🟢",
|
|
13
|
+
AgentStatus.PROCESSING_USER_INPUT: "💭",
|
|
14
|
+
AgentStatus.AWAITING_LLM_RESPONSE: "💭",
|
|
15
|
+
AgentStatus.ANALYZING_LLM_RESPONSE: "🤔",
|
|
16
|
+
AgentStatus.AWAITING_TOOL_APPROVAL: "❓",
|
|
17
|
+
AgentStatus.TOOL_DENIED: "❌",
|
|
18
|
+
AgentStatus.EXECUTING_TOOL: "🛠️",
|
|
19
|
+
AgentStatus.PROCESSING_TOOL_RESULT: "⚙️",
|
|
20
|
+
AgentStatus.SHUTTING_DOWN: "🌙",
|
|
21
|
+
AgentStatus.SHUTDOWN_COMPLETE: "⚫",
|
|
22
|
+
AgentStatus.ERROR: "❗",
|
|
23
23
|
}
|
|
24
24
|
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
25
|
+
TEAM_STATUS_ICONS: Dict[AgentTeamStatus, str] = {
|
|
26
|
+
AgentTeamStatus.UNINITIALIZED: "⚪",
|
|
27
|
+
AgentTeamStatus.BOOTSTRAPPING: "⏳",
|
|
28
|
+
AgentTeamStatus.IDLE: "🟢",
|
|
29
|
+
AgentTeamStatus.PROCESSING: "⚙️",
|
|
30
|
+
AgentTeamStatus.SHUTTING_DOWN: "🌙",
|
|
31
|
+
AgentTeamStatus.SHUTDOWN_COMPLETE: "⚫",
|
|
32
|
+
AgentTeamStatus.ERROR: "❗",
|
|
33
33
|
}
|
|
34
34
|
|
|
35
35
|
TASK_STATUS_ICONS: Dict[TaskStatus, str] = {
|
|
@@ -55,6 +55,6 @@ ASSISTANT_ICON = "🤖"
|
|
|
55
55
|
TOOL_ICON = "🛠️"
|
|
56
56
|
PROMPT_ICON = "❓"
|
|
57
57
|
ERROR_ICON = "💥"
|
|
58
|
-
|
|
58
|
+
STATUS_ICON = "🔄"
|
|
59
59
|
LOG_ICON = "📄"
|
|
60
60
|
SYSTEM_TASK_ICON = "📥" # NEW
|