autobyteus 1.2.0__py3-none-any.whl → 1.2.3__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- autobyteus/agent/agent.py +15 -5
- autobyteus/agent/bootstrap_steps/__init__.py +1 -3
- autobyteus/agent/bootstrap_steps/agent_bootstrapper.py +3 -59
- autobyteus/agent/bootstrap_steps/base_bootstrap_step.py +1 -4
- autobyteus/agent/bootstrap_steps/mcp_server_prewarming_step.py +1 -3
- autobyteus/agent/bootstrap_steps/system_prompt_processing_step.py +16 -13
- autobyteus/agent/bootstrap_steps/workspace_context_initialization_step.py +2 -4
- autobyteus/agent/context/agent_config.py +43 -20
- autobyteus/agent/context/agent_context.py +23 -18
- autobyteus/agent/context/agent_runtime_state.py +23 -19
- autobyteus/agent/events/__init__.py +16 -1
- autobyteus/agent/events/agent_events.py +43 -3
- autobyteus/agent/events/agent_input_event_queue_manager.py +79 -26
- autobyteus/agent/events/event_store.py +57 -0
- autobyteus/agent/events/notifiers.py +74 -60
- autobyteus/agent/events/worker_event_dispatcher.py +21 -64
- autobyteus/agent/factory/agent_factory.py +52 -0
- autobyteus/agent/handlers/__init__.py +2 -0
- autobyteus/agent/handlers/approved_tool_invocation_event_handler.py +51 -34
- autobyteus/agent/handlers/bootstrap_event_handler.py +155 -0
- autobyteus/agent/handlers/inter_agent_message_event_handler.py +10 -0
- autobyteus/agent/handlers/lifecycle_event_logger.py +19 -11
- autobyteus/agent/handlers/llm_complete_response_received_event_handler.py +10 -15
- autobyteus/agent/handlers/llm_user_message_ready_event_handler.py +188 -48
- autobyteus/agent/handlers/tool_execution_approval_event_handler.py +0 -10
- autobyteus/agent/handlers/tool_invocation_request_event_handler.py +53 -48
- autobyteus/agent/handlers/tool_result_event_handler.py +7 -8
- autobyteus/agent/handlers/user_input_message_event_handler.py +10 -3
- autobyteus/agent/input_processor/memory_ingest_input_processor.py +40 -0
- autobyteus/agent/lifecycle/__init__.py +12 -0
- autobyteus/agent/lifecycle/base_processor.py +109 -0
- autobyteus/agent/lifecycle/events.py +35 -0
- autobyteus/agent/lifecycle/processor_definition.py +36 -0
- autobyteus/agent/lifecycle/processor_registry.py +106 -0
- autobyteus/agent/llm_request_assembler.py +98 -0
- autobyteus/agent/llm_response_processor/__init__.py +1 -8
- autobyteus/agent/message/context_file_type.py +1 -1
- autobyteus/agent/message/send_message_to.py +5 -4
- autobyteus/agent/runtime/agent_runtime.py +29 -21
- autobyteus/agent/runtime/agent_worker.py +98 -19
- autobyteus/agent/shutdown_steps/__init__.py +2 -0
- autobyteus/agent/shutdown_steps/agent_shutdown_orchestrator.py +2 -0
- autobyteus/agent/shutdown_steps/tool_cleanup_step.py +58 -0
- autobyteus/agent/status/__init__.py +14 -0
- autobyteus/agent/status/manager.py +93 -0
- autobyteus/agent/status/status_deriver.py +96 -0
- autobyteus/agent/{phases/phase_enum.py → status/status_enum.py} +16 -16
- autobyteus/agent/status/status_update_utils.py +73 -0
- autobyteus/agent/streaming/__init__.py +52 -5
- autobyteus/agent/streaming/adapters/__init__.py +18 -0
- autobyteus/agent/streaming/adapters/invocation_adapter.py +184 -0
- autobyteus/agent/streaming/adapters/tool_call_parsing.py +163 -0
- autobyteus/agent/streaming/adapters/tool_syntax_registry.py +67 -0
- autobyteus/agent/streaming/agent_event_stream.py +3 -178
- autobyteus/agent/streaming/api_tool_call/__init__.py +16 -0
- autobyteus/agent/streaming/api_tool_call/file_content_streamer.py +56 -0
- autobyteus/agent/streaming/api_tool_call/json_string_field_extractor.py +175 -0
- autobyteus/agent/streaming/api_tool_call_streaming_response_handler.py +4 -0
- autobyteus/agent/streaming/events/__init__.py +6 -0
- autobyteus/agent/streaming/events/stream_event_payloads.py +284 -0
- autobyteus/agent/streaming/events/stream_events.py +141 -0
- autobyteus/agent/streaming/handlers/__init__.py +15 -0
- autobyteus/agent/streaming/handlers/api_tool_call_streaming_response_handler.py +303 -0
- autobyteus/agent/streaming/handlers/parsing_streaming_response_handler.py +107 -0
- autobyteus/agent/streaming/handlers/pass_through_streaming_response_handler.py +107 -0
- autobyteus/agent/streaming/handlers/streaming_handler_factory.py +177 -0
- autobyteus/agent/streaming/handlers/streaming_response_handler.py +58 -0
- autobyteus/agent/streaming/parser/__init__.py +61 -0
- autobyteus/agent/streaming/parser/event_emitter.py +181 -0
- autobyteus/agent/streaming/parser/events.py +4 -0
- autobyteus/agent/streaming/parser/invocation_adapter.py +4 -0
- autobyteus/agent/streaming/parser/json_parsing_strategies/__init__.py +19 -0
- autobyteus/agent/streaming/parser/json_parsing_strategies/base.py +32 -0
- autobyteus/agent/streaming/parser/json_parsing_strategies/default.py +34 -0
- autobyteus/agent/streaming/parser/json_parsing_strategies/gemini.py +31 -0
- autobyteus/agent/streaming/parser/json_parsing_strategies/openai.py +64 -0
- autobyteus/agent/streaming/parser/json_parsing_strategies/registry.py +75 -0
- autobyteus/agent/streaming/parser/parser_context.py +227 -0
- autobyteus/agent/streaming/parser/parser_factory.py +132 -0
- autobyteus/agent/streaming/parser/sentinel_format.py +7 -0
- autobyteus/agent/streaming/parser/state_factory.py +62 -0
- autobyteus/agent/streaming/parser/states/__init__.py +1 -0
- autobyteus/agent/streaming/parser/states/base_state.py +60 -0
- autobyteus/agent/streaming/parser/states/custom_xml_tag_run_bash_parsing_state.py +38 -0
- autobyteus/agent/streaming/parser/states/custom_xml_tag_write_file_parsing_state.py +55 -0
- autobyteus/agent/streaming/parser/states/delimited_content_state.py +146 -0
- autobyteus/agent/streaming/parser/states/json_initialization_state.py +144 -0
- autobyteus/agent/streaming/parser/states/json_tool_parsing_state.py +137 -0
- autobyteus/agent/streaming/parser/states/sentinel_content_state.py +30 -0
- autobyteus/agent/streaming/parser/states/sentinel_initialization_state.py +117 -0
- autobyteus/agent/streaming/parser/states/text_state.py +78 -0
- autobyteus/agent/streaming/parser/states/xml_patch_file_tool_parsing_state.py +328 -0
- autobyteus/agent/streaming/parser/states/xml_run_bash_tool_parsing_state.py +129 -0
- autobyteus/agent/streaming/parser/states/xml_tag_initialization_state.py +151 -0
- autobyteus/agent/streaming/parser/states/xml_tool_parsing_state.py +63 -0
- autobyteus/agent/streaming/parser/states/xml_write_file_tool_parsing_state.py +343 -0
- autobyteus/agent/streaming/parser/strategies/__init__.py +17 -0
- autobyteus/agent/streaming/parser/strategies/base.py +24 -0
- autobyteus/agent/streaming/parser/strategies/json_tool_strategy.py +26 -0
- autobyteus/agent/streaming/parser/strategies/registry.py +28 -0
- autobyteus/agent/streaming/parser/strategies/sentinel_strategy.py +23 -0
- autobyteus/agent/streaming/parser/strategies/xml_tag_strategy.py +21 -0
- autobyteus/agent/streaming/parser/stream_scanner.py +167 -0
- autobyteus/agent/streaming/parser/streaming_parser.py +212 -0
- autobyteus/agent/streaming/parser/tool_call_parsing.py +4 -0
- autobyteus/agent/streaming/parser/tool_constants.py +7 -0
- autobyteus/agent/streaming/parser/tool_syntax_registry.py +4 -0
- autobyteus/agent/streaming/parser/xml_tool_parsing_state_registry.py +55 -0
- autobyteus/agent/streaming/parsing_streaming_response_handler.py +4 -0
- autobyteus/agent/streaming/pass_through_streaming_response_handler.py +4 -0
- autobyteus/agent/streaming/queue_streamer.py +3 -57
- autobyteus/agent/streaming/segments/__init__.py +5 -0
- autobyteus/agent/streaming/segments/segment_events.py +81 -0
- autobyteus/agent/streaming/stream_event_payloads.py +2 -198
- autobyteus/agent/streaming/stream_events.py +3 -128
- autobyteus/agent/streaming/streaming_handler_factory.py +4 -0
- autobyteus/agent/streaming/streaming_response_handler.py +4 -0
- autobyteus/agent/streaming/streams/__init__.py +5 -0
- autobyteus/agent/streaming/streams/agent_event_stream.py +197 -0
- autobyteus/agent/streaming/utils/__init__.py +5 -0
- autobyteus/agent/streaming/utils/queue_streamer.py +59 -0
- autobyteus/agent/system_prompt_processor/__init__.py +2 -0
- autobyteus/agent/system_prompt_processor/available_skills_processor.py +96 -0
- autobyteus/agent/system_prompt_processor/base_processor.py +1 -1
- autobyteus/agent/system_prompt_processor/processor_meta.py +15 -2
- autobyteus/agent/system_prompt_processor/tool_manifest_injector_processor.py +39 -58
- autobyteus/agent/token_budget.py +56 -0
- autobyteus/agent/tool_execution_result_processor/memory_ingest_tool_result_processor.py +29 -0
- autobyteus/agent/tool_invocation.py +16 -40
- autobyteus/agent/tool_invocation_preprocessor/__init__.py +9 -0
- autobyteus/agent/tool_invocation_preprocessor/base_preprocessor.py +45 -0
- autobyteus/agent/tool_invocation_preprocessor/processor_definition.py +15 -0
- autobyteus/agent/tool_invocation_preprocessor/processor_meta.py +33 -0
- autobyteus/agent/tool_invocation_preprocessor/processor_registry.py +60 -0
- autobyteus/agent/utils/wait_for_idle.py +12 -14
- autobyteus/agent/workspace/base_workspace.py +6 -27
- autobyteus/agent_team/agent_team.py +3 -3
- autobyteus/agent_team/agent_team_builder.py +1 -41
- autobyteus/agent_team/bootstrap_steps/__init__.py +0 -4
- autobyteus/agent_team/bootstrap_steps/agent_configuration_preparation_step.py +8 -18
- autobyteus/agent_team/bootstrap_steps/agent_team_bootstrapper.py +4 -16
- autobyteus/agent_team/bootstrap_steps/base_agent_team_bootstrap_step.py +1 -2
- autobyteus/agent_team/bootstrap_steps/coordinator_initialization_step.py +1 -2
- autobyteus/agent_team/bootstrap_steps/task_notifier_initialization_step.py +5 -6
- autobyteus/agent_team/bootstrap_steps/team_context_initialization_step.py +15 -15
- autobyteus/agent_team/context/agent_team_config.py +6 -3
- autobyteus/agent_team/context/agent_team_context.py +25 -3
- autobyteus/agent_team/context/agent_team_runtime_state.py +11 -8
- autobyteus/agent_team/events/__init__.py +11 -0
- autobyteus/agent_team/events/agent_team_event_dispatcher.py +22 -9
- autobyteus/agent_team/events/agent_team_events.py +16 -0
- autobyteus/agent_team/events/event_store.py +57 -0
- autobyteus/agent_team/factory/agent_team_factory.py +8 -0
- autobyteus/agent_team/handlers/inter_agent_message_request_event_handler.py +18 -2
- autobyteus/agent_team/handlers/lifecycle_agent_team_event_handler.py +21 -5
- autobyteus/agent_team/handlers/process_user_message_event_handler.py +17 -8
- autobyteus/agent_team/handlers/tool_approval_team_event_handler.py +19 -4
- autobyteus/agent_team/runtime/agent_team_runtime.py +41 -10
- autobyteus/agent_team/runtime/agent_team_worker.py +69 -5
- autobyteus/agent_team/status/__init__.py +14 -0
- autobyteus/agent_team/status/agent_team_status.py +18 -0
- autobyteus/agent_team/status/agent_team_status_manager.py +33 -0
- autobyteus/agent_team/status/status_deriver.py +62 -0
- autobyteus/agent_team/status/status_update_utils.py +42 -0
- autobyteus/agent_team/streaming/__init__.py +2 -2
- autobyteus/agent_team/streaming/agent_team_event_notifier.py +10 -10
- autobyteus/agent_team/streaming/agent_team_stream_event_payloads.py +7 -7
- autobyteus/agent_team/streaming/agent_team_stream_events.py +11 -11
- autobyteus/agent_team/system_prompt_processor/__init__.py +6 -0
- autobyteus/agent_team/system_prompt_processor/team_manifest_injector_processor.py +76 -0
- autobyteus/agent_team/task_notification/activation_policy.py +1 -1
- autobyteus/agent_team/task_notification/system_event_driven_agent_task_notifier.py +22 -22
- autobyteus/agent_team/task_notification/task_notification_mode.py +20 -1
- autobyteus/agent_team/utils/wait_for_idle.py +4 -4
- autobyteus/cli/agent_cli.py +18 -10
- autobyteus/cli/agent_team_tui/app.py +18 -15
- autobyteus/cli/agent_team_tui/state.py +21 -23
- autobyteus/cli/agent_team_tui/widgets/agent_list_sidebar.py +15 -15
- autobyteus/cli/agent_team_tui/widgets/focus_pane.py +146 -39
- autobyteus/cli/agent_team_tui/widgets/renderables.py +1 -1
- autobyteus/cli/agent_team_tui/widgets/shared.py +26 -26
- autobyteus/cli/agent_team_tui/widgets/{task_board_panel.py → task_plan_panel.py} +5 -5
- autobyteus/cli/cli_display.py +193 -44
- autobyteus/cli/workflow_tui/app.py +9 -10
- autobyteus/cli/workflow_tui/state.py +14 -16
- autobyteus/cli/workflow_tui/widgets/agent_list_sidebar.py +15 -15
- autobyteus/cli/workflow_tui/widgets/focus_pane.py +137 -35
- autobyteus/cli/workflow_tui/widgets/renderables.py +1 -1
- autobyteus/cli/workflow_tui/widgets/shared.py +25 -25
- autobyteus/clients/autobyteus_client.py +94 -1
- autobyteus/events/event_types.py +15 -21
- autobyteus/llm/api/autobyteus_llm.py +33 -29
- autobyteus/llm/api/claude_llm.py +142 -36
- autobyteus/llm/api/gemini_llm.py +163 -59
- autobyteus/llm/api/grok_llm.py +1 -1
- autobyteus/llm/api/minimax_llm.py +26 -0
- autobyteus/llm/api/mistral_llm.py +113 -87
- autobyteus/llm/api/ollama_llm.py +9 -42
- autobyteus/llm/api/openai_compatible_llm.py +127 -91
- autobyteus/llm/api/openai_llm.py +3 -3
- autobyteus/llm/api/openai_responses_llm.py +324 -0
- autobyteus/llm/api/zhipu_llm.py +21 -2
- autobyteus/llm/autobyteus_provider.py +70 -60
- autobyteus/llm/base_llm.py +85 -81
- autobyteus/llm/converters/__init__.py +14 -0
- autobyteus/llm/converters/anthropic_tool_call_converter.py +37 -0
- autobyteus/llm/converters/gemini_tool_call_converter.py +57 -0
- autobyteus/llm/converters/mistral_tool_call_converter.py +37 -0
- autobyteus/llm/converters/openai_tool_call_converter.py +38 -0
- autobyteus/llm/extensions/base_extension.py +6 -12
- autobyteus/llm/extensions/token_usage_tracking_extension.py +45 -18
- autobyteus/llm/llm_factory.py +282 -204
- autobyteus/llm/lmstudio_provider.py +60 -49
- autobyteus/llm/models.py +35 -2
- autobyteus/llm/ollama_provider.py +60 -49
- autobyteus/llm/ollama_provider_resolver.py +0 -1
- autobyteus/llm/prompt_renderers/__init__.py +19 -0
- autobyteus/llm/prompt_renderers/anthropic_prompt_renderer.py +104 -0
- autobyteus/llm/prompt_renderers/autobyteus_prompt_renderer.py +19 -0
- autobyteus/llm/prompt_renderers/base_prompt_renderer.py +10 -0
- autobyteus/llm/prompt_renderers/gemini_prompt_renderer.py +63 -0
- autobyteus/llm/prompt_renderers/mistral_prompt_renderer.py +87 -0
- autobyteus/llm/prompt_renderers/ollama_prompt_renderer.py +51 -0
- autobyteus/llm/prompt_renderers/openai_chat_renderer.py +97 -0
- autobyteus/llm/prompt_renderers/openai_responses_renderer.py +101 -0
- autobyteus/llm/providers.py +1 -3
- autobyteus/llm/token_counter/claude_token_counter.py +56 -25
- autobyteus/llm/token_counter/mistral_token_counter.py +12 -8
- autobyteus/llm/token_counter/openai_token_counter.py +24 -5
- autobyteus/llm/token_counter/token_counter_factory.py +12 -5
- autobyteus/llm/utils/llm_config.py +6 -12
- autobyteus/llm/utils/media_payload_formatter.py +27 -20
- autobyteus/llm/utils/messages.py +55 -3
- autobyteus/llm/utils/response_types.py +3 -0
- autobyteus/llm/utils/tool_call_delta.py +31 -0
- autobyteus/memory/__init__.py +32 -0
- autobyteus/memory/active_transcript.py +69 -0
- autobyteus/memory/compaction/__init__.py +9 -0
- autobyteus/memory/compaction/compaction_result.py +8 -0
- autobyteus/memory/compaction/compactor.py +89 -0
- autobyteus/memory/compaction/summarizer.py +11 -0
- autobyteus/memory/compaction_snapshot_builder.py +84 -0
- autobyteus/memory/memory_manager.py +183 -0
- autobyteus/memory/models/__init__.py +14 -0
- autobyteus/memory/models/episodic_item.py +41 -0
- autobyteus/memory/models/memory_types.py +7 -0
- autobyteus/memory/models/raw_trace_item.py +79 -0
- autobyteus/memory/models/semantic_item.py +41 -0
- autobyteus/memory/models/tool_interaction.py +20 -0
- autobyteus/memory/policies/__init__.py +5 -0
- autobyteus/memory/policies/compaction_policy.py +16 -0
- autobyteus/memory/retrieval/__init__.py +7 -0
- autobyteus/memory/retrieval/memory_bundle.py +11 -0
- autobyteus/memory/retrieval/retriever.py +13 -0
- autobyteus/memory/store/__init__.py +7 -0
- autobyteus/memory/store/base_store.py +14 -0
- autobyteus/memory/store/file_store.py +98 -0
- autobyteus/memory/tool_interaction_builder.py +46 -0
- autobyteus/memory/turn_tracker.py +9 -0
- autobyteus/multimedia/audio/api/__init__.py +3 -2
- autobyteus/multimedia/audio/api/autobyteus_audio_client.py +19 -5
- autobyteus/multimedia/audio/api/gemini_audio_client.py +108 -16
- autobyteus/multimedia/audio/api/openai_audio_client.py +112 -0
- autobyteus/multimedia/audio/audio_client_factory.py +84 -9
- autobyteus/multimedia/audio/audio_model.py +2 -1
- autobyteus/multimedia/image/api/autobyteus_image_client.py +19 -5
- autobyteus/multimedia/image/api/gemini_image_client.py +38 -17
- autobyteus/multimedia/image/api/openai_image_client.py +125 -43
- autobyteus/multimedia/image/autobyteus_image_provider.py +2 -1
- autobyteus/multimedia/image/image_client_factory.py +47 -15
- autobyteus/multimedia/image/image_model.py +5 -2
- autobyteus/multimedia/providers.py +3 -2
- autobyteus/skills/loader.py +71 -0
- autobyteus/skills/model.py +11 -0
- autobyteus/skills/registry.py +70 -0
- autobyteus/task_management/__init__.py +43 -20
- autobyteus/task_management/{base_task_board.py → base_task_plan.py} +16 -13
- autobyteus/task_management/converters/__init__.py +2 -2
- autobyteus/task_management/converters/{task_board_converter.py → task_plan_converter.py} +13 -13
- autobyteus/task_management/events.py +7 -7
- autobyteus/task_management/{in_memory_task_board.py → in_memory_task_plan.py} +34 -22
- autobyteus/task_management/schemas/__init__.py +3 -0
- autobyteus/task_management/schemas/task_status_report.py +2 -2
- autobyteus/task_management/schemas/todo_definition.py +15 -0
- autobyteus/task_management/todo.py +29 -0
- autobyteus/task_management/todo_list.py +75 -0
- autobyteus/task_management/tools/__init__.py +24 -8
- autobyteus/task_management/tools/task_tools/__init__.py +19 -0
- autobyteus/task_management/tools/{assign_task_to.py → task_tools/assign_task_to.py} +18 -18
- autobyteus/task_management/tools/{publish_task.py → task_tools/create_task.py} +16 -18
- autobyteus/task_management/tools/{publish_tasks.py → task_tools/create_tasks.py} +19 -19
- autobyteus/task_management/tools/{get_my_tasks.py → task_tools/get_my_tasks.py} +15 -15
- autobyteus/task_management/tools/{get_task_board_status.py → task_tools/get_task_plan_status.py} +16 -16
- autobyteus/task_management/tools/{update_task_status.py → task_tools/update_task_status.py} +16 -16
- autobyteus/task_management/tools/todo_tools/__init__.py +18 -0
- autobyteus/task_management/tools/todo_tools/add_todo.py +78 -0
- autobyteus/task_management/tools/todo_tools/create_todo_list.py +79 -0
- autobyteus/task_management/tools/todo_tools/get_todo_list.py +55 -0
- autobyteus/task_management/tools/todo_tools/update_todo_status.py +85 -0
- autobyteus/tools/__init__.py +43 -52
- autobyteus/tools/base_tool.py +7 -0
- autobyteus/tools/file/__init__.py +9 -0
- autobyteus/tools/file/patch_file.py +149 -0
- autobyteus/tools/file/{file_reader.py → read_file.py} +38 -7
- autobyteus/tools/file/{file_writer.py → write_file.py} +7 -4
- autobyteus/tools/functional_tool.py +53 -14
- autobyteus/tools/mcp/__init__.py +2 -0
- autobyteus/tools/mcp/config_service.py +5 -1
- autobyteus/tools/mcp/server/__init__.py +2 -0
- autobyteus/tools/mcp/server/http_managed_mcp_server.py +1 -1
- autobyteus/tools/mcp/server/websocket_managed_mcp_server.py +141 -0
- autobyteus/tools/mcp/server_instance_manager.py +8 -1
- autobyteus/tools/mcp/tool.py +3 -3
- autobyteus/tools/mcp/tool_registrar.py +5 -2
- autobyteus/tools/mcp/types.py +61 -0
- autobyteus/tools/multimedia/__init__.py +2 -1
- autobyteus/tools/multimedia/audio_tools.py +72 -19
- autobyteus/tools/{download_media_tool.py → multimedia/download_media_tool.py} +21 -7
- autobyteus/tools/multimedia/image_tools.py +248 -64
- autobyteus/tools/multimedia/media_reader_tool.py +1 -1
- autobyteus/tools/operation_executor/journal_manager.py +107 -0
- autobyteus/tools/operation_executor/operation_event_buffer.py +57 -0
- autobyteus/tools/operation_executor/operation_event_producer.py +29 -0
- autobyteus/tools/operation_executor/operation_executor.py +58 -0
- autobyteus/tools/registry/tool_definition.py +108 -14
- autobyteus/tools/registry/tool_registry.py +29 -0
- autobyteus/tools/search/__init__.py +17 -0
- autobyteus/tools/search/base_strategy.py +35 -0
- autobyteus/tools/search/client.py +24 -0
- autobyteus/tools/search/factory.py +81 -0
- autobyteus/tools/search/google_cse_strategy.py +68 -0
- autobyteus/tools/search/providers.py +10 -0
- autobyteus/tools/search/serpapi_strategy.py +65 -0
- autobyteus/tools/search/serper_strategy.py +87 -0
- autobyteus/tools/search_tool.py +83 -0
- autobyteus/tools/skill/load_skill.py +50 -0
- autobyteus/tools/terminal/__init__.py +45 -0
- autobyteus/tools/terminal/ansi_utils.py +32 -0
- autobyteus/tools/terminal/background_process_manager.py +233 -0
- autobyteus/tools/terminal/output_buffer.py +105 -0
- autobyteus/tools/terminal/prompt_detector.py +63 -0
- autobyteus/tools/terminal/pty_session.py +241 -0
- autobyteus/tools/terminal/session_factory.py +20 -0
- autobyteus/tools/terminal/terminal_session_manager.py +226 -0
- autobyteus/tools/terminal/tools/__init__.py +13 -0
- autobyteus/tools/terminal/tools/get_process_output.py +81 -0
- autobyteus/tools/terminal/tools/run_bash.py +109 -0
- autobyteus/tools/terminal/tools/start_background_process.py +104 -0
- autobyteus/tools/terminal/tools/stop_background_process.py +67 -0
- autobyteus/tools/terminal/types.py +54 -0
- autobyteus/tools/terminal/wsl_tmux_session.py +221 -0
- autobyteus/tools/terminal/wsl_utils.py +156 -0
- autobyteus/tools/tool_meta.py +4 -24
- autobyteus/tools/transaction_management/backup_handler.py +48 -0
- autobyteus/tools/transaction_management/operation_lifecycle_manager.py +62 -0
- autobyteus/tools/usage/__init__.py +1 -2
- autobyteus/tools/usage/formatters/__init__.py +17 -1
- autobyteus/tools/usage/formatters/base_formatter.py +8 -0
- autobyteus/tools/usage/formatters/default_xml_schema_formatter.py +2 -2
- autobyteus/tools/usage/formatters/mistral_json_schema_formatter.py +18 -0
- autobyteus/tools/usage/formatters/patch_file_xml_example_formatter.py +64 -0
- autobyteus/tools/usage/formatters/patch_file_xml_schema_formatter.py +31 -0
- autobyteus/tools/usage/formatters/run_bash_xml_example_formatter.py +32 -0
- autobyteus/tools/usage/formatters/run_bash_xml_schema_formatter.py +36 -0
- autobyteus/tools/usage/formatters/write_file_xml_example_formatter.py +53 -0
- autobyteus/tools/usage/formatters/write_file_xml_schema_formatter.py +31 -0
- autobyteus/tools/usage/providers/tool_manifest_provider.py +10 -10
- autobyteus/tools/usage/registries/__init__.py +1 -3
- autobyteus/tools/usage/registries/tool_formatting_registry.py +115 -8
- autobyteus/tools/usage/tool_schema_provider.py +51 -0
- autobyteus/tools/web/__init__.py +4 -0
- autobyteus/tools/web/read_url_tool.py +80 -0
- autobyteus/utils/diff_utils.py +271 -0
- autobyteus/utils/download_utils.py +109 -0
- autobyteus/utils/file_utils.py +57 -2
- autobyteus/utils/gemini_helper.py +56 -0
- autobyteus/utils/gemini_model_mapping.py +71 -0
- autobyteus/utils/llm_output_formatter.py +75 -0
- autobyteus/utils/tool_call_format.py +36 -0
- autobyteus/workflow/agentic_workflow.py +3 -3
- autobyteus/workflow/bootstrap_steps/agent_tool_injection_step.py +2 -2
- autobyteus/workflow/bootstrap_steps/base_workflow_bootstrap_step.py +2 -2
- autobyteus/workflow/bootstrap_steps/coordinator_initialization_step.py +2 -2
- autobyteus/workflow/bootstrap_steps/coordinator_prompt_preparation_step.py +4 -11
- autobyteus/workflow/bootstrap_steps/workflow_bootstrapper.py +6 -6
- autobyteus/workflow/bootstrap_steps/workflow_runtime_queue_initialization_step.py +2 -2
- autobyteus/workflow/context/workflow_context.py +3 -3
- autobyteus/workflow/context/workflow_runtime_state.py +5 -5
- autobyteus/workflow/events/workflow_event_dispatcher.py +5 -5
- autobyteus/workflow/handlers/lifecycle_workflow_event_handler.py +3 -3
- autobyteus/workflow/handlers/process_user_message_event_handler.py +5 -5
- autobyteus/workflow/handlers/tool_approval_workflow_event_handler.py +2 -2
- autobyteus/workflow/runtime/workflow_runtime.py +8 -8
- autobyteus/workflow/runtime/workflow_worker.py +3 -3
- autobyteus/workflow/status/__init__.py +11 -0
- autobyteus/workflow/status/workflow_status.py +19 -0
- autobyteus/workflow/status/workflow_status_manager.py +48 -0
- autobyteus/workflow/streaming/__init__.py +2 -2
- autobyteus/workflow/streaming/workflow_event_notifier.py +7 -7
- autobyteus/workflow/streaming/workflow_stream_event_payloads.py +4 -4
- autobyteus/workflow/streaming/workflow_stream_events.py +3 -3
- autobyteus/workflow/utils/wait_for_idle.py +4 -4
- autobyteus-1.2.3.dist-info/METADATA +293 -0
- autobyteus-1.2.3.dist-info/RECORD +600 -0
- {autobyteus-1.2.0.dist-info → autobyteus-1.2.3.dist-info}/WHEEL +1 -1
- {autobyteus-1.2.0.dist-info → autobyteus-1.2.3.dist-info}/top_level.txt +0 -1
- autobyteus/agent/bootstrap_steps/agent_runtime_queue_initialization_step.py +0 -57
- autobyteus/agent/hooks/__init__.py +0 -16
- autobyteus/agent/hooks/base_phase_hook.py +0 -78
- autobyteus/agent/hooks/hook_definition.py +0 -36
- autobyteus/agent/hooks/hook_meta.py +0 -37
- autobyteus/agent/hooks/hook_registry.py +0 -106
- autobyteus/agent/llm_response_processor/provider_aware_tool_usage_processor.py +0 -103
- autobyteus/agent/phases/__init__.py +0 -18
- autobyteus/agent/phases/discover.py +0 -53
- autobyteus/agent/phases/manager.py +0 -265
- autobyteus/agent/phases/transition_decorator.py +0 -40
- autobyteus/agent/phases/transition_info.py +0 -33
- autobyteus/agent/remote_agent.py +0 -244
- autobyteus/agent/workspace/workspace_definition.py +0 -36
- autobyteus/agent/workspace/workspace_meta.py +0 -37
- autobyteus/agent/workspace/workspace_registry.py +0 -72
- autobyteus/agent_team/bootstrap_steps/agent_team_runtime_queue_initialization_step.py +0 -25
- autobyteus/agent_team/bootstrap_steps/coordinator_prompt_preparation_step.py +0 -85
- autobyteus/agent_team/phases/__init__.py +0 -11
- autobyteus/agent_team/phases/agent_team_operational_phase.py +0 -19
- autobyteus/agent_team/phases/agent_team_phase_manager.py +0 -48
- autobyteus/llm/api/bedrock_llm.py +0 -92
- autobyteus/llm/api/groq_llm.py +0 -94
- autobyteus/llm/api/nvidia_llm.py +0 -108
- autobyteus/llm/utils/token_pricing_config.py +0 -87
- autobyteus/person/examples/sample_persons.py +0 -14
- autobyteus/person/examples/sample_roles.py +0 -14
- autobyteus/person/person.py +0 -29
- autobyteus/person/role.py +0 -14
- autobyteus/rpc/__init__.py +0 -73
- autobyteus/rpc/client/__init__.py +0 -17
- autobyteus/rpc/client/abstract_client_connection.py +0 -124
- autobyteus/rpc/client/client_connection_manager.py +0 -153
- autobyteus/rpc/client/sse_client_connection.py +0 -306
- autobyteus/rpc/client/stdio_client_connection.py +0 -280
- autobyteus/rpc/config/__init__.py +0 -13
- autobyteus/rpc/config/agent_server_config.py +0 -153
- autobyteus/rpc/config/agent_server_registry.py +0 -152
- autobyteus/rpc/hosting.py +0 -244
- autobyteus/rpc/protocol.py +0 -244
- autobyteus/rpc/server/__init__.py +0 -20
- autobyteus/rpc/server/agent_server_endpoint.py +0 -181
- autobyteus/rpc/server/base_method_handler.py +0 -40
- autobyteus/rpc/server/method_handlers.py +0 -259
- autobyteus/rpc/server/sse_server_handler.py +0 -182
- autobyteus/rpc/server/stdio_server_handler.py +0 -151
- autobyteus/rpc/server_main.py +0 -198
- autobyteus/rpc/transport_type.py +0 -13
- autobyteus/tools/bash/__init__.py +0 -2
- autobyteus/tools/bash/bash_executor.py +0 -100
- autobyteus/tools/browser/__init__.py +0 -2
- autobyteus/tools/browser/session_aware/__init__.py +0 -0
- autobyteus/tools/browser/session_aware/browser_session_aware_navigate_to.py +0 -75
- autobyteus/tools/browser/session_aware/browser_session_aware_tool.py +0 -30
- autobyteus/tools/browser/session_aware/browser_session_aware_web_element_trigger.py +0 -154
- autobyteus/tools/browser/session_aware/browser_session_aware_webpage_reader.py +0 -89
- autobyteus/tools/browser/session_aware/browser_session_aware_webpage_screenshot_taker.py +0 -107
- autobyteus/tools/browser/session_aware/factory/__init__.py +0 -0
- autobyteus/tools/browser/session_aware/factory/browser_session_aware_web_element_trigger_factory.py +0 -14
- autobyteus/tools/browser/session_aware/factory/browser_session_aware_webpage_reader_factory.py +0 -26
- autobyteus/tools/browser/session_aware/factory/browser_session_aware_webpage_screenshot_taker_factory.py +0 -14
- autobyteus/tools/browser/session_aware/shared_browser_session.py +0 -11
- autobyteus/tools/browser/session_aware/shared_browser_session_manager.py +0 -25
- autobyteus/tools/browser/session_aware/web_element_action.py +0 -20
- autobyteus/tools/browser/standalone/__init__.py +0 -6
- autobyteus/tools/browser/standalone/factory/__init__.py +0 -0
- autobyteus/tools/browser/standalone/factory/webpage_reader_factory.py +0 -25
- autobyteus/tools/browser/standalone/factory/webpage_screenshot_taker_factory.py +0 -14
- autobyteus/tools/browser/standalone/navigate_to.py +0 -80
- autobyteus/tools/browser/standalone/web_page_pdf_generator.py +0 -97
- autobyteus/tools/browser/standalone/webpage_image_downloader.py +0 -165
- autobyteus/tools/browser/standalone/webpage_reader.py +0 -101
- autobyteus/tools/browser/standalone/webpage_screenshot_taker.py +0 -101
- autobyteus/tools/file/file_editor.py +0 -200
- autobyteus/tools/google_search.py +0 -149
- autobyteus/tools/timer.py +0 -171
- autobyteus/tools/usage/parsers/__init__.py +0 -22
- autobyteus/tools/usage/parsers/_json_extractor.py +0 -99
- autobyteus/tools/usage/parsers/_string_decoders.py +0 -18
- autobyteus/tools/usage/parsers/anthropic_xml_tool_usage_parser.py +0 -10
- autobyteus/tools/usage/parsers/base_parser.py +0 -41
- autobyteus/tools/usage/parsers/default_json_tool_usage_parser.py +0 -83
- autobyteus/tools/usage/parsers/default_xml_tool_usage_parser.py +0 -316
- autobyteus/tools/usage/parsers/exceptions.py +0 -13
- autobyteus/tools/usage/parsers/gemini_json_tool_usage_parser.py +0 -77
- autobyteus/tools/usage/parsers/openai_json_tool_usage_parser.py +0 -149
- autobyteus/tools/usage/parsers/provider_aware_tool_usage_parser.py +0 -59
- autobyteus/tools/usage/registries/tool_usage_parser_registry.py +0 -62
- autobyteus/workflow/phases/__init__.py +0 -11
- autobyteus/workflow/phases/workflow_operational_phase.py +0 -19
- autobyteus/workflow/phases/workflow_phase_manager.py +0 -48
- autobyteus-1.2.0.dist-info/METADATA +0 -205
- autobyteus-1.2.0.dist-info/RECORD +0 -496
- examples/__init__.py +0 -1
- examples/agent_team/__init__.py +0 -1
- examples/discover_phase_transitions.py +0 -104
- examples/run_browser_agent.py +0 -262
- examples/run_google_slides_agent.py +0 -287
- examples/run_mcp_browser_client.py +0 -174
- examples/run_mcp_google_slides_client.py +0 -270
- examples/run_mcp_list_tools.py +0 -189
- examples/run_poem_writer.py +0 -284
- examples/run_sqlite_agent.py +0 -295
- /autobyteus/{person → skills}/__init__.py +0 -0
- /autobyteus/{person/examples → tools/skill}/__init__.py +0 -0
- {autobyteus-1.2.0.dist-info → autobyteus-1.2.3.dist-info}/licenses/LICENSE +0 -0
|
@@ -5,18 +5,25 @@ Also includes the WorkerEventDispatcher for routing events within an agent's wor
|
|
|
5
5
|
"""
|
|
6
6
|
from .agent_input_event_queue_manager import AgentInputEventQueueManager
|
|
7
7
|
from .worker_event_dispatcher import WorkerEventDispatcher
|
|
8
|
+
from .event_store import AgentEventStore, EventEnvelope
|
|
8
9
|
|
|
9
10
|
from .agent_events import (
|
|
10
11
|
BaseEvent,
|
|
11
12
|
# Categorical Base Events
|
|
12
13
|
LifecycleEvent,
|
|
13
14
|
AgentProcessingEvent,
|
|
14
|
-
# Agent
|
|
15
|
+
# Agent Status-Specific Base Events
|
|
15
16
|
AgentOperationalEvent,
|
|
16
17
|
# Specific Lifecycle Events
|
|
17
18
|
AgentReadyEvent,
|
|
18
19
|
AgentStoppedEvent,
|
|
19
20
|
AgentErrorEvent,
|
|
21
|
+
AgentIdleEvent,
|
|
22
|
+
ShutdownRequestedEvent,
|
|
23
|
+
BootstrapStartedEvent,
|
|
24
|
+
BootstrapStepRequestedEvent,
|
|
25
|
+
BootstrapStepCompletedEvent,
|
|
26
|
+
BootstrapCompletedEvent,
|
|
20
27
|
# Regular Agent Processing Events
|
|
21
28
|
UserMessageReceivedEvent,
|
|
22
29
|
InterAgentMessageReceivedEvent,
|
|
@@ -33,6 +40,8 @@ from .agent_events import (
|
|
|
33
40
|
__all__ = [
|
|
34
41
|
"AgentInputEventQueueManager",
|
|
35
42
|
"WorkerEventDispatcher",
|
|
43
|
+
"AgentEventStore",
|
|
44
|
+
"EventEnvelope",
|
|
36
45
|
"BaseEvent",
|
|
37
46
|
"LifecycleEvent",
|
|
38
47
|
"AgentProcessingEvent",
|
|
@@ -40,6 +49,12 @@ __all__ = [
|
|
|
40
49
|
"AgentReadyEvent",
|
|
41
50
|
"AgentStoppedEvent",
|
|
42
51
|
"AgentErrorEvent",
|
|
52
|
+
"AgentIdleEvent",
|
|
53
|
+
"ShutdownRequestedEvent",
|
|
54
|
+
"BootstrapStartedEvent",
|
|
55
|
+
"BootstrapStepRequestedEvent",
|
|
56
|
+
"BootstrapStepCompletedEvent",
|
|
57
|
+
"BootstrapCompletedEvent",
|
|
43
58
|
"UserMessageReceivedEvent",
|
|
44
59
|
"InterAgentMessageReceivedEvent",
|
|
45
60
|
"LLMUserMessageReadyEvent",
|
|
@@ -1,10 +1,12 @@
|
|
|
1
|
+
|
|
1
2
|
# file: autobyteus/autobyteus/agent/events/agent_events.py
|
|
2
3
|
from dataclasses import dataclass, field
|
|
3
4
|
from typing import Any, Dict, Optional
|
|
4
5
|
|
|
5
6
|
from autobyteus.agent.message.agent_input_user_message import AgentInputUserMessage
|
|
6
|
-
from autobyteus.agent.tool_invocation import ToolInvocation
|
|
7
7
|
from autobyteus.agent.message.inter_agent_message import InterAgentMessage
|
|
8
|
+
from autobyteus.agent.status.status_enum import AgentStatus
|
|
9
|
+
from autobyteus.agent.tool_invocation import ToolInvocation
|
|
8
10
|
from autobyteus.llm.user_message import LLMUserMessage
|
|
9
11
|
from autobyteus.llm.utils.response_types import CompleteResponse
|
|
10
12
|
|
|
@@ -25,10 +27,10 @@ class AgentProcessingEvent(BaseEvent):
|
|
|
25
27
|
"""Base class for events related to the agent's internal data processing and task execution logic."""
|
|
26
28
|
|
|
27
29
|
|
|
28
|
-
# --- Agent Operational
|
|
30
|
+
# --- Agent Operational Status Events ---
|
|
29
31
|
@dataclass
|
|
30
32
|
class AgentOperationalEvent(AgentProcessingEvent):
|
|
31
|
-
"""Base class for events that occur during the agent's active operational
|
|
33
|
+
"""Base class for events that occur during the agent's active operational status (post-preparation)."""
|
|
32
34
|
pass
|
|
33
35
|
|
|
34
36
|
|
|
@@ -50,6 +52,42 @@ class AgentErrorEvent(LifecycleEvent):
|
|
|
50
52
|
error_message: str
|
|
51
53
|
exception_details: Optional[str] = None
|
|
52
54
|
|
|
55
|
+
@dataclass
|
|
56
|
+
class AgentIdleEvent(LifecycleEvent):
|
|
57
|
+
"""Event indicating the agent has completed a processing cycle and is idle."""
|
|
58
|
+
pass
|
|
59
|
+
|
|
60
|
+
@dataclass
|
|
61
|
+
class ShutdownRequestedEvent(LifecycleEvent):
|
|
62
|
+
"""Event indicating a shutdown has been requested."""
|
|
63
|
+
pass
|
|
64
|
+
|
|
65
|
+
# --- Bootstrap Lifecycle Events ---
|
|
66
|
+
|
|
67
|
+
@dataclass
|
|
68
|
+
class BootstrapStartedEvent(LifecycleEvent):
|
|
69
|
+
"""Event indicating the bootstrap orchestration has begun."""
|
|
70
|
+
pass
|
|
71
|
+
|
|
72
|
+
@dataclass
|
|
73
|
+
class BootstrapStepRequestedEvent(LifecycleEvent):
|
|
74
|
+
"""Event requesting execution of a specific bootstrap step."""
|
|
75
|
+
step_index: int
|
|
76
|
+
|
|
77
|
+
@dataclass
|
|
78
|
+
class BootstrapStepCompletedEvent(LifecycleEvent):
|
|
79
|
+
"""Event indicating a bootstrap step has completed."""
|
|
80
|
+
step_index: int
|
|
81
|
+
step_name: str
|
|
82
|
+
success: bool
|
|
83
|
+
error_message: Optional[str] = None
|
|
84
|
+
|
|
85
|
+
@dataclass
|
|
86
|
+
class BootstrapCompletedEvent(LifecycleEvent):
|
|
87
|
+
"""Event indicating the bootstrap sequence has completed."""
|
|
88
|
+
success: bool
|
|
89
|
+
error_message: Optional[str] = None
|
|
90
|
+
|
|
53
91
|
|
|
54
92
|
# --- Regular Agent Processing Events (now Operational) ---
|
|
55
93
|
|
|
@@ -85,7 +123,9 @@ class ToolResultEvent(AgentOperationalEvent):
|
|
|
85
123
|
tool_name: str
|
|
86
124
|
result: Any
|
|
87
125
|
tool_invocation_id: Optional[str] = None
|
|
126
|
+
turn_id: Optional[str] = None
|
|
88
127
|
error: Optional[str] = None
|
|
128
|
+
tool_args: Optional[Dict[str, Any]] = None # Carries original arguments for internal processing (e.g. artifacts)
|
|
89
129
|
|
|
90
130
|
@dataclass
|
|
91
131
|
class ToolExecutionApprovalEvent(AgentOperationalEvent):
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
import asyncio
|
|
3
3
|
import logging
|
|
4
4
|
from typing import Any, AsyncIterator, Union, Tuple, Optional, List, TYPE_CHECKING, Dict, Set
|
|
5
|
+
from collections import deque
|
|
5
6
|
|
|
6
7
|
# Import specific event types for queue annotations where possible
|
|
7
8
|
if TYPE_CHECKING:
|
|
@@ -20,7 +21,9 @@ logger = logging.getLogger(__name__)
|
|
|
20
21
|
class AgentInputEventQueueManager:
|
|
21
22
|
"""
|
|
22
23
|
Manages asyncio.Queue instances for events consumed by the AgentRuntime's
|
|
23
|
-
main event loop.
|
|
24
|
+
main event loop. Uses per-queue ready buffers plus a deterministic priority
|
|
25
|
+
order to avoid requeue-induced reordering when multiple queues are ready at
|
|
26
|
+
the same time.
|
|
24
27
|
"""
|
|
25
28
|
def __init__(self, queue_size: int = 0):
|
|
26
29
|
self.user_message_input_queue: asyncio.Queue['UserMessageReceivedEvent'] = asyncio.Queue(maxsize=queue_size)
|
|
@@ -38,6 +41,21 @@ class AgentInputEventQueueManager:
|
|
|
38
41
|
("tool_execution_approval_queue", self.tool_execution_approval_queue),
|
|
39
42
|
("internal_system_event_queue", self.internal_system_event_queue),
|
|
40
43
|
]
|
|
44
|
+
|
|
45
|
+
# Buffer of ready items per queue to avoid requeue-induced reordering.
|
|
46
|
+
self._ready_buffers: Dict[str, deque[Any]] = {
|
|
47
|
+
name: deque() for name, _ in self._input_queues
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
# Deterministic priority order when multiple queues are ready.
|
|
51
|
+
self._queue_priority: List[str] = [
|
|
52
|
+
"user_message_input_queue",
|
|
53
|
+
"inter_agent_message_input_queue",
|
|
54
|
+
"tool_invocation_request_queue",
|
|
55
|
+
"tool_result_input_queue",
|
|
56
|
+
"tool_execution_approval_queue",
|
|
57
|
+
"internal_system_event_queue",
|
|
58
|
+
]
|
|
41
59
|
logger.info("AgentInputEventQueueManager initialized.")
|
|
42
60
|
|
|
43
61
|
async def enqueue_user_message(self, event: 'UserMessageReceivedEvent') -> None:
|
|
@@ -65,7 +83,27 @@ class AgentInputEventQueueManager:
|
|
|
65
83
|
logger.debug(f"Enqueued internal system event: {type(event).__name__}")
|
|
66
84
|
|
|
67
85
|
async def get_next_input_event(self) -> Optional[Tuple[str, 'BaseEvent']]: # type: ignore[type-var]
|
|
68
|
-
|
|
86
|
+
"""
|
|
87
|
+
Returns the next available event along with its originating queue name.
|
|
88
|
+
|
|
89
|
+
Algorithm:
|
|
90
|
+
1. Serve any buffered items first (buffers keep FIFO per queue).
|
|
91
|
+
2. If none buffered, await one get() per queue with FIRST_COMPLETED,
|
|
92
|
+
buffer all completed results (no requeue to the tail), cancel the rest.
|
|
93
|
+
3. Return the highest-priority buffered item.
|
|
94
|
+
|
|
95
|
+
This preserves intra-queue order and avoids the previous bug where
|
|
96
|
+
re-inserting a ready item to the queue tail could invert tool call order.
|
|
97
|
+
"""
|
|
98
|
+
# 1) Serve any buffered items first (deterministic priority).
|
|
99
|
+
for qname in self._queue_priority:
|
|
100
|
+
buf = self._ready_buffers.get(qname)
|
|
101
|
+
if buf and buf:
|
|
102
|
+
event = buf.popleft()
|
|
103
|
+
logger.debug(f"get_next_input_event: Returning buffered event from {qname}: {type(event).__name__}")
|
|
104
|
+
return (qname, event)
|
|
105
|
+
|
|
106
|
+
# 2) No buffered items; proceed to gather one from live queues.
|
|
69
107
|
logger.debug(f"get_next_input_event: Checking queue sizes before creating tasks...")
|
|
70
108
|
for name, q_obj in self._input_queues:
|
|
71
109
|
if q_obj is not None: # pragma: no cover
|
|
@@ -82,9 +120,6 @@ class AgentInputEventQueueManager:
|
|
|
82
120
|
|
|
83
121
|
logger.debug(f"get_next_input_event: Created {len(created_tasks)} tasks for queues: {[t.get_name() for t in created_tasks]}. Awaiting asyncio.wait...")
|
|
84
122
|
|
|
85
|
-
event_tuple: Optional[Tuple[str, 'BaseEvent']] = None # type: ignore[type-var]
|
|
86
|
-
done_tasks_from_wait: Set[asyncio.Task] = set()
|
|
87
|
-
|
|
88
123
|
try:
|
|
89
124
|
done_tasks_from_wait, pending_tasks_from_wait = await asyncio.wait(
|
|
90
125
|
created_tasks, return_when=asyncio.FIRST_COMPLETED
|
|
@@ -92,37 +127,27 @@ class AgentInputEventQueueManager:
|
|
|
92
127
|
|
|
93
128
|
logger.debug(f"get_next_input_event: asyncio.wait returned. Done tasks: {len(done_tasks_from_wait)}, Pending tasks: {len(pending_tasks_from_wait)}.")
|
|
94
129
|
|
|
95
|
-
|
|
96
|
-
for i, task_in_done in enumerate(done_tasks_from_wait): # pragma: no cover
|
|
97
|
-
logger.debug(f"get_next_input_event: Processing done task #{i+1} (name: {task_in_done.get_name()})")
|
|
98
|
-
|
|
130
|
+
# Collect all done results into buffers without requeueing
|
|
99
131
|
for task in done_tasks_from_wait:
|
|
100
132
|
queue_name = task.get_name()
|
|
101
133
|
try:
|
|
102
|
-
event_result: Any = task.result()
|
|
134
|
+
event_result: Any = task.result()
|
|
103
135
|
logger.debug(f"get_next_input_event: Task for queue '{queue_name}' completed. Result type: {type(event_result).__name__}, Result: {str(event_result)[:100]}")
|
|
104
136
|
|
|
105
|
-
|
|
106
|
-
from autobyteus.agent.events.agent_events import BaseEvent as AgentBaseEvent
|
|
137
|
+
from autobyteus.agent.events.agent_events import BaseEvent as AgentBaseEvent
|
|
107
138
|
if isinstance(event_result, AgentBaseEvent):
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
event_tuple = (queue_name, event)
|
|
111
|
-
logger.debug(f"get_next_input_event: Dequeued event from {queue_name}: {type(event).__name__}")
|
|
112
|
-
else: # pragma: no cover
|
|
113
|
-
original_queue = next((q for n, q in self._input_queues if n == queue_name), None)
|
|
114
|
-
if original_queue:
|
|
115
|
-
original_queue.put_nowait(event)
|
|
116
|
-
logger.warning(f"get_next_input_event: Re-queued event from {queue_name} (type {type(event).__name__}) as another event was processed first in the same wait cycle.")
|
|
139
|
+
self._ready_buffers[queue_name].append(event_result)
|
|
140
|
+
logger.debug(f"get_next_input_event: Buffered event from {queue_name}: {type(event_result).__name__}")
|
|
117
141
|
else: # pragma: no cover
|
|
118
142
|
logger.error(f"get_next_input_event: Dequeued item from {queue_name} is not a BaseEvent subclass: {type(event_result)}. Event: {event_result!r}")
|
|
119
143
|
|
|
120
144
|
except asyncio.CancelledError: # pragma: no cover
|
|
121
|
-
|
|
145
|
+
logger.info(f"get_next_input_event: Task for queue {queue_name} (from done set) was cancelled during result processing.")
|
|
122
146
|
except Exception as e: # pragma: no cover
|
|
123
147
|
logger.error(f"get_next_input_event: Error processing result from task for queue {queue_name} (from done set): {e}", exc_info=True)
|
|
124
148
|
|
|
125
|
-
|
|
149
|
+
# Cancel pending tasks
|
|
150
|
+
if pending_tasks_from_wait:
|
|
126
151
|
logger.debug(f"get_next_input_event: Cancelling {len(pending_tasks_from_wait)} pending tasks from asyncio.wait.")
|
|
127
152
|
for task_in_pending in pending_tasks_from_wait: # pragma: no cover
|
|
128
153
|
if not task_in_pending.done():
|
|
@@ -160,9 +185,37 @@ class AgentInputEventQueueManager:
|
|
|
160
185
|
|
|
161
186
|
logger.debug(f"get_next_input_event: Finished finally block task cleanup.")
|
|
162
187
|
|
|
163
|
-
if
|
|
164
|
-
|
|
165
|
-
|
|
188
|
+
# After buffering, return the highest-priority ready item (if any)
|
|
189
|
+
for qname in self._queue_priority:
|
|
190
|
+
buf = self._ready_buffers.get(qname)
|
|
191
|
+
if buf and buf:
|
|
192
|
+
event = buf.popleft()
|
|
193
|
+
logger.debug(f"get_next_input_event: Returning buffered event from {qname}: {type(event).__name__}")
|
|
194
|
+
return (qname, event)
|
|
195
|
+
|
|
196
|
+
logger.debug("get_next_input_event: No events available after buffering.")
|
|
197
|
+
return None
|
|
198
|
+
|
|
199
|
+
async def get_next_internal_event(self) -> Optional[Tuple[str, 'BaseEvent']]: # type: ignore[type-var]
|
|
200
|
+
"""
|
|
201
|
+
Returns the next available internal system event only.
|
|
202
|
+
Intended for bootstrapping phases where non-internal queues should be gated.
|
|
203
|
+
"""
|
|
204
|
+
qname = "internal_system_event_queue"
|
|
205
|
+
buf = self._ready_buffers.get(qname)
|
|
206
|
+
if buf and buf:
|
|
207
|
+
event = buf.popleft()
|
|
208
|
+
logger.debug(f"get_next_internal_event: Returning buffered event from {qname}: {type(event).__name__}")
|
|
209
|
+
return (qname, event)
|
|
210
|
+
|
|
211
|
+
event_result: Any = await self.internal_system_event_queue.get()
|
|
212
|
+
from autobyteus.agent.events.agent_events import BaseEvent as AgentBaseEvent
|
|
213
|
+
if isinstance(event_result, AgentBaseEvent):
|
|
214
|
+
logger.debug(f"get_next_internal_event: Dequeued event from {qname}: {type(event_result).__name__}")
|
|
215
|
+
return (qname, event_result)
|
|
216
|
+
|
|
217
|
+
logger.error(f"get_next_internal_event: Dequeued item is not a BaseEvent subclass: {type(event_result)}. Event: {event_result!r}")
|
|
218
|
+
return None
|
|
166
219
|
|
|
167
220
|
def log_remaining_items_at_shutdown(self): # pragma: no cover
|
|
168
221
|
"""Logs remaining items in input queues, typically called during shutdown."""
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
# file: autobyteus/autobyteus/agent/events/event_store.py
|
|
2
|
+
from __future__ import annotations
|
|
3
|
+
|
|
4
|
+
import logging
|
|
5
|
+
import time
|
|
6
|
+
import uuid
|
|
7
|
+
from dataclasses import dataclass
|
|
8
|
+
from typing import List, Optional
|
|
9
|
+
|
|
10
|
+
from autobyteus.agent.events.agent_events import BaseEvent
|
|
11
|
+
|
|
12
|
+
logger = logging.getLogger(__name__)
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
@dataclass(frozen=True)
|
|
16
|
+
class EventEnvelope:
|
|
17
|
+
event_id: str
|
|
18
|
+
event_type: str
|
|
19
|
+
timestamp: float
|
|
20
|
+
agent_id: str
|
|
21
|
+
event: BaseEvent
|
|
22
|
+
correlation_id: Optional[str] = None
|
|
23
|
+
caused_by_event_id: Optional[str] = None
|
|
24
|
+
sequence: int = 0
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
class AgentEventStore:
|
|
28
|
+
"""
|
|
29
|
+
Simple in-memory event store for agent events.
|
|
30
|
+
"""
|
|
31
|
+
def __init__(self, agent_id: str):
|
|
32
|
+
self._agent_id = agent_id
|
|
33
|
+
self._events: List[EventEnvelope] = []
|
|
34
|
+
self._sequence: int = 0
|
|
35
|
+
logger.debug(f"AgentEventStore initialized for agent_id '{agent_id}'.")
|
|
36
|
+
|
|
37
|
+
def append(self,
|
|
38
|
+
event: BaseEvent,
|
|
39
|
+
correlation_id: Optional[str] = None,
|
|
40
|
+
caused_by_event_id: Optional[str] = None) -> EventEnvelope:
|
|
41
|
+
envelope = EventEnvelope(
|
|
42
|
+
event_id=str(uuid.uuid4()),
|
|
43
|
+
event_type=type(event).__name__,
|
|
44
|
+
timestamp=time.time(),
|
|
45
|
+
agent_id=self._agent_id,
|
|
46
|
+
event=event,
|
|
47
|
+
correlation_id=correlation_id,
|
|
48
|
+
caused_by_event_id=caused_by_event_id,
|
|
49
|
+
sequence=self._sequence,
|
|
50
|
+
)
|
|
51
|
+
self._sequence += 1
|
|
52
|
+
self._events.append(envelope)
|
|
53
|
+
logger.debug(f"Appended event '{envelope.event_type}' to store for agent '{self._agent_id}'.")
|
|
54
|
+
return envelope
|
|
55
|
+
|
|
56
|
+
def all_events(self) -> List[EventEnvelope]:
|
|
57
|
+
return list(self._events)
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
# file: autobyteus/autobyteus/agent/events/notifiers.py
|
|
2
2
|
import logging
|
|
3
|
-
from typing import Optional, Dict, Any, TYPE_CHECKING
|
|
3
|
+
from typing import Optional, Dict, Any, TYPE_CHECKING, List
|
|
4
4
|
|
|
5
5
|
from autobyteus.events.event_emitter import EventEmitter
|
|
6
6
|
from autobyteus.events.event_types import EventType
|
|
7
|
-
from autobyteus.agent.
|
|
7
|
+
from autobyteus.agent.status.status_enum import AgentStatus
|
|
8
8
|
|
|
9
9
|
if TYPE_CHECKING:
|
|
10
10
|
from autobyteus.llm.utils.response_types import ChunkResponse, CompleteResponse
|
|
@@ -13,7 +13,7 @@ logger = logging.getLogger(__name__)
|
|
|
13
13
|
|
|
14
14
|
class AgentExternalEventNotifier(EventEmitter):
|
|
15
15
|
"""
|
|
16
|
-
Responsible for emitting external events related to agent
|
|
16
|
+
Responsible for emitting external events related to agent status updates
|
|
17
17
|
and data outputs.
|
|
18
18
|
"""
|
|
19
19
|
def __init__(self, agent_id: str):
|
|
@@ -31,75 +31,73 @@ class AgentExternalEventNotifier(EventEmitter):
|
|
|
31
31
|
f"AgentExternalEventNotifier (NotifierID: {self.object_id}, AgentID: {self.agent_id}) "
|
|
32
32
|
f"emitted {event_type.name}. Kwarg keys for emit: {list(emit_kwargs.keys())}"
|
|
33
33
|
)
|
|
34
|
-
# Reduce log level for high-frequency events like streaming chunks
|
|
35
|
-
if event_type
|
|
36
|
-
|
|
34
|
+
# Reduce log level for high-frequency events like streaming chunks/segments
|
|
35
|
+
if event_type in {EventType.AGENT_DATA_ASSISTANT_CHUNK, EventType.AGENT_DATA_SEGMENT_EVENT}:
|
|
36
|
+
summary = self._summarize_payload(event_type, payload_content)
|
|
37
|
+
if summary:
|
|
38
|
+
logger.debug(f"{log_message} | {summary}")
|
|
39
|
+
else:
|
|
40
|
+
logger.debug(log_message)
|
|
37
41
|
else:
|
|
38
42
|
logger.info(log_message)
|
|
39
43
|
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
"
|
|
48
|
-
"
|
|
44
|
+
def _summarize_payload(self, event_type: EventType, payload_content: Optional[Any]) -> Optional[str]:
|
|
45
|
+
"""Return a compact, non-sensitive payload summary for debug logs."""
|
|
46
|
+
if payload_content is None:
|
|
47
|
+
return None
|
|
48
|
+
|
|
49
|
+
if event_type == EventType.AGENT_DATA_SEGMENT_EVENT and isinstance(payload_content, dict):
|
|
50
|
+
seg_type = payload_content.get("segment_type")
|
|
51
|
+
seg_id = payload_content.get("segment_id")
|
|
52
|
+
seg_event_type = payload_content.get("type")
|
|
53
|
+
payload = payload_content.get("payload") or {}
|
|
54
|
+
summary_parts = [f"segment_id={seg_id}", f"segment_type={seg_type}", f"event_type={seg_event_type}"]
|
|
55
|
+
if isinstance(payload, dict):
|
|
56
|
+
if "delta" in payload:
|
|
57
|
+
delta = payload.get("delta", "")
|
|
58
|
+
summary_parts.append(f"delta_len={len(str(delta))}")
|
|
59
|
+
if "metadata" in payload and isinstance(payload.get("metadata"), dict):
|
|
60
|
+
meta_keys = list(payload.get("metadata").keys())
|
|
61
|
+
if meta_keys:
|
|
62
|
+
summary_parts.append(f"metadata_keys={meta_keys}")
|
|
63
|
+
return " ".join(summary_parts)
|
|
64
|
+
|
|
65
|
+
if event_type == EventType.AGENT_DATA_ASSISTANT_CHUNK and hasattr(payload_content, "content"):
|
|
66
|
+
content = getattr(payload_content, "content", "") or ""
|
|
67
|
+
reasoning = getattr(payload_content, "reasoning", "") or ""
|
|
68
|
+
return f"content_len={len(str(content))} reasoning_len={len(str(reasoning))}"
|
|
69
|
+
|
|
70
|
+
return None
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
def _emit_status_update(self,
|
|
74
|
+
new_status: AgentStatus,
|
|
75
|
+
old_status: Optional[AgentStatus] = None,
|
|
76
|
+
additional_data: Optional[Dict[str, Any]] = None):
|
|
77
|
+
status_payload_dict = {
|
|
78
|
+
"new_status": new_status.value,
|
|
79
|
+
"old_status": old_status.value if old_status else None,
|
|
49
80
|
}
|
|
50
81
|
if additional_data:
|
|
51
|
-
|
|
52
|
-
self._emit_event(
|
|
53
|
-
|
|
54
|
-
def
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
self.
|
|
59
|
-
|
|
60
|
-
def notify_phase_idle_entered(self, old_phase: Optional[AgentOperationalPhase]):
|
|
61
|
-
self._emit_phase_change(EventType.AGENT_PHASE_IDLE_ENTERED, AgentOperationalPhase.IDLE, old_phase)
|
|
62
|
-
|
|
63
|
-
def notify_phase_processing_user_input_started(self, old_phase: Optional[AgentOperationalPhase], trigger_info: Optional[str] = None):
|
|
64
|
-
data = {"trigger": trigger_info} if trigger_info else {}
|
|
65
|
-
self._emit_phase_change(EventType.AGENT_PHASE_PROCESSING_USER_INPUT_STARTED, AgentOperationalPhase.PROCESSING_USER_INPUT, old_phase, additional_data=data)
|
|
66
|
-
def notify_phase_awaiting_llm_response_started(self, old_phase: Optional[AgentOperationalPhase]):
|
|
67
|
-
self._emit_phase_change(EventType.AGENT_PHASE_AWAITING_LLM_RESPONSE_STARTED, AgentOperationalPhase.AWAITING_LLM_RESPONSE, old_phase)
|
|
68
|
-
|
|
69
|
-
def notify_phase_analyzing_llm_response_started(self, old_phase: Optional[AgentOperationalPhase]):
|
|
70
|
-
self._emit_phase_change(EventType.AGENT_PHASE_ANALYZING_LLM_RESPONSE_STARTED, AgentOperationalPhase.ANALYZING_LLM_RESPONSE, old_phase)
|
|
71
|
-
|
|
72
|
-
def notify_phase_awaiting_tool_approval_started(self, old_phase: Optional[AgentOperationalPhase]):
|
|
73
|
-
self._emit_phase_change(EventType.AGENT_PHASE_AWAITING_TOOL_APPROVAL_STARTED, AgentOperationalPhase.AWAITING_TOOL_APPROVAL, old_phase)
|
|
74
|
-
|
|
75
|
-
def notify_phase_tool_denied_started(self, old_phase: Optional[AgentOperationalPhase], tool_name: Optional[str], denial_for_tool: Optional[str]):
|
|
76
|
-
data = {"tool_name": tool_name, "denial_for_tool": denial_for_tool}
|
|
77
|
-
# Assuming EventType.AGENT_PHASE_TOOL_DENIED_STARTED exists in the main EventType enum
|
|
78
|
-
self._emit_phase_change(EventType.AGENT_PHASE_TOOL_DENIED_STARTED, AgentOperationalPhase.TOOL_DENIED, old_phase, additional_data=data)
|
|
79
|
-
|
|
80
|
-
def notify_phase_executing_tool_started(self, old_phase: Optional[AgentOperationalPhase], tool_name: str):
|
|
81
|
-
data = {"tool_name": tool_name}
|
|
82
|
-
self._emit_phase_change(EventType.AGENT_PHASE_EXECUTING_TOOL_STARTED, AgentOperationalPhase.EXECUTING_TOOL, old_phase, additional_data=data)
|
|
83
|
-
def notify_phase_processing_tool_result_started(self, old_phase: Optional[AgentOperationalPhase], tool_name: str):
|
|
84
|
-
data = {"tool_name": tool_name}
|
|
85
|
-
self._emit_phase_change(EventType.AGENT_PHASE_PROCESSING_TOOL_RESULT_STARTED, AgentOperationalPhase.PROCESSING_TOOL_RESULT, old_phase, additional_data=data)
|
|
86
|
-
def notify_phase_shutting_down_started(self, old_phase: Optional[AgentOperationalPhase]):
|
|
87
|
-
self._emit_phase_change(EventType.AGENT_PHASE_SHUTTING_DOWN_STARTED, AgentOperationalPhase.SHUTTING_DOWN, old_phase)
|
|
88
|
-
def notify_phase_shutdown_completed(self, old_phase: Optional[AgentOperationalPhase]):
|
|
89
|
-
self._emit_phase_change(EventType.AGENT_PHASE_SHUTDOWN_COMPLETED, AgentOperationalPhase.SHUTDOWN_COMPLETE, old_phase)
|
|
90
|
-
def notify_phase_error_entered(self, old_phase: Optional[AgentOperationalPhase], error_message: str, error_details: Optional[str] = None):
|
|
91
|
-
data = {"error_message": error_message, "error_details": error_details}
|
|
92
|
-
self._emit_phase_change(EventType.AGENT_PHASE_ERROR_ENTERED, AgentOperationalPhase.ERROR, old_phase, additional_data=data)
|
|
82
|
+
status_payload_dict.update(additional_data)
|
|
83
|
+
self._emit_event(EventType.AGENT_STATUS_UPDATED, payload_content=status_payload_dict)
|
|
84
|
+
|
|
85
|
+
def notify_status_updated(self,
|
|
86
|
+
new_status: AgentStatus,
|
|
87
|
+
old_status: Optional[AgentStatus] = None,
|
|
88
|
+
additional_data: Optional[Dict[str, Any]] = None):
|
|
89
|
+
self._emit_status_update(new_status, old_status, additional_data)
|
|
93
90
|
|
|
94
91
|
def notify_agent_data_assistant_chunk(self, chunk: 'ChunkResponse'):
|
|
95
92
|
self._emit_event(EventType.AGENT_DATA_ASSISTANT_CHUNK, payload_content=chunk)
|
|
96
93
|
|
|
97
|
-
def notify_agent_data_assistant_chunk_stream_end(self):
|
|
98
|
-
self._emit_event(EventType.AGENT_DATA_ASSISTANT_CHUNK_STREAM_END)
|
|
99
|
-
|
|
100
94
|
def notify_agent_data_assistant_complete_response(self, complete_response: 'CompleteResponse'):
|
|
101
95
|
self._emit_event(EventType.AGENT_DATA_ASSISTANT_COMPLETE_RESPONSE, payload_content=complete_response)
|
|
102
96
|
|
|
97
|
+
def notify_agent_segment_event(self, event_dict: Dict[str, Any]):
|
|
98
|
+
"""Notify a streaming parser segment event (START, CONTENT, END)."""
|
|
99
|
+
self._emit_event(EventType.AGENT_DATA_SEGMENT_EVENT, payload_content=event_dict)
|
|
100
|
+
|
|
103
101
|
def notify_agent_data_tool_log(self, log_data: Dict[str, Any]):
|
|
104
102
|
self._emit_event(EventType.AGENT_DATA_TOOL_LOG, payload_content=log_data)
|
|
105
103
|
|
|
@@ -117,6 +115,14 @@ class AgentExternalEventNotifier(EventEmitter):
|
|
|
117
115
|
"""Notifies that the agent has received a system-generated task notification."""
|
|
118
116
|
self._emit_event(EventType.AGENT_DATA_SYSTEM_TASK_NOTIFICATION_RECEIVED, payload_content=notification_data)
|
|
119
117
|
|
|
118
|
+
def notify_agent_data_inter_agent_message_received(self, message_data: Dict[str, Any]):
|
|
119
|
+
"""Notifies that the agent has received a message from another agent."""
|
|
120
|
+
self._emit_event(EventType.AGENT_DATA_INTER_AGENT_MESSAGE_RECEIVED, payload_content=message_data)
|
|
121
|
+
|
|
122
|
+
def notify_agent_data_todo_list_updated(self, todo_list: List[Dict[str, Any]]):
|
|
123
|
+
"""Notifies that the agent's ToDo list has been updated."""
|
|
124
|
+
self._emit_event(EventType.AGENT_DATA_TODO_LIST_UPDATED, payload_content={"todos": todo_list})
|
|
125
|
+
|
|
120
126
|
def notify_agent_error_output_generation(self, error_source: str, error_message: str, error_details: Optional[str] = None):
|
|
121
127
|
payload_dict = {
|
|
122
128
|
"source": error_source,
|
|
@@ -124,3 +130,11 @@ class AgentExternalEventNotifier(EventEmitter):
|
|
|
124
130
|
"details": error_details
|
|
125
131
|
}
|
|
126
132
|
self._emit_event(EventType.AGENT_ERROR_OUTPUT_GENERATION, payload_content=payload_dict)
|
|
133
|
+
|
|
134
|
+
def notify_agent_artifact_persisted(self, artifact_data: Dict[str, Any]):
|
|
135
|
+
"""Notifies that an artifact has been successfully persisted to the database."""
|
|
136
|
+
self._emit_event(EventType.AGENT_ARTIFACT_PERSISTED, payload_content=artifact_data)
|
|
137
|
+
|
|
138
|
+
def notify_agent_artifact_updated(self, artifact_data: Dict[str, Any]):
|
|
139
|
+
"""Notifies that an artifact has been updated (e.g., via patch_file)."""
|
|
140
|
+
self._emit_event(EventType.AGENT_ARTIFACT_UPDATED, payload_content=artifact_data)
|