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
|
@@ -13,15 +13,17 @@ from textual.message import Message
|
|
|
13
13
|
from textual.widgets import Input, Static, Button
|
|
14
14
|
from textual.containers import VerticalScroll, Horizontal
|
|
15
15
|
|
|
16
|
-
from autobyteus.agent.
|
|
17
|
-
from autobyteus.workflow.
|
|
16
|
+
from autobyteus.agent.status.status_enum import AgentStatus
|
|
17
|
+
from autobyteus.workflow.status.workflow_status import WorkflowStatus
|
|
18
18
|
from autobyteus.agent.streaming.stream_events import StreamEvent as AgentStreamEvent, StreamEventType as AgentStreamEventType
|
|
19
19
|
from autobyteus.agent.streaming.stream_event_payloads import (
|
|
20
|
-
|
|
21
|
-
ErrorEventData, ToolInteractionLogEntryData, ToolInvocationApprovalRequestedData, ToolInvocationAutoExecutingData
|
|
20
|
+
AgentStatusUpdateData, AssistantChunkData, AssistantCompleteResponseData,
|
|
21
|
+
ErrorEventData, ToolInteractionLogEntryData, ToolInvocationApprovalRequestedData, ToolInvocationAutoExecutingData,
|
|
22
|
+
SegmentEventData,
|
|
22
23
|
)
|
|
24
|
+
from autobyteus.agent.streaming.parser.events import SegmentEventType, SegmentType
|
|
23
25
|
from .shared import (
|
|
24
|
-
|
|
26
|
+
AGENT_STATUS_ICONS, WORKFLOW_STATUS_ICONS, SUB_WORKFLOW_ICON, DEFAULT_ICON,
|
|
25
27
|
USER_ICON, ASSISTANT_ICON, WORKFLOW_ICON, AGENT_ICON
|
|
26
28
|
)
|
|
27
29
|
from . import renderables
|
|
@@ -62,6 +64,8 @@ class FocusPane(Static):
|
|
|
62
64
|
# Buffers for batched UI updates to improve performance
|
|
63
65
|
self._reasoning_buffer: str = ""
|
|
64
66
|
self._content_buffer: str = ""
|
|
67
|
+
self._segment_types_by_id: Dict[str, SegmentType] = {}
|
|
68
|
+
self._saw_segment_event: bool = False
|
|
65
69
|
|
|
66
70
|
def compose(self):
|
|
67
71
|
yield Static("Select a node from the sidebar", id="focus-pane-title")
|
|
@@ -127,7 +131,7 @@ class FocusPane(Static):
|
|
|
127
131
|
Button("Deny", variant="error", id="deny-btn")
|
|
128
132
|
)
|
|
129
133
|
|
|
130
|
-
def _update_title(self,
|
|
134
|
+
def _update_title(self, agent_statuses: Dict[str, AgentStatus], workflow_statuses: Dict[str, WorkflowStatus]):
|
|
131
135
|
"""Renders the title of the focus pane with the node's current status."""
|
|
132
136
|
if not self._focused_node_data:
|
|
133
137
|
self.query_one("#focus-pane-title").update("Select a node from the sidebar")
|
|
@@ -138,31 +142,31 @@ class FocusPane(Static):
|
|
|
138
142
|
node_type_str = node_type.replace("_", " ").capitalize()
|
|
139
143
|
|
|
140
144
|
title_icon = DEFAULT_ICON
|
|
141
|
-
|
|
145
|
+
status_str = ""
|
|
142
146
|
|
|
143
147
|
if node_type == 'agent':
|
|
144
148
|
title_icon = AGENT_ICON
|
|
145
|
-
|
|
146
|
-
|
|
149
|
+
status = agent_statuses.get(node_name, AgentStatus.UNINITIALIZED)
|
|
150
|
+
status_str = f" (Status: {status.value})"
|
|
147
151
|
elif node_type == 'subworkflow':
|
|
148
152
|
title_icon = SUB_WORKFLOW_ICON
|
|
149
|
-
|
|
150
|
-
|
|
153
|
+
status = workflow_statuses.get(node_name, WorkflowStatus.UNINITIALIZED)
|
|
154
|
+
status_str = f" (Status: {status.value})"
|
|
151
155
|
elif node_type == 'workflow':
|
|
152
156
|
title_icon = WORKFLOW_ICON
|
|
153
|
-
|
|
154
|
-
|
|
157
|
+
status = workflow_statuses.get(node_name, WorkflowStatus.UNINITIALIZED)
|
|
158
|
+
status_str = f" (Status: {status.value})"
|
|
155
159
|
|
|
156
|
-
self.query_one("#focus-pane-title").update(f"{title_icon} {node_type_str}: [bold]{node_name}[/bold]{
|
|
160
|
+
self.query_one("#focus-pane-title").update(f"{title_icon} {node_type_str}: [bold]{node_name}[/bold]{status_str}")
|
|
157
161
|
|
|
158
|
-
def update_current_node_status(self,
|
|
162
|
+
def update_current_node_status(self, all_agent_statuses: Dict, all_workflow_statuses: Dict):
|
|
159
163
|
"""A lightweight method to only update the title with the latest status."""
|
|
160
|
-
self._update_title(
|
|
164
|
+
self._update_title(all_agent_statuses, all_workflow_statuses)
|
|
161
165
|
|
|
162
166
|
async def update_content(self, node_data: Dict[str, Any], history: List[Any],
|
|
163
167
|
pending_approval: Optional[ToolInvocationApprovalRequestedData],
|
|
164
|
-
|
|
165
|
-
|
|
168
|
+
all_agent_statuses: Dict[str, AgentStatus],
|
|
169
|
+
all_workflow_statuses: Dict[str, WorkflowStatus]):
|
|
166
170
|
"""The main method to update the entire pane based on new state.
|
|
167
171
|
This is called when focus SWITCHES, or when data for a focused workflow is REFRESHED."""
|
|
168
172
|
self.flush_stream_buffers()
|
|
@@ -170,7 +174,7 @@ class FocusPane(Static):
|
|
|
170
174
|
self._focused_node_data = node_data
|
|
171
175
|
self._pending_approval_data = pending_approval
|
|
172
176
|
|
|
173
|
-
self._update_title(
|
|
177
|
+
self._update_title(all_agent_statuses, all_workflow_statuses)
|
|
174
178
|
|
|
175
179
|
log_container = self.query_one("#focus-pane-log-container")
|
|
176
180
|
await log_container.remove_children()
|
|
@@ -180,6 +184,8 @@ class FocusPane(Static):
|
|
|
180
184
|
self._thinking_text = None
|
|
181
185
|
self._assistant_content_widget = None
|
|
182
186
|
self._assistant_content_text = None
|
|
187
|
+
self._segment_types_by_id.clear()
|
|
188
|
+
self._saw_segment_event = False
|
|
183
189
|
|
|
184
190
|
await self._clear_approval_ui()
|
|
185
191
|
|
|
@@ -189,21 +195,21 @@ class FocusPane(Static):
|
|
|
189
195
|
if self._pending_approval_data:
|
|
190
196
|
await self._show_approval_prompt()
|
|
191
197
|
elif self._focused_node_data.get("type") in ['workflow', 'subworkflow']:
|
|
192
|
-
await self._render_workflow_dashboard(node_data,
|
|
198
|
+
await self._render_workflow_dashboard(node_data, all_agent_statuses, all_workflow_statuses)
|
|
193
199
|
|
|
194
200
|
async def _render_workflow_dashboard(self, node_data: Dict[str, Any],
|
|
195
|
-
|
|
196
|
-
|
|
201
|
+
all_agent_statuses: Dict[str, AgentStatus],
|
|
202
|
+
all_workflow_statuses: Dict[str, WorkflowStatus]):
|
|
197
203
|
"""Renders a static summary dashboard for a workflow or sub-workflow."""
|
|
198
204
|
log_container = self.query_one("#focus-pane-log-container")
|
|
199
205
|
|
|
200
|
-
|
|
201
|
-
|
|
206
|
+
status = all_workflow_statuses.get(node_data['name'], WorkflowStatus.UNINITIALIZED)
|
|
207
|
+
status_icon = WORKFLOW_STATUS_ICONS.get(status, DEFAULT_ICON)
|
|
202
208
|
info_text = Text()
|
|
203
209
|
info_text.append(f"Name: {node_data['name']}\n", style="bold")
|
|
204
210
|
if node_data.get('role'):
|
|
205
211
|
info_text.append(f"Role: {node_data['role']}\n")
|
|
206
|
-
info_text.append(f"Status: {
|
|
212
|
+
info_text.append(f"Status: {status_icon} {status.value}")
|
|
207
213
|
await log_container.mount(Static(Panel(info_text, title="Workflow Info", border_style="green", title_align="left")))
|
|
208
214
|
|
|
209
215
|
children_data = node_data.get("children", {})
|
|
@@ -211,13 +217,13 @@ class FocusPane(Static):
|
|
|
211
217
|
team_text = Text()
|
|
212
218
|
for name, child_node in children_data.items():
|
|
213
219
|
if child_node['type'] == 'agent':
|
|
214
|
-
|
|
215
|
-
agent_icon =
|
|
216
|
-
team_text.append(f" ▪ {agent_icon} {name} (Agent): {
|
|
220
|
+
agent_status = all_agent_statuses.get(name, AgentStatus.UNINITIALIZED)
|
|
221
|
+
agent_icon = AGENT_STATUS_ICONS.get(agent_status, DEFAULT_ICON)
|
|
222
|
+
team_text.append(f" ▪ {agent_icon} {name} (Agent): {agent_status.value}\n")
|
|
217
223
|
elif child_node['type'] == 'subworkflow':
|
|
218
|
-
|
|
219
|
-
wf_icon =
|
|
220
|
-
team_text.append(f" ▪ {wf_icon} {name} (Sub-Workflow): {
|
|
224
|
+
wf_status = all_workflow_statuses.get(name, WorkflowStatus.UNINITIALIZED)
|
|
225
|
+
wf_icon = WORKFLOW_STATUS_ICONS.get(wf_status, SUB_WORKFLOW_ICON)
|
|
226
|
+
team_text.append(f" ▪ {wf_icon} {name} (Sub-Workflow): {wf_status.value}\n")
|
|
221
227
|
await log_container.mount(Static(Panel(team_text, title="Team Status", border_style="blue", title_align="left")))
|
|
222
228
|
|
|
223
229
|
async def _close_thinking_block(self, scroll: bool = True):
|
|
@@ -249,12 +255,107 @@ class FocusPane(Static):
|
|
|
249
255
|
if scrolled:
|
|
250
256
|
self.query_one("#focus-pane-log-container").scroll_end(animate=False)
|
|
251
257
|
|
|
258
|
+
async def _ensure_thinking_widget(self, log_container: VerticalScroll) -> None:
|
|
259
|
+
if self._thinking_widget is None:
|
|
260
|
+
self.flush_stream_buffers()
|
|
261
|
+
await log_container.mount(Static(""))
|
|
262
|
+
self._thinking_text = Text("<Thinking>\n", style="dim italic cyan")
|
|
263
|
+
self._thinking_widget = Static(self._thinking_text)
|
|
264
|
+
await log_container.mount(self._thinking_widget)
|
|
265
|
+
|
|
266
|
+
async def _ensure_assistant_content_widget(self, log_container: VerticalScroll) -> None:
|
|
267
|
+
if self._assistant_content_widget is None:
|
|
268
|
+
await log_container.mount(Static(""))
|
|
269
|
+
self._assistant_content_text = Text()
|
|
270
|
+
self._assistant_content_text.append(f"{ASSISTANT_ICON} assistant: ", style="bold green")
|
|
271
|
+
self._assistant_content_widget = Static(self._assistant_content_text)
|
|
272
|
+
await log_container.mount(self._assistant_content_widget)
|
|
273
|
+
|
|
274
|
+
async def _handle_segment_event(self, data: SegmentEventData) -> None:
|
|
275
|
+
log_container = self.query_one("#focus-pane-log-container")
|
|
276
|
+
self._saw_segment_event = True
|
|
277
|
+
try:
|
|
278
|
+
event_type = SegmentEventType(data.event_type)
|
|
279
|
+
except ValueError:
|
|
280
|
+
logger.debug(f"TUI FocusPane: Unknown segment event type '{data.event_type}'.")
|
|
281
|
+
return
|
|
282
|
+
|
|
283
|
+
segment_type = None
|
|
284
|
+
if data.segment_type:
|
|
285
|
+
try:
|
|
286
|
+
segment_type = SegmentType(data.segment_type)
|
|
287
|
+
except ValueError:
|
|
288
|
+
logger.debug(f"TUI FocusPane: Unknown segment type '{data.segment_type}'.")
|
|
289
|
+
|
|
290
|
+
if segment_type is None and data.segment_id in self._segment_types_by_id:
|
|
291
|
+
segment_type = self._segment_types_by_id.get(data.segment_id)
|
|
292
|
+
|
|
293
|
+
metadata = {}
|
|
294
|
+
if isinstance(data.payload, dict):
|
|
295
|
+
metadata = data.payload.get("metadata", {}) or {}
|
|
296
|
+
|
|
297
|
+
if event_type == SegmentEventType.START:
|
|
298
|
+
if segment_type is not None:
|
|
299
|
+
self._segment_types_by_id[data.segment_id] = segment_type
|
|
300
|
+
|
|
301
|
+
if segment_type != SegmentType.REASONING:
|
|
302
|
+
await self._close_thinking_block(scroll=False)
|
|
303
|
+
|
|
304
|
+
if segment_type == SegmentType.REASONING:
|
|
305
|
+
await self._ensure_thinking_widget(log_container)
|
|
306
|
+
return
|
|
307
|
+
|
|
308
|
+
await self._ensure_assistant_content_widget(log_container)
|
|
309
|
+
|
|
310
|
+
if segment_type == SegmentType.WRITE_FILE:
|
|
311
|
+
path = metadata.get("path", "")
|
|
312
|
+
header = f"<write_file path=\"{path}\">" if path else "<write_file>"
|
|
313
|
+
self._content_buffer += f"{header}\n"
|
|
314
|
+
elif segment_type == SegmentType.RUN_BASH:
|
|
315
|
+
self._content_buffer += "<run_bash>\n"
|
|
316
|
+
elif segment_type == SegmentType.TOOL_CALL:
|
|
317
|
+
tool_name = metadata.get("tool_name", "")
|
|
318
|
+
header = f"<tool name=\"{tool_name}\">" if tool_name else "<tool>"
|
|
319
|
+
self._content_buffer += f"{header}\n"
|
|
320
|
+
return
|
|
321
|
+
|
|
322
|
+
if event_type == SegmentEventType.CONTENT:
|
|
323
|
+
delta = ""
|
|
324
|
+
if isinstance(data.payload, dict):
|
|
325
|
+
delta = data.payload.get("delta", "")
|
|
326
|
+
|
|
327
|
+
if segment_type == SegmentType.REASONING:
|
|
328
|
+
await self._ensure_thinking_widget(log_container)
|
|
329
|
+
self._reasoning_buffer += str(delta)
|
|
330
|
+
else:
|
|
331
|
+
await self._ensure_assistant_content_widget(log_container)
|
|
332
|
+
self._content_buffer += str(delta)
|
|
333
|
+
return
|
|
334
|
+
|
|
335
|
+
if event_type == SegmentEventType.END:
|
|
336
|
+
if segment_type == SegmentType.REASONING:
|
|
337
|
+
await self._close_thinking_block()
|
|
338
|
+
self._segment_types_by_id.pop(data.segment_id, None)
|
|
339
|
+
return
|
|
340
|
+
|
|
341
|
+
if segment_type in {SegmentType.WRITE_FILE, SegmentType.RUN_BASH, SegmentType.TOOL_CALL}:
|
|
342
|
+
tag = "write_file" if segment_type == SegmentType.WRITE_FILE else (
|
|
343
|
+
"run_bash" if segment_type == SegmentType.RUN_BASH else "tool"
|
|
344
|
+
)
|
|
345
|
+
self._content_buffer += f"\n</{tag}>\n"
|
|
346
|
+
|
|
347
|
+
self._segment_types_by_id.pop(data.segment_id, None)
|
|
348
|
+
return
|
|
349
|
+
|
|
252
350
|
async def add_agent_event(self, event: AgentStreamEvent):
|
|
253
351
|
"""Adds a single agent event to the log view, handling stream state correctly."""
|
|
254
352
|
log_container = self.query_one("#focus-pane-log-container")
|
|
255
353
|
event_type = event.event_type
|
|
256
354
|
|
|
257
|
-
|
|
355
|
+
if event_type == AgentStreamEventType.SEGMENT_EVENT and isinstance(event.data, SegmentEventData):
|
|
356
|
+
await self._handle_segment_event(event.data)
|
|
357
|
+
return
|
|
358
|
+
|
|
258
359
|
if event_type == AgentStreamEventType.ASSISTANT_CHUNK:
|
|
259
360
|
data: AssistantChunkData = event.data
|
|
260
361
|
if data.reasoning:
|
|
@@ -276,7 +377,7 @@ class FocusPane(Static):
|
|
|
276
377
|
self._assistant_content_widget = Static(self._assistant_content_text)
|
|
277
378
|
await log_container.mount(self._assistant_content_widget)
|
|
278
379
|
self._content_buffer += data.content
|
|
279
|
-
return
|
|
380
|
+
return
|
|
280
381
|
|
|
281
382
|
# Handle the explicit end of a stream
|
|
282
383
|
if event_type == AgentStreamEventType.ASSISTANT_COMPLETE_RESPONSE:
|
|
@@ -287,13 +388,14 @@ class FocusPane(Static):
|
|
|
287
388
|
self._assistant_content_text = None
|
|
288
389
|
|
|
289
390
|
# If we weren't streaming, it means this is a non-streamed response. We should render it.
|
|
290
|
-
if not was_streaming_content:
|
|
391
|
+
if not self._saw_segment_event and not was_streaming_content:
|
|
291
392
|
renderables_list = renderables.render_assistant_complete_response(event.data)
|
|
292
393
|
if renderables_list:
|
|
293
394
|
await log_container.mount(Static(""))
|
|
294
395
|
for item in renderables_list:
|
|
295
396
|
await log_container.mount(Static(item))
|
|
296
397
|
log_container.scroll_end(animate=False)
|
|
398
|
+
self._saw_segment_event = False
|
|
297
399
|
return # This event's purpose is to end the stream.
|
|
298
400
|
|
|
299
401
|
# For all other events, first check if they should break an ongoing stream.
|
|
@@ -324,7 +426,7 @@ class FocusPane(Static):
|
|
|
324
426
|
await self._show_approval_prompt()
|
|
325
427
|
elif event_type == AgentStreamEventType.ERROR_EVENT:
|
|
326
428
|
renderable = renderables.render_error(event.data)
|
|
327
|
-
elif event_type
|
|
429
|
+
elif event_type == AgentStreamEventType.AGENT_STATUS_UPDATED:
|
|
328
430
|
# These are informational and do not have a renderable in the log pane.
|
|
329
431
|
pass
|
|
330
432
|
|
|
@@ -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, ToolInvocationAutoExecutingData
|
|
15
15
|
)
|
|
16
16
|
from .shared import ASSISTANT_ICON, TOOL_ICON, PROMPT_ICON, ERROR_ICON, LOG_ICON
|
|
@@ -3,33 +3,33 @@
|
|
|
3
3
|
Shared constants and data for TUI widgets.
|
|
4
4
|
"""
|
|
5
5
|
from typing import Dict
|
|
6
|
-
from autobyteus.agent.
|
|
7
|
-
from autobyteus.workflow.
|
|
6
|
+
from autobyteus.agent.status.status_enum import AgentStatus
|
|
7
|
+
from autobyteus.workflow.status.workflow_status import WorkflowStatus
|
|
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
|
+
WORKFLOW_STATUS_ICONS: Dict[WorkflowStatus, str] = {
|
|
26
|
+
WorkflowStatus.UNINITIALIZED: "⚪",
|
|
27
|
+
WorkflowStatus.BOOTSTRAPPING: "⏳",
|
|
28
|
+
WorkflowStatus.IDLE: "🟢",
|
|
29
|
+
WorkflowStatus.PROCESSING: "⚙️",
|
|
30
|
+
WorkflowStatus.SHUTTING_DOWN: "🌙",
|
|
31
|
+
WorkflowStatus.SHUTDOWN_COMPLETE: "⚫",
|
|
32
|
+
WorkflowStatus.ERROR: "❗",
|
|
33
33
|
}
|
|
34
34
|
|
|
35
35
|
# Main component icons
|
|
@@ -47,5 +47,5 @@ ASSISTANT_ICON = "🤖"
|
|
|
47
47
|
TOOL_ICON = "🛠️"
|
|
48
48
|
PROMPT_ICON = "❓"
|
|
49
49
|
ERROR_ICON = "💥"
|
|
50
|
-
|
|
50
|
+
STATUS_ICON = "🔄"
|
|
51
51
|
LOG_ICON = "📄"
|
|
@@ -102,6 +102,30 @@ class AutobyteusClient:
|
|
|
102
102
|
|
|
103
103
|
logger.info("Initialized Autobyteus client with server URL: %s", self.server_url)
|
|
104
104
|
|
|
105
|
+
@staticmethod
|
|
106
|
+
def _wrap_http_error(exc: httpx.HTTPStatusError) -> RuntimeError:
|
|
107
|
+
"""
|
|
108
|
+
Produce a RuntimeError that preserves status code and server-provided details.
|
|
109
|
+
"""
|
|
110
|
+
response = exc.response
|
|
111
|
+
detail: str = ""
|
|
112
|
+
# Prefer JSON "detail" if present
|
|
113
|
+
try:
|
|
114
|
+
json_body = response.json()
|
|
115
|
+
detail = json_body.get("detail") or json.dumps(json_body)
|
|
116
|
+
except Exception:
|
|
117
|
+
# Fall back to raw text
|
|
118
|
+
detail = response.text
|
|
119
|
+
|
|
120
|
+
message = f"HTTP {response.status_code} {response.reason_phrase}"
|
|
121
|
+
if detail:
|
|
122
|
+
message = f"{message}: {detail}"
|
|
123
|
+
else:
|
|
124
|
+
message = f"{message}: {exc}"
|
|
125
|
+
err = RuntimeError(message)
|
|
126
|
+
err.__cause__ = exc
|
|
127
|
+
return err
|
|
128
|
+
|
|
105
129
|
async def get_available_llm_models(self) -> Dict[str, Any]:
|
|
106
130
|
"""Async discovery of available LLM models."""
|
|
107
131
|
try:
|
|
@@ -110,6 +134,9 @@ class AutobyteusClient:
|
|
|
110
134
|
)
|
|
111
135
|
response.raise_for_status()
|
|
112
136
|
return response.json()
|
|
137
|
+
except httpx.HTTPStatusError as exc:
|
|
138
|
+
logger.error("Async LLM model fetch error: %s", exc)
|
|
139
|
+
raise self._wrap_http_error(exc)
|
|
113
140
|
except httpx.HTTPError as exc:
|
|
114
141
|
logger.error("Async LLM model fetch error: %s", exc)
|
|
115
142
|
raise RuntimeError(str(exc)) from exc
|
|
@@ -120,6 +147,9 @@ class AutobyteusClient:
|
|
|
120
147
|
response = self.sync_client.get(urljoin(self.server_url, "/models/llm"))
|
|
121
148
|
response.raise_for_status()
|
|
122
149
|
return response.json()
|
|
150
|
+
except httpx.HTTPStatusError as exc:
|
|
151
|
+
logger.error("Sync LLM model fetch error: %s", exc)
|
|
152
|
+
raise self._wrap_http_error(exc)
|
|
123
153
|
except httpx.HTTPError as exc:
|
|
124
154
|
logger.error("Sync LLM model fetch error: %s", exc)
|
|
125
155
|
raise RuntimeError(str(exc)) from exc
|
|
@@ -132,6 +162,9 @@ class AutobyteusClient:
|
|
|
132
162
|
)
|
|
133
163
|
response.raise_for_status()
|
|
134
164
|
return response.json()
|
|
165
|
+
except httpx.HTTPStatusError as exc:
|
|
166
|
+
logger.error("Async image model fetch error: %s", exc)
|
|
167
|
+
raise self._wrap_http_error(exc)
|
|
135
168
|
except httpx.HTTPError as exc:
|
|
136
169
|
logger.error("Async image model fetch error: %s", exc)
|
|
137
170
|
raise RuntimeError(str(exc)) from exc
|
|
@@ -144,6 +177,9 @@ class AutobyteusClient:
|
|
|
144
177
|
)
|
|
145
178
|
response.raise_for_status()
|
|
146
179
|
return response.json()
|
|
180
|
+
except httpx.HTTPStatusError as exc:
|
|
181
|
+
logger.error("Sync image model fetch error: %s", exc)
|
|
182
|
+
raise self._wrap_http_error(exc)
|
|
147
183
|
except httpx.HTTPError as exc:
|
|
148
184
|
logger.error("Sync image model fetch error: %s", exc)
|
|
149
185
|
raise RuntimeError(str(exc)) from exc
|
|
@@ -156,6 +192,9 @@ class AutobyteusClient:
|
|
|
156
192
|
)
|
|
157
193
|
response.raise_for_status()
|
|
158
194
|
return response.json()
|
|
195
|
+
except httpx.HTTPStatusError as exc:
|
|
196
|
+
logger.error("Async audio model fetch error: %s", exc)
|
|
197
|
+
raise self._wrap_http_error(exc)
|
|
159
198
|
except httpx.HTTPError as exc:
|
|
160
199
|
logger.error("Async audio model fetch error: %s", exc)
|
|
161
200
|
raise RuntimeError(str(exc)) from exc
|
|
@@ -168,6 +207,9 @@ class AutobyteusClient:
|
|
|
168
207
|
)
|
|
169
208
|
response.raise_for_status()
|
|
170
209
|
return response.json()
|
|
210
|
+
except httpx.HTTPStatusError as exc:
|
|
211
|
+
logger.error("Sync audio model fetch error: %s", exc)
|
|
212
|
+
raise self._wrap_http_error(exc)
|
|
171
213
|
except httpx.HTTPError as exc:
|
|
172
214
|
logger.error("Sync audio model fetch error: %s", exc)
|
|
173
215
|
raise RuntimeError(str(exc)) from exc
|
|
@@ -197,6 +239,9 @@ class AutobyteusClient:
|
|
|
197
239
|
)
|
|
198
240
|
response.raise_for_status()
|
|
199
241
|
return response.json()
|
|
242
|
+
except httpx.HTTPStatusError as exc:
|
|
243
|
+
logger.error("Error sending message: %s", exc)
|
|
244
|
+
raise self._wrap_http_error(exc)
|
|
200
245
|
except httpx.HTTPError as exc:
|
|
201
246
|
logger.error("Error sending message: %s", exc)
|
|
202
247
|
raise RuntimeError(str(exc)) from exc
|
|
@@ -239,6 +284,9 @@ class AutobyteusClient:
|
|
|
239
284
|
logger.error("Failed to parse stream chunk: %s", exc)
|
|
240
285
|
raise RuntimeError("Invalid stream response format") from exc
|
|
241
286
|
|
|
287
|
+
except httpx.HTTPStatusError as exc:
|
|
288
|
+
logger.error("Stream error: %s", exc)
|
|
289
|
+
raise self._wrap_http_error(exc)
|
|
242
290
|
except httpx.HTTPError as exc:
|
|
243
291
|
logger.error("Stream error: %s", exc)
|
|
244
292
|
raise RuntimeError(str(exc)) from exc
|
|
@@ -250,6 +298,7 @@ class AutobyteusClient:
|
|
|
250
298
|
input_image_urls: Optional[List[str]] = None,
|
|
251
299
|
mask_url: Optional[str] = None,
|
|
252
300
|
generation_config: Optional[Dict[str, Any]] = None,
|
|
301
|
+
session_id: Optional[str] = None,
|
|
253
302
|
) -> Dict[str, Any]:
|
|
254
303
|
"""Generate or edit an image and return the server response."""
|
|
255
304
|
try:
|
|
@@ -259,6 +308,7 @@ class AutobyteusClient:
|
|
|
259
308
|
"input_image_urls": input_image_urls or [],
|
|
260
309
|
"mask_url": mask_url,
|
|
261
310
|
"generation_config": generation_config or {},
|
|
311
|
+
"session_id": session_id,
|
|
262
312
|
}
|
|
263
313
|
response = await self.async_client.post(
|
|
264
314
|
urljoin(self.server_url, "/generate-image"),
|
|
@@ -266,6 +316,9 @@ class AutobyteusClient:
|
|
|
266
316
|
)
|
|
267
317
|
response.raise_for_status()
|
|
268
318
|
return response.json()
|
|
319
|
+
except httpx.HTTPStatusError as exc:
|
|
320
|
+
logger.error("Error generating image: %s", exc)
|
|
321
|
+
raise self._wrap_http_error(exc)
|
|
269
322
|
except httpx.HTTPError as exc:
|
|
270
323
|
logger.error("Error generating image: %s", exc)
|
|
271
324
|
raise RuntimeError(str(exc)) from exc
|
|
@@ -275,6 +328,7 @@ class AutobyteusClient:
|
|
|
275
328
|
model_name: str,
|
|
276
329
|
prompt: str,
|
|
277
330
|
generation_config: Optional[Dict[str, Any]] = None,
|
|
331
|
+
session_id: Optional[str] = None,
|
|
278
332
|
) -> Dict[str, Any]:
|
|
279
333
|
"""Generate speech from text and return the server response."""
|
|
280
334
|
try:
|
|
@@ -282,6 +336,7 @@ class AutobyteusClient:
|
|
|
282
336
|
"model_name": model_name,
|
|
283
337
|
"prompt": prompt,
|
|
284
338
|
"generation_config": generation_config or {},
|
|
339
|
+
"session_id": session_id,
|
|
285
340
|
}
|
|
286
341
|
response = await self.async_client.post(
|
|
287
342
|
urljoin(self.server_url, "/generate-speech"),
|
|
@@ -289,12 +344,15 @@ class AutobyteusClient:
|
|
|
289
344
|
)
|
|
290
345
|
response.raise_for_status()
|
|
291
346
|
return response.json()
|
|
347
|
+
except httpx.HTTPStatusError as exc:
|
|
348
|
+
logger.error("Error generating speech: %s", exc)
|
|
349
|
+
raise self._wrap_http_error(exc)
|
|
292
350
|
except httpx.HTTPError as exc:
|
|
293
351
|
logger.error("Error generating speech: %s", exc)
|
|
294
352
|
raise RuntimeError(str(exc)) from exc
|
|
295
353
|
|
|
296
354
|
async def cleanup(self, conversation_id: str) -> Dict[str, Any]:
|
|
297
|
-
"""Clean up a conversation."""
|
|
355
|
+
"""Clean up a conversation (LLM)."""
|
|
298
356
|
try:
|
|
299
357
|
response = await self.async_client.post(
|
|
300
358
|
urljoin(self.server_url, "/cleanup"),
|
|
@@ -302,10 +360,45 @@ class AutobyteusClient:
|
|
|
302
360
|
)
|
|
303
361
|
response.raise_for_status()
|
|
304
362
|
return response.json()
|
|
363
|
+
except httpx.HTTPStatusError as exc:
|
|
364
|
+
logger.error("Cleanup error: %s", exc)
|
|
365
|
+
raise self._wrap_http_error(exc)
|
|
305
366
|
except httpx.HTTPError as exc:
|
|
306
367
|
logger.error("Cleanup error: %s", exc)
|
|
307
368
|
raise RuntimeError(str(exc)) from exc
|
|
308
369
|
|
|
370
|
+
async def cleanup_image_session(self, session_id: str) -> Dict[str, Any]:
|
|
371
|
+
"""Clean up an image session."""
|
|
372
|
+
try:
|
|
373
|
+
response = await self.async_client.post(
|
|
374
|
+
urljoin(self.server_url, "/cleanup/image"),
|
|
375
|
+
json={"session_id": session_id},
|
|
376
|
+
)
|
|
377
|
+
response.raise_for_status()
|
|
378
|
+
return response.json()
|
|
379
|
+
except httpx.HTTPStatusError as exc:
|
|
380
|
+
logger.error("Image session cleanup error: %s", exc)
|
|
381
|
+
raise self._wrap_http_error(exc)
|
|
382
|
+
except httpx.HTTPError as exc:
|
|
383
|
+
logger.error("Image session cleanup error: %s", exc)
|
|
384
|
+
raise RuntimeError(str(exc)) from exc
|
|
385
|
+
|
|
386
|
+
async def cleanup_audio_session(self, session_id: str) -> Dict[str, Any]:
|
|
387
|
+
"""Clean up an audio session."""
|
|
388
|
+
try:
|
|
389
|
+
response = await self.async_client.post(
|
|
390
|
+
urljoin(self.server_url, "/cleanup/audio"),
|
|
391
|
+
json={"session_id": session_id},
|
|
392
|
+
)
|
|
393
|
+
response.raise_for_status()
|
|
394
|
+
return response.json()
|
|
395
|
+
except httpx.HTTPStatusError as exc:
|
|
396
|
+
logger.error("Audio session cleanup error: %s", exc)
|
|
397
|
+
raise self._wrap_http_error(exc)
|
|
398
|
+
except httpx.HTTPError as exc:
|
|
399
|
+
logger.error("Audio session cleanup error: %s", exc)
|
|
400
|
+
raise RuntimeError(str(exc)) from exc
|
|
401
|
+
|
|
309
402
|
async def close(self) -> None:
|
|
310
403
|
"""Close both HTTP clients."""
|
|
311
404
|
await self.async_client.aclose()
|
autobyteus/events/event_types.py
CHANGED
|
@@ -4,49 +4,42 @@ from enum import Enum
|
|
|
4
4
|
class EventType(Enum):
|
|
5
5
|
"""
|
|
6
6
|
Defines the types of events that can be emitted by EventEmitters within the system.
|
|
7
|
-
Uses prefixes like
|
|
7
|
+
Uses prefixes like AGENT_STATUS_, AGENT_DATA_, AGENT_REQUEST_, AGENT_ERROR_ for clarity.
|
|
8
8
|
"""
|
|
9
9
|
# --- Non-Agent specific events ---
|
|
10
10
|
WEIBO_POST_COMPLETED = "weibo_post_completed" # Example, keep as is
|
|
11
11
|
TOOL_EXECUTION_COMPLETED = "tool_execution_completed" # Added for generic tool events
|
|
12
|
-
TIMER_UPDATE = "timer_update" # Added for Timer tool
|
|
13
12
|
SHARED_BROWSER_SESSION_CREATED = "shared_browser_session_created" # Added for session-aware tools
|
|
14
13
|
CREATE_SHARED_SESSION = "create_shared_session" # Added for session-aware tools
|
|
15
14
|
|
|
16
|
-
# --- Agent
|
|
17
|
-
|
|
18
|
-
AGENT_PHASE_BOOTSTRAPPING_STARTED = "agent_phase_bootstrapping_started"
|
|
19
|
-
AGENT_PHASE_IDLE_ENTERED = "agent_phase_idle_entered"
|
|
20
|
-
AGENT_PHASE_PROCESSING_USER_INPUT_STARTED = "agent_phase_processing_user_input_started"
|
|
21
|
-
AGENT_PHASE_AWAITING_LLM_RESPONSE_STARTED = "agent_phase_awaiting_llm_response_started"
|
|
22
|
-
AGENT_PHASE_ANALYZING_LLM_RESPONSE_STARTED = "agent_phase_analyzing_llm_response_started"
|
|
23
|
-
AGENT_PHASE_AWAITING_TOOL_APPROVAL_STARTED = "agent_phase_awaiting_tool_approval_started"
|
|
24
|
-
AGENT_PHASE_TOOL_DENIED_STARTED = "agent_phase_tool_denied_started"
|
|
25
|
-
AGENT_PHASE_EXECUTING_TOOL_STARTED = "agent_phase_executing_tool_started"
|
|
26
|
-
AGENT_PHASE_PROCESSING_TOOL_RESULT_STARTED = "agent_phase_processing_tool_result_started"
|
|
27
|
-
AGENT_PHASE_SHUTTING_DOWN_STARTED = "agent_phase_shutting_down_started"
|
|
28
|
-
AGENT_PHASE_SHUTDOWN_COMPLETED = "agent_phase_shutdown_completed"
|
|
29
|
-
AGENT_PHASE_ERROR_ENTERED = "agent_phase_error_entered"
|
|
15
|
+
# --- Agent Status Updates ---
|
|
16
|
+
AGENT_STATUS_UPDATED = "agent_status_updated"
|
|
30
17
|
|
|
31
18
|
# --- Agent Data Outputs ---
|
|
32
19
|
AGENT_DATA_ASSISTANT_CHUNK = "agent_data_assistant_chunk"
|
|
33
|
-
AGENT_DATA_ASSISTANT_CHUNK_STREAM_END = "agent_data_assistant_chunk_stream_end"
|
|
34
20
|
AGENT_DATA_ASSISTANT_COMPLETE_RESPONSE = "agent_data_assistant_complete_response"
|
|
21
|
+
AGENT_DATA_SEGMENT_EVENT = "agent_data_segment_event" # Streaming parser segment events
|
|
35
22
|
AGENT_DATA_TOOL_LOG = "agent_data_tool_log"
|
|
36
23
|
AGENT_DATA_TOOL_LOG_STREAM_END = "agent_data_tool_log_stream_end"
|
|
37
24
|
AGENT_DATA_SYSTEM_TASK_NOTIFICATION_RECEIVED = "agent_data_system_task_notification_received" # NEW
|
|
25
|
+
AGENT_DATA_INTER_AGENT_MESSAGE_RECEIVED = "agent_data_inter_agent_message_received" # NEW: surface inter-agent messages
|
|
38
26
|
AGENT_DATA_TODO_LIST_UPDATED = "agent_data_todo_list_updated"
|
|
27
|
+
AGENT_ARTIFACT_PERSISTED = "agent_artifact_persisted" # NEW: artifact persistence confirmation
|
|
28
|
+
AGENT_ARTIFACT_UPDATED = "agent_artifact_updated" # NEW: artifact content updated (e.g., patch_file)
|
|
39
29
|
|
|
40
30
|
# --- Agent Requests for External Interaction ---
|
|
41
31
|
AGENT_REQUEST_TOOL_INVOCATION_APPROVAL = "agent_request_tool_invocation_approval"
|
|
42
32
|
AGENT_TOOL_INVOCATION_AUTO_EXECUTING = "agent_tool_invocation_auto_executing"
|
|
43
33
|
|
|
44
|
-
# --- Agent Errors (not necessarily
|
|
34
|
+
# --- Agent Errors (not necessarily status changes, e.g., error during output generation) ---
|
|
45
35
|
AGENT_ERROR_OUTPUT_GENERATION = "agent_error_output_generation"
|
|
46
36
|
|
|
47
37
|
# --- Agent Team Events ---
|
|
48
38
|
TEAM_STREAM_EVENT = "team_stream_event" # For unified agent team event stream
|
|
49
39
|
|
|
40
|
+
# --- Workflow Events ---
|
|
41
|
+
WORKFLOW_STREAM_EVENT = "workflow_stream_event" # For unified workflow event stream
|
|
42
|
+
|
|
50
43
|
# --- Task Plan Events ---
|
|
51
44
|
TASK_PLAN_TASKS_CREATED = "task_plan.tasks.created"
|
|
52
45
|
TASK_PLAN_STATUS_UPDATED = "task_plan.status.updated"
|