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
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
# file: autobyteus/autobyteus/task_management/
|
|
1
|
+
# file: autobyteus/autobyteus/task_management/in_memory_task_plan.py
|
|
2
2
|
"""
|
|
3
|
-
An in-memory implementation of the
|
|
3
|
+
An in-memory implementation of the BaseTaskPlan.
|
|
4
4
|
It tracks task statuses in a simple dictionary and emits events on state changes.
|
|
5
5
|
"""
|
|
6
6
|
import logging
|
|
@@ -8,50 +8,62 @@ from typing import Optional, List, Dict, Any
|
|
|
8
8
|
from enum import Enum
|
|
9
9
|
|
|
10
10
|
from autobyteus.events.event_types import EventType
|
|
11
|
+
from .schemas import TaskDefinitionSchema
|
|
11
12
|
from .task import Task
|
|
12
|
-
from .
|
|
13
|
-
from .events import
|
|
13
|
+
from .base_task_plan import BaseTaskPlan, TaskStatus
|
|
14
|
+
from .events import TasksCreatedEvent, TaskStatusUpdatedEvent
|
|
14
15
|
|
|
15
16
|
logger = logging.getLogger(__name__)
|
|
16
17
|
|
|
17
|
-
class
|
|
18
|
+
class InMemoryTaskPlan(BaseTaskPlan):
|
|
18
19
|
"""
|
|
19
|
-
An in-memory, dictionary-based implementation of the
|
|
20
|
+
An in-memory, dictionary-based implementation of the TaskPlan that emits
|
|
20
21
|
events on state changes.
|
|
21
22
|
"""
|
|
22
23
|
def __init__(self, team_id: str):
|
|
23
24
|
"""
|
|
24
|
-
Initializes the
|
|
25
|
+
Initializes the InMemoryTaskPlan.
|
|
25
26
|
"""
|
|
26
27
|
super().__init__(team_id=team_id)
|
|
27
28
|
self.task_statuses: Dict[str, TaskStatus] = {}
|
|
28
29
|
self._task_map: Dict[str, Task] = {}
|
|
29
|
-
|
|
30
|
+
self._id_counter: int = 0
|
|
31
|
+
logger.info(f"InMemoryTaskPlan initialized for team '{self.team_id}'.")
|
|
32
|
+
|
|
33
|
+
def _generate_next_id(self) -> str:
|
|
34
|
+
self._id_counter += 1
|
|
35
|
+
return f"task_{self._id_counter:04d}"
|
|
30
36
|
|
|
31
|
-
def add_tasks(self,
|
|
37
|
+
def add_tasks(self, task_definitions: List[TaskDefinitionSchema]) -> List[Task]:
|
|
32
38
|
"""
|
|
33
|
-
|
|
39
|
+
Creates new tasks from definitions, adds them to the plan, and returns the created tasks.
|
|
34
40
|
"""
|
|
35
|
-
|
|
41
|
+
new_tasks: List[Task] = []
|
|
42
|
+
for task_def in task_definitions:
|
|
43
|
+
new_id = self._generate_next_id()
|
|
44
|
+
task = Task(task_id=new_id, **task_def.model_dump())
|
|
45
|
+
|
|
36
46
|
self.tasks.append(task)
|
|
37
47
|
self.task_statuses[task.task_id] = TaskStatus.NOT_STARTED
|
|
38
48
|
self._task_map[task.task_id] = task
|
|
49
|
+
new_tasks.append(task)
|
|
39
50
|
|
|
40
51
|
self._hydrate_all_dependencies()
|
|
41
|
-
logger.info(f"Team '{self.team_id}': Added {len(
|
|
52
|
+
logger.info(f"Team '{self.team_id}': Added {len(new_tasks)} new task(s) to the plan. Emitting TasksCreatedEvent.")
|
|
42
53
|
|
|
43
|
-
event_payload =
|
|
54
|
+
event_payload = TasksCreatedEvent(
|
|
44
55
|
team_id=self.team_id,
|
|
45
|
-
tasks=
|
|
56
|
+
tasks=new_tasks,
|
|
46
57
|
)
|
|
47
|
-
self.emit(EventType.
|
|
48
|
-
return
|
|
58
|
+
self.emit(EventType.TASK_PLAN_TASKS_CREATED, payload=event_payload)
|
|
59
|
+
return new_tasks
|
|
49
60
|
|
|
50
|
-
def add_task(self,
|
|
61
|
+
def add_task(self, task_definition: TaskDefinitionSchema) -> Optional[Task]:
|
|
51
62
|
"""
|
|
52
|
-
|
|
63
|
+
Creates a single new task from a definition, adds it to the plan, and returns it.
|
|
53
64
|
"""
|
|
54
|
-
|
|
65
|
+
created_tasks = self.add_tasks([task_definition])
|
|
66
|
+
return created_tasks[0] if created_tasks else None
|
|
55
67
|
|
|
56
68
|
def _hydrate_all_dependencies(self):
|
|
57
69
|
"""
|
|
@@ -67,7 +79,7 @@ class InMemoryTaskBoard(BaseTaskBoard):
|
|
|
67
79
|
|
|
68
80
|
resolved_deps = []
|
|
69
81
|
for dep in task.dependencies:
|
|
70
|
-
# Case 1: The dependency is already a valid task_id on the
|
|
82
|
+
# Case 1: The dependency is already a valid task_id on the plan.
|
|
71
83
|
if dep in all_task_ids:
|
|
72
84
|
resolved_deps.append(dep)
|
|
73
85
|
# Case 2: The dependency is a task_name that can be resolved.
|
|
@@ -103,12 +115,12 @@ class InMemoryTaskBoard(BaseTaskBoard):
|
|
|
103
115
|
agent_name=agent_name,
|
|
104
116
|
deliverables=task_deliverables
|
|
105
117
|
)
|
|
106
|
-
self.emit(EventType.
|
|
118
|
+
self.emit(EventType.TASK_PLAN_STATUS_UPDATED, payload=event_payload)
|
|
107
119
|
return True
|
|
108
120
|
|
|
109
121
|
def get_status_overview(self) -> Dict[str, Any]:
|
|
110
122
|
"""
|
|
111
|
-
Returns a serializable dictionary of the
|
|
123
|
+
Returns a serializable dictionary of the plan's current state.
|
|
112
124
|
The overall_goal is now fetched from the context via the converter.
|
|
113
125
|
"""
|
|
114
126
|
return {
|
|
@@ -5,6 +5,7 @@ Exposes the public schema models for the task management module.
|
|
|
5
5
|
from .task_definition import TasksDefinitionSchema, TaskDefinitionSchema
|
|
6
6
|
from .task_status_report import TaskStatusReportSchema, TaskStatusReportItemSchema
|
|
7
7
|
from .deliverable_schema import FileDeliverableSchema
|
|
8
|
+
from .todo_definition import ToDoDefinitionSchema, ToDosDefinitionSchema
|
|
8
9
|
|
|
9
10
|
__all__ = [
|
|
10
11
|
"TasksDefinitionSchema",
|
|
@@ -12,4 +13,6 @@ __all__ = [
|
|
|
12
13
|
"TaskStatusReportSchema",
|
|
13
14
|
"TaskStatusReportItemSchema",
|
|
14
15
|
"FileDeliverableSchema",
|
|
16
|
+
"ToDoDefinitionSchema",
|
|
17
|
+
"ToDosDefinitionSchema",
|
|
15
18
|
]
|
|
@@ -9,7 +9,7 @@ but includes dynamic state information (like task status).
|
|
|
9
9
|
from typing import List, Optional
|
|
10
10
|
from pydantic import BaseModel, Field
|
|
11
11
|
|
|
12
|
-
from autobyteus.task_management.
|
|
12
|
+
from autobyteus.task_management.base_task_plan import TaskStatus
|
|
13
13
|
from autobyteus.task_management.deliverable import FileDeliverable
|
|
14
14
|
|
|
15
15
|
class TaskStatusReportItemSchema(BaseModel):
|
|
@@ -22,5 +22,5 @@ class TaskStatusReportItemSchema(BaseModel):
|
|
|
22
22
|
file_deliverables: List[FileDeliverable] = Field(default_factory=list, description="A list of files submitted as deliverables for this task.")
|
|
23
23
|
|
|
24
24
|
class TaskStatusReportSchema(BaseModel):
|
|
25
|
-
"""Represents a full task
|
|
25
|
+
"""Represents a full task plan status report in an LLM-friendly format."""
|
|
26
26
|
tasks: List[TaskStatusReportItemSchema] = Field(..., description="The list of tasks and their current statuses.")
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
# file: autobyteus/autobyteus/task_management/schemas/todo_definition.py
|
|
2
|
+
"""
|
|
3
|
+
Defines the Pydantic models for ToDo "definitions".
|
|
4
|
+
These models represent the structure an LLM is expected to generate for personal planning.
|
|
5
|
+
"""
|
|
6
|
+
from typing import List
|
|
7
|
+
from pydantic import BaseModel, Field
|
|
8
|
+
|
|
9
|
+
class ToDoDefinitionSchema(BaseModel):
|
|
10
|
+
"""A Pydantic model representing a single to-do item as defined by an LLM."""
|
|
11
|
+
description: str = Field(..., description="A clear, detailed description of what this to-do item or step entails.")
|
|
12
|
+
|
|
13
|
+
class ToDosDefinitionSchema(BaseModel):
|
|
14
|
+
"""A Pydantic model representing a list of to-do items as generated by an LLM."""
|
|
15
|
+
todos: List[ToDoDefinitionSchema] = Field(..., description="The list of to-do items to create.")
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# file: autobyteus/autobyteus/task_management/todo.py
|
|
2
|
+
"""
|
|
3
|
+
Defines the data structures for a ToDo item.
|
|
4
|
+
A ToDo represents a small, personal step an agent creates for itself to break down a larger Task.
|
|
5
|
+
"""
|
|
6
|
+
import logging
|
|
7
|
+
from enum import Enum
|
|
8
|
+
from pydantic import BaseModel, Field
|
|
9
|
+
|
|
10
|
+
logger = logging.getLogger(__name__)
|
|
11
|
+
|
|
12
|
+
class ToDoStatus(str, Enum):
|
|
13
|
+
"""Enumerates the possible lifecycle states of a ToDo item."""
|
|
14
|
+
PENDING = "pending"
|
|
15
|
+
IN_PROGRESS = "in_progress"
|
|
16
|
+
DONE = "done"
|
|
17
|
+
|
|
18
|
+
class ToDo(BaseModel):
|
|
19
|
+
"""
|
|
20
|
+
Represents a single, discrete item on a personal ToDoList.
|
|
21
|
+
It is intentionally simpler than a `Task`, as it's for an agent's internal planning.
|
|
22
|
+
"""
|
|
23
|
+
description: str = Field(..., description="A clear and concise description of what this to-do item or step entails.")
|
|
24
|
+
todo_id: str = Field(..., description="A unique, sequential, system-generated identifier for this to-do item (e.g., 'todo_1').")
|
|
25
|
+
status: ToDoStatus = Field(default=ToDoStatus.PENDING, description="The current status of this to-do item.")
|
|
26
|
+
|
|
27
|
+
def model_post_init(self, __context: any) -> None:
|
|
28
|
+
"""Called after the model is initialized and validated."""
|
|
29
|
+
logger.debug(f"ToDo created: ID='{self.todo_id}', Description='{self.description}'")
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
# file: autobyteus/autobyteus/task_management/todo_list.py
|
|
2
|
+
"""
|
|
3
|
+
An in-memory implementation of a personal ToDoList for a single agent.
|
|
4
|
+
"""
|
|
5
|
+
import logging
|
|
6
|
+
from typing import List, Dict, Optional
|
|
7
|
+
|
|
8
|
+
from autobyteus.task_management.schemas import ToDoDefinitionSchema
|
|
9
|
+
from .todo import ToDo, ToDoStatus
|
|
10
|
+
|
|
11
|
+
logger = logging.getLogger(__name__)
|
|
12
|
+
|
|
13
|
+
class ToDoList:
|
|
14
|
+
"""
|
|
15
|
+
An in-memory, list-based implementation of a personal ToDo list for an agent.
|
|
16
|
+
It manages a collection of ToDo items.
|
|
17
|
+
"""
|
|
18
|
+
def __init__(self, agent_id: str):
|
|
19
|
+
self.agent_id = agent_id
|
|
20
|
+
self.todos: List[ToDo] = []
|
|
21
|
+
self._todo_map: Dict[str, ToDo] = {}
|
|
22
|
+
self._id_counter: int = 0
|
|
23
|
+
logger.info(f"ToDoList initialized for agent '{self.agent_id}'.")
|
|
24
|
+
|
|
25
|
+
def _generate_next_id(self) -> str:
|
|
26
|
+
self._id_counter += 1
|
|
27
|
+
return f"todo_{self._id_counter:04d}"
|
|
28
|
+
|
|
29
|
+
def add_todos(self, todo_definitions: List[ToDoDefinitionSchema]) -> List[ToDo]:
|
|
30
|
+
"""Creates and adds new to-do items from definitions, and returns the created items."""
|
|
31
|
+
new_todos: List[ToDo] = []
|
|
32
|
+
for definition in todo_definitions:
|
|
33
|
+
new_id = self._generate_next_id()
|
|
34
|
+
todo = ToDo(todo_id=new_id, **definition.model_dump())
|
|
35
|
+
# This check is defensive, with a sequential counter it should not happen
|
|
36
|
+
if todo.todo_id in self._todo_map:
|
|
37
|
+
logger.warning(f"ToDo with ID '{todo.todo_id}' already exists in the list for agent '{self.agent_id}'. Skipping.")
|
|
38
|
+
continue
|
|
39
|
+
self.todos.append(todo)
|
|
40
|
+
self._todo_map[todo.todo_id] = todo
|
|
41
|
+
new_todos.append(todo)
|
|
42
|
+
logger.info(f"Agent '{self.agent_id}': Added {len(new_todos)} new item(s) to the ToDoList.")
|
|
43
|
+
return new_todos
|
|
44
|
+
|
|
45
|
+
def add_todo(self, todo_definition: ToDoDefinitionSchema) -> ToDo:
|
|
46
|
+
"""Adds a single new to-do item from a definition."""
|
|
47
|
+
created_todos = self.add_todos([todo_definition])
|
|
48
|
+
return created_todos[0]
|
|
49
|
+
|
|
50
|
+
def get_todo_by_id(self, todo_id: str) -> Optional[ToDo]:
|
|
51
|
+
"""Retrieves a to-do item by its ID."""
|
|
52
|
+
return self._todo_map.get(todo_id)
|
|
53
|
+
|
|
54
|
+
def update_todo_status(self, todo_id: str, status: ToDoStatus) -> bool:
|
|
55
|
+
"""Updates the status of a specific to-do item."""
|
|
56
|
+
todo = self.get_todo_by_id(todo_id)
|
|
57
|
+
if not todo:
|
|
58
|
+
logger.warning(f"Agent '{self.agent_id}': Attempted to update status for non-existent todo_id '{todo_id}'.")
|
|
59
|
+
return False
|
|
60
|
+
|
|
61
|
+
old_status = todo.status
|
|
62
|
+
todo.status = status
|
|
63
|
+
logger.info(f"Agent '{self.agent_id}': Status of todo '{todo_id}' updated from '{old_status.value}' to '{status.value}'.")
|
|
64
|
+
return True
|
|
65
|
+
|
|
66
|
+
def get_all_todos(self) -> List[ToDo]:
|
|
67
|
+
"""Returns all to-do items."""
|
|
68
|
+
return self.todos
|
|
69
|
+
|
|
70
|
+
def clear(self) -> None:
|
|
71
|
+
"""Clears all to-do items from the list."""
|
|
72
|
+
self.todos.clear()
|
|
73
|
+
self._todo_map.clear()
|
|
74
|
+
self._id_counter = 0
|
|
75
|
+
logger.info(f"ToDoList for agent '{self.agent_id}' has been cleared.")
|
|
@@ -3,16 +3,32 @@
|
|
|
3
3
|
This package contains the class-based tools related to task and project
|
|
4
4
|
management within an agent team.
|
|
5
5
|
"""
|
|
6
|
-
from .
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
6
|
+
from .task_tools import (
|
|
7
|
+
GetTaskPlanStatus,
|
|
8
|
+
CreateTasks,
|
|
9
|
+
CreateTask,
|
|
10
|
+
UpdateTaskStatus,
|
|
11
|
+
AssignTaskTo,
|
|
12
|
+
GetMyTasks,
|
|
13
|
+
)
|
|
14
|
+
from .todo_tools import (
|
|
15
|
+
CreateToDoList,
|
|
16
|
+
AddToDo,
|
|
17
|
+
GetToDoList,
|
|
18
|
+
UpdateToDoStatus,
|
|
19
|
+
UpdateToDoStatusTool,
|
|
20
|
+
)
|
|
11
21
|
|
|
12
22
|
__all__ = [
|
|
13
|
-
"
|
|
14
|
-
"
|
|
15
|
-
"
|
|
23
|
+
"GetTaskPlanStatus",
|
|
24
|
+
"CreateTasks",
|
|
25
|
+
"CreateTask",
|
|
16
26
|
"UpdateTaskStatus",
|
|
17
27
|
"AssignTaskTo",
|
|
28
|
+
"GetMyTasks",
|
|
29
|
+
"CreateToDoList",
|
|
30
|
+
"AddToDo",
|
|
31
|
+
"GetToDoList",
|
|
32
|
+
"UpdateToDoStatus",
|
|
33
|
+
"UpdateToDoStatusTool",
|
|
18
34
|
]
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# file: autobyteus/task_management/tools/task_tools/__init__.py
|
|
2
|
+
"""
|
|
3
|
+
Task management tool package exposing task plan utilities.
|
|
4
|
+
"""
|
|
5
|
+
from .get_task_plan_status import GetTaskPlanStatus
|
|
6
|
+
from .create_tasks import CreateTasks
|
|
7
|
+
from .create_task import CreateTask
|
|
8
|
+
from .update_task_status import UpdateTaskStatus
|
|
9
|
+
from .assign_task_to import AssignTaskTo
|
|
10
|
+
from .get_my_tasks import GetMyTasks
|
|
11
|
+
|
|
12
|
+
__all__ = [
|
|
13
|
+
"GetTaskPlanStatus",
|
|
14
|
+
"CreateTasks",
|
|
15
|
+
"CreateTask",
|
|
16
|
+
"UpdateTaskStatus",
|
|
17
|
+
"AssignTaskTo",
|
|
18
|
+
"GetMyTasks",
|
|
19
|
+
]
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# file: autobyteus/autobyteus/task_management/tools/assign_task_to.py
|
|
1
|
+
# file: autobyteus/autobyteus/task_management/tools/task_tools/assign_task_to.py
|
|
2
2
|
import logging
|
|
3
3
|
from typing import TYPE_CHECKING, Optional, Any
|
|
4
4
|
|
|
@@ -9,7 +9,6 @@ from autobyteus.tools.tool_category import ToolCategory
|
|
|
9
9
|
from autobyteus.utils.parameter_schema import ParameterSchema
|
|
10
10
|
from autobyteus.tools.pydantic_schema_converter import pydantic_to_parameter_schema
|
|
11
11
|
from autobyteus.task_management.schemas import TaskDefinitionSchema
|
|
12
|
-
from autobyteus.task_management.task import Task
|
|
13
12
|
|
|
14
13
|
if TYPE_CHECKING:
|
|
15
14
|
from autobyteus.agent.context import AgentContext
|
|
@@ -25,7 +24,7 @@ class AssignTaskTo(BaseTool):
|
|
|
25
24
|
|
|
26
25
|
@classmethod
|
|
27
26
|
def get_name(cls) -> str:
|
|
28
|
-
return "
|
|
27
|
+
return "assign_task_to"
|
|
29
28
|
|
|
30
29
|
@classmethod
|
|
31
30
|
def get_description(cls) -> str:
|
|
@@ -41,42 +40,43 @@ class AssignTaskTo(BaseTool):
|
|
|
41
40
|
|
|
42
41
|
async def _execute(self, context: 'AgentContext', **kwargs: Any) -> str:
|
|
43
42
|
"""
|
|
44
|
-
Executes the tool by adding the task to the central
|
|
43
|
+
Executes the tool by adding the task to the central TaskPlan and then
|
|
45
44
|
sending a direct message to the assignee with the task's details.
|
|
46
45
|
"""
|
|
47
46
|
agent_name = context.config.name
|
|
48
47
|
task_name = kwargs.get("task_name", "unnamed task")
|
|
49
48
|
assignee_name = kwargs.get("assignee_name")
|
|
50
|
-
logger.info(f"Agent '{agent_name}' is executing
|
|
49
|
+
logger.info(f"Agent '{agent_name}' is executing assign_task_to for task '{task_name}' assigned to '{assignee_name}'.")
|
|
51
50
|
|
|
52
|
-
# --- Get Team Context and Task
|
|
51
|
+
# --- Get Team Context and Task Plan ---
|
|
53
52
|
team_context: Optional['AgentTeamContext'] = context.custom_data.get("team_context")
|
|
54
53
|
if not team_context:
|
|
55
|
-
error_msg = "Error: Team context is not available. Cannot access the task
|
|
54
|
+
error_msg = "Error: Team context is not available. Cannot access the task plan or send messages."
|
|
56
55
|
logger.error(f"Agent '{agent_name}': {error_msg}")
|
|
57
56
|
return error_msg
|
|
58
57
|
|
|
59
|
-
|
|
60
|
-
if not
|
|
61
|
-
error_msg = "Error: Task
|
|
58
|
+
task_plan = getattr(team_context.state, 'task_plan', None)
|
|
59
|
+
if not task_plan:
|
|
60
|
+
error_msg = "Error: Task plan has not been initialized for this team."
|
|
62
61
|
logger.error(f"Agent '{agent_name}': {error_msg}")
|
|
63
62
|
return error_msg
|
|
64
63
|
|
|
65
|
-
# --- Action 1: Add the task to the Task
|
|
64
|
+
# --- Action 1: Add the task to the Task Plan ---
|
|
66
65
|
try:
|
|
67
66
|
task_def_schema = TaskDefinitionSchema(**kwargs)
|
|
68
|
-
new_task = Task(**task_def_schema.model_dump())
|
|
69
67
|
except (ValidationError, ValueError) as e:
|
|
70
68
|
error_msg = f"Invalid task definition provided: {e}"
|
|
71
|
-
logger.warning(f"Agent '{agent_name}' provided an invalid definition for
|
|
69
|
+
logger.warning(f"Agent '{agent_name}' provided an invalid definition for assign_task_to: {error_msg}")
|
|
72
70
|
return f"Error: {error_msg}"
|
|
73
71
|
|
|
74
|
-
|
|
75
|
-
|
|
72
|
+
# The task plan now handles ID generation and returns the created Task object.
|
|
73
|
+
new_task = task_plan.add_task(task_def_schema)
|
|
74
|
+
if not new_task:
|
|
75
|
+
error_msg = f"Failed to publish task '{task_name}' to the plan for an unknown reason."
|
|
76
76
|
logger.error(f"Agent '{agent_name}': {error_msg}")
|
|
77
77
|
return f"Error: {error_msg}"
|
|
78
78
|
|
|
79
|
-
logger.info(f"Agent '{agent_name}' successfully published task '{new_task.task_name}' to the task
|
|
79
|
+
logger.info(f"Agent '{agent_name}' successfully published task '{new_task.task_name}' (ID: {new_task.task_id}) to the task plan.")
|
|
80
80
|
|
|
81
81
|
# --- Action 2: Send a direct notification message to the assignee ---
|
|
82
82
|
team_manager: Optional['TeamManager'] = team_context.team_manager
|
|
@@ -98,11 +98,11 @@ class AssignTaskTo(BaseTool):
|
|
|
98
98
|
)
|
|
99
99
|
if new_task.dependencies:
|
|
100
100
|
# Resolve dependency names for the message
|
|
101
|
-
id_to_name_map = {task.task_id: task.task_name for task in
|
|
101
|
+
id_to_name_map = {task.task_id: task.task_name for task in task_plan.tasks}
|
|
102
102
|
dep_names = [id_to_name_map.get(dep_id, str(dep_id)) for dep_id in new_task.dependencies]
|
|
103
103
|
notification_content += f"**Dependencies**: {', '.join(dep_names)}\n"
|
|
104
104
|
|
|
105
|
-
notification_content += "\nThis task has been logged on the team's task
|
|
105
|
+
notification_content += "\nThis task has been logged on the team's task plan. You can begin work when its dependencies are met."
|
|
106
106
|
|
|
107
107
|
event = InterAgentMessageRequestEvent(
|
|
108
108
|
sender_agent_id=context.agent_id,
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# file: autobyteus/autobyteus/task_management/tools/
|
|
1
|
+
# file: autobyteus/autobyteus/task_management/tools/task_tools/create_task.py
|
|
2
2
|
import logging
|
|
3
3
|
from typing import TYPE_CHECKING, Optional, Dict, Any
|
|
4
4
|
|
|
@@ -9,7 +9,6 @@ from autobyteus.tools.tool_category import ToolCategory
|
|
|
9
9
|
from autobyteus.utils.parameter_schema import ParameterSchema
|
|
10
10
|
from autobyteus.tools.pydantic_schema_converter import pydantic_to_parameter_schema
|
|
11
11
|
from autobyteus.task_management.schemas import TaskDefinitionSchema
|
|
12
|
-
from autobyteus.task_management.task import Task
|
|
13
12
|
|
|
14
13
|
if TYPE_CHECKING:
|
|
15
14
|
from autobyteus.agent.context import AgentContext
|
|
@@ -17,19 +16,19 @@ if TYPE_CHECKING:
|
|
|
17
16
|
|
|
18
17
|
logger = logging.getLogger(__name__)
|
|
19
18
|
|
|
20
|
-
class
|
|
21
|
-
"""A tool for any agent to add a single new task to the team's task
|
|
19
|
+
class CreateTask(BaseTool):
|
|
20
|
+
"""A tool for any agent to add a single new task to the team's task plan."""
|
|
22
21
|
|
|
23
22
|
CATEGORY = ToolCategory.TASK_MANAGEMENT
|
|
24
23
|
|
|
25
24
|
@classmethod
|
|
26
25
|
def get_name(cls) -> str:
|
|
27
|
-
return "
|
|
26
|
+
return "create_task"
|
|
28
27
|
|
|
29
28
|
@classmethod
|
|
30
29
|
def get_description(cls) -> str:
|
|
31
30
|
return (
|
|
32
|
-
"Adds a single new task to the team's shared task
|
|
31
|
+
"Adds a single new task to the team's shared task plan. This is an additive action "
|
|
33
32
|
"and does not affect existing tasks. Use this to create follow-up tasks or delegate new work."
|
|
34
33
|
)
|
|
35
34
|
|
|
@@ -40,38 +39,37 @@ class PublishTask(BaseTool):
|
|
|
40
39
|
|
|
41
40
|
async def _execute(self, context: 'AgentContext', **kwargs: Any) -> str:
|
|
42
41
|
"""
|
|
43
|
-
Executes the tool by validating the task
|
|
42
|
+
Executes the tool by validating the task definition and adding it to the plan.
|
|
44
43
|
"""
|
|
45
44
|
agent_name = context.config.name
|
|
46
45
|
task_name = kwargs.get("task_name", "unnamed task")
|
|
47
|
-
logger.info(f"Agent '{agent_name}' is executing
|
|
46
|
+
logger.info(f"Agent '{agent_name}' is executing create_task for task '{task_name}'.")
|
|
48
47
|
|
|
49
48
|
team_context: Optional['AgentTeamContext'] = context.custom_data.get("team_context")
|
|
50
49
|
if not team_context:
|
|
51
|
-
error_msg = "Error: Team context is not available. Cannot access the task
|
|
50
|
+
error_msg = "Error: Team context is not available. Cannot access the task plan."
|
|
52
51
|
logger.error(f"Agent '{agent_name}': {error_msg}")
|
|
53
52
|
return error_msg
|
|
54
53
|
|
|
55
|
-
|
|
56
|
-
if not
|
|
57
|
-
error_msg = "Error: Task
|
|
54
|
+
task_plan = getattr(team_context.state, 'task_plan', None)
|
|
55
|
+
if not task_plan:
|
|
56
|
+
error_msg = "Error: Task plan has not been initialized for this team."
|
|
58
57
|
logger.error(f"Agent '{agent_name}': {error_msg}")
|
|
59
58
|
return error_msg
|
|
60
59
|
|
|
61
60
|
try:
|
|
62
61
|
task_def_schema = TaskDefinitionSchema(**kwargs)
|
|
63
|
-
new_task = Task(**task_def_schema.model_dump())
|
|
64
62
|
except (ValidationError, ValueError) as e:
|
|
65
63
|
error_msg = f"Invalid task definition provided: {e}"
|
|
66
|
-
logger.warning(f"Agent '{agent_name}' provided an invalid definition for
|
|
64
|
+
logger.warning(f"Agent '{agent_name}' provided an invalid definition for create_task: {error_msg}")
|
|
67
65
|
return f"Error: {error_msg}"
|
|
68
66
|
|
|
69
|
-
|
|
70
|
-
|
|
67
|
+
new_task = task_plan.add_task(task_def_schema)
|
|
68
|
+
if new_task:
|
|
69
|
+
success_msg = f"Successfully created new task '{new_task.task_name}' (ID: {new_task.task_id}) in the task plan."
|
|
71
70
|
logger.info(f"Agent '{agent_name}': {success_msg}")
|
|
72
71
|
return success_msg
|
|
73
72
|
else:
|
|
74
|
-
|
|
75
|
-
error_msg = "Failed to publish task to the board for an unknown reason."
|
|
73
|
+
error_msg = f"Failed to create task '{task_name}' in the plan for an unknown reason."
|
|
76
74
|
logger.error(f"Agent '{agent_name}': {error_msg}")
|
|
77
75
|
return f"Error: {error_msg}"
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# file: autobyteus/autobyteus/task_management/tools/
|
|
1
|
+
# file: autobyteus/autobyteus/task_management/tools/task_tools/create_tasks.py
|
|
2
2
|
import logging
|
|
3
3
|
from typing import TYPE_CHECKING, Optional, Dict, Any
|
|
4
4
|
|
|
@@ -9,7 +9,6 @@ from autobyteus.tools.tool_category import ToolCategory
|
|
|
9
9
|
from autobyteus.utils.parameter_schema import ParameterSchema
|
|
10
10
|
from autobyteus.tools.pydantic_schema_converter import pydantic_to_parameter_schema
|
|
11
11
|
from autobyteus.task_management.schemas import TasksDefinitionSchema
|
|
12
|
-
from autobyteus.task_management.task import Task
|
|
13
12
|
|
|
14
13
|
if TYPE_CHECKING:
|
|
15
14
|
from autobyteus.agent.context import AgentContext
|
|
@@ -17,21 +16,22 @@ if TYPE_CHECKING:
|
|
|
17
16
|
|
|
18
17
|
logger = logging.getLogger(__name__)
|
|
19
18
|
|
|
20
|
-
|
|
19
|
+
|
|
20
|
+
class CreateTasks(BaseTool):
|
|
21
21
|
"""
|
|
22
|
-
A tool to
|
|
22
|
+
A tool to create multiple tasks in the task plan. This is an additive-only operation.
|
|
23
23
|
"""
|
|
24
24
|
|
|
25
25
|
CATEGORY = ToolCategory.TASK_MANAGEMENT
|
|
26
26
|
|
|
27
27
|
@classmethod
|
|
28
28
|
def get_name(cls) -> str:
|
|
29
|
-
return "
|
|
29
|
+
return "create_tasks"
|
|
30
30
|
|
|
31
31
|
@classmethod
|
|
32
32
|
def get_description(cls) -> str:
|
|
33
33
|
return (
|
|
34
|
-
"Adds a list of new tasks to the team's shared task
|
|
34
|
+
"Adds a list of new tasks to the team's shared task plan. This action is additive and "
|
|
35
35
|
"does not affect existing tasks or the team's overall goal."
|
|
36
36
|
)
|
|
37
37
|
|
|
@@ -41,34 +41,34 @@ class PublishTasks(BaseTool):
|
|
|
41
41
|
|
|
42
42
|
async def _execute(self, context: 'AgentContext', **kwargs: Any) -> str:
|
|
43
43
|
agent_name = context.config.name
|
|
44
|
-
logger.info(f"Agent '{agent_name}' is executing
|
|
44
|
+
logger.info(f"Agent '{agent_name}' is executing create_tasks.")
|
|
45
45
|
|
|
46
46
|
team_context: Optional['AgentTeamContext'] = context.custom_data.get("team_context")
|
|
47
47
|
if not team_context:
|
|
48
|
-
error_msg = "Error: Team context is not available. Cannot access the task
|
|
48
|
+
error_msg = "Error: Team context is not available. Cannot access the task plan."
|
|
49
49
|
logger.error(f"Agent '{agent_name}': {error_msg}")
|
|
50
50
|
return error_msg
|
|
51
51
|
|
|
52
|
-
|
|
53
|
-
if not
|
|
54
|
-
error_msg = "Error: Task
|
|
52
|
+
task_plan = getattr(team_context.state, 'task_plan', None)
|
|
53
|
+
if not task_plan:
|
|
54
|
+
error_msg = "Error: Task plan has not been initialized for this team."
|
|
55
55
|
logger.error(f"Agent '{agent_name}': {error_msg}")
|
|
56
56
|
return error_msg
|
|
57
57
|
|
|
58
58
|
try:
|
|
59
59
|
tasks_def_schema = TasksDefinitionSchema(**kwargs)
|
|
60
|
-
final_tasks = [Task(**task_def.model_dump()) for task_def in tasks_def_schema.tasks]
|
|
61
60
|
except (ValidationError, ValueError) as e:
|
|
62
61
|
error_msg = f"Invalid task definitions provided: {e}"
|
|
63
|
-
logger.warning(f"Agent '{agent_name}' provided an invalid definition for
|
|
62
|
+
logger.warning(f"Agent '{agent_name}' provided an invalid definition for create_tasks: {error_msg}")
|
|
64
63
|
return f"Error: {error_msg}"
|
|
65
64
|
|
|
66
|
-
|
|
67
|
-
|
|
65
|
+
newly_created_tasks = task_plan.add_tasks(tasks_def_schema.tasks)
|
|
66
|
+
if newly_created_tasks:
|
|
67
|
+
success_msg = f"Successfully created {len(newly_created_tasks)} new task(s) in the task plan."
|
|
68
68
|
logger.info(f"Agent '{agent_name}': {success_msg}")
|
|
69
69
|
return success_msg
|
|
70
70
|
else:
|
|
71
|
-
# This
|
|
72
|
-
|
|
73
|
-
logger.
|
|
74
|
-
return
|
|
71
|
+
# This case might happen if the input list was empty, or an error occurred.
|
|
72
|
+
warning_msg = "No tasks were created. The provided list may have been empty."
|
|
73
|
+
logger.warning(f"Agent '{agent_name}': {warning_msg}")
|
|
74
|
+
return warning_msg
|