autobyteus 1.2.1__py3-none-any.whl → 1.2.3__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (466) hide show
  1. autobyteus/agent/agent.py +15 -5
  2. autobyteus/agent/bootstrap_steps/__init__.py +1 -3
  3. autobyteus/agent/bootstrap_steps/agent_bootstrapper.py +3 -59
  4. autobyteus/agent/bootstrap_steps/base_bootstrap_step.py +1 -4
  5. autobyteus/agent/bootstrap_steps/mcp_server_prewarming_step.py +1 -3
  6. autobyteus/agent/bootstrap_steps/system_prompt_processing_step.py +16 -13
  7. autobyteus/agent/bootstrap_steps/workspace_context_initialization_step.py +2 -4
  8. autobyteus/agent/context/agent_config.py +43 -20
  9. autobyteus/agent/context/agent_context.py +23 -18
  10. autobyteus/agent/context/agent_runtime_state.py +19 -19
  11. autobyteus/agent/events/__init__.py +16 -1
  12. autobyteus/agent/events/agent_events.py +43 -3
  13. autobyteus/agent/events/agent_input_event_queue_manager.py +79 -26
  14. autobyteus/agent/events/event_store.py +57 -0
  15. autobyteus/agent/events/notifiers.py +69 -59
  16. autobyteus/agent/events/worker_event_dispatcher.py +21 -64
  17. autobyteus/agent/factory/agent_factory.py +52 -0
  18. autobyteus/agent/handlers/__init__.py +2 -0
  19. autobyteus/agent/handlers/approved_tool_invocation_event_handler.py +51 -34
  20. autobyteus/agent/handlers/bootstrap_event_handler.py +155 -0
  21. autobyteus/agent/handlers/inter_agent_message_event_handler.py +10 -0
  22. autobyteus/agent/handlers/lifecycle_event_logger.py +19 -11
  23. autobyteus/agent/handlers/llm_complete_response_received_event_handler.py +10 -15
  24. autobyteus/agent/handlers/llm_user_message_ready_event_handler.py +188 -48
  25. autobyteus/agent/handlers/tool_execution_approval_event_handler.py +0 -10
  26. autobyteus/agent/handlers/tool_invocation_request_event_handler.py +53 -48
  27. autobyteus/agent/handlers/tool_result_event_handler.py +7 -8
  28. autobyteus/agent/handlers/user_input_message_event_handler.py +10 -3
  29. autobyteus/agent/input_processor/memory_ingest_input_processor.py +40 -0
  30. autobyteus/agent/lifecycle/__init__.py +12 -0
  31. autobyteus/agent/lifecycle/base_processor.py +109 -0
  32. autobyteus/agent/lifecycle/events.py +35 -0
  33. autobyteus/agent/lifecycle/processor_definition.py +36 -0
  34. autobyteus/agent/lifecycle/processor_registry.py +106 -0
  35. autobyteus/agent/llm_request_assembler.py +98 -0
  36. autobyteus/agent/llm_response_processor/__init__.py +1 -8
  37. autobyteus/agent/message/context_file_type.py +1 -1
  38. autobyteus/agent/runtime/agent_runtime.py +29 -21
  39. autobyteus/agent/runtime/agent_worker.py +98 -19
  40. autobyteus/agent/shutdown_steps/__init__.py +2 -0
  41. autobyteus/agent/shutdown_steps/agent_shutdown_orchestrator.py +2 -0
  42. autobyteus/agent/shutdown_steps/tool_cleanup_step.py +58 -0
  43. autobyteus/agent/status/__init__.py +14 -0
  44. autobyteus/agent/status/manager.py +93 -0
  45. autobyteus/agent/status/status_deriver.py +96 -0
  46. autobyteus/agent/{phases/phase_enum.py → status/status_enum.py} +16 -16
  47. autobyteus/agent/status/status_update_utils.py +73 -0
  48. autobyteus/agent/streaming/__init__.py +52 -5
  49. autobyteus/agent/streaming/adapters/__init__.py +18 -0
  50. autobyteus/agent/streaming/adapters/invocation_adapter.py +184 -0
  51. autobyteus/agent/streaming/adapters/tool_call_parsing.py +163 -0
  52. autobyteus/agent/streaming/adapters/tool_syntax_registry.py +67 -0
  53. autobyteus/agent/streaming/agent_event_stream.py +3 -183
  54. autobyteus/agent/streaming/api_tool_call/__init__.py +16 -0
  55. autobyteus/agent/streaming/api_tool_call/file_content_streamer.py +56 -0
  56. autobyteus/agent/streaming/api_tool_call/json_string_field_extractor.py +175 -0
  57. autobyteus/agent/streaming/api_tool_call_streaming_response_handler.py +4 -0
  58. autobyteus/agent/streaming/events/__init__.py +6 -0
  59. autobyteus/agent/streaming/events/stream_event_payloads.py +284 -0
  60. autobyteus/agent/streaming/events/stream_events.py +141 -0
  61. autobyteus/agent/streaming/handlers/__init__.py +15 -0
  62. autobyteus/agent/streaming/handlers/api_tool_call_streaming_response_handler.py +303 -0
  63. autobyteus/agent/streaming/handlers/parsing_streaming_response_handler.py +107 -0
  64. autobyteus/agent/streaming/handlers/pass_through_streaming_response_handler.py +107 -0
  65. autobyteus/agent/streaming/handlers/streaming_handler_factory.py +177 -0
  66. autobyteus/agent/streaming/handlers/streaming_response_handler.py +58 -0
  67. autobyteus/agent/streaming/parser/__init__.py +61 -0
  68. autobyteus/agent/streaming/parser/event_emitter.py +181 -0
  69. autobyteus/agent/streaming/parser/events.py +4 -0
  70. autobyteus/agent/streaming/parser/invocation_adapter.py +4 -0
  71. autobyteus/agent/streaming/parser/json_parsing_strategies/__init__.py +19 -0
  72. autobyteus/agent/streaming/parser/json_parsing_strategies/base.py +32 -0
  73. autobyteus/agent/streaming/parser/json_parsing_strategies/default.py +34 -0
  74. autobyteus/agent/streaming/parser/json_parsing_strategies/gemini.py +31 -0
  75. autobyteus/agent/streaming/parser/json_parsing_strategies/openai.py +64 -0
  76. autobyteus/agent/streaming/parser/json_parsing_strategies/registry.py +75 -0
  77. autobyteus/agent/streaming/parser/parser_context.py +227 -0
  78. autobyteus/agent/streaming/parser/parser_factory.py +132 -0
  79. autobyteus/agent/streaming/parser/sentinel_format.py +7 -0
  80. autobyteus/agent/streaming/parser/state_factory.py +62 -0
  81. autobyteus/agent/streaming/parser/states/__init__.py +1 -0
  82. autobyteus/agent/streaming/parser/states/base_state.py +60 -0
  83. autobyteus/agent/streaming/parser/states/custom_xml_tag_run_bash_parsing_state.py +38 -0
  84. autobyteus/agent/streaming/parser/states/custom_xml_tag_write_file_parsing_state.py +55 -0
  85. autobyteus/agent/streaming/parser/states/delimited_content_state.py +146 -0
  86. autobyteus/agent/streaming/parser/states/json_initialization_state.py +144 -0
  87. autobyteus/agent/streaming/parser/states/json_tool_parsing_state.py +137 -0
  88. autobyteus/agent/streaming/parser/states/sentinel_content_state.py +30 -0
  89. autobyteus/agent/streaming/parser/states/sentinel_initialization_state.py +117 -0
  90. autobyteus/agent/streaming/parser/states/text_state.py +78 -0
  91. autobyteus/agent/streaming/parser/states/xml_patch_file_tool_parsing_state.py +328 -0
  92. autobyteus/agent/streaming/parser/states/xml_run_bash_tool_parsing_state.py +129 -0
  93. autobyteus/agent/streaming/parser/states/xml_tag_initialization_state.py +151 -0
  94. autobyteus/agent/streaming/parser/states/xml_tool_parsing_state.py +63 -0
  95. autobyteus/agent/streaming/parser/states/xml_write_file_tool_parsing_state.py +343 -0
  96. autobyteus/agent/streaming/parser/strategies/__init__.py +17 -0
  97. autobyteus/agent/streaming/parser/strategies/base.py +24 -0
  98. autobyteus/agent/streaming/parser/strategies/json_tool_strategy.py +26 -0
  99. autobyteus/agent/streaming/parser/strategies/registry.py +28 -0
  100. autobyteus/agent/streaming/parser/strategies/sentinel_strategy.py +23 -0
  101. autobyteus/agent/streaming/parser/strategies/xml_tag_strategy.py +21 -0
  102. autobyteus/agent/streaming/parser/stream_scanner.py +167 -0
  103. autobyteus/agent/streaming/parser/streaming_parser.py +212 -0
  104. autobyteus/agent/streaming/parser/tool_call_parsing.py +4 -0
  105. autobyteus/agent/streaming/parser/tool_constants.py +7 -0
  106. autobyteus/agent/streaming/parser/tool_syntax_registry.py +4 -0
  107. autobyteus/agent/streaming/parser/xml_tool_parsing_state_registry.py +55 -0
  108. autobyteus/agent/streaming/parsing_streaming_response_handler.py +4 -0
  109. autobyteus/agent/streaming/pass_through_streaming_response_handler.py +4 -0
  110. autobyteus/agent/streaming/queue_streamer.py +3 -57
  111. autobyteus/agent/streaming/segments/__init__.py +5 -0
  112. autobyteus/agent/streaming/segments/segment_events.py +81 -0
  113. autobyteus/agent/streaming/stream_event_payloads.py +2 -223
  114. autobyteus/agent/streaming/stream_events.py +3 -140
  115. autobyteus/agent/streaming/streaming_handler_factory.py +4 -0
  116. autobyteus/agent/streaming/streaming_response_handler.py +4 -0
  117. autobyteus/agent/streaming/streams/__init__.py +5 -0
  118. autobyteus/agent/streaming/streams/agent_event_stream.py +197 -0
  119. autobyteus/agent/streaming/utils/__init__.py +5 -0
  120. autobyteus/agent/streaming/utils/queue_streamer.py +59 -0
  121. autobyteus/agent/system_prompt_processor/__init__.py +2 -0
  122. autobyteus/agent/system_prompt_processor/available_skills_processor.py +96 -0
  123. autobyteus/agent/system_prompt_processor/base_processor.py +1 -1
  124. autobyteus/agent/system_prompt_processor/processor_meta.py +15 -2
  125. autobyteus/agent/system_prompt_processor/tool_manifest_injector_processor.py +39 -58
  126. autobyteus/agent/token_budget.py +56 -0
  127. autobyteus/agent/tool_execution_result_processor/memory_ingest_tool_result_processor.py +29 -0
  128. autobyteus/agent/tool_invocation.py +16 -40
  129. autobyteus/agent/tool_invocation_preprocessor/__init__.py +9 -0
  130. autobyteus/agent/tool_invocation_preprocessor/base_preprocessor.py +45 -0
  131. autobyteus/agent/tool_invocation_preprocessor/processor_definition.py +15 -0
  132. autobyteus/agent/tool_invocation_preprocessor/processor_meta.py +33 -0
  133. autobyteus/agent/tool_invocation_preprocessor/processor_registry.py +60 -0
  134. autobyteus/agent/utils/wait_for_idle.py +12 -14
  135. autobyteus/agent/workspace/base_workspace.py +6 -27
  136. autobyteus/agent_team/agent_team.py +3 -3
  137. autobyteus/agent_team/agent_team_builder.py +1 -41
  138. autobyteus/agent_team/bootstrap_steps/__init__.py +0 -4
  139. autobyteus/agent_team/bootstrap_steps/agent_configuration_preparation_step.py +8 -18
  140. autobyteus/agent_team/bootstrap_steps/agent_team_bootstrapper.py +4 -16
  141. autobyteus/agent_team/bootstrap_steps/base_agent_team_bootstrap_step.py +1 -2
  142. autobyteus/agent_team/bootstrap_steps/coordinator_initialization_step.py +1 -2
  143. autobyteus/agent_team/bootstrap_steps/task_notifier_initialization_step.py +1 -2
  144. autobyteus/agent_team/bootstrap_steps/team_context_initialization_step.py +4 -4
  145. autobyteus/agent_team/context/agent_team_config.py +6 -3
  146. autobyteus/agent_team/context/agent_team_context.py +25 -3
  147. autobyteus/agent_team/context/agent_team_runtime_state.py +9 -6
  148. autobyteus/agent_team/events/__init__.py +11 -0
  149. autobyteus/agent_team/events/agent_team_event_dispatcher.py +22 -9
  150. autobyteus/agent_team/events/agent_team_events.py +16 -0
  151. autobyteus/agent_team/events/event_store.py +57 -0
  152. autobyteus/agent_team/factory/agent_team_factory.py +8 -0
  153. autobyteus/agent_team/handlers/inter_agent_message_request_event_handler.py +18 -2
  154. autobyteus/agent_team/handlers/lifecycle_agent_team_event_handler.py +21 -5
  155. autobyteus/agent_team/handlers/process_user_message_event_handler.py +17 -8
  156. autobyteus/agent_team/handlers/tool_approval_team_event_handler.py +19 -4
  157. autobyteus/agent_team/runtime/agent_team_runtime.py +41 -10
  158. autobyteus/agent_team/runtime/agent_team_worker.py +69 -5
  159. autobyteus/agent_team/status/__init__.py +14 -0
  160. autobyteus/agent_team/status/agent_team_status.py +18 -0
  161. autobyteus/agent_team/status/agent_team_status_manager.py +33 -0
  162. autobyteus/agent_team/status/status_deriver.py +62 -0
  163. autobyteus/agent_team/status/status_update_utils.py +42 -0
  164. autobyteus/agent_team/streaming/__init__.py +2 -2
  165. autobyteus/agent_team/streaming/agent_team_event_notifier.py +6 -6
  166. autobyteus/agent_team/streaming/agent_team_stream_event_payloads.py +4 -4
  167. autobyteus/agent_team/streaming/agent_team_stream_events.py +3 -3
  168. autobyteus/agent_team/system_prompt_processor/__init__.py +6 -0
  169. autobyteus/agent_team/system_prompt_processor/team_manifest_injector_processor.py +76 -0
  170. autobyteus/agent_team/task_notification/task_notification_mode.py +19 -0
  171. autobyteus/agent_team/utils/wait_for_idle.py +4 -4
  172. autobyteus/cli/agent_cli.py +18 -10
  173. autobyteus/cli/agent_team_tui/app.py +14 -11
  174. autobyteus/cli/agent_team_tui/state.py +13 -15
  175. autobyteus/cli/agent_team_tui/widgets/agent_list_sidebar.py +15 -15
  176. autobyteus/cli/agent_team_tui/widgets/focus_pane.py +143 -36
  177. autobyteus/cli/agent_team_tui/widgets/renderables.py +1 -1
  178. autobyteus/cli/agent_team_tui/widgets/shared.py +25 -25
  179. autobyteus/cli/cli_display.py +193 -44
  180. autobyteus/cli/workflow_tui/app.py +9 -10
  181. autobyteus/cli/workflow_tui/state.py +14 -16
  182. autobyteus/cli/workflow_tui/widgets/agent_list_sidebar.py +15 -15
  183. autobyteus/cli/workflow_tui/widgets/focus_pane.py +137 -35
  184. autobyteus/cli/workflow_tui/widgets/renderables.py +1 -1
  185. autobyteus/cli/workflow_tui/widgets/shared.py +25 -25
  186. autobyteus/clients/autobyteus_client.py +94 -1
  187. autobyteus/events/event_types.py +11 -18
  188. autobyteus/llm/api/autobyteus_llm.py +33 -29
  189. autobyteus/llm/api/claude_llm.py +142 -36
  190. autobyteus/llm/api/gemini_llm.py +163 -59
  191. autobyteus/llm/api/grok_llm.py +1 -1
  192. autobyteus/llm/api/minimax_llm.py +26 -0
  193. autobyteus/llm/api/mistral_llm.py +113 -87
  194. autobyteus/llm/api/ollama_llm.py +9 -42
  195. autobyteus/llm/api/openai_compatible_llm.py +127 -91
  196. autobyteus/llm/api/openai_llm.py +3 -3
  197. autobyteus/llm/api/openai_responses_llm.py +324 -0
  198. autobyteus/llm/api/zhipu_llm.py +21 -2
  199. autobyteus/llm/autobyteus_provider.py +70 -60
  200. autobyteus/llm/base_llm.py +85 -81
  201. autobyteus/llm/converters/__init__.py +14 -0
  202. autobyteus/llm/converters/anthropic_tool_call_converter.py +37 -0
  203. autobyteus/llm/converters/gemini_tool_call_converter.py +57 -0
  204. autobyteus/llm/converters/mistral_tool_call_converter.py +37 -0
  205. autobyteus/llm/converters/openai_tool_call_converter.py +38 -0
  206. autobyteus/llm/extensions/base_extension.py +6 -12
  207. autobyteus/llm/extensions/token_usage_tracking_extension.py +45 -18
  208. autobyteus/llm/llm_factory.py +282 -204
  209. autobyteus/llm/lmstudio_provider.py +60 -49
  210. autobyteus/llm/models.py +35 -2
  211. autobyteus/llm/ollama_provider.py +60 -49
  212. autobyteus/llm/ollama_provider_resolver.py +0 -1
  213. autobyteus/llm/prompt_renderers/__init__.py +19 -0
  214. autobyteus/llm/prompt_renderers/anthropic_prompt_renderer.py +104 -0
  215. autobyteus/llm/prompt_renderers/autobyteus_prompt_renderer.py +19 -0
  216. autobyteus/llm/prompt_renderers/base_prompt_renderer.py +10 -0
  217. autobyteus/llm/prompt_renderers/gemini_prompt_renderer.py +63 -0
  218. autobyteus/llm/prompt_renderers/mistral_prompt_renderer.py +87 -0
  219. autobyteus/llm/prompt_renderers/ollama_prompt_renderer.py +51 -0
  220. autobyteus/llm/prompt_renderers/openai_chat_renderer.py +97 -0
  221. autobyteus/llm/prompt_renderers/openai_responses_renderer.py +101 -0
  222. autobyteus/llm/providers.py +1 -3
  223. autobyteus/llm/token_counter/claude_token_counter.py +56 -25
  224. autobyteus/llm/token_counter/mistral_token_counter.py +12 -8
  225. autobyteus/llm/token_counter/openai_token_counter.py +24 -5
  226. autobyteus/llm/token_counter/token_counter_factory.py +12 -5
  227. autobyteus/llm/utils/llm_config.py +6 -12
  228. autobyteus/llm/utils/media_payload_formatter.py +27 -20
  229. autobyteus/llm/utils/messages.py +55 -3
  230. autobyteus/llm/utils/response_types.py +3 -0
  231. autobyteus/llm/utils/tool_call_delta.py +31 -0
  232. autobyteus/memory/__init__.py +32 -0
  233. autobyteus/memory/active_transcript.py +69 -0
  234. autobyteus/memory/compaction/__init__.py +9 -0
  235. autobyteus/memory/compaction/compaction_result.py +8 -0
  236. autobyteus/memory/compaction/compactor.py +89 -0
  237. autobyteus/memory/compaction/summarizer.py +11 -0
  238. autobyteus/memory/compaction_snapshot_builder.py +84 -0
  239. autobyteus/memory/memory_manager.py +183 -0
  240. autobyteus/memory/models/__init__.py +14 -0
  241. autobyteus/memory/models/episodic_item.py +41 -0
  242. autobyteus/memory/models/memory_types.py +7 -0
  243. autobyteus/memory/models/raw_trace_item.py +79 -0
  244. autobyteus/memory/models/semantic_item.py +41 -0
  245. autobyteus/memory/models/tool_interaction.py +20 -0
  246. autobyteus/memory/policies/__init__.py +5 -0
  247. autobyteus/memory/policies/compaction_policy.py +16 -0
  248. autobyteus/memory/retrieval/__init__.py +7 -0
  249. autobyteus/memory/retrieval/memory_bundle.py +11 -0
  250. autobyteus/memory/retrieval/retriever.py +13 -0
  251. autobyteus/memory/store/__init__.py +7 -0
  252. autobyteus/memory/store/base_store.py +14 -0
  253. autobyteus/memory/store/file_store.py +98 -0
  254. autobyteus/memory/tool_interaction_builder.py +46 -0
  255. autobyteus/memory/turn_tracker.py +9 -0
  256. autobyteus/multimedia/audio/api/autobyteus_audio_client.py +19 -5
  257. autobyteus/multimedia/audio/api/gemini_audio_client.py +108 -16
  258. autobyteus/multimedia/audio/audio_client_factory.py +47 -9
  259. autobyteus/multimedia/audio/audio_model.py +2 -1
  260. autobyteus/multimedia/image/api/autobyteus_image_client.py +19 -5
  261. autobyteus/multimedia/image/api/gemini_image_client.py +38 -17
  262. autobyteus/multimedia/image/api/openai_image_client.py +125 -43
  263. autobyteus/multimedia/image/autobyteus_image_provider.py +2 -1
  264. autobyteus/multimedia/image/image_client_factory.py +47 -15
  265. autobyteus/multimedia/image/image_model.py +5 -2
  266. autobyteus/multimedia/providers.py +3 -2
  267. autobyteus/skills/loader.py +71 -0
  268. autobyteus/skills/model.py +11 -0
  269. autobyteus/skills/registry.py +70 -0
  270. autobyteus/task_management/tools/todo_tools/add_todo.py +2 -2
  271. autobyteus/task_management/tools/todo_tools/create_todo_list.py +2 -2
  272. autobyteus/task_management/tools/todo_tools/update_todo_status.py +2 -2
  273. autobyteus/tools/__init__.py +34 -47
  274. autobyteus/tools/base_tool.py +7 -0
  275. autobyteus/tools/file/__init__.py +2 -6
  276. autobyteus/tools/file/patch_file.py +149 -0
  277. autobyteus/tools/file/read_file.py +36 -5
  278. autobyteus/tools/file/write_file.py +4 -1
  279. autobyteus/tools/functional_tool.py +43 -6
  280. autobyteus/tools/mcp/__init__.py +2 -0
  281. autobyteus/tools/mcp/config_service.py +5 -1
  282. autobyteus/tools/mcp/server/__init__.py +2 -0
  283. autobyteus/tools/mcp/server/http_managed_mcp_server.py +1 -1
  284. autobyteus/tools/mcp/server/websocket_managed_mcp_server.py +141 -0
  285. autobyteus/tools/mcp/server_instance_manager.py +8 -1
  286. autobyteus/tools/mcp/types.py +61 -0
  287. autobyteus/tools/multimedia/audio_tools.py +70 -17
  288. autobyteus/tools/multimedia/download_media_tool.py +18 -4
  289. autobyteus/tools/multimedia/image_tools.py +246 -62
  290. autobyteus/tools/operation_executor/journal_manager.py +107 -0
  291. autobyteus/tools/operation_executor/operation_event_buffer.py +57 -0
  292. autobyteus/tools/operation_executor/operation_event_producer.py +29 -0
  293. autobyteus/tools/operation_executor/operation_executor.py +58 -0
  294. autobyteus/tools/registry/tool_definition.py +43 -2
  295. autobyteus/tools/skill/load_skill.py +50 -0
  296. autobyteus/tools/terminal/__init__.py +45 -0
  297. autobyteus/tools/terminal/ansi_utils.py +32 -0
  298. autobyteus/tools/terminal/background_process_manager.py +233 -0
  299. autobyteus/tools/terminal/output_buffer.py +105 -0
  300. autobyteus/tools/terminal/prompt_detector.py +63 -0
  301. autobyteus/tools/terminal/pty_session.py +241 -0
  302. autobyteus/tools/terminal/session_factory.py +20 -0
  303. autobyteus/tools/terminal/terminal_session_manager.py +226 -0
  304. autobyteus/tools/terminal/tools/__init__.py +13 -0
  305. autobyteus/tools/terminal/tools/get_process_output.py +81 -0
  306. autobyteus/tools/terminal/tools/run_bash.py +109 -0
  307. autobyteus/tools/terminal/tools/start_background_process.py +104 -0
  308. autobyteus/tools/terminal/tools/stop_background_process.py +67 -0
  309. autobyteus/tools/terminal/types.py +54 -0
  310. autobyteus/tools/terminal/wsl_tmux_session.py +221 -0
  311. autobyteus/tools/terminal/wsl_utils.py +156 -0
  312. autobyteus/tools/transaction_management/backup_handler.py +48 -0
  313. autobyteus/tools/transaction_management/operation_lifecycle_manager.py +62 -0
  314. autobyteus/tools/usage/__init__.py +1 -2
  315. autobyteus/tools/usage/formatters/__init__.py +17 -1
  316. autobyteus/tools/usage/formatters/base_formatter.py +8 -0
  317. autobyteus/tools/usage/formatters/default_xml_schema_formatter.py +2 -2
  318. autobyteus/tools/usage/formatters/mistral_json_schema_formatter.py +18 -0
  319. autobyteus/tools/usage/formatters/patch_file_xml_example_formatter.py +64 -0
  320. autobyteus/tools/usage/formatters/patch_file_xml_schema_formatter.py +31 -0
  321. autobyteus/tools/usage/formatters/run_bash_xml_example_formatter.py +32 -0
  322. autobyteus/tools/usage/formatters/run_bash_xml_schema_formatter.py +36 -0
  323. autobyteus/tools/usage/formatters/write_file_xml_example_formatter.py +53 -0
  324. autobyteus/tools/usage/formatters/write_file_xml_schema_formatter.py +31 -0
  325. autobyteus/tools/usage/providers/tool_manifest_provider.py +10 -10
  326. autobyteus/tools/usage/registries/__init__.py +1 -3
  327. autobyteus/tools/usage/registries/tool_formatting_registry.py +115 -8
  328. autobyteus/tools/usage/tool_schema_provider.py +51 -0
  329. autobyteus/tools/web/__init__.py +4 -0
  330. autobyteus/tools/web/read_url_tool.py +80 -0
  331. autobyteus/utils/diff_utils.py +271 -0
  332. autobyteus/utils/download_utils.py +109 -0
  333. autobyteus/utils/file_utils.py +57 -2
  334. autobyteus/utils/gemini_helper.py +56 -0
  335. autobyteus/utils/gemini_model_mapping.py +71 -0
  336. autobyteus/utils/llm_output_formatter.py +75 -0
  337. autobyteus/utils/tool_call_format.py +36 -0
  338. autobyteus/workflow/agentic_workflow.py +3 -3
  339. autobyteus/workflow/bootstrap_steps/agent_tool_injection_step.py +2 -2
  340. autobyteus/workflow/bootstrap_steps/base_workflow_bootstrap_step.py +2 -2
  341. autobyteus/workflow/bootstrap_steps/coordinator_initialization_step.py +2 -2
  342. autobyteus/workflow/bootstrap_steps/coordinator_prompt_preparation_step.py +3 -9
  343. autobyteus/workflow/bootstrap_steps/workflow_bootstrapper.py +6 -6
  344. autobyteus/workflow/bootstrap_steps/workflow_runtime_queue_initialization_step.py +2 -2
  345. autobyteus/workflow/context/workflow_context.py +3 -3
  346. autobyteus/workflow/context/workflow_runtime_state.py +5 -5
  347. autobyteus/workflow/events/workflow_event_dispatcher.py +5 -5
  348. autobyteus/workflow/handlers/lifecycle_workflow_event_handler.py +3 -3
  349. autobyteus/workflow/handlers/process_user_message_event_handler.py +5 -5
  350. autobyteus/workflow/handlers/tool_approval_workflow_event_handler.py +2 -2
  351. autobyteus/workflow/runtime/workflow_runtime.py +8 -8
  352. autobyteus/workflow/runtime/workflow_worker.py +3 -3
  353. autobyteus/workflow/status/__init__.py +11 -0
  354. autobyteus/workflow/status/workflow_status.py +19 -0
  355. autobyteus/workflow/status/workflow_status_manager.py +48 -0
  356. autobyteus/workflow/streaming/__init__.py +2 -2
  357. autobyteus/workflow/streaming/workflow_event_notifier.py +7 -7
  358. autobyteus/workflow/streaming/workflow_stream_event_payloads.py +4 -4
  359. autobyteus/workflow/streaming/workflow_stream_events.py +3 -3
  360. autobyteus/workflow/utils/wait_for_idle.py +4 -4
  361. autobyteus-1.2.3.dist-info/METADATA +293 -0
  362. autobyteus-1.2.3.dist-info/RECORD +600 -0
  363. {autobyteus-1.2.1.dist-info → autobyteus-1.2.3.dist-info}/WHEEL +1 -1
  364. {autobyteus-1.2.1.dist-info → autobyteus-1.2.3.dist-info}/top_level.txt +0 -1
  365. autobyteus/agent/bootstrap_steps/agent_runtime_queue_initialization_step.py +0 -57
  366. autobyteus/agent/hooks/__init__.py +0 -16
  367. autobyteus/agent/hooks/base_phase_hook.py +0 -78
  368. autobyteus/agent/hooks/hook_definition.py +0 -36
  369. autobyteus/agent/hooks/hook_meta.py +0 -37
  370. autobyteus/agent/hooks/hook_registry.py +0 -106
  371. autobyteus/agent/llm_response_processor/provider_aware_tool_usage_processor.py +0 -103
  372. autobyteus/agent/phases/__init__.py +0 -18
  373. autobyteus/agent/phases/discover.py +0 -53
  374. autobyteus/agent/phases/manager.py +0 -265
  375. autobyteus/agent/phases/transition_decorator.py +0 -40
  376. autobyteus/agent/phases/transition_info.py +0 -33
  377. autobyteus/agent/remote_agent.py +0 -244
  378. autobyteus/agent/workspace/workspace_definition.py +0 -36
  379. autobyteus/agent/workspace/workspace_meta.py +0 -37
  380. autobyteus/agent/workspace/workspace_registry.py +0 -72
  381. autobyteus/agent_team/bootstrap_steps/agent_team_runtime_queue_initialization_step.py +0 -25
  382. autobyteus/agent_team/bootstrap_steps/coordinator_prompt_preparation_step.py +0 -85
  383. autobyteus/agent_team/phases/__init__.py +0 -11
  384. autobyteus/agent_team/phases/agent_team_operational_phase.py +0 -19
  385. autobyteus/agent_team/phases/agent_team_phase_manager.py +0 -48
  386. autobyteus/llm/api/bedrock_llm.py +0 -92
  387. autobyteus/llm/api/groq_llm.py +0 -94
  388. autobyteus/llm/api/nvidia_llm.py +0 -108
  389. autobyteus/llm/utils/token_pricing_config.py +0 -87
  390. autobyteus/rpc/__init__.py +0 -73
  391. autobyteus/rpc/client/__init__.py +0 -17
  392. autobyteus/rpc/client/abstract_client_connection.py +0 -124
  393. autobyteus/rpc/client/client_connection_manager.py +0 -153
  394. autobyteus/rpc/client/sse_client_connection.py +0 -306
  395. autobyteus/rpc/client/stdio_client_connection.py +0 -280
  396. autobyteus/rpc/config/__init__.py +0 -13
  397. autobyteus/rpc/config/agent_server_config.py +0 -153
  398. autobyteus/rpc/config/agent_server_registry.py +0 -152
  399. autobyteus/rpc/hosting.py +0 -244
  400. autobyteus/rpc/protocol.py +0 -244
  401. autobyteus/rpc/server/__init__.py +0 -20
  402. autobyteus/rpc/server/agent_server_endpoint.py +0 -181
  403. autobyteus/rpc/server/base_method_handler.py +0 -40
  404. autobyteus/rpc/server/method_handlers.py +0 -259
  405. autobyteus/rpc/server/sse_server_handler.py +0 -182
  406. autobyteus/rpc/server/stdio_server_handler.py +0 -151
  407. autobyteus/rpc/server_main.py +0 -198
  408. autobyteus/rpc/transport_type.py +0 -13
  409. autobyteus/tools/bash/__init__.py +0 -2
  410. autobyteus/tools/bash/bash_executor.py +0 -100
  411. autobyteus/tools/browser/__init__.py +0 -2
  412. autobyteus/tools/browser/session_aware/browser_session_aware_navigate_to.py +0 -75
  413. autobyteus/tools/browser/session_aware/browser_session_aware_tool.py +0 -30
  414. autobyteus/tools/browser/session_aware/browser_session_aware_web_element_trigger.py +0 -154
  415. autobyteus/tools/browser/session_aware/browser_session_aware_webpage_reader.py +0 -89
  416. autobyteus/tools/browser/session_aware/browser_session_aware_webpage_screenshot_taker.py +0 -107
  417. autobyteus/tools/browser/session_aware/factory/browser_session_aware_web_element_trigger_factory.py +0 -14
  418. autobyteus/tools/browser/session_aware/factory/browser_session_aware_webpage_reader_factory.py +0 -26
  419. autobyteus/tools/browser/session_aware/factory/browser_session_aware_webpage_screenshot_taker_factory.py +0 -14
  420. autobyteus/tools/browser/session_aware/shared_browser_session.py +0 -11
  421. autobyteus/tools/browser/session_aware/shared_browser_session_manager.py +0 -25
  422. autobyteus/tools/browser/session_aware/web_element_action.py +0 -20
  423. autobyteus/tools/browser/standalone/__init__.py +0 -6
  424. autobyteus/tools/browser/standalone/factory/__init__.py +0 -0
  425. autobyteus/tools/browser/standalone/factory/webpage_reader_factory.py +0 -25
  426. autobyteus/tools/browser/standalone/factory/webpage_screenshot_taker_factory.py +0 -14
  427. autobyteus/tools/browser/standalone/navigate_to.py +0 -84
  428. autobyteus/tools/browser/standalone/web_page_pdf_generator.py +0 -101
  429. autobyteus/tools/browser/standalone/webpage_image_downloader.py +0 -169
  430. autobyteus/tools/browser/standalone/webpage_reader.py +0 -105
  431. autobyteus/tools/browser/standalone/webpage_screenshot_taker.py +0 -105
  432. autobyteus/tools/file/edit_file.py +0 -200
  433. autobyteus/tools/file/list_directory.py +0 -168
  434. autobyteus/tools/file/search_files.py +0 -188
  435. autobyteus/tools/timer.py +0 -175
  436. autobyteus/tools/usage/parsers/__init__.py +0 -22
  437. autobyteus/tools/usage/parsers/_json_extractor.py +0 -99
  438. autobyteus/tools/usage/parsers/_string_decoders.py +0 -18
  439. autobyteus/tools/usage/parsers/anthropic_xml_tool_usage_parser.py +0 -10
  440. autobyteus/tools/usage/parsers/base_parser.py +0 -41
  441. autobyteus/tools/usage/parsers/default_json_tool_usage_parser.py +0 -83
  442. autobyteus/tools/usage/parsers/default_xml_tool_usage_parser.py +0 -316
  443. autobyteus/tools/usage/parsers/exceptions.py +0 -13
  444. autobyteus/tools/usage/parsers/gemini_json_tool_usage_parser.py +0 -77
  445. autobyteus/tools/usage/parsers/openai_json_tool_usage_parser.py +0 -149
  446. autobyteus/tools/usage/parsers/provider_aware_tool_usage_parser.py +0 -59
  447. autobyteus/tools/usage/registries/tool_usage_parser_registry.py +0 -62
  448. autobyteus/workflow/phases/__init__.py +0 -11
  449. autobyteus/workflow/phases/workflow_operational_phase.py +0 -19
  450. autobyteus/workflow/phases/workflow_phase_manager.py +0 -48
  451. autobyteus-1.2.1.dist-info/METADATA +0 -205
  452. autobyteus-1.2.1.dist-info/RECORD +0 -511
  453. examples/__init__.py +0 -1
  454. examples/agent_team/__init__.py +0 -1
  455. examples/discover_phase_transitions.py +0 -104
  456. examples/run_agentic_software_engineer.py +0 -239
  457. examples/run_browser_agent.py +0 -262
  458. examples/run_google_slides_agent.py +0 -287
  459. examples/run_mcp_browser_client.py +0 -174
  460. examples/run_mcp_google_slides_client.py +0 -270
  461. examples/run_mcp_list_tools.py +0 -189
  462. examples/run_poem_writer.py +0 -284
  463. examples/run_sqlite_agent.py +0 -295
  464. /autobyteus/{tools/browser/session_aware → skills}/__init__.py +0 -0
  465. /autobyteus/tools/{browser/session_aware/factory → skill}/__init__.py +0 -0
  466. {autobyteus-1.2.1.dist-info → autobyteus-1.2.3.dist-info}/licenses/LICENSE +0 -0
@@ -3,7 +3,7 @@ import logging
3
3
  from typing import TYPE_CHECKING
4
4
 
5
5
  from autobyteus.agent_team.handlers.base_agent_team_event_handler import BaseAgentTeamEventHandler
6
- from autobyteus.agent_team.events.agent_team_events import InterAgentMessageRequestEvent
6
+ from autobyteus.agent_team.events.agent_team_events import InterAgentMessageRequestEvent, AgentTeamErrorEvent
7
7
  from autobyteus.agent.message.inter_agent_message import InterAgentMessage
8
8
  from autobyteus.agent.message.agent_input_user_message import AgentInputUserMessage
9
9
  from autobyteus.agent_team.agent_team import AgentTeam
@@ -24,7 +24,12 @@ class InterAgentMessageRequestEventHandler(BaseAgentTeamEventHandler):
24
24
  team_manager = context.team_manager
25
25
 
26
26
  if not team_manager:
27
- logger.error(f"Team '{team_id}': TeamManager not found. Cannot route message from '{event.sender_agent_id}' to '{event.recipient_name}'.")
27
+ msg = f"Team '{team_id}': TeamManager not found. Cannot route message from '{event.sender_agent_id}' to '{event.recipient_name}'."
28
+ logger.error(msg)
29
+ if context.state.input_event_queues:
30
+ await context.state.input_event_queues.enqueue_internal_system_event(
31
+ AgentTeamErrorEvent(error_message=msg, exception_details="TeamManager is not initialized.")
32
+ )
28
33
  return
29
34
 
30
35
  try:
@@ -32,6 +37,13 @@ class InterAgentMessageRequestEventHandler(BaseAgentTeamEventHandler):
32
37
  except Exception as e:
33
38
  msg = f"Recipient node '{event.recipient_name}' not found or failed to start for message from '{event.sender_agent_id}'. Error: {e}"
34
39
  logger.error(f"Team '{team_id}': {msg}", exc_info=True)
40
+ if context.state.input_event_queues:
41
+ await context.state.input_event_queues.enqueue_internal_system_event(
42
+ AgentTeamErrorEvent(
43
+ error_message=f"Team '{team_id}': {msg}",
44
+ exception_details=f"Node '{event.recipient_name}' not found or failed to start."
45
+ )
46
+ )
35
47
  return
36
48
 
37
49
  try:
@@ -59,3 +71,7 @@ class InterAgentMessageRequestEventHandler(BaseAgentTeamEventHandler):
59
71
  except Exception as e:
60
72
  msg = f"Error posting message to node '{event.recipient_name}': {e}"
61
73
  logger.error(f"Team '{team_id}': {msg}", exc_info=True)
74
+ if context.state.input_event_queues:
75
+ await context.state.input_event_queues.enqueue_internal_system_event(
76
+ AgentTeamErrorEvent(error_message=f"Team '{team_id}': {msg}", exception_details="Message delivery failed.")
77
+ )
@@ -3,7 +3,15 @@ import logging
3
3
  from typing import TYPE_CHECKING
4
4
 
5
5
  from autobyteus.agent_team.handlers.base_agent_team_event_handler import BaseAgentTeamEventHandler
6
- from autobyteus.agent_team.events.agent_team_events import BaseAgentTeamEvent, AgentTeamReadyEvent, AgentTeamErrorEvent
6
+ from autobyteus.agent_team.events.agent_team_events import (
7
+ BaseAgentTeamEvent,
8
+ AgentTeamBootstrapStartedEvent,
9
+ AgentTeamReadyEvent,
10
+ AgentTeamIdleEvent,
11
+ AgentTeamShutdownRequestedEvent,
12
+ AgentTeamStoppedEvent,
13
+ AgentTeamErrorEvent,
14
+ )
7
15
 
8
16
  if TYPE_CHECKING:
9
17
  from autobyteus.agent_team.context.agent_team_context import AgentTeamContext
@@ -14,14 +22,22 @@ class LifecycleAgentTeamEventHandler(BaseAgentTeamEventHandler):
14
22
  """Logs various lifecycle events for an agent team."""
15
23
  async def handle(self, event: BaseAgentTeamEvent, context: 'AgentTeamContext') -> None:
16
24
  team_id = context.team_id
17
- current_phase = context.state.current_phase.value
25
+ current_status = context.state.current_status.value
18
26
 
19
- if isinstance(event, AgentTeamReadyEvent):
20
- logger.info(f"Team '{team_id}' Logged AgentTeamReadyEvent. Current phase: {current_phase}")
27
+ if isinstance(event, AgentTeamBootstrapStartedEvent):
28
+ logger.info(f"Team '{team_id}' Logged AgentTeamBootstrapStartedEvent. Current status: {current_status}")
29
+ elif isinstance(event, AgentTeamReadyEvent):
30
+ logger.info(f"Team '{team_id}' Logged AgentTeamReadyEvent. Current status: {current_status}")
31
+ elif isinstance(event, AgentTeamIdleEvent):
32
+ logger.info(f"Team '{team_id}' Logged AgentTeamIdleEvent. Current status: {current_status}")
33
+ elif isinstance(event, AgentTeamShutdownRequestedEvent):
34
+ logger.info(f"Team '{team_id}' Logged AgentTeamShutdownRequestedEvent. Current status: {current_status}")
35
+ elif isinstance(event, AgentTeamStoppedEvent):
36
+ logger.info(f"Team '{team_id}' Logged AgentTeamStoppedEvent. Current status: {current_status}")
21
37
  elif isinstance(event, AgentTeamErrorEvent):
22
38
  logger.error(
23
39
  f"Team '{team_id}' Logged AgentTeamErrorEvent: {event.error_message}. "
24
- f"Details: {event.exception_details}. Current phase: {current_phase}"
40
+ f"Details: {event.exception_details}. Current status: {current_status}"
25
41
  )
26
42
  else:
27
43
  logger.warning(f"LifecycleAgentTeamEventHandler received unhandled event type: {type(event).__name__}")
@@ -1,8 +1,9 @@
1
1
  # file: autobyteus/autobyteus/agent_team/handlers/process_user_message_event_handler.py
2
2
  import logging
3
3
  from typing import TYPE_CHECKING
4
+
4
5
  from autobyteus.agent_team.handlers.base_agent_team_event_handler import BaseAgentTeamEventHandler
5
- from autobyteus.agent_team.events.agent_team_events import ProcessUserMessageEvent
6
+ from autobyteus.agent_team.events.agent_team_events import ProcessUserMessageEvent, AgentTeamErrorEvent
6
7
  from autobyteus.agent.agent import Agent
7
8
  from autobyteus.agent_team.agent_team import AgentTeam
8
9
  from autobyteus.agent.message.agent_input_user_message import AgentInputUserMessage
@@ -15,13 +16,14 @@ logger = logging.getLogger(__name__)
15
16
  class ProcessUserMessageEventHandler(BaseAgentTeamEventHandler):
16
17
  """Handles user messages by routing them to the specified target agent or sub-team."""
17
18
  async def handle(self, event: ProcessUserMessageEvent, context: 'AgentTeamContext') -> None:
18
- await context.phase_manager.notify_processing_started()
19
-
20
19
  team_manager = context.team_manager
21
20
  if not team_manager:
22
21
  msg = f"Team '{context.team_id}': TeamManager not found. Cannot route message."
23
22
  logger.error(msg)
24
- await context.phase_manager.notify_error_occurred(msg, "TeamManager is not initialized.")
23
+ if context.state.input_event_queues:
24
+ await context.state.input_event_queues.enqueue_internal_system_event(
25
+ AgentTeamErrorEvent(error_message=msg, exception_details="TeamManager is not initialized.")
26
+ )
25
27
  return
26
28
 
27
29
  try:
@@ -29,7 +31,13 @@ class ProcessUserMessageEventHandler(BaseAgentTeamEventHandler):
29
31
  except Exception as e:
30
32
  msg = f"Team '{context.team_id}': Node '{event.target_agent_name}' not found or failed to start. Cannot route message. Error: {e}"
31
33
  logger.error(msg, exc_info=True)
32
- await context.phase_manager.notify_error_occurred(msg, f"Node '{event.target_agent_name}' not found or failed to start.")
34
+ if context.state.input_event_queues:
35
+ await context.state.input_event_queues.enqueue_internal_system_event(
36
+ AgentTeamErrorEvent(
37
+ error_message=msg,
38
+ exception_details=f"Node '{event.target_agent_name}' not found or failed to start."
39
+ )
40
+ )
33
41
  return
34
42
 
35
43
  if isinstance(target_node, Agent):
@@ -41,6 +49,7 @@ class ProcessUserMessageEventHandler(BaseAgentTeamEventHandler):
41
49
  else:
42
50
  msg = f"Target node '{event.target_agent_name}' is of an unsupported type: {type(target_node).__name__}"
43
51
  logger.error(f"Team '{context.team_id}': {msg}")
44
- await context.phase_manager.notify_error_occurred(msg, "")
45
-
46
- await context.phase_manager.notify_processing_complete_and_idle()
52
+ if context.state.input_event_queues:
53
+ await context.state.input_event_queues.enqueue_internal_system_event(
54
+ AgentTeamErrorEvent(error_message=msg, exception_details="")
55
+ )
@@ -3,7 +3,7 @@ import logging
3
3
  from typing import TYPE_CHECKING
4
4
 
5
5
  from autobyteus.agent_team.handlers.base_agent_team_event_handler import BaseAgentTeamEventHandler
6
- from autobyteus.agent_team.events.agent_team_events import ToolApprovalTeamEvent
6
+ from autobyteus.agent_team.events.agent_team_events import ToolApprovalTeamEvent, AgentTeamErrorEvent
7
7
 
8
8
  if TYPE_CHECKING:
9
9
  from autobyteus.agent_team.context.agent_team_context import AgentTeamContext
@@ -21,7 +21,10 @@ class ToolApprovalTeamEventHandler(BaseAgentTeamEventHandler):
21
21
  if not team_manager:
22
22
  msg = f"Team '{team_id}': TeamManager not found. Cannot route approval for agent '{event.agent_name}'."
23
23
  logger.error(msg)
24
- await context.phase_manager.notify_error_occurred(msg, "TeamManager is not initialized.")
24
+ if context.state.input_event_queues:
25
+ await context.state.input_event_queues.enqueue_internal_system_event(
26
+ AgentTeamErrorEvent(error_message=msg, exception_details="TeamManager is not initialized.")
27
+ )
25
28
  return
26
29
 
27
30
  from autobyteus.agent.agent import Agent
@@ -29,7 +32,13 @@ class ToolApprovalTeamEventHandler(BaseAgentTeamEventHandler):
29
32
  if not isinstance(target_node, Agent):
30
33
  msg = f"Team '{team_id}': Target node '{event.agent_name}' for approval is not an agent."
31
34
  logger.error(msg)
32
- await context.phase_manager.notify_error_occurred(msg, f"Node '{event.agent_name}' is not an agent.")
35
+ if context.state.input_event_queues:
36
+ await context.state.input_event_queues.enqueue_internal_system_event(
37
+ AgentTeamErrorEvent(
38
+ error_message=msg,
39
+ exception_details=f"Node '{event.agent_name}' is not an agent."
40
+ )
41
+ )
33
42
  return
34
43
 
35
44
  target_agent = target_node
@@ -37,7 +46,13 @@ class ToolApprovalTeamEventHandler(BaseAgentTeamEventHandler):
37
46
  if not target_agent:
38
47
  msg = f"Team '{team_id}': Target agent '{event.agent_name}' for approval not found or failed to start."
39
48
  logger.error(msg)
40
- await context.phase_manager.notify_error_occurred(msg, f"Agent '{event.agent_name}' not found or failed to start.")
49
+ if context.state.input_event_queues:
50
+ await context.state.input_event_queues.enqueue_internal_system_event(
51
+ AgentTeamErrorEvent(
52
+ error_message=msg,
53
+ exception_details=f"Agent '{event.agent_name}' not found or failed to start."
54
+ )
55
+ )
41
56
  return
42
57
 
43
58
  logger.info(f"Team '{team_id}': Posting tool approval (Approved: {event.is_approved}) to agent '{event.agent_name}' for invocation '{event.tool_invocation_id}'.")
@@ -1,12 +1,20 @@
1
+
1
2
  # file: autobyteus/autobyteus/agent_team/runtime/agent_team_runtime.py
2
3
  import asyncio
3
4
  import logging
4
- from typing import TYPE_CHECKING, Callable, Optional
5
+ import traceback
6
+ from typing import TYPE_CHECKING, Optional
5
7
 
6
8
  from autobyteus.agent_team.context.agent_team_context import AgentTeamContext
7
- from autobyteus.agent_team.phases.agent_team_phase_manager import AgentTeamPhaseManager
9
+ from autobyteus.agent_team.status.agent_team_status_manager import AgentTeamStatusManager
10
+ from autobyteus.agent_team.status.status_update_utils import apply_event_and_derive_status
8
11
  from autobyteus.agent_team.runtime.agent_team_worker import AgentTeamWorker
9
- from autobyteus.agent_team.events.agent_team_events import BaseAgentTeamEvent
12
+ from autobyteus.agent_team.events.agent_team_events import (
13
+ BaseAgentTeamEvent,
14
+ AgentTeamErrorEvent,
15
+ AgentTeamStoppedEvent,
16
+ AgentTeamShutdownRequestedEvent,
17
+ )
10
18
  from autobyteus.agent_team.streaming.agent_team_event_notifier import AgentTeamExternalEventNotifier
11
19
  from autobyteus.agent_team.streaming.agent_event_multiplexer import AgentEventMultiplexer
12
20
 
@@ -20,10 +28,11 @@ class AgentTeamRuntime:
20
28
  def __init__(self, context: AgentTeamContext, event_handler_registry: 'AgentTeamEventHandlerRegistry'):
21
29
  self.context = context
22
30
  self.notifier = AgentTeamExternalEventNotifier(team_id=self.context.team_id, runtime_ref=self)
23
- self.phase_manager = AgentTeamPhaseManager(context=self.context, notifier=self.notifier)
24
31
 
25
- # --- FIX: Set the phase_manager_ref on the context's state BEFORE creating the worker ---
26
- self.context.state.phase_manager_ref = self.phase_manager
32
+ # Create the status manager before the worker so external notifications are available during bootstrap.
33
+ self.status_manager: AgentTeamStatusManager = AgentTeamStatusManager(self.context, self.notifier)
34
+ self.context.state.status_manager_ref = self.status_manager
35
+
27
36
 
28
37
  self._worker = AgentTeamWorker(self.context, event_handler_registry)
29
38
 
@@ -50,8 +59,22 @@ class AgentTeamRuntime:
50
59
  logger.info(f"AgentTeamRuntime '{team_id}': Worker thread completed.")
51
60
  except Exception as e:
52
61
  logger.error(f"AgentTeamRuntime '{team_id}': Worker thread terminated with exception: {e}", exc_info=True)
53
- if not self.context.state.current_phase.is_terminal():
54
- asyncio.run(self.phase_manager.notify_final_shutdown_complete())
62
+ if not self.context.current_status.is_terminal():
63
+ try:
64
+ asyncio.run(self._apply_event_and_derive_status(
65
+ AgentTeamErrorEvent(
66
+ error_message="Worker thread exited unexpectedly.",
67
+ exception_details=traceback.format_exc()
68
+ )
69
+ ))
70
+ except Exception as run_e:
71
+ logger.critical(f"AgentTeamRuntime '{team_id}': Failed to emit derived error: {run_e}")
72
+
73
+ if not self.context.current_status.is_terminal():
74
+ try:
75
+ asyncio.run(self._apply_event_and_derive_status(AgentTeamStoppedEvent()))
76
+ except Exception as run_e:
77
+ logger.critical(f"AgentTeamRuntime '{team_id}': Failed to emit derived shutdown complete: {run_e}")
55
78
 
56
79
  def start(self):
57
80
  if self._worker.is_alive:
@@ -59,9 +82,14 @@ class AgentTeamRuntime:
59
82
  self._worker.start()
60
83
 
61
84
  async def stop(self, timeout: float = 10.0):
62
- await self.phase_manager.notify_shutdown_initiated()
85
+ if not self._worker.is_alive and not self._worker._is_active:
86
+ if not self.context.current_status.is_terminal():
87
+ await self._apply_event_and_derive_status(AgentTeamStoppedEvent())
88
+ return
89
+
90
+ await self._apply_event_and_derive_status(AgentTeamShutdownRequestedEvent())
63
91
  await self._worker.stop(timeout=timeout)
64
- await self.phase_manager.notify_final_shutdown_complete()
92
+ await self._apply_event_and_derive_status(AgentTeamStoppedEvent())
65
93
 
66
94
  async def submit_event(self, event: BaseAgentTeamEvent):
67
95
  if not self._worker.is_alive:
@@ -77,6 +105,9 @@ class AgentTeamRuntime:
77
105
  future = self._worker.schedule_coroutine(_coro_factory)
78
106
  await asyncio.wrap_future(future)
79
107
 
108
+ async def _apply_event_and_derive_status(self, event: BaseAgentTeamEvent) -> None:
109
+ await apply_event_and_derive_status(event, self.context)
110
+
80
111
  @property
81
112
  def is_running(self) -> bool:
82
113
  return self._worker.is_alive
@@ -5,8 +5,18 @@ import concurrent.futures
5
5
  from typing import TYPE_CHECKING, Optional, Callable, Awaitable, Any
6
6
 
7
7
  from autobyteus.agent_team.events.agent_team_event_dispatcher import AgentTeamEventDispatcher
8
+ from autobyteus.agent_team.events.agent_team_events import (
9
+ AgentTeamBootstrapStartedEvent,
10
+ AgentTeamReadyEvent,
11
+ AgentTeamErrorEvent,
12
+ AgentTeamStoppedEvent,
13
+ )
14
+ from autobyteus.agent_team.events.agent_team_input_event_queue_manager import AgentTeamInputEventQueueManager
15
+ from autobyteus.agent_team.events.event_store import AgentTeamEventStore
8
16
  from autobyteus.agent_team.bootstrap_steps.agent_team_bootstrapper import AgentTeamBootstrapper
9
17
  from autobyteus.agent_team.shutdown_steps.agent_team_shutdown_orchestrator import AgentTeamShutdownOrchestrator
18
+ from autobyteus.agent_team.status.status_deriver import AgentTeamStatusDeriver
19
+ from autobyteus.agent_team.status.status_update_utils import apply_event_and_derive_status
10
20
  from autobyteus.agent.runtime.agent_thread_pool_manager import AgentThreadPoolManager
11
21
 
12
22
  if TYPE_CHECKING:
@@ -19,8 +29,11 @@ class AgentTeamWorker:
19
29
  """Encapsulates the core event processing loop for an agent team."""
20
30
  def __init__(self, context: 'AgentTeamContext', event_handler_registry: 'AgentTeamEventHandlerRegistry'):
21
31
  self.context = context
22
- self.phase_manager = self.context.phase_manager
23
- self.event_dispatcher = AgentTeamEventDispatcher(event_handler_registry, self.phase_manager)
32
+ self.status_manager = self.context.status_manager
33
+ if not self.status_manager: # pragma: no cover
34
+ raise ValueError(f"AgentTeamWorker for '{self.context.team_id}': AgentTeamStatusManager not found.")
35
+
36
+ self.event_dispatcher = AgentTeamEventDispatcher(event_handler_registry)
24
37
 
25
38
  self._thread_pool_manager = AgentThreadPoolManager()
26
39
  self._thread_future: Optional[concurrent.futures.Future] = None
@@ -31,6 +44,28 @@ class AgentTeamWorker:
31
44
  self._done_callbacks: list[Callable[[concurrent.futures.Future], None]] = []
32
45
  logger.info(f"AgentTeamWorker initialized for team '{self.context.team_id}'.")
33
46
 
47
+ async def _runtime_init(self) -> bool:
48
+ team_id = self.context.team_id
49
+ if self.context.state.event_store is None:
50
+ self.context.state.event_store = AgentTeamEventStore(team_id=team_id)
51
+ logger.info(f"Team '{team_id}': Runtime init completed (event store initialized).")
52
+
53
+ if self.context.state.status_deriver is None:
54
+ self.context.state.status_deriver = AgentTeamStatusDeriver()
55
+ logger.info(f"Team '{team_id}': Runtime init completed (status deriver initialized).")
56
+
57
+ if self.context.state.input_event_queues is not None:
58
+ logger.debug(f"Team '{team_id}': Runtime init skipped; input event queues already initialized.")
59
+ return True
60
+
61
+ try:
62
+ self.context.state.input_event_queues = AgentTeamInputEventQueueManager()
63
+ logger.info(f"Team '{team_id}': Runtime init completed (input queues initialized).")
64
+ return True
65
+ except Exception as e:
66
+ logger.critical(f"Team '{team_id}': Runtime init failed while initializing input queues: {e}", exc_info=True)
67
+ return False
68
+
34
69
  def get_worker_loop(self) -> Optional[asyncio.AbstractEventLoop]:
35
70
  """Returns the worker's event loop if it's running."""
36
71
  return self._worker_loop if self._worker_loop and self._worker_loop.is_running() else None
@@ -69,11 +104,27 @@ class AgentTeamWorker:
69
104
  self._is_active = False
70
105
 
71
106
  async def async_run(self):
107
+ team_id = self.context.team_id
108
+ if not await self._runtime_init():
109
+ logger.critical(f"Team '{team_id}': Runtime init failed. Shutting down.")
110
+ await apply_event_and_derive_status(
111
+ AgentTeamErrorEvent(error_message="Runtime init failed.", exception_details="Failed to initialize event store or queues."),
112
+ self.context
113
+ )
114
+ return
115
+
72
116
  bootstrapper = AgentTeamBootstrapper()
73
- if not await bootstrapper.run(self.context, self.phase_manager):
74
- logger.critical(f"Team '{self.context.team_id}' failed to initialize. Shutting down.")
117
+ await self.event_dispatcher.dispatch(AgentTeamBootstrapStartedEvent(), self.context)
118
+ if not await bootstrapper.run(self.context):
119
+ logger.critical(f"Team '{team_id}' failed to initialize. Shutting down.")
120
+ await self.event_dispatcher.dispatch(
121
+ AgentTeamErrorEvent(error_message="Bootstrap failed.", exception_details="Bootstrapper returned failure."),
122
+ self.context
123
+ )
75
124
  return
76
125
 
126
+ await self.event_dispatcher.dispatch(AgentTeamReadyEvent(), self.context)
127
+
77
128
  logger.info(f"Team '{self.context.team_id}' entering main event loop.")
78
129
  while not self._async_stop_event.is_set():
79
130
  try:
@@ -103,7 +154,20 @@ class AgentTeamWorker:
103
154
  return
104
155
  self._stop_initiated = True
105
156
  if self._worker_loop:
106
- self._worker_loop.call_soon_threadsafe(self._async_stop_event.set)
157
+ def _coro_factory():
158
+ async def _signal_coro():
159
+ if self._async_stop_event and not self._async_stop_event.is_set():
160
+ self._async_stop_event.set()
161
+ if self.context.state.input_event_queues:
162
+ await self.context.state.input_event_queues.enqueue_internal_system_event(
163
+ AgentTeamStoppedEvent()
164
+ )
165
+ return _signal_coro()
166
+ try:
167
+ future = self.schedule_coroutine(_coro_factory)
168
+ future.result(timeout=max(1.0, timeout - 1))
169
+ except Exception as e:
170
+ logger.error(f"Team '{self.context.team_id}': Error signaling stop event: {e}", exc_info=True)
107
171
  if self._thread_future:
108
172
  try:
109
173
  # FIX: Use asyncio.wait_for() to handle the timeout correctly.
@@ -0,0 +1,14 @@
1
+ """
2
+ This package contains components for defining and managing agent team operational status.
3
+ """
4
+ from autobyteus.agent_team.status.agent_team_status import AgentTeamStatus
5
+ from autobyteus.agent_team.status.agent_team_status_manager import AgentTeamStatusManager
6
+ from autobyteus.agent_team.status.status_deriver import AgentTeamStatusDeriver
7
+ from autobyteus.agent_team.status.status_update_utils import apply_event_and_derive_status
8
+
9
+ __all__ = [
10
+ "AgentTeamStatus",
11
+ "AgentTeamStatusManager",
12
+ "AgentTeamStatusDeriver",
13
+ "apply_event_and_derive_status",
14
+ ]
@@ -0,0 +1,18 @@
1
+ from enum import Enum
2
+
3
+ class AgentTeamStatus(str, Enum):
4
+ """Defines the operational status of an AgentTeam."""
5
+ UNINITIALIZED = "uninitialized"
6
+ BOOTSTRAPPING = "bootstrapping"
7
+ IDLE = "idle"
8
+ PROCESSING = "processing"
9
+ SHUTTING_DOWN = "shutting_down"
10
+ SHUTDOWN_COMPLETE = "shutdown_complete"
11
+ ERROR = "error"
12
+
13
+ def is_terminal(self) -> bool:
14
+ """Checks if the status is a terminal state."""
15
+ return self in [AgentTeamStatus.SHUTDOWN_COMPLETE, AgentTeamStatus.ERROR]
16
+
17
+ def __str__(self) -> str:
18
+ return self.value
@@ -0,0 +1,33 @@
1
+ import logging
2
+ from typing import TYPE_CHECKING, Optional
3
+
4
+ from autobyteus.agent_team.status.agent_team_status import AgentTeamStatus
5
+
6
+ if TYPE_CHECKING:
7
+ from autobyteus.agent_team.context.agent_team_context import AgentTeamContext
8
+ from autobyteus.agent_team.streaming.agent_team_event_notifier import AgentTeamExternalEventNotifier
9
+
10
+ logger = logging.getLogger(__name__)
11
+
12
+ class AgentTeamStatusManager:
13
+ """
14
+ Emits external notifications for status updates derived from events.
15
+ The status itself is owned by the event stream projection.
16
+ """
17
+ def __init__(self, context: 'AgentTeamContext', notifier: 'AgentTeamExternalEventNotifier'):
18
+ if notifier is None:
19
+ raise ValueError("AgentTeamStatusManager requires a notifier.")
20
+ self.context = context
21
+ self.notifier = notifier
22
+ if not isinstance(self.context.state.current_status, AgentTeamStatus):
23
+ self.context.state.current_status = AgentTeamStatus.UNINITIALIZED
24
+ logger.debug(f"AgentTeamStatusManager initialized for team '{context.team_id}'.")
25
+
26
+ async def emit_status_update(self,
27
+ old_status: AgentTeamStatus,
28
+ new_status: AgentTeamStatus,
29
+ additional_data: Optional[dict] = None) -> None:
30
+ if old_status == new_status:
31
+ return
32
+ logger.info(f"Team '{self.context.team_id}' updating status from {old_status.value} to {new_status.value}.")
33
+ self.notifier.notify_status_updated(new_status, old_status, additional_data)
@@ -0,0 +1,62 @@
1
+ # file: autobyteus/autobyteus/agent_team/status/status_deriver.py
2
+ import logging
3
+ from typing import Optional, Tuple, TYPE_CHECKING
4
+
5
+ from autobyteus.agent_team.status.agent_team_status import AgentTeamStatus
6
+ from autobyteus.agent_team.events.agent_team_events import (
7
+ AgentTeamBootstrapStartedEvent,
8
+ AgentTeamReadyEvent,
9
+ AgentTeamIdleEvent,
10
+ AgentTeamShutdownRequestedEvent,
11
+ AgentTeamStoppedEvent,
12
+ AgentTeamErrorEvent,
13
+ OperationalAgentTeamEvent,
14
+ )
15
+
16
+ if TYPE_CHECKING:
17
+ from autobyteus.agent_team.context.agent_team_context import AgentTeamContext
18
+ from autobyteus.agent_team.events.agent_team_events import BaseAgentTeamEvent
19
+
20
+ logger = logging.getLogger(__name__)
21
+
22
+
23
+ class AgentTeamStatusDeriver:
24
+ """
25
+ Derives agent team status from an event stream.
26
+ """
27
+ def __init__(self, initial_status: AgentTeamStatus = AgentTeamStatus.UNINITIALIZED):
28
+ self._current_status = initial_status
29
+ logger.debug(f"AgentTeamStatusDeriver initialized with status '{initial_status.value}'.")
30
+
31
+ @property
32
+ def current_status(self) -> AgentTeamStatus:
33
+ return self._current_status
34
+
35
+ def apply(self, event: 'BaseAgentTeamEvent', context: Optional['AgentTeamContext'] = None) -> Tuple[AgentTeamStatus, AgentTeamStatus]:
36
+ old_status = self._current_status
37
+ new_status = self._reduce(event, old_status, context)
38
+ self._current_status = new_status
39
+ return old_status, new_status
40
+
41
+ def _reduce(self, event: 'BaseAgentTeamEvent', current_status: AgentTeamStatus, context: Optional['AgentTeamContext']) -> AgentTeamStatus:
42
+ if isinstance(event, AgentTeamBootstrapStartedEvent):
43
+ return AgentTeamStatus.BOOTSTRAPPING
44
+ if isinstance(event, AgentTeamReadyEvent):
45
+ return AgentTeamStatus.IDLE
46
+ if isinstance(event, AgentTeamIdleEvent):
47
+ return AgentTeamStatus.IDLE
48
+ if isinstance(event, AgentTeamShutdownRequestedEvent):
49
+ if current_status == AgentTeamStatus.ERROR:
50
+ return current_status
51
+ return AgentTeamStatus.SHUTTING_DOWN
52
+ if isinstance(event, AgentTeamStoppedEvent):
53
+ if current_status == AgentTeamStatus.ERROR:
54
+ return current_status
55
+ return AgentTeamStatus.SHUTDOWN_COMPLETE
56
+ if isinstance(event, AgentTeamErrorEvent):
57
+ return AgentTeamStatus.ERROR
58
+
59
+ if isinstance(event, OperationalAgentTeamEvent):
60
+ return AgentTeamStatus.PROCESSING
61
+
62
+ return current_status
@@ -0,0 +1,42 @@
1
+ # file: autobyteus/autobyteus/agent_team/status/status_update_utils.py
2
+ import logging
3
+ from typing import Optional, Tuple, TYPE_CHECKING
4
+
5
+ from autobyteus.agent_team.status.agent_team_status import AgentTeamStatus
6
+ from autobyteus.agent_team.events.agent_team_events import AgentTeamErrorEvent
7
+
8
+ if TYPE_CHECKING:
9
+ from autobyteus.agent_team.context.agent_team_context import AgentTeamContext
10
+ from autobyteus.agent_team.events.agent_team_events import BaseAgentTeamEvent
11
+
12
+ logger = logging.getLogger(__name__)
13
+
14
+
15
+ def build_status_update_data(event: 'BaseAgentTeamEvent',
16
+ new_status: AgentTeamStatus) -> Optional[dict]:
17
+ if new_status == AgentTeamStatus.ERROR and isinstance(event, AgentTeamErrorEvent):
18
+ return {"error_message": event.error_message}
19
+ return None
20
+
21
+
22
+ async def apply_event_and_derive_status(event: 'BaseAgentTeamEvent',
23
+ context: 'AgentTeamContext') -> Tuple[AgentTeamStatus, AgentTeamStatus]:
24
+ if context.state.event_store:
25
+ try:
26
+ context.state.event_store.append(event)
27
+ except Exception as exc: # pragma: no cover
28
+ logger.error(f"Failed to append team event to store: {exc}", exc_info=True)
29
+
30
+ if not context.state.status_deriver:
31
+ return context.current_status, context.current_status
32
+
33
+ old_status, new_status = context.state.status_deriver.apply(event, context)
34
+ if old_status != new_status:
35
+ context.current_status = new_status
36
+ additional_data = build_status_update_data(event, new_status)
37
+ if context.status_manager:
38
+ await context.status_manager.emit_status_update(
39
+ old_status, new_status, additional_data=additional_data
40
+ )
41
+
42
+ return old_status, new_status
@@ -7,7 +7,7 @@ from .agent_team_event_stream import AgentTeamEventStream
7
7
  from .agent_team_stream_events import AgentTeamStreamEvent, AgentTeamStreamDataPayload
8
8
  from .agent_team_stream_event_payloads import (
9
9
  BaseTeamSpecificPayload,
10
- AgentTeamPhaseTransitionData,
10
+ AgentTeamStatusUpdateData,
11
11
  AgentEventRebroadcastPayload,
12
12
  )
13
13
  from .agent_event_bridge import AgentEventBridge
@@ -19,7 +19,7 @@ __all__ = [
19
19
  "AgentTeamStreamEvent",
20
20
  "AgentTeamStreamDataPayload",
21
21
  "BaseTeamSpecificPayload",
22
- "AgentTeamPhaseTransitionData",
22
+ "AgentTeamStatusUpdateData",
23
23
  "AgentEventRebroadcastPayload",
24
24
  "AgentEventBridge",
25
25
  "AgentEventMultiplexer",
@@ -4,9 +4,9 @@ from typing import Optional, Dict, Any, TYPE_CHECKING
4
4
 
5
5
  from autobyteus.events.event_emitter import EventEmitter
6
6
  from autobyteus.events.event_types import EventType
7
- from autobyteus.agent_team.phases.agent_team_operational_phase import AgentTeamOperationalPhase
7
+ from autobyteus.agent_team.status.agent_team_status import AgentTeamStatus
8
8
  from autobyteus.agent.streaming.stream_events import StreamEvent as AgentStreamEvent
9
- from .agent_team_stream_events import AgentTeamStreamEvent, AgentEventRebroadcastPayload, AgentTeamPhaseTransitionData, SubTeamEventRebroadcastPayload
9
+ from .agent_team_stream_events import AgentTeamStreamEvent, AgentEventRebroadcastPayload, AgentTeamStatusUpdateData, SubTeamEventRebroadcastPayload
10
10
  from autobyteus.task_management.events import BaseTaskPlanEvent
11
11
 
12
12
  if TYPE_CHECKING:
@@ -32,14 +32,14 @@ class AgentTeamExternalEventNotifier(EventEmitter):
32
32
  """
33
33
  self.emit(EventType.TEAM_STREAM_EVENT, payload=event)
34
34
 
35
- def notify_phase_change(self, new_phase: AgentTeamOperationalPhase, old_phase: Optional[AgentTeamOperationalPhase], extra_data: Optional[Dict[str, Any]] = None):
35
+ def notify_status_updated(self, new_status: AgentTeamStatus, old_status: Optional[AgentTeamStatus], extra_data: Optional[Dict[str, Any]] = None):
36
36
  """
37
- Notifies of an agent team phase transition by creating and emitting a
37
+ Notifies of an agent team status update by creating and emitting a
38
38
  'TEAM' sourced event.
39
39
  """
40
- payload_dict = { "new_phase": new_phase, "old_phase": old_phase, "error_message": extra_data.get("error_message") if extra_data else None }
40
+ payload_dict = { "new_status": new_status, "old_status": old_status, "error_message": extra_data.get("error_message") if extra_data else None }
41
41
  filtered_payload_dict = {k: v for k, v in payload_dict.items() if v is not None}
42
- event = AgentTeamStreamEvent(team_id=self.team_id, event_source_type="TEAM", data=AgentTeamPhaseTransitionData(**filtered_payload_dict))
42
+ event = AgentTeamStreamEvent(team_id=self.team_id, event_source_type="TEAM", data=AgentTeamStatusUpdateData(**filtered_payload_dict))
43
43
  self._emit_event(event)
44
44
 
45
45
  def publish_agent_event(self, agent_name: str, agent_event: AgentStreamEvent):
@@ -1,7 +1,7 @@
1
1
  # file: autobyteus/autobyteus/agent_team/streaming/agent_team_stream_event_payloads.py
2
2
  from typing import Optional, Any
3
3
  from pydantic import BaseModel, Field
4
- from autobyteus.agent_team.phases.agent_team_operational_phase import AgentTeamOperationalPhase
4
+ from autobyteus.agent_team.status.agent_team_status import AgentTeamStatus
5
5
  from autobyteus.agent.streaming.stream_events import StreamEvent as AgentStreamEvent
6
6
  from autobyteus.task_management.events import TasksCreatedEvent, TaskStatusUpdatedEvent
7
7
  # Need to use a forward reference string to avoid circular import at runtime
@@ -13,9 +13,9 @@ if TYPE_CHECKING:
13
13
  class BaseTeamSpecificPayload(BaseModel):
14
14
  pass
15
15
 
16
- class AgentTeamPhaseTransitionData(BaseTeamSpecificPayload):
17
- new_phase: AgentTeamOperationalPhase
18
- old_phase: Optional[AgentTeamOperationalPhase] = None
16
+ class AgentTeamStatusUpdateData(BaseTeamSpecificPayload):
17
+ new_status: AgentTeamStatus
18
+ old_status: Optional[AgentTeamStatus] = None
19
19
  error_message: Optional[str] = None
20
20
 
21
21
  # --- Payload for events originating from the "AGENT" source ---