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
@@ -5,13 +5,13 @@ from typing import Literal, Union
5
5
  from pydantic import BaseModel, Field, model_validator
6
6
 
7
7
  from .agent_team_stream_event_payloads import (
8
- AgentTeamPhaseTransitionData, AgentEventRebroadcastPayload,
8
+ AgentTeamStatusUpdateData, AgentEventRebroadcastPayload,
9
9
  SubTeamEventRebroadcastPayload, TaskPlanEventPayload
10
10
  )
11
11
  from autobyteus.task_management.events import BaseTaskPlanEvent
12
12
 
13
13
  # A union of all possible payloads for a "TEAM" sourced event.
14
- TeamSpecificPayload = Union[AgentTeamPhaseTransitionData]
14
+ TeamSpecificPayload = Union[AgentTeamStatusUpdateData]
15
15
 
16
16
  # The top-level discriminated union for the main event stream's payload.
17
17
  AgentTeamStreamDataPayload = Union[TeamSpecificPayload, AgentEventRebroadcastPayload, SubTeamEventRebroadcastPayload, TaskPlanEventPayload]
@@ -32,7 +32,7 @@ class AgentTeamStreamEvent(BaseModel):
32
32
  is_sub_team_payload = isinstance(self.data, SubTeamEventRebroadcastPayload)
33
33
 
34
34
  is_team_event = self.event_source_type == "TEAM"
35
- is_team_payload = isinstance(self.data, AgentTeamPhaseTransitionData)
35
+ is_team_payload = isinstance(self.data, AgentTeamStatusUpdateData)
36
36
 
37
37
  is_task_plan_event = self.event_source_type == "TASK_PLAN"
38
38
  is_task_plan_payload = isinstance(self.data, BaseTaskPlanEvent)
@@ -0,0 +1,6 @@
1
+ # file: autobyteus/autobyteus/agent_team/system_prompt_processor/__init__.py
2
+ from .team_manifest_injector_processor import TeamManifestInjectorProcessor
3
+
4
+ __all__ = [
5
+ "TeamManifestInjectorProcessor",
6
+ ]
@@ -0,0 +1,76 @@
1
+ # file: autobyteus/autobyteus/agent_team/system_prompt_processor/team_manifest_injector_processor.py
2
+ import logging
3
+ from typing import Dict, List, TYPE_CHECKING
4
+
5
+ from autobyteus.agent.system_prompt_processor.base_processor import BaseSystemPromptProcessor
6
+ from autobyteus.agent_team.context import AgentTeamConfig
7
+
8
+ if TYPE_CHECKING:
9
+ from autobyteus.tools.base_tool import BaseTool
10
+ from autobyteus.agent.context import AgentContext
11
+ from autobyteus.agent_team.context.agent_team_context import AgentTeamContext
12
+
13
+ logger = logging.getLogger(__name__)
14
+
15
+
16
+ class TeamManifestInjectorProcessor(BaseSystemPromptProcessor):
17
+ """
18
+ Injects a team manifest into the system prompt for agents that belong to a team.
19
+ If the prompt contains {{team}}, the placeholder is replaced. Otherwise, the
20
+ manifest is appended as a dedicated section.
21
+ """
22
+
23
+ @classmethod
24
+ def get_name(cls) -> str:
25
+ return "TeamManifestInjector"
26
+
27
+ @classmethod
28
+ def get_order(cls) -> int:
29
+ return 450
30
+
31
+ def process(
32
+ self,
33
+ system_prompt: str,
34
+ tool_instances: Dict[str, 'BaseTool'],
35
+ agent_id: str,
36
+ context: 'AgentContext',
37
+ ) -> str:
38
+ team_context = context.custom_data.get("team_context")
39
+ if team_context is None:
40
+ logger.debug(f"Agent '{agent_id}': No team_context found; skipping team manifest injection.")
41
+ return system_prompt
42
+
43
+ manifest = self._generate_team_manifest(team_context, exclude_name=context.config.name)
44
+
45
+ if "{{team}}" in system_prompt:
46
+ logger.info(f"Agent '{agent_id}': Replacing {{team}} placeholder with team manifest.")
47
+ return system_prompt.replace("{{team}}", manifest)
48
+
49
+ logger.info(f"Agent '{agent_id}': Appending team manifest to system prompt.")
50
+ return system_prompt + "\n\n## Team Manifest\n\n" + manifest
51
+
52
+ def _generate_team_manifest(self, context: 'AgentTeamContext', exclude_name: str) -> str:
53
+ """
54
+ Builds a manifest string of all team members except the given agent.
55
+ Includes sub-teams so agents see the full collaboration surface.
56
+ """
57
+ prompt_parts: List[str] = []
58
+
59
+ for node in sorted(list(context.config.nodes), key=lambda n: n.name):
60
+ if node.name == exclude_name:
61
+ continue
62
+
63
+ node_def = node.node_definition
64
+ description = "No description available."
65
+
66
+ if hasattr(node_def, "description") and isinstance(node_def.description, str):
67
+ description = node_def.description
68
+ elif isinstance(node_def, AgentTeamConfig):
69
+ description = node_def.role or node_def.description
70
+
71
+ prompt_parts.append(f"- name: {node.name}\n description: {description}")
72
+
73
+ if not prompt_parts:
74
+ return "You are working alone. You have no team members to delegate to."
75
+
76
+ return "\n".join(prompt_parts)
@@ -2,6 +2,7 @@
2
2
  """
3
3
  Defines the enum for controlling how task notifications are handled in an agent team.
4
4
  """
5
+ import os
5
6
  from enum import Enum
6
7
 
7
8
  class TaskNotificationMode(str, Enum):
@@ -22,3 +23,21 @@ class TaskNotificationMode(str, Enum):
22
23
 
23
24
  def __str__(self) -> str:
24
25
  return self.value
26
+
27
+
28
+ ENV_TASK_NOTIFICATION_MODE = "AUTOBYTEUS_TASK_NOTIFICATION_MODE"
29
+ DEFAULT_TASK_NOTIFICATION_MODE = TaskNotificationMode.AGENT_MANUAL_NOTIFICATION
30
+ _VALID_TASK_NOTIFICATION_MODES = {mode.value: mode for mode in TaskNotificationMode}
31
+
32
+
33
+ def resolve_task_notification_mode() -> TaskNotificationMode:
34
+ """
35
+ Resolve task notification mode from environment.
36
+
37
+ Env var: AUTOBYTEUS_TASK_NOTIFICATION_MODE
38
+ """
39
+ raw_value = os.getenv(ENV_TASK_NOTIFICATION_MODE)
40
+ if not raw_value:
41
+ return DEFAULT_TASK_NOTIFICATION_MODE
42
+ normalized = raw_value.strip().lower()
43
+ return _VALID_TASK_NOTIFICATION_MODES.get(normalized, DEFAULT_TASK_NOTIFICATION_MODE)
@@ -4,7 +4,7 @@ import logging
4
4
  from typing import TYPE_CHECKING
5
5
 
6
6
  from autobyteus.agent_team.streaming.agent_team_event_stream import AgentTeamEventStream
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
 
9
9
  if TYPE_CHECKING:
10
10
  from autobyteus.agent_team.agent_team import AgentTeam
@@ -14,10 +14,10 @@ logger = logging.getLogger(__name__)
14
14
  async def _wait_loop(streamer: AgentTeamEventStream, team_id: str):
15
15
  """Internal helper to listen for the IDLE or ERROR event."""
16
16
  async for event in streamer.all_events():
17
- if event.event_source_type == "TEAM" and event.data.new_phase == AgentTeamOperationalPhase.IDLE:
17
+ if event.event_source_type == "TEAM" and event.data.new_status == AgentTeamStatus.IDLE:
18
18
  logger.info(f"Team '{team_id}' has become idle.")
19
19
  return
20
- if event.event_source_type == "TEAM" and event.data.new_phase == AgentTeamOperationalPhase.ERROR:
20
+ if event.event_source_type == "TEAM" and event.data.new_status == AgentTeamStatus.ERROR:
21
21
  error_message = f"Team '{team_id}' entered an error state while waiting for idle: {event.data.error_message}"
22
22
  logger.error(error_message)
23
23
  raise RuntimeError(error_message)
@@ -34,7 +34,7 @@ async def wait_for_team_to_be_idle(team: 'AgentTeam', timeout: float = 60.0):
34
34
  asyncio.TimeoutError: If the team does not become idle within the timeout period.
35
35
  RuntimeError: If the team enters an error state.
36
36
  """
37
- if team.get_current_phase() == AgentTeamOperationalPhase.IDLE:
37
+ if team.get_current_status() == AgentTeamStatus.IDLE:
38
38
  return
39
39
 
40
40
  logger.info(f"Waiting for team '{team.team_id}' to become idle (timeout: {timeout}s)...")
@@ -70,16 +70,24 @@ async def run(agent: Agent, show_tool_logs: bool = True, show_token_usage: bool
70
70
  agent_turn_complete_event.clear()
71
71
 
72
72
  if cli_display.pending_approval_data:
73
- approval_input = await asyncio.get_event_loop().run_in_executor(None, sys.stdin.readline)
74
- approval_input = approval_input.strip().lower()
75
-
76
- approval_data = cli_display.pending_approval_data
77
- cli_display.pending_approval_data = None
78
-
79
- is_approved = approval_input in ["y", "yes"]
80
- reason = "User approved via CLI" if is_approved else "User denied via CLI"
81
-
82
- await agent.post_tool_execution_approval(approval_data.invocation_id, is_approved, reason)
73
+ approval_prompt = cli_display.get_approval_prompt()
74
+ if approval_prompt:
75
+ approval_input = await asyncio.get_event_loop().run_in_executor(None, lambda: input(approval_prompt))
76
+ approval_input = approval_input.strip().lower()
77
+
78
+ approval_data = cli_display.pending_approval_data
79
+ cli_display.clear_pending_approval()
80
+
81
+ is_approved = approval_input in ["y", "yes"]
82
+ reason = "User approved via CLI"
83
+
84
+ if not is_approved:
85
+ reason_input = await asyncio.get_event_loop().run_in_executor(None, lambda: input("Reason (optional): "))
86
+ reason = reason_input.strip()
87
+ if not reason:
88
+ reason = "User denied via CLI"
89
+
90
+ await agent.post_tool_execution_approval(approval_data.invocation_id, is_approved, reason)
83
91
 
84
92
  else:
85
93
  sys.stdout.write("You: ")
@@ -13,11 +13,12 @@ from textual.widgets import Header, Static
13
13
  from textual.reactive import reactive
14
14
 
15
15
  from autobyteus.agent_team.agent_team import AgentTeam
16
+ from autobyteus.agent_team.status.agent_team_status import AgentTeamStatus
16
17
  from autobyteus.agent_team.streaming.agent_team_event_stream import AgentTeamEventStream
17
18
  from autobyteus.agent.message.agent_input_user_message import AgentInputUserMessage
18
19
  from autobyteus.agent.streaming.stream_events import StreamEventType as AgentStreamEventType
19
- from autobyteus.agent.streaming.stream_event_payloads import AssistantChunkData
20
- from autobyteus.agent_team.streaming.agent_team_stream_event_payloads import AgentEventRebroadcastPayload, AgentTeamPhaseTransitionData
20
+ from autobyteus.agent_team.streaming.agent_team_stream_events import AgentTeamStreamEvent
21
+ from autobyteus.agent_team.streaming.agent_team_stream_event_payloads import AgentEventRebroadcastPayload, SubTeamEventRebroadcastPayload, AgentTeamStatusUpdateData
21
22
 
22
23
  from .state import TUIStateStore
23
24
  from .widgets.agent_list_sidebar import AgentListSidebar
@@ -104,7 +105,9 @@ class AgentTeamApp(App):
104
105
  self._ui_update_pending = True
105
106
 
106
107
  # 3. Handle real-time, incremental updates directly.
107
- if isinstance(event.data, AgentEventRebroadcastPayload):
108
+ if event.event_source_type == "TEAM" and isinstance(event.data, AgentTeamStatusUpdateData):
109
+ self.store._team_statuses[self.team.name] = event.data.new_status
110
+ elif isinstance(event.data, AgentEventRebroadcastPayload):
108
111
  payload = event.data
109
112
  agent_name = payload.agent_name
110
113
  agent_event = payload.agent_event
@@ -132,11 +135,11 @@ class AgentTeamApp(App):
132
135
  focus_pane = self.query_one(FocusPane)
133
136
 
134
137
  tree_data = self.store.get_tree_data()
135
- agent_phases = self.store._agent_phases
136
- team_phases = self.store._team_phases
138
+ agent_statuses = self.store._agent_statuses
139
+ team_statuses = self.store._team_statuses
137
140
  speaking_agents = self.store._speaking_agents
138
141
 
139
- sidebar.update_tree(tree_data, agent_phases, team_phases, speaking_agents)
142
+ sidebar.update_tree(tree_data, agent_statuses, team_statuses, speaking_agents)
140
143
 
141
144
  focused_data = self.focused_node_data
142
145
  if focused_data and focused_data.get("type") in ['team', 'subteam']:
@@ -147,13 +150,13 @@ class AgentTeamApp(App):
147
150
  node_data=focused_data,
148
151
  history=[], # No history for teams
149
152
  pending_approval=None,
150
- all_agent_phases=agent_phases,
151
- all_team_phases=team_phases,
153
+ all_agent_statuses=agent_statuses,
154
+ all_team_statuses=team_statuses,
152
155
  task_plan=task_plan,
153
156
  task_statuses=task_statuses
154
157
  )
155
158
  elif focused_data and focused_data.get("type") == 'agent':
156
- focus_pane.update_current_node_status(agent_phases, team_phases)
159
+ focus_pane.update_current_node_status(agent_statuses, team_statuses)
157
160
 
158
161
 
159
162
  async def watch_focused_node_data(self, new_node_data: Optional[Dict[str, Any]]):
@@ -179,8 +182,8 @@ class AgentTeamApp(App):
179
182
  node_data=new_node_data,
180
183
  history=history,
181
184
  pending_approval=pending_approval,
182
- all_agent_phases=self.store._agent_phases,
183
- all_team_phases=self.store._team_phases,
185
+ all_agent_statuses=self.store._agent_statuses,
186
+ all_team_statuses=self.store._team_statuses,
184
187
  task_plan=task_plan,
185
188
  task_statuses=task_statuses
186
189
  )
@@ -7,15 +7,15 @@ import copy
7
7
 
8
8
  from autobyteus.agent.context import AgentConfig
9
9
  from autobyteus.agent_team.agent_team import AgentTeam
10
- from autobyteus.agent.phases import AgentOperationalPhase
11
- from autobyteus.agent_team.phases import AgentTeamOperationalPhase
10
+ from autobyteus.agent.status.status_enum import AgentStatus
11
+ from autobyteus.agent_team.status.agent_team_status import AgentTeamStatus
12
12
  from autobyteus.agent.streaming.stream_events import StreamEvent as AgentStreamEvent, StreamEventType as AgentStreamEventType
13
13
  from autobyteus.agent.streaming.stream_event_payloads import (
14
- AgentOperationalPhaseTransitionData, ToolInvocationApprovalRequestedData,
15
- AssistantChunkData, AssistantCompleteResponseData
14
+ AgentStatusUpdateData, ToolInvocationApprovalRequestedData,
15
+ AssistantCompleteResponseData
16
16
  )
17
17
  from autobyteus.agent_team.streaming.agent_team_stream_events import AgentTeamStreamEvent
18
- from autobyteus.agent_team.streaming.agent_team_stream_event_payloads import AgentEventRebroadcastPayload, SubTeamEventRebroadcastPayload, AgentTeamPhaseTransitionData
18
+ from autobyteus.agent_team.streaming.agent_team_stream_event_payloads import AgentEventRebroadcastPayload, SubTeamEventRebroadcastPayload, AgentTeamStatusUpdateData
19
19
  from autobyteus.task_management.task import Task
20
20
  from autobyteus.task_management.events import TasksCreatedEvent, TaskStatusUpdatedEvent
21
21
  from autobyteus.task_management.base_task_plan import TaskStatus
@@ -39,8 +39,8 @@ class TUIStateStore:
39
39
 
40
40
  self._node_roles: Dict[str, str] = self._extract_node_roles(team)
41
41
  self._nodes: Dict[str, Any] = self._initialize_root_node()
42
- self._agent_phases: Dict[str, AgentOperationalPhase] = {}
43
- self._team_phases: Dict[str, AgentTeamOperationalPhase] = {self.team_name: AgentTeamOperationalPhase.UNINITIALIZED}
42
+ self._agent_statuses: Dict[str, AgentStatus] = {}
43
+ self._team_statuses: Dict[str, AgentTeamStatus] = {self.team_name: AgentTeamStatus.UNINITIALIZED}
44
44
  self._agent_event_history: Dict[str, List[AgentStreamEvent]] = {}
45
45
  self._team_event_history: Dict[str, List[AgentTeamStreamEvent]] = {self.team_name: []}
46
46
  self._pending_approvals: Dict[str, ToolInvocationApprovalRequestedData] = {}
@@ -75,8 +75,8 @@ class TUIStateStore:
75
75
  def process_event(self, event: AgentTeamStreamEvent):
76
76
  self.version += 1 # Increment on any event to signal a change
77
77
 
78
- if event.event_source_type == "TEAM" and isinstance(event.data, AgentTeamPhaseTransitionData):
79
- self._team_phases[self.team_name] = event.data.new_phase
78
+ if event.event_source_type == "TEAM" and isinstance(event.data, AgentTeamStatusUpdateData):
79
+ self._team_statuses[self.team_name] = event.data.new_status
80
80
 
81
81
  self._process_event_recursively(event, self.team_name)
82
82
 
@@ -121,11 +121,9 @@ class TUIStateStore:
121
121
  else: logger.error(f"Cannot add agent node '{agent_name}': parent '{parent_name}' not found.")
122
122
  self._agent_event_history[agent_name].append(agent_event)
123
123
 
124
- if agent_event.event_type == AgentStreamEventType.AGENT_OPERATIONAL_PHASE_TRANSITION:
125
- self._agent_phases[agent_name] = agent_event.data.new_phase
124
+ if agent_event.event_type == AgentStreamEventType.AGENT_STATUS_UPDATED:
125
+ self._agent_statuses[agent_name] = agent_event.data.new_status
126
126
  if agent_name in self._pending_approvals: del self._pending_approvals[agent_name]
127
- elif agent_event.event_type == AgentStreamEventType.AGENT_IDLE:
128
- self._agent_phases[agent_name] = AgentOperationalPhase.IDLE
129
127
  elif agent_event.event_type == AgentStreamEventType.TOOL_INVOCATION_APPROVAL_REQUESTED:
130
128
  self._pending_approvals[agent_name] = agent_event.data
131
129
 
@@ -136,8 +134,8 @@ class TUIStateStore:
136
134
  if not self._find_node(sub_team_name):
137
135
  role = self._node_roles.get(sub_team_name, "Sub-Team")
138
136
  self._add_node(sub_team_name, {"type": "subteam", "name": sub_team_name, "role": role, "children": {}}, parent_name)
139
- if sub_team_event.event_source_type == "TEAM" and isinstance(sub_team_event.data, AgentTeamPhaseTransitionData):
140
- self._team_phases[sub_team_name] = sub_team_event.data.new_phase
137
+ if sub_team_event.event_source_type == "TEAM" and isinstance(sub_team_event.data, AgentTeamStatusUpdateData):
138
+ self._team_statuses[sub_team_name] = sub_team_event.data.new_status
141
139
  self._process_event_recursively(sub_team_event, parent_name=sub_team_name)
142
140
 
143
141
  def _add_node(self, node_name: str, node_data: Dict, parent_name: str):
@@ -10,10 +10,10 @@ from textual.widgets import Static, Tree
10
10
  from textual.widgets.tree import TreeNode
11
11
  from textual.containers import Vertical
12
12
 
13
- from autobyteus.agent.phases import AgentOperationalPhase
14
- from autobyteus.agent_team.phases import AgentTeamOperationalPhase
13
+ from autobyteus.agent.status.status_enum import AgentStatus
14
+ from autobyteus.agent_team.status.agent_team_status import AgentTeamStatus
15
15
  from .shared import (
16
- AGENT_PHASE_ICONS, TEAM_PHASE_ICONS, SUB_TEAM_ICON,
16
+ AGENT_STATUS_ICONS, TEAM_STATUS_ICONS, SUB_TEAM_ICON,
17
17
  TEAM_ICON, SPEAKING_ICON, DEFAULT_ICON
18
18
  )
19
19
  from .logo import Logo
@@ -45,19 +45,19 @@ class AgentListSidebar(Static):
45
45
  self.post_message(self.NodeSelected(event.node.data))
46
46
  event.stop()
47
47
 
48
- def _build_label(self, name: str, node_data: Dict, agent_phases: Dict, team_phases: Dict, speaking_agents: Dict) -> str:
48
+ def _build_label(self, name: str, node_data: Dict, agent_statuses: Dict, team_statuses: Dict, speaking_agents: Dict) -> str:
49
49
  """Constructs the display label for a tree node."""
50
50
  node_type = node_data["type"]
51
51
  icon = DEFAULT_ICON
52
52
 
53
53
  if node_type == "agent":
54
- phase = agent_phases.get(name, AgentOperationalPhase.UNINITIALIZED)
55
- icon = SPEAKING_ICON if speaking_agents.get(name) else AGENT_PHASE_ICONS.get(phase, DEFAULT_ICON)
54
+ status = agent_statuses.get(name, AgentStatus.UNINITIALIZED)
55
+ icon = SPEAKING_ICON if speaking_agents.get(name) else AGENT_STATUS_ICONS.get(status, DEFAULT_ICON)
56
56
  label = f"{icon} {name}"
57
57
  elif node_type in ["team", "subteam"]:
58
- phase = team_phases.get(name, AgentTeamOperationalPhase.UNINITIALIZED)
58
+ status = team_statuses.get(name, AgentTeamStatus.UNINITIALIZED)
59
59
  default_icon = TEAM_ICON if node_type == "team" else SUB_TEAM_ICON
60
- icon = TEAM_PHASE_ICONS.get(phase, default_icon)
60
+ icon = TEAM_STATUS_ICONS.get(status, default_icon)
61
61
  role = node_data.get("role")
62
62
  label = f"{icon} {role or name}"
63
63
  if role and role != name:
@@ -67,7 +67,7 @@ class AgentListSidebar(Static):
67
67
 
68
68
  return label
69
69
 
70
- def update_tree(self, tree_data: Dict, agent_phases: Dict[str, AgentOperationalPhase], team_phases: Dict[str, AgentTeamOperationalPhase], speaking_agents: Dict[str, bool]):
70
+ def update_tree(self, tree_data: Dict, agent_statuses: Dict[str, AgentStatus], team_statuses: Dict[str, AgentTeamStatus], speaking_agents: Dict[str, bool]):
71
71
  """
72
72
  Performs an in-place update of the tree to reflect the new state,
73
73
  avoiding a full rebuild for better performance and preserving UI state like expansion.
@@ -82,17 +82,17 @@ class AgentListSidebar(Static):
82
82
  root_node_data = tree_data[root_name]
83
83
 
84
84
  # Kick off the recursive update from the root.
85
- self._update_node_recursively(tree.root, root_node_data, agent_phases, team_phases, speaking_agents)
85
+ self._update_node_recursively(tree.root, root_node_data, agent_statuses, team_statuses, speaking_agents)
86
86
 
87
87
  # Ensure the root is expanded on the first run.
88
88
  if not tree.root.is_expanded:
89
89
  tree.root.expand()
90
90
 
91
- def _update_node_recursively(self, ui_node: TreeNode, node_data: Dict, agent_phases: Dict, team_phases: Dict, speaking_agents: Dict):
91
+ def _update_node_recursively(self, ui_node: TreeNode, node_data: Dict, agent_statuses: Dict, team_statuses: Dict, speaking_agents: Dict):
92
92
  """Recursively updates a node and reconciles its children."""
93
93
  # 1. Update the current node's label and data
94
94
  name = node_data['name']
95
- label = self._build_label(name, node_data, agent_phases, team_phases, speaking_agents)
95
+ label = self._build_label(name, node_data, agent_statuses, team_statuses, speaking_agents)
96
96
  ui_node.set_label(label)
97
97
  ui_node.data = node_data
98
98
  self._node_map[name] = ui_node # Ensure map is always up-to-date
@@ -106,10 +106,10 @@ class AgentListSidebar(Static):
106
106
  if child_name in existing_ui_children_by_name:
107
107
  # Node exists, so we recursively update it
108
108
  child_ui_node = existing_ui_children_by_name[child_name]
109
- self._update_node_recursively(child_ui_node, child_data, agent_phases, team_phases, speaking_agents)
109
+ self._update_node_recursively(child_ui_node, child_data, agent_statuses, team_statuses, speaking_agents)
110
110
  else:
111
111
  # Node is new, so we add it
112
- new_child_label = self._build_label(child_name, child_data, agent_phases, team_phases, speaking_agents)
112
+ new_child_label = self._build_label(child_name, child_data, agent_statuses, team_statuses, speaking_agents)
113
113
  is_leaf = child_data.get("children", {}) == {} and child_data['type'] == 'agent'
114
114
 
115
115
  if is_leaf:
@@ -117,7 +117,7 @@ class AgentListSidebar(Static):
117
117
  else:
118
118
  new_ui_node = ui_node.add(new_child_label, data=child_data)
119
119
  # Since this is a new branch, we must build its children too
120
- self._update_node_recursively(new_ui_node, child_data, agent_phases, team_phases, speaking_agents)
120
+ self._update_node_recursively(new_ui_node, child_data, agent_statuses, team_statuses, speaking_agents)
121
121
 
122
122
  self._node_map[child_name] = new_ui_node
123
123