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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (512) 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 +23 -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 +74 -60
  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/message/send_message_to.py +5 -4
  39. autobyteus/agent/runtime/agent_runtime.py +29 -21
  40. autobyteus/agent/runtime/agent_worker.py +98 -19
  41. autobyteus/agent/shutdown_steps/__init__.py +2 -0
  42. autobyteus/agent/shutdown_steps/agent_shutdown_orchestrator.py +2 -0
  43. autobyteus/agent/shutdown_steps/tool_cleanup_step.py +58 -0
  44. autobyteus/agent/status/__init__.py +14 -0
  45. autobyteus/agent/status/manager.py +93 -0
  46. autobyteus/agent/status/status_deriver.py +96 -0
  47. autobyteus/agent/{phases/phase_enum.py → status/status_enum.py} +16 -16
  48. autobyteus/agent/status/status_update_utils.py +73 -0
  49. autobyteus/agent/streaming/__init__.py +52 -5
  50. autobyteus/agent/streaming/adapters/__init__.py +18 -0
  51. autobyteus/agent/streaming/adapters/invocation_adapter.py +184 -0
  52. autobyteus/agent/streaming/adapters/tool_call_parsing.py +163 -0
  53. autobyteus/agent/streaming/adapters/tool_syntax_registry.py +67 -0
  54. autobyteus/agent/streaming/agent_event_stream.py +3 -178
  55. autobyteus/agent/streaming/api_tool_call/__init__.py +16 -0
  56. autobyteus/agent/streaming/api_tool_call/file_content_streamer.py +56 -0
  57. autobyteus/agent/streaming/api_tool_call/json_string_field_extractor.py +175 -0
  58. autobyteus/agent/streaming/api_tool_call_streaming_response_handler.py +4 -0
  59. autobyteus/agent/streaming/events/__init__.py +6 -0
  60. autobyteus/agent/streaming/events/stream_event_payloads.py +284 -0
  61. autobyteus/agent/streaming/events/stream_events.py +141 -0
  62. autobyteus/agent/streaming/handlers/__init__.py +15 -0
  63. autobyteus/agent/streaming/handlers/api_tool_call_streaming_response_handler.py +303 -0
  64. autobyteus/agent/streaming/handlers/parsing_streaming_response_handler.py +107 -0
  65. autobyteus/agent/streaming/handlers/pass_through_streaming_response_handler.py +107 -0
  66. autobyteus/agent/streaming/handlers/streaming_handler_factory.py +177 -0
  67. autobyteus/agent/streaming/handlers/streaming_response_handler.py +58 -0
  68. autobyteus/agent/streaming/parser/__init__.py +61 -0
  69. autobyteus/agent/streaming/parser/event_emitter.py +181 -0
  70. autobyteus/agent/streaming/parser/events.py +4 -0
  71. autobyteus/agent/streaming/parser/invocation_adapter.py +4 -0
  72. autobyteus/agent/streaming/parser/json_parsing_strategies/__init__.py +19 -0
  73. autobyteus/agent/streaming/parser/json_parsing_strategies/base.py +32 -0
  74. autobyteus/agent/streaming/parser/json_parsing_strategies/default.py +34 -0
  75. autobyteus/agent/streaming/parser/json_parsing_strategies/gemini.py +31 -0
  76. autobyteus/agent/streaming/parser/json_parsing_strategies/openai.py +64 -0
  77. autobyteus/agent/streaming/parser/json_parsing_strategies/registry.py +75 -0
  78. autobyteus/agent/streaming/parser/parser_context.py +227 -0
  79. autobyteus/agent/streaming/parser/parser_factory.py +132 -0
  80. autobyteus/agent/streaming/parser/sentinel_format.py +7 -0
  81. autobyteus/agent/streaming/parser/state_factory.py +62 -0
  82. autobyteus/agent/streaming/parser/states/__init__.py +1 -0
  83. autobyteus/agent/streaming/parser/states/base_state.py +60 -0
  84. autobyteus/agent/streaming/parser/states/custom_xml_tag_run_bash_parsing_state.py +38 -0
  85. autobyteus/agent/streaming/parser/states/custom_xml_tag_write_file_parsing_state.py +55 -0
  86. autobyteus/agent/streaming/parser/states/delimited_content_state.py +146 -0
  87. autobyteus/agent/streaming/parser/states/json_initialization_state.py +144 -0
  88. autobyteus/agent/streaming/parser/states/json_tool_parsing_state.py +137 -0
  89. autobyteus/agent/streaming/parser/states/sentinel_content_state.py +30 -0
  90. autobyteus/agent/streaming/parser/states/sentinel_initialization_state.py +117 -0
  91. autobyteus/agent/streaming/parser/states/text_state.py +78 -0
  92. autobyteus/agent/streaming/parser/states/xml_patch_file_tool_parsing_state.py +328 -0
  93. autobyteus/agent/streaming/parser/states/xml_run_bash_tool_parsing_state.py +129 -0
  94. autobyteus/agent/streaming/parser/states/xml_tag_initialization_state.py +151 -0
  95. autobyteus/agent/streaming/parser/states/xml_tool_parsing_state.py +63 -0
  96. autobyteus/agent/streaming/parser/states/xml_write_file_tool_parsing_state.py +343 -0
  97. autobyteus/agent/streaming/parser/strategies/__init__.py +17 -0
  98. autobyteus/agent/streaming/parser/strategies/base.py +24 -0
  99. autobyteus/agent/streaming/parser/strategies/json_tool_strategy.py +26 -0
  100. autobyteus/agent/streaming/parser/strategies/registry.py +28 -0
  101. autobyteus/agent/streaming/parser/strategies/sentinel_strategy.py +23 -0
  102. autobyteus/agent/streaming/parser/strategies/xml_tag_strategy.py +21 -0
  103. autobyteus/agent/streaming/parser/stream_scanner.py +167 -0
  104. autobyteus/agent/streaming/parser/streaming_parser.py +212 -0
  105. autobyteus/agent/streaming/parser/tool_call_parsing.py +4 -0
  106. autobyteus/agent/streaming/parser/tool_constants.py +7 -0
  107. autobyteus/agent/streaming/parser/tool_syntax_registry.py +4 -0
  108. autobyteus/agent/streaming/parser/xml_tool_parsing_state_registry.py +55 -0
  109. autobyteus/agent/streaming/parsing_streaming_response_handler.py +4 -0
  110. autobyteus/agent/streaming/pass_through_streaming_response_handler.py +4 -0
  111. autobyteus/agent/streaming/queue_streamer.py +3 -57
  112. autobyteus/agent/streaming/segments/__init__.py +5 -0
  113. autobyteus/agent/streaming/segments/segment_events.py +81 -0
  114. autobyteus/agent/streaming/stream_event_payloads.py +2 -198
  115. autobyteus/agent/streaming/stream_events.py +3 -128
  116. autobyteus/agent/streaming/streaming_handler_factory.py +4 -0
  117. autobyteus/agent/streaming/streaming_response_handler.py +4 -0
  118. autobyteus/agent/streaming/streams/__init__.py +5 -0
  119. autobyteus/agent/streaming/streams/agent_event_stream.py +197 -0
  120. autobyteus/agent/streaming/utils/__init__.py +5 -0
  121. autobyteus/agent/streaming/utils/queue_streamer.py +59 -0
  122. autobyteus/agent/system_prompt_processor/__init__.py +2 -0
  123. autobyteus/agent/system_prompt_processor/available_skills_processor.py +96 -0
  124. autobyteus/agent/system_prompt_processor/base_processor.py +1 -1
  125. autobyteus/agent/system_prompt_processor/processor_meta.py +15 -2
  126. autobyteus/agent/system_prompt_processor/tool_manifest_injector_processor.py +39 -58
  127. autobyteus/agent/token_budget.py +56 -0
  128. autobyteus/agent/tool_execution_result_processor/memory_ingest_tool_result_processor.py +29 -0
  129. autobyteus/agent/tool_invocation.py +16 -40
  130. autobyteus/agent/tool_invocation_preprocessor/__init__.py +9 -0
  131. autobyteus/agent/tool_invocation_preprocessor/base_preprocessor.py +45 -0
  132. autobyteus/agent/tool_invocation_preprocessor/processor_definition.py +15 -0
  133. autobyteus/agent/tool_invocation_preprocessor/processor_meta.py +33 -0
  134. autobyteus/agent/tool_invocation_preprocessor/processor_registry.py +60 -0
  135. autobyteus/agent/utils/wait_for_idle.py +12 -14
  136. autobyteus/agent/workspace/base_workspace.py +6 -27
  137. autobyteus/agent_team/agent_team.py +3 -3
  138. autobyteus/agent_team/agent_team_builder.py +1 -41
  139. autobyteus/agent_team/bootstrap_steps/__init__.py +0 -4
  140. autobyteus/agent_team/bootstrap_steps/agent_configuration_preparation_step.py +8 -18
  141. autobyteus/agent_team/bootstrap_steps/agent_team_bootstrapper.py +4 -16
  142. autobyteus/agent_team/bootstrap_steps/base_agent_team_bootstrap_step.py +1 -2
  143. autobyteus/agent_team/bootstrap_steps/coordinator_initialization_step.py +1 -2
  144. autobyteus/agent_team/bootstrap_steps/task_notifier_initialization_step.py +5 -6
  145. autobyteus/agent_team/bootstrap_steps/team_context_initialization_step.py +15 -15
  146. autobyteus/agent_team/context/agent_team_config.py +6 -3
  147. autobyteus/agent_team/context/agent_team_context.py +25 -3
  148. autobyteus/agent_team/context/agent_team_runtime_state.py +11 -8
  149. autobyteus/agent_team/events/__init__.py +11 -0
  150. autobyteus/agent_team/events/agent_team_event_dispatcher.py +22 -9
  151. autobyteus/agent_team/events/agent_team_events.py +16 -0
  152. autobyteus/agent_team/events/event_store.py +57 -0
  153. autobyteus/agent_team/factory/agent_team_factory.py +8 -0
  154. autobyteus/agent_team/handlers/inter_agent_message_request_event_handler.py +18 -2
  155. autobyteus/agent_team/handlers/lifecycle_agent_team_event_handler.py +21 -5
  156. autobyteus/agent_team/handlers/process_user_message_event_handler.py +17 -8
  157. autobyteus/agent_team/handlers/tool_approval_team_event_handler.py +19 -4
  158. autobyteus/agent_team/runtime/agent_team_runtime.py +41 -10
  159. autobyteus/agent_team/runtime/agent_team_worker.py +69 -5
  160. autobyteus/agent_team/status/__init__.py +14 -0
  161. autobyteus/agent_team/status/agent_team_status.py +18 -0
  162. autobyteus/agent_team/status/agent_team_status_manager.py +33 -0
  163. autobyteus/agent_team/status/status_deriver.py +62 -0
  164. autobyteus/agent_team/status/status_update_utils.py +42 -0
  165. autobyteus/agent_team/streaming/__init__.py +2 -2
  166. autobyteus/agent_team/streaming/agent_team_event_notifier.py +10 -10
  167. autobyteus/agent_team/streaming/agent_team_stream_event_payloads.py +7 -7
  168. autobyteus/agent_team/streaming/agent_team_stream_events.py +11 -11
  169. autobyteus/agent_team/system_prompt_processor/__init__.py +6 -0
  170. autobyteus/agent_team/system_prompt_processor/team_manifest_injector_processor.py +76 -0
  171. autobyteus/agent_team/task_notification/activation_policy.py +1 -1
  172. autobyteus/agent_team/task_notification/system_event_driven_agent_task_notifier.py +22 -22
  173. autobyteus/agent_team/task_notification/task_notification_mode.py +20 -1
  174. autobyteus/agent_team/utils/wait_for_idle.py +4 -4
  175. autobyteus/cli/agent_cli.py +18 -10
  176. autobyteus/cli/agent_team_tui/app.py +18 -15
  177. autobyteus/cli/agent_team_tui/state.py +21 -23
  178. autobyteus/cli/agent_team_tui/widgets/agent_list_sidebar.py +15 -15
  179. autobyteus/cli/agent_team_tui/widgets/focus_pane.py +146 -39
  180. autobyteus/cli/agent_team_tui/widgets/renderables.py +1 -1
  181. autobyteus/cli/agent_team_tui/widgets/shared.py +26 -26
  182. autobyteus/cli/agent_team_tui/widgets/{task_board_panel.py → task_plan_panel.py} +5 -5
  183. autobyteus/cli/cli_display.py +193 -44
  184. autobyteus/cli/workflow_tui/app.py +9 -10
  185. autobyteus/cli/workflow_tui/state.py +14 -16
  186. autobyteus/cli/workflow_tui/widgets/agent_list_sidebar.py +15 -15
  187. autobyteus/cli/workflow_tui/widgets/focus_pane.py +137 -35
  188. autobyteus/cli/workflow_tui/widgets/renderables.py +1 -1
  189. autobyteus/cli/workflow_tui/widgets/shared.py +25 -25
  190. autobyteus/clients/autobyteus_client.py +94 -1
  191. autobyteus/events/event_types.py +15 -21
  192. autobyteus/llm/api/autobyteus_llm.py +33 -29
  193. autobyteus/llm/api/claude_llm.py +142 -36
  194. autobyteus/llm/api/gemini_llm.py +163 -59
  195. autobyteus/llm/api/grok_llm.py +1 -1
  196. autobyteus/llm/api/minimax_llm.py +26 -0
  197. autobyteus/llm/api/mistral_llm.py +113 -87
  198. autobyteus/llm/api/ollama_llm.py +9 -42
  199. autobyteus/llm/api/openai_compatible_llm.py +127 -91
  200. autobyteus/llm/api/openai_llm.py +3 -3
  201. autobyteus/llm/api/openai_responses_llm.py +324 -0
  202. autobyteus/llm/api/zhipu_llm.py +21 -2
  203. autobyteus/llm/autobyteus_provider.py +70 -60
  204. autobyteus/llm/base_llm.py +85 -81
  205. autobyteus/llm/converters/__init__.py +14 -0
  206. autobyteus/llm/converters/anthropic_tool_call_converter.py +37 -0
  207. autobyteus/llm/converters/gemini_tool_call_converter.py +57 -0
  208. autobyteus/llm/converters/mistral_tool_call_converter.py +37 -0
  209. autobyteus/llm/converters/openai_tool_call_converter.py +38 -0
  210. autobyteus/llm/extensions/base_extension.py +6 -12
  211. autobyteus/llm/extensions/token_usage_tracking_extension.py +45 -18
  212. autobyteus/llm/llm_factory.py +282 -204
  213. autobyteus/llm/lmstudio_provider.py +60 -49
  214. autobyteus/llm/models.py +35 -2
  215. autobyteus/llm/ollama_provider.py +60 -49
  216. autobyteus/llm/ollama_provider_resolver.py +0 -1
  217. autobyteus/llm/prompt_renderers/__init__.py +19 -0
  218. autobyteus/llm/prompt_renderers/anthropic_prompt_renderer.py +104 -0
  219. autobyteus/llm/prompt_renderers/autobyteus_prompt_renderer.py +19 -0
  220. autobyteus/llm/prompt_renderers/base_prompt_renderer.py +10 -0
  221. autobyteus/llm/prompt_renderers/gemini_prompt_renderer.py +63 -0
  222. autobyteus/llm/prompt_renderers/mistral_prompt_renderer.py +87 -0
  223. autobyteus/llm/prompt_renderers/ollama_prompt_renderer.py +51 -0
  224. autobyteus/llm/prompt_renderers/openai_chat_renderer.py +97 -0
  225. autobyteus/llm/prompt_renderers/openai_responses_renderer.py +101 -0
  226. autobyteus/llm/providers.py +1 -3
  227. autobyteus/llm/token_counter/claude_token_counter.py +56 -25
  228. autobyteus/llm/token_counter/mistral_token_counter.py +12 -8
  229. autobyteus/llm/token_counter/openai_token_counter.py +24 -5
  230. autobyteus/llm/token_counter/token_counter_factory.py +12 -5
  231. autobyteus/llm/utils/llm_config.py +6 -12
  232. autobyteus/llm/utils/media_payload_formatter.py +27 -20
  233. autobyteus/llm/utils/messages.py +55 -3
  234. autobyteus/llm/utils/response_types.py +3 -0
  235. autobyteus/llm/utils/tool_call_delta.py +31 -0
  236. autobyteus/memory/__init__.py +32 -0
  237. autobyteus/memory/active_transcript.py +69 -0
  238. autobyteus/memory/compaction/__init__.py +9 -0
  239. autobyteus/memory/compaction/compaction_result.py +8 -0
  240. autobyteus/memory/compaction/compactor.py +89 -0
  241. autobyteus/memory/compaction/summarizer.py +11 -0
  242. autobyteus/memory/compaction_snapshot_builder.py +84 -0
  243. autobyteus/memory/memory_manager.py +183 -0
  244. autobyteus/memory/models/__init__.py +14 -0
  245. autobyteus/memory/models/episodic_item.py +41 -0
  246. autobyteus/memory/models/memory_types.py +7 -0
  247. autobyteus/memory/models/raw_trace_item.py +79 -0
  248. autobyteus/memory/models/semantic_item.py +41 -0
  249. autobyteus/memory/models/tool_interaction.py +20 -0
  250. autobyteus/memory/policies/__init__.py +5 -0
  251. autobyteus/memory/policies/compaction_policy.py +16 -0
  252. autobyteus/memory/retrieval/__init__.py +7 -0
  253. autobyteus/memory/retrieval/memory_bundle.py +11 -0
  254. autobyteus/memory/retrieval/retriever.py +13 -0
  255. autobyteus/memory/store/__init__.py +7 -0
  256. autobyteus/memory/store/base_store.py +14 -0
  257. autobyteus/memory/store/file_store.py +98 -0
  258. autobyteus/memory/tool_interaction_builder.py +46 -0
  259. autobyteus/memory/turn_tracker.py +9 -0
  260. autobyteus/multimedia/audio/api/__init__.py +3 -2
  261. autobyteus/multimedia/audio/api/autobyteus_audio_client.py +19 -5
  262. autobyteus/multimedia/audio/api/gemini_audio_client.py +108 -16
  263. autobyteus/multimedia/audio/api/openai_audio_client.py +112 -0
  264. autobyteus/multimedia/audio/audio_client_factory.py +84 -9
  265. autobyteus/multimedia/audio/audio_model.py +2 -1
  266. autobyteus/multimedia/image/api/autobyteus_image_client.py +19 -5
  267. autobyteus/multimedia/image/api/gemini_image_client.py +38 -17
  268. autobyteus/multimedia/image/api/openai_image_client.py +125 -43
  269. autobyteus/multimedia/image/autobyteus_image_provider.py +2 -1
  270. autobyteus/multimedia/image/image_client_factory.py +47 -15
  271. autobyteus/multimedia/image/image_model.py +5 -2
  272. autobyteus/multimedia/providers.py +3 -2
  273. autobyteus/skills/loader.py +71 -0
  274. autobyteus/skills/model.py +11 -0
  275. autobyteus/skills/registry.py +70 -0
  276. autobyteus/task_management/__init__.py +43 -20
  277. autobyteus/task_management/{base_task_board.py → base_task_plan.py} +16 -13
  278. autobyteus/task_management/converters/__init__.py +2 -2
  279. autobyteus/task_management/converters/{task_board_converter.py → task_plan_converter.py} +13 -13
  280. autobyteus/task_management/events.py +7 -7
  281. autobyteus/task_management/{in_memory_task_board.py → in_memory_task_plan.py} +34 -22
  282. autobyteus/task_management/schemas/__init__.py +3 -0
  283. autobyteus/task_management/schemas/task_status_report.py +2 -2
  284. autobyteus/task_management/schemas/todo_definition.py +15 -0
  285. autobyteus/task_management/todo.py +29 -0
  286. autobyteus/task_management/todo_list.py +75 -0
  287. autobyteus/task_management/tools/__init__.py +24 -8
  288. autobyteus/task_management/tools/task_tools/__init__.py +19 -0
  289. autobyteus/task_management/tools/{assign_task_to.py → task_tools/assign_task_to.py} +18 -18
  290. autobyteus/task_management/tools/{publish_task.py → task_tools/create_task.py} +16 -18
  291. autobyteus/task_management/tools/{publish_tasks.py → task_tools/create_tasks.py} +19 -19
  292. autobyteus/task_management/tools/{get_my_tasks.py → task_tools/get_my_tasks.py} +15 -15
  293. autobyteus/task_management/tools/{get_task_board_status.py → task_tools/get_task_plan_status.py} +16 -16
  294. autobyteus/task_management/tools/{update_task_status.py → task_tools/update_task_status.py} +16 -16
  295. autobyteus/task_management/tools/todo_tools/__init__.py +18 -0
  296. autobyteus/task_management/tools/todo_tools/add_todo.py +78 -0
  297. autobyteus/task_management/tools/todo_tools/create_todo_list.py +79 -0
  298. autobyteus/task_management/tools/todo_tools/get_todo_list.py +55 -0
  299. autobyteus/task_management/tools/todo_tools/update_todo_status.py +85 -0
  300. autobyteus/tools/__init__.py +43 -52
  301. autobyteus/tools/base_tool.py +7 -0
  302. autobyteus/tools/file/__init__.py +9 -0
  303. autobyteus/tools/file/patch_file.py +149 -0
  304. autobyteus/tools/file/{file_reader.py → read_file.py} +38 -7
  305. autobyteus/tools/file/{file_writer.py → write_file.py} +7 -4
  306. autobyteus/tools/functional_tool.py +53 -14
  307. autobyteus/tools/mcp/__init__.py +2 -0
  308. autobyteus/tools/mcp/config_service.py +5 -1
  309. autobyteus/tools/mcp/server/__init__.py +2 -0
  310. autobyteus/tools/mcp/server/http_managed_mcp_server.py +1 -1
  311. autobyteus/tools/mcp/server/websocket_managed_mcp_server.py +141 -0
  312. autobyteus/tools/mcp/server_instance_manager.py +8 -1
  313. autobyteus/tools/mcp/tool.py +3 -3
  314. autobyteus/tools/mcp/tool_registrar.py +5 -2
  315. autobyteus/tools/mcp/types.py +61 -0
  316. autobyteus/tools/multimedia/__init__.py +2 -1
  317. autobyteus/tools/multimedia/audio_tools.py +72 -19
  318. autobyteus/tools/{download_media_tool.py → multimedia/download_media_tool.py} +21 -7
  319. autobyteus/tools/multimedia/image_tools.py +248 -64
  320. autobyteus/tools/multimedia/media_reader_tool.py +1 -1
  321. autobyteus/tools/operation_executor/journal_manager.py +107 -0
  322. autobyteus/tools/operation_executor/operation_event_buffer.py +57 -0
  323. autobyteus/tools/operation_executor/operation_event_producer.py +29 -0
  324. autobyteus/tools/operation_executor/operation_executor.py +58 -0
  325. autobyteus/tools/registry/tool_definition.py +108 -14
  326. autobyteus/tools/registry/tool_registry.py +29 -0
  327. autobyteus/tools/search/__init__.py +17 -0
  328. autobyteus/tools/search/base_strategy.py +35 -0
  329. autobyteus/tools/search/client.py +24 -0
  330. autobyteus/tools/search/factory.py +81 -0
  331. autobyteus/tools/search/google_cse_strategy.py +68 -0
  332. autobyteus/tools/search/providers.py +10 -0
  333. autobyteus/tools/search/serpapi_strategy.py +65 -0
  334. autobyteus/tools/search/serper_strategy.py +87 -0
  335. autobyteus/tools/search_tool.py +83 -0
  336. autobyteus/tools/skill/load_skill.py +50 -0
  337. autobyteus/tools/terminal/__init__.py +45 -0
  338. autobyteus/tools/terminal/ansi_utils.py +32 -0
  339. autobyteus/tools/terminal/background_process_manager.py +233 -0
  340. autobyteus/tools/terminal/output_buffer.py +105 -0
  341. autobyteus/tools/terminal/prompt_detector.py +63 -0
  342. autobyteus/tools/terminal/pty_session.py +241 -0
  343. autobyteus/tools/terminal/session_factory.py +20 -0
  344. autobyteus/tools/terminal/terminal_session_manager.py +226 -0
  345. autobyteus/tools/terminal/tools/__init__.py +13 -0
  346. autobyteus/tools/terminal/tools/get_process_output.py +81 -0
  347. autobyteus/tools/terminal/tools/run_bash.py +109 -0
  348. autobyteus/tools/terminal/tools/start_background_process.py +104 -0
  349. autobyteus/tools/terminal/tools/stop_background_process.py +67 -0
  350. autobyteus/tools/terminal/types.py +54 -0
  351. autobyteus/tools/terminal/wsl_tmux_session.py +221 -0
  352. autobyteus/tools/terminal/wsl_utils.py +156 -0
  353. autobyteus/tools/tool_meta.py +4 -24
  354. autobyteus/tools/transaction_management/backup_handler.py +48 -0
  355. autobyteus/tools/transaction_management/operation_lifecycle_manager.py +62 -0
  356. autobyteus/tools/usage/__init__.py +1 -2
  357. autobyteus/tools/usage/formatters/__init__.py +17 -1
  358. autobyteus/tools/usage/formatters/base_formatter.py +8 -0
  359. autobyteus/tools/usage/formatters/default_xml_schema_formatter.py +2 -2
  360. autobyteus/tools/usage/formatters/mistral_json_schema_formatter.py +18 -0
  361. autobyteus/tools/usage/formatters/patch_file_xml_example_formatter.py +64 -0
  362. autobyteus/tools/usage/formatters/patch_file_xml_schema_formatter.py +31 -0
  363. autobyteus/tools/usage/formatters/run_bash_xml_example_formatter.py +32 -0
  364. autobyteus/tools/usage/formatters/run_bash_xml_schema_formatter.py +36 -0
  365. autobyteus/tools/usage/formatters/write_file_xml_example_formatter.py +53 -0
  366. autobyteus/tools/usage/formatters/write_file_xml_schema_formatter.py +31 -0
  367. autobyteus/tools/usage/providers/tool_manifest_provider.py +10 -10
  368. autobyteus/tools/usage/registries/__init__.py +1 -3
  369. autobyteus/tools/usage/registries/tool_formatting_registry.py +115 -8
  370. autobyteus/tools/usage/tool_schema_provider.py +51 -0
  371. autobyteus/tools/web/__init__.py +4 -0
  372. autobyteus/tools/web/read_url_tool.py +80 -0
  373. autobyteus/utils/diff_utils.py +271 -0
  374. autobyteus/utils/download_utils.py +109 -0
  375. autobyteus/utils/file_utils.py +57 -2
  376. autobyteus/utils/gemini_helper.py +56 -0
  377. autobyteus/utils/gemini_model_mapping.py +71 -0
  378. autobyteus/utils/llm_output_formatter.py +75 -0
  379. autobyteus/utils/tool_call_format.py +36 -0
  380. autobyteus/workflow/agentic_workflow.py +3 -3
  381. autobyteus/workflow/bootstrap_steps/agent_tool_injection_step.py +2 -2
  382. autobyteus/workflow/bootstrap_steps/base_workflow_bootstrap_step.py +2 -2
  383. autobyteus/workflow/bootstrap_steps/coordinator_initialization_step.py +2 -2
  384. autobyteus/workflow/bootstrap_steps/coordinator_prompt_preparation_step.py +4 -11
  385. autobyteus/workflow/bootstrap_steps/workflow_bootstrapper.py +6 -6
  386. autobyteus/workflow/bootstrap_steps/workflow_runtime_queue_initialization_step.py +2 -2
  387. autobyteus/workflow/context/workflow_context.py +3 -3
  388. autobyteus/workflow/context/workflow_runtime_state.py +5 -5
  389. autobyteus/workflow/events/workflow_event_dispatcher.py +5 -5
  390. autobyteus/workflow/handlers/lifecycle_workflow_event_handler.py +3 -3
  391. autobyteus/workflow/handlers/process_user_message_event_handler.py +5 -5
  392. autobyteus/workflow/handlers/tool_approval_workflow_event_handler.py +2 -2
  393. autobyteus/workflow/runtime/workflow_runtime.py +8 -8
  394. autobyteus/workflow/runtime/workflow_worker.py +3 -3
  395. autobyteus/workflow/status/__init__.py +11 -0
  396. autobyteus/workflow/status/workflow_status.py +19 -0
  397. autobyteus/workflow/status/workflow_status_manager.py +48 -0
  398. autobyteus/workflow/streaming/__init__.py +2 -2
  399. autobyteus/workflow/streaming/workflow_event_notifier.py +7 -7
  400. autobyteus/workflow/streaming/workflow_stream_event_payloads.py +4 -4
  401. autobyteus/workflow/streaming/workflow_stream_events.py +3 -3
  402. autobyteus/workflow/utils/wait_for_idle.py +4 -4
  403. autobyteus-1.2.3.dist-info/METADATA +293 -0
  404. autobyteus-1.2.3.dist-info/RECORD +600 -0
  405. {autobyteus-1.2.0.dist-info → autobyteus-1.2.3.dist-info}/WHEEL +1 -1
  406. {autobyteus-1.2.0.dist-info → autobyteus-1.2.3.dist-info}/top_level.txt +0 -1
  407. autobyteus/agent/bootstrap_steps/agent_runtime_queue_initialization_step.py +0 -57
  408. autobyteus/agent/hooks/__init__.py +0 -16
  409. autobyteus/agent/hooks/base_phase_hook.py +0 -78
  410. autobyteus/agent/hooks/hook_definition.py +0 -36
  411. autobyteus/agent/hooks/hook_meta.py +0 -37
  412. autobyteus/agent/hooks/hook_registry.py +0 -106
  413. autobyteus/agent/llm_response_processor/provider_aware_tool_usage_processor.py +0 -103
  414. autobyteus/agent/phases/__init__.py +0 -18
  415. autobyteus/agent/phases/discover.py +0 -53
  416. autobyteus/agent/phases/manager.py +0 -265
  417. autobyteus/agent/phases/transition_decorator.py +0 -40
  418. autobyteus/agent/phases/transition_info.py +0 -33
  419. autobyteus/agent/remote_agent.py +0 -244
  420. autobyteus/agent/workspace/workspace_definition.py +0 -36
  421. autobyteus/agent/workspace/workspace_meta.py +0 -37
  422. autobyteus/agent/workspace/workspace_registry.py +0 -72
  423. autobyteus/agent_team/bootstrap_steps/agent_team_runtime_queue_initialization_step.py +0 -25
  424. autobyteus/agent_team/bootstrap_steps/coordinator_prompt_preparation_step.py +0 -85
  425. autobyteus/agent_team/phases/__init__.py +0 -11
  426. autobyteus/agent_team/phases/agent_team_operational_phase.py +0 -19
  427. autobyteus/agent_team/phases/agent_team_phase_manager.py +0 -48
  428. autobyteus/llm/api/bedrock_llm.py +0 -92
  429. autobyteus/llm/api/groq_llm.py +0 -94
  430. autobyteus/llm/api/nvidia_llm.py +0 -108
  431. autobyteus/llm/utils/token_pricing_config.py +0 -87
  432. autobyteus/person/examples/sample_persons.py +0 -14
  433. autobyteus/person/examples/sample_roles.py +0 -14
  434. autobyteus/person/person.py +0 -29
  435. autobyteus/person/role.py +0 -14
  436. autobyteus/rpc/__init__.py +0 -73
  437. autobyteus/rpc/client/__init__.py +0 -17
  438. autobyteus/rpc/client/abstract_client_connection.py +0 -124
  439. autobyteus/rpc/client/client_connection_manager.py +0 -153
  440. autobyteus/rpc/client/sse_client_connection.py +0 -306
  441. autobyteus/rpc/client/stdio_client_connection.py +0 -280
  442. autobyteus/rpc/config/__init__.py +0 -13
  443. autobyteus/rpc/config/agent_server_config.py +0 -153
  444. autobyteus/rpc/config/agent_server_registry.py +0 -152
  445. autobyteus/rpc/hosting.py +0 -244
  446. autobyteus/rpc/protocol.py +0 -244
  447. autobyteus/rpc/server/__init__.py +0 -20
  448. autobyteus/rpc/server/agent_server_endpoint.py +0 -181
  449. autobyteus/rpc/server/base_method_handler.py +0 -40
  450. autobyteus/rpc/server/method_handlers.py +0 -259
  451. autobyteus/rpc/server/sse_server_handler.py +0 -182
  452. autobyteus/rpc/server/stdio_server_handler.py +0 -151
  453. autobyteus/rpc/server_main.py +0 -198
  454. autobyteus/rpc/transport_type.py +0 -13
  455. autobyteus/tools/bash/__init__.py +0 -2
  456. autobyteus/tools/bash/bash_executor.py +0 -100
  457. autobyteus/tools/browser/__init__.py +0 -2
  458. autobyteus/tools/browser/session_aware/__init__.py +0 -0
  459. autobyteus/tools/browser/session_aware/browser_session_aware_navigate_to.py +0 -75
  460. autobyteus/tools/browser/session_aware/browser_session_aware_tool.py +0 -30
  461. autobyteus/tools/browser/session_aware/browser_session_aware_web_element_trigger.py +0 -154
  462. autobyteus/tools/browser/session_aware/browser_session_aware_webpage_reader.py +0 -89
  463. autobyteus/tools/browser/session_aware/browser_session_aware_webpage_screenshot_taker.py +0 -107
  464. autobyteus/tools/browser/session_aware/factory/__init__.py +0 -0
  465. autobyteus/tools/browser/session_aware/factory/browser_session_aware_web_element_trigger_factory.py +0 -14
  466. autobyteus/tools/browser/session_aware/factory/browser_session_aware_webpage_reader_factory.py +0 -26
  467. autobyteus/tools/browser/session_aware/factory/browser_session_aware_webpage_screenshot_taker_factory.py +0 -14
  468. autobyteus/tools/browser/session_aware/shared_browser_session.py +0 -11
  469. autobyteus/tools/browser/session_aware/shared_browser_session_manager.py +0 -25
  470. autobyteus/tools/browser/session_aware/web_element_action.py +0 -20
  471. autobyteus/tools/browser/standalone/__init__.py +0 -6
  472. autobyteus/tools/browser/standalone/factory/__init__.py +0 -0
  473. autobyteus/tools/browser/standalone/factory/webpage_reader_factory.py +0 -25
  474. autobyteus/tools/browser/standalone/factory/webpage_screenshot_taker_factory.py +0 -14
  475. autobyteus/tools/browser/standalone/navigate_to.py +0 -80
  476. autobyteus/tools/browser/standalone/web_page_pdf_generator.py +0 -97
  477. autobyteus/tools/browser/standalone/webpage_image_downloader.py +0 -165
  478. autobyteus/tools/browser/standalone/webpage_reader.py +0 -101
  479. autobyteus/tools/browser/standalone/webpage_screenshot_taker.py +0 -101
  480. autobyteus/tools/file/file_editor.py +0 -200
  481. autobyteus/tools/google_search.py +0 -149
  482. autobyteus/tools/timer.py +0 -171
  483. autobyteus/tools/usage/parsers/__init__.py +0 -22
  484. autobyteus/tools/usage/parsers/_json_extractor.py +0 -99
  485. autobyteus/tools/usage/parsers/_string_decoders.py +0 -18
  486. autobyteus/tools/usage/parsers/anthropic_xml_tool_usage_parser.py +0 -10
  487. autobyteus/tools/usage/parsers/base_parser.py +0 -41
  488. autobyteus/tools/usage/parsers/default_json_tool_usage_parser.py +0 -83
  489. autobyteus/tools/usage/parsers/default_xml_tool_usage_parser.py +0 -316
  490. autobyteus/tools/usage/parsers/exceptions.py +0 -13
  491. autobyteus/tools/usage/parsers/gemini_json_tool_usage_parser.py +0 -77
  492. autobyteus/tools/usage/parsers/openai_json_tool_usage_parser.py +0 -149
  493. autobyteus/tools/usage/parsers/provider_aware_tool_usage_parser.py +0 -59
  494. autobyteus/tools/usage/registries/tool_usage_parser_registry.py +0 -62
  495. autobyteus/workflow/phases/__init__.py +0 -11
  496. autobyteus/workflow/phases/workflow_operational_phase.py +0 -19
  497. autobyteus/workflow/phases/workflow_phase_manager.py +0 -48
  498. autobyteus-1.2.0.dist-info/METADATA +0 -205
  499. autobyteus-1.2.0.dist-info/RECORD +0 -496
  500. examples/__init__.py +0 -1
  501. examples/agent_team/__init__.py +0 -1
  502. examples/discover_phase_transitions.py +0 -104
  503. examples/run_browser_agent.py +0 -262
  504. examples/run_google_slides_agent.py +0 -287
  505. examples/run_mcp_browser_client.py +0 -174
  506. examples/run_mcp_google_slides_client.py +0 -270
  507. examples/run_mcp_list_tools.py +0 -189
  508. examples/run_poem_writer.py +0 -284
  509. examples/run_sqlite_agent.py +0 -295
  510. /autobyteus/{person → skills}/__init__.py +0 -0
  511. /autobyteus/{person/examples → tools/skill}/__init__.py +0 -0
  512. {autobyteus-1.2.0.dist-info → autobyteus-1.2.3.dist-info}/licenses/LICENSE +0 -0
@@ -13,15 +13,17 @@ from textual.message import Message
13
13
  from textual.widgets import Input, Static, Button
14
14
  from textual.containers import VerticalScroll, Horizontal
15
15
 
16
- from autobyteus.agent.phases import AgentOperationalPhase
17
- from autobyteus.workflow.phases import WorkflowOperationalPhase
16
+ from autobyteus.agent.status.status_enum import AgentStatus
17
+ from autobyteus.workflow.status.workflow_status import WorkflowStatus
18
18
  from autobyteus.agent.streaming.stream_events import StreamEvent as AgentStreamEvent, StreamEventType as AgentStreamEventType
19
19
  from autobyteus.agent.streaming.stream_event_payloads import (
20
- AgentOperationalPhaseTransitionData, AssistantChunkData, AssistantCompleteResponseData,
21
- ErrorEventData, ToolInteractionLogEntryData, ToolInvocationApprovalRequestedData, ToolInvocationAutoExecutingData
20
+ AgentStatusUpdateData, AssistantChunkData, AssistantCompleteResponseData,
21
+ ErrorEventData, ToolInteractionLogEntryData, ToolInvocationApprovalRequestedData, ToolInvocationAutoExecutingData,
22
+ SegmentEventData,
22
23
  )
24
+ from autobyteus.agent.streaming.parser.events import SegmentEventType, SegmentType
23
25
  from .shared import (
24
- AGENT_PHASE_ICONS, WORKFLOW_PHASE_ICONS, SUB_WORKFLOW_ICON, DEFAULT_ICON,
26
+ AGENT_STATUS_ICONS, WORKFLOW_STATUS_ICONS, SUB_WORKFLOW_ICON, DEFAULT_ICON,
25
27
  USER_ICON, ASSISTANT_ICON, WORKFLOW_ICON, AGENT_ICON
26
28
  )
27
29
  from . import renderables
@@ -62,6 +64,8 @@ class FocusPane(Static):
62
64
  # Buffers for batched UI updates to improve performance
63
65
  self._reasoning_buffer: str = ""
64
66
  self._content_buffer: str = ""
67
+ self._segment_types_by_id: Dict[str, SegmentType] = {}
68
+ self._saw_segment_event: bool = False
65
69
 
66
70
  def compose(self):
67
71
  yield Static("Select a node from the sidebar", id="focus-pane-title")
@@ -127,7 +131,7 @@ class FocusPane(Static):
127
131
  Button("Deny", variant="error", id="deny-btn")
128
132
  )
129
133
 
130
- def _update_title(self, agent_phases: Dict[str, AgentOperationalPhase], workflow_phases: Dict[str, WorkflowOperationalPhase]):
134
+ def _update_title(self, agent_statuses: Dict[str, AgentStatus], workflow_statuses: Dict[str, WorkflowStatus]):
131
135
  """Renders the title of the focus pane with the node's current status."""
132
136
  if not self._focused_node_data:
133
137
  self.query_one("#focus-pane-title").update("Select a node from the sidebar")
@@ -138,31 +142,31 @@ class FocusPane(Static):
138
142
  node_type_str = node_type.replace("_", " ").capitalize()
139
143
 
140
144
  title_icon = DEFAULT_ICON
141
- phase_str = ""
145
+ status_str = ""
142
146
 
143
147
  if node_type == 'agent':
144
148
  title_icon = AGENT_ICON
145
- phase = agent_phases.get(node_name, AgentOperationalPhase.UNINITIALIZED)
146
- phase_str = f" (Status: {phase.value})"
149
+ status = agent_statuses.get(node_name, AgentStatus.UNINITIALIZED)
150
+ status_str = f" (Status: {status.value})"
147
151
  elif node_type == 'subworkflow':
148
152
  title_icon = SUB_WORKFLOW_ICON
149
- phase = workflow_phases.get(node_name, WorkflowOperationalPhase.UNINITIALIZED)
150
- phase_str = f" (Status: {phase.value})"
153
+ status = workflow_statuses.get(node_name, WorkflowStatus.UNINITIALIZED)
154
+ status_str = f" (Status: {status.value})"
151
155
  elif node_type == 'workflow':
152
156
  title_icon = WORKFLOW_ICON
153
- phase = workflow_phases.get(node_name, WorkflowOperationalPhase.UNINITIALIZED)
154
- phase_str = f" (Status: {phase.value})"
157
+ status = workflow_statuses.get(node_name, WorkflowStatus.UNINITIALIZED)
158
+ status_str = f" (Status: {status.value})"
155
159
 
156
- self.query_one("#focus-pane-title").update(f"{title_icon} {node_type_str}: [bold]{node_name}[/bold]{phase_str}")
160
+ self.query_one("#focus-pane-title").update(f"{title_icon} {node_type_str}: [bold]{node_name}[/bold]{status_str}")
157
161
 
158
- def update_current_node_status(self, all_agent_phases: Dict, all_workflow_phases: Dict):
162
+ def update_current_node_status(self, all_agent_statuses: Dict, all_workflow_statuses: Dict):
159
163
  """A lightweight method to only update the title with the latest status."""
160
- self._update_title(all_agent_phases, all_workflow_phases)
164
+ self._update_title(all_agent_statuses, all_workflow_statuses)
161
165
 
162
166
  async def update_content(self, node_data: Dict[str, Any], history: List[Any],
163
167
  pending_approval: Optional[ToolInvocationApprovalRequestedData],
164
- all_agent_phases: Dict[str, AgentOperationalPhase],
165
- all_workflow_phases: Dict[str, WorkflowOperationalPhase]):
168
+ all_agent_statuses: Dict[str, AgentStatus],
169
+ all_workflow_statuses: Dict[str, WorkflowStatus]):
166
170
  """The main method to update the entire pane based on new state.
167
171
  This is called when focus SWITCHES, or when data for a focused workflow is REFRESHED."""
168
172
  self.flush_stream_buffers()
@@ -170,7 +174,7 @@ class FocusPane(Static):
170
174
  self._focused_node_data = node_data
171
175
  self._pending_approval_data = pending_approval
172
176
 
173
- self._update_title(all_agent_phases, all_workflow_phases)
177
+ self._update_title(all_agent_statuses, all_workflow_statuses)
174
178
 
175
179
  log_container = self.query_one("#focus-pane-log-container")
176
180
  await log_container.remove_children()
@@ -180,6 +184,8 @@ class FocusPane(Static):
180
184
  self._thinking_text = None
181
185
  self._assistant_content_widget = None
182
186
  self._assistant_content_text = None
187
+ self._segment_types_by_id.clear()
188
+ self._saw_segment_event = False
183
189
 
184
190
  await self._clear_approval_ui()
185
191
 
@@ -189,21 +195,21 @@ class FocusPane(Static):
189
195
  if self._pending_approval_data:
190
196
  await self._show_approval_prompt()
191
197
  elif self._focused_node_data.get("type") in ['workflow', 'subworkflow']:
192
- await self._render_workflow_dashboard(node_data, all_agent_phases, all_workflow_phases)
198
+ await self._render_workflow_dashboard(node_data, all_agent_statuses, all_workflow_statuses)
193
199
 
194
200
  async def _render_workflow_dashboard(self, node_data: Dict[str, Any],
195
- all_agent_phases: Dict[str, AgentOperationalPhase],
196
- all_workflow_phases: Dict[str, WorkflowOperationalPhase]):
201
+ all_agent_statuses: Dict[str, AgentStatus],
202
+ all_workflow_statuses: Dict[str, WorkflowStatus]):
197
203
  """Renders a static summary dashboard for a workflow or sub-workflow."""
198
204
  log_container = self.query_one("#focus-pane-log-container")
199
205
 
200
- phase = all_workflow_phases.get(node_data['name'], WorkflowOperationalPhase.UNINITIALIZED)
201
- phase_icon = WORKFLOW_PHASE_ICONS.get(phase, DEFAULT_ICON)
206
+ status = all_workflow_statuses.get(node_data['name'], WorkflowStatus.UNINITIALIZED)
207
+ status_icon = WORKFLOW_STATUS_ICONS.get(status, DEFAULT_ICON)
202
208
  info_text = Text()
203
209
  info_text.append(f"Name: {node_data['name']}\n", style="bold")
204
210
  if node_data.get('role'):
205
211
  info_text.append(f"Role: {node_data['role']}\n")
206
- info_text.append(f"Status: {phase_icon} {phase.value}")
212
+ info_text.append(f"Status: {status_icon} {status.value}")
207
213
  await log_container.mount(Static(Panel(info_text, title="Workflow Info", border_style="green", title_align="left")))
208
214
 
209
215
  children_data = node_data.get("children", {})
@@ -211,13 +217,13 @@ class FocusPane(Static):
211
217
  team_text = Text()
212
218
  for name, child_node in children_data.items():
213
219
  if child_node['type'] == 'agent':
214
- agent_phase = all_agent_phases.get(name, AgentOperationalPhase.UNINITIALIZED)
215
- agent_icon = AGENT_PHASE_ICONS.get(agent_phase, DEFAULT_ICON)
216
- team_text.append(f" ▪ {agent_icon} {name} (Agent): {agent_phase.value}\n")
220
+ agent_status = all_agent_statuses.get(name, AgentStatus.UNINITIALIZED)
221
+ agent_icon = AGENT_STATUS_ICONS.get(agent_status, DEFAULT_ICON)
222
+ team_text.append(f" ▪ {agent_icon} {name} (Agent): {agent_status.value}\n")
217
223
  elif child_node['type'] == 'subworkflow':
218
- wf_phase = all_workflow_phases.get(name, WorkflowOperationalPhase.UNINITIALIZED)
219
- wf_icon = WORKFLOW_PHASE_ICONS.get(wf_phase, SUB_WORKFLOW_ICON)
220
- team_text.append(f" ▪ {wf_icon} {name} (Sub-Workflow): {wf_phase.value}\n")
224
+ wf_status = all_workflow_statuses.get(name, WorkflowStatus.UNINITIALIZED)
225
+ wf_icon = WORKFLOW_STATUS_ICONS.get(wf_status, SUB_WORKFLOW_ICON)
226
+ team_text.append(f" ▪ {wf_icon} {name} (Sub-Workflow): {wf_status.value}\n")
221
227
  await log_container.mount(Static(Panel(team_text, title="Team Status", border_style="blue", title_align="left")))
222
228
 
223
229
  async def _close_thinking_block(self, scroll: bool = True):
@@ -249,12 +255,107 @@ class FocusPane(Static):
249
255
  if scrolled:
250
256
  self.query_one("#focus-pane-log-container").scroll_end(animate=False)
251
257
 
258
+ async def _ensure_thinking_widget(self, log_container: VerticalScroll) -> None:
259
+ if self._thinking_widget is None:
260
+ self.flush_stream_buffers()
261
+ await log_container.mount(Static(""))
262
+ self._thinking_text = Text("<Thinking>\n", style="dim italic cyan")
263
+ self._thinking_widget = Static(self._thinking_text)
264
+ await log_container.mount(self._thinking_widget)
265
+
266
+ async def _ensure_assistant_content_widget(self, log_container: VerticalScroll) -> None:
267
+ if self._assistant_content_widget is None:
268
+ await log_container.mount(Static(""))
269
+ self._assistant_content_text = Text()
270
+ self._assistant_content_text.append(f"{ASSISTANT_ICON} assistant: ", style="bold green")
271
+ self._assistant_content_widget = Static(self._assistant_content_text)
272
+ await log_container.mount(self._assistant_content_widget)
273
+
274
+ async def _handle_segment_event(self, data: SegmentEventData) -> None:
275
+ log_container = self.query_one("#focus-pane-log-container")
276
+ self._saw_segment_event = True
277
+ try:
278
+ event_type = SegmentEventType(data.event_type)
279
+ except ValueError:
280
+ logger.debug(f"TUI FocusPane: Unknown segment event type '{data.event_type}'.")
281
+ return
282
+
283
+ segment_type = None
284
+ if data.segment_type:
285
+ try:
286
+ segment_type = SegmentType(data.segment_type)
287
+ except ValueError:
288
+ logger.debug(f"TUI FocusPane: Unknown segment type '{data.segment_type}'.")
289
+
290
+ if segment_type is None and data.segment_id in self._segment_types_by_id:
291
+ segment_type = self._segment_types_by_id.get(data.segment_id)
292
+
293
+ metadata = {}
294
+ if isinstance(data.payload, dict):
295
+ metadata = data.payload.get("metadata", {}) or {}
296
+
297
+ if event_type == SegmentEventType.START:
298
+ if segment_type is not None:
299
+ self._segment_types_by_id[data.segment_id] = segment_type
300
+
301
+ if segment_type != SegmentType.REASONING:
302
+ await self._close_thinking_block(scroll=False)
303
+
304
+ if segment_type == SegmentType.REASONING:
305
+ await self._ensure_thinking_widget(log_container)
306
+ return
307
+
308
+ await self._ensure_assistant_content_widget(log_container)
309
+
310
+ if segment_type == SegmentType.WRITE_FILE:
311
+ path = metadata.get("path", "")
312
+ header = f"<write_file path=\"{path}\">" if path else "<write_file>"
313
+ self._content_buffer += f"{header}\n"
314
+ elif segment_type == SegmentType.RUN_BASH:
315
+ self._content_buffer += "<run_bash>\n"
316
+ elif segment_type == SegmentType.TOOL_CALL:
317
+ tool_name = metadata.get("tool_name", "")
318
+ header = f"<tool name=\"{tool_name}\">" if tool_name else "<tool>"
319
+ self._content_buffer += f"{header}\n"
320
+ return
321
+
322
+ if event_type == SegmentEventType.CONTENT:
323
+ delta = ""
324
+ if isinstance(data.payload, dict):
325
+ delta = data.payload.get("delta", "")
326
+
327
+ if segment_type == SegmentType.REASONING:
328
+ await self._ensure_thinking_widget(log_container)
329
+ self._reasoning_buffer += str(delta)
330
+ else:
331
+ await self._ensure_assistant_content_widget(log_container)
332
+ self._content_buffer += str(delta)
333
+ return
334
+
335
+ if event_type == SegmentEventType.END:
336
+ if segment_type == SegmentType.REASONING:
337
+ await self._close_thinking_block()
338
+ self._segment_types_by_id.pop(data.segment_id, None)
339
+ return
340
+
341
+ if segment_type in {SegmentType.WRITE_FILE, SegmentType.RUN_BASH, SegmentType.TOOL_CALL}:
342
+ tag = "write_file" if segment_type == SegmentType.WRITE_FILE else (
343
+ "run_bash" if segment_type == SegmentType.RUN_BASH else "tool"
344
+ )
345
+ self._content_buffer += f"\n</{tag}>\n"
346
+
347
+ self._segment_types_by_id.pop(data.segment_id, None)
348
+ return
349
+
252
350
  async def add_agent_event(self, event: AgentStreamEvent):
253
351
  """Adds a single agent event to the log view, handling stream state correctly."""
254
352
  log_container = self.query_one("#focus-pane-log-container")
255
353
  event_type = event.event_type
256
354
 
257
- # Handle streaming content events
355
+ if event_type == AgentStreamEventType.SEGMENT_EVENT and isinstance(event.data, SegmentEventData):
356
+ await self._handle_segment_event(event.data)
357
+ return
358
+
258
359
  if event_type == AgentStreamEventType.ASSISTANT_CHUNK:
259
360
  data: AssistantChunkData = event.data
260
361
  if data.reasoning:
@@ -276,7 +377,7 @@ class FocusPane(Static):
276
377
  self._assistant_content_widget = Static(self._assistant_content_text)
277
378
  await log_container.mount(self._assistant_content_widget)
278
379
  self._content_buffer += data.content
279
- return # This event is handled, do nothing more.
380
+ return
280
381
 
281
382
  # Handle the explicit end of a stream
282
383
  if event_type == AgentStreamEventType.ASSISTANT_COMPLETE_RESPONSE:
@@ -287,13 +388,14 @@ class FocusPane(Static):
287
388
  self._assistant_content_text = None
288
389
 
289
390
  # If we weren't streaming, it means this is a non-streamed response. We should render it.
290
- if not was_streaming_content:
391
+ if not self._saw_segment_event and not was_streaming_content:
291
392
  renderables_list = renderables.render_assistant_complete_response(event.data)
292
393
  if renderables_list:
293
394
  await log_container.mount(Static(""))
294
395
  for item in renderables_list:
295
396
  await log_container.mount(Static(item))
296
397
  log_container.scroll_end(animate=False)
398
+ self._saw_segment_event = False
297
399
  return # This event's purpose is to end the stream.
298
400
 
299
401
  # For all other events, first check if they should break an ongoing stream.
@@ -324,7 +426,7 @@ class FocusPane(Static):
324
426
  await self._show_approval_prompt()
325
427
  elif event_type == AgentStreamEventType.ERROR_EVENT:
326
428
  renderable = renderables.render_error(event.data)
327
- elif event_type in [AgentStreamEventType.AGENT_OPERATIONAL_PHASE_TRANSITION, AgentStreamEventType.AGENT_IDLE]:
429
+ elif event_type == AgentStreamEventType.AGENT_STATUS_UPDATED:
328
430
  # These are informational and do not have a renderable in the log pane.
329
431
  pass
330
432
 
@@ -10,7 +10,7 @@ from rich.text import Text
10
10
  from rich.panel import Panel
11
11
 
12
12
  from autobyteus.agent.streaming.stream_event_payloads import (
13
- AgentOperationalPhaseTransitionData, AssistantCompleteResponseData,
13
+ AgentStatusUpdateData, AssistantCompleteResponseData,
14
14
  ErrorEventData, ToolInteractionLogEntryData, ToolInvocationApprovalRequestedData, ToolInvocationAutoExecutingData
15
15
  )
16
16
  from .shared import ASSISTANT_ICON, TOOL_ICON, PROMPT_ICON, ERROR_ICON, LOG_ICON
@@ -3,33 +3,33 @@
3
3
  Shared constants and data for TUI widgets.
4
4
  """
5
5
  from typing import Dict
6
- from autobyteus.agent.phases import AgentOperationalPhase
7
- from autobyteus.workflow.phases import WorkflowOperationalPhase
6
+ from autobyteus.agent.status.status_enum import AgentStatus
7
+ from autobyteus.workflow.status.workflow_status import WorkflowStatus
8
8
 
9
- AGENT_PHASE_ICONS: Dict[AgentOperationalPhase, str] = {
10
- AgentOperationalPhase.UNINITIALIZED: "⚪",
11
- AgentOperationalPhase.BOOTSTRAPPING: "⏳",
12
- AgentOperationalPhase.IDLE: "🟢",
13
- AgentOperationalPhase.PROCESSING_USER_INPUT: "💭",
14
- AgentOperationalPhase.AWAITING_LLM_RESPONSE: "💭",
15
- AgentOperationalPhase.ANALYZING_LLM_RESPONSE: "🤔",
16
- AgentOperationalPhase.AWAITING_TOOL_APPROVAL: "❓",
17
- AgentOperationalPhase.TOOL_DENIED: "❌",
18
- AgentOperationalPhase.EXECUTING_TOOL: "🛠️",
19
- AgentOperationalPhase.PROCESSING_TOOL_RESULT: "⚙️",
20
- AgentOperationalPhase.SHUTTING_DOWN: "🌙",
21
- AgentOperationalPhase.SHUTDOWN_COMPLETE: "⚫",
22
- AgentOperationalPhase.ERROR: "❗",
9
+ AGENT_STATUS_ICONS: Dict[AgentStatus, str] = {
10
+ AgentStatus.UNINITIALIZED: "⚪",
11
+ AgentStatus.BOOTSTRAPPING: "⏳",
12
+ AgentStatus.IDLE: "🟢",
13
+ AgentStatus.PROCESSING_USER_INPUT: "💭",
14
+ AgentStatus.AWAITING_LLM_RESPONSE: "💭",
15
+ AgentStatus.ANALYZING_LLM_RESPONSE: "🤔",
16
+ AgentStatus.AWAITING_TOOL_APPROVAL: "❓",
17
+ AgentStatus.TOOL_DENIED: "❌",
18
+ AgentStatus.EXECUTING_TOOL: "🛠️",
19
+ AgentStatus.PROCESSING_TOOL_RESULT: "⚙️",
20
+ AgentStatus.SHUTTING_DOWN: "🌙",
21
+ AgentStatus.SHUTDOWN_COMPLETE: "⚫",
22
+ AgentStatus.ERROR: "❗",
23
23
  }
24
24
 
25
- WORKFLOW_PHASE_ICONS: Dict[WorkflowOperationalPhase, str] = {
26
- WorkflowOperationalPhase.UNINITIALIZED: "⚪",
27
- WorkflowOperationalPhase.BOOTSTRAPPING: "⏳",
28
- WorkflowOperationalPhase.IDLE: "🟢",
29
- WorkflowOperationalPhase.PROCESSING: "⚙️",
30
- WorkflowOperationalPhase.SHUTTING_DOWN: "🌙",
31
- WorkflowOperationalPhase.SHUTDOWN_COMPLETE: "⚫",
32
- WorkflowOperationalPhase.ERROR: "❗",
25
+ WORKFLOW_STATUS_ICONS: Dict[WorkflowStatus, str] = {
26
+ WorkflowStatus.UNINITIALIZED: "⚪",
27
+ WorkflowStatus.BOOTSTRAPPING: "⏳",
28
+ WorkflowStatus.IDLE: "🟢",
29
+ WorkflowStatus.PROCESSING: "⚙️",
30
+ WorkflowStatus.SHUTTING_DOWN: "🌙",
31
+ WorkflowStatus.SHUTDOWN_COMPLETE: "⚫",
32
+ WorkflowStatus.ERROR: "❗",
33
33
  }
34
34
 
35
35
  # Main component icons
@@ -47,5 +47,5 @@ ASSISTANT_ICON = "🤖"
47
47
  TOOL_ICON = "🛠️"
48
48
  PROMPT_ICON = "❓"
49
49
  ERROR_ICON = "💥"
50
- PHASE_ICON = "🔄"
50
+ STATUS_ICON = "🔄"
51
51
  LOG_ICON = "📄"
@@ -102,6 +102,30 @@ class AutobyteusClient:
102
102
 
103
103
  logger.info("Initialized Autobyteus client with server URL: %s", self.server_url)
104
104
 
105
+ @staticmethod
106
+ def _wrap_http_error(exc: httpx.HTTPStatusError) -> RuntimeError:
107
+ """
108
+ Produce a RuntimeError that preserves status code and server-provided details.
109
+ """
110
+ response = exc.response
111
+ detail: str = ""
112
+ # Prefer JSON "detail" if present
113
+ try:
114
+ json_body = response.json()
115
+ detail = json_body.get("detail") or json.dumps(json_body)
116
+ except Exception:
117
+ # Fall back to raw text
118
+ detail = response.text
119
+
120
+ message = f"HTTP {response.status_code} {response.reason_phrase}"
121
+ if detail:
122
+ message = f"{message}: {detail}"
123
+ else:
124
+ message = f"{message}: {exc}"
125
+ err = RuntimeError(message)
126
+ err.__cause__ = exc
127
+ return err
128
+
105
129
  async def get_available_llm_models(self) -> Dict[str, Any]:
106
130
  """Async discovery of available LLM models."""
107
131
  try:
@@ -110,6 +134,9 @@ class AutobyteusClient:
110
134
  )
111
135
  response.raise_for_status()
112
136
  return response.json()
137
+ except httpx.HTTPStatusError as exc:
138
+ logger.error("Async LLM model fetch error: %s", exc)
139
+ raise self._wrap_http_error(exc)
113
140
  except httpx.HTTPError as exc:
114
141
  logger.error("Async LLM model fetch error: %s", exc)
115
142
  raise RuntimeError(str(exc)) from exc
@@ -120,6 +147,9 @@ class AutobyteusClient:
120
147
  response = self.sync_client.get(urljoin(self.server_url, "/models/llm"))
121
148
  response.raise_for_status()
122
149
  return response.json()
150
+ except httpx.HTTPStatusError as exc:
151
+ logger.error("Sync LLM model fetch error: %s", exc)
152
+ raise self._wrap_http_error(exc)
123
153
  except httpx.HTTPError as exc:
124
154
  logger.error("Sync LLM model fetch error: %s", exc)
125
155
  raise RuntimeError(str(exc)) from exc
@@ -132,6 +162,9 @@ class AutobyteusClient:
132
162
  )
133
163
  response.raise_for_status()
134
164
  return response.json()
165
+ except httpx.HTTPStatusError as exc:
166
+ logger.error("Async image model fetch error: %s", exc)
167
+ raise self._wrap_http_error(exc)
135
168
  except httpx.HTTPError as exc:
136
169
  logger.error("Async image model fetch error: %s", exc)
137
170
  raise RuntimeError(str(exc)) from exc
@@ -144,6 +177,9 @@ class AutobyteusClient:
144
177
  )
145
178
  response.raise_for_status()
146
179
  return response.json()
180
+ except httpx.HTTPStatusError as exc:
181
+ logger.error("Sync image model fetch error: %s", exc)
182
+ raise self._wrap_http_error(exc)
147
183
  except httpx.HTTPError as exc:
148
184
  logger.error("Sync image model fetch error: %s", exc)
149
185
  raise RuntimeError(str(exc)) from exc
@@ -156,6 +192,9 @@ class AutobyteusClient:
156
192
  )
157
193
  response.raise_for_status()
158
194
  return response.json()
195
+ except httpx.HTTPStatusError as exc:
196
+ logger.error("Async audio model fetch error: %s", exc)
197
+ raise self._wrap_http_error(exc)
159
198
  except httpx.HTTPError as exc:
160
199
  logger.error("Async audio model fetch error: %s", exc)
161
200
  raise RuntimeError(str(exc)) from exc
@@ -168,6 +207,9 @@ class AutobyteusClient:
168
207
  )
169
208
  response.raise_for_status()
170
209
  return response.json()
210
+ except httpx.HTTPStatusError as exc:
211
+ logger.error("Sync audio model fetch error: %s", exc)
212
+ raise self._wrap_http_error(exc)
171
213
  except httpx.HTTPError as exc:
172
214
  logger.error("Sync audio model fetch error: %s", exc)
173
215
  raise RuntimeError(str(exc)) from exc
@@ -197,6 +239,9 @@ class AutobyteusClient:
197
239
  )
198
240
  response.raise_for_status()
199
241
  return response.json()
242
+ except httpx.HTTPStatusError as exc:
243
+ logger.error("Error sending message: %s", exc)
244
+ raise self._wrap_http_error(exc)
200
245
  except httpx.HTTPError as exc:
201
246
  logger.error("Error sending message: %s", exc)
202
247
  raise RuntimeError(str(exc)) from exc
@@ -239,6 +284,9 @@ class AutobyteusClient:
239
284
  logger.error("Failed to parse stream chunk: %s", exc)
240
285
  raise RuntimeError("Invalid stream response format") from exc
241
286
 
287
+ except httpx.HTTPStatusError as exc:
288
+ logger.error("Stream error: %s", exc)
289
+ raise self._wrap_http_error(exc)
242
290
  except httpx.HTTPError as exc:
243
291
  logger.error("Stream error: %s", exc)
244
292
  raise RuntimeError(str(exc)) from exc
@@ -250,6 +298,7 @@ class AutobyteusClient:
250
298
  input_image_urls: Optional[List[str]] = None,
251
299
  mask_url: Optional[str] = None,
252
300
  generation_config: Optional[Dict[str, Any]] = None,
301
+ session_id: Optional[str] = None,
253
302
  ) -> Dict[str, Any]:
254
303
  """Generate or edit an image and return the server response."""
255
304
  try:
@@ -259,6 +308,7 @@ class AutobyteusClient:
259
308
  "input_image_urls": input_image_urls or [],
260
309
  "mask_url": mask_url,
261
310
  "generation_config": generation_config or {},
311
+ "session_id": session_id,
262
312
  }
263
313
  response = await self.async_client.post(
264
314
  urljoin(self.server_url, "/generate-image"),
@@ -266,6 +316,9 @@ class AutobyteusClient:
266
316
  )
267
317
  response.raise_for_status()
268
318
  return response.json()
319
+ except httpx.HTTPStatusError as exc:
320
+ logger.error("Error generating image: %s", exc)
321
+ raise self._wrap_http_error(exc)
269
322
  except httpx.HTTPError as exc:
270
323
  logger.error("Error generating image: %s", exc)
271
324
  raise RuntimeError(str(exc)) from exc
@@ -275,6 +328,7 @@ class AutobyteusClient:
275
328
  model_name: str,
276
329
  prompt: str,
277
330
  generation_config: Optional[Dict[str, Any]] = None,
331
+ session_id: Optional[str] = None,
278
332
  ) -> Dict[str, Any]:
279
333
  """Generate speech from text and return the server response."""
280
334
  try:
@@ -282,6 +336,7 @@ class AutobyteusClient:
282
336
  "model_name": model_name,
283
337
  "prompt": prompt,
284
338
  "generation_config": generation_config or {},
339
+ "session_id": session_id,
285
340
  }
286
341
  response = await self.async_client.post(
287
342
  urljoin(self.server_url, "/generate-speech"),
@@ -289,12 +344,15 @@ class AutobyteusClient:
289
344
  )
290
345
  response.raise_for_status()
291
346
  return response.json()
347
+ except httpx.HTTPStatusError as exc:
348
+ logger.error("Error generating speech: %s", exc)
349
+ raise self._wrap_http_error(exc)
292
350
  except httpx.HTTPError as exc:
293
351
  logger.error("Error generating speech: %s", exc)
294
352
  raise RuntimeError(str(exc)) from exc
295
353
 
296
354
  async def cleanup(self, conversation_id: str) -> Dict[str, Any]:
297
- """Clean up a conversation."""
355
+ """Clean up a conversation (LLM)."""
298
356
  try:
299
357
  response = await self.async_client.post(
300
358
  urljoin(self.server_url, "/cleanup"),
@@ -302,10 +360,45 @@ class AutobyteusClient:
302
360
  )
303
361
  response.raise_for_status()
304
362
  return response.json()
363
+ except httpx.HTTPStatusError as exc:
364
+ logger.error("Cleanup error: %s", exc)
365
+ raise self._wrap_http_error(exc)
305
366
  except httpx.HTTPError as exc:
306
367
  logger.error("Cleanup error: %s", exc)
307
368
  raise RuntimeError(str(exc)) from exc
308
369
 
370
+ async def cleanup_image_session(self, session_id: str) -> Dict[str, Any]:
371
+ """Clean up an image session."""
372
+ try:
373
+ response = await self.async_client.post(
374
+ urljoin(self.server_url, "/cleanup/image"),
375
+ json={"session_id": session_id},
376
+ )
377
+ response.raise_for_status()
378
+ return response.json()
379
+ except httpx.HTTPStatusError as exc:
380
+ logger.error("Image session cleanup error: %s", exc)
381
+ raise self._wrap_http_error(exc)
382
+ except httpx.HTTPError as exc:
383
+ logger.error("Image session cleanup error: %s", exc)
384
+ raise RuntimeError(str(exc)) from exc
385
+
386
+ async def cleanup_audio_session(self, session_id: str) -> Dict[str, Any]:
387
+ """Clean up an audio session."""
388
+ try:
389
+ response = await self.async_client.post(
390
+ urljoin(self.server_url, "/cleanup/audio"),
391
+ json={"session_id": session_id},
392
+ )
393
+ response.raise_for_status()
394
+ return response.json()
395
+ except httpx.HTTPStatusError as exc:
396
+ logger.error("Audio session cleanup error: %s", exc)
397
+ raise self._wrap_http_error(exc)
398
+ except httpx.HTTPError as exc:
399
+ logger.error("Audio session cleanup error: %s", exc)
400
+ raise RuntimeError(str(exc)) from exc
401
+
309
402
  async def close(self) -> None:
310
403
  """Close both HTTP clients."""
311
404
  await self.async_client.aclose()
@@ -4,51 +4,45 @@ from enum import Enum
4
4
  class EventType(Enum):
5
5
  """
6
6
  Defines the types of events that can be emitted by EventEmitters within the system.
7
- Uses prefixes like AGENT_PHASE_, AGENT_DATA_, AGENT_REQUEST_, AGENT_ERROR_ for clarity.
7
+ Uses prefixes like AGENT_STATUS_, AGENT_DATA_, AGENT_REQUEST_, AGENT_ERROR_ for clarity.
8
8
  """
9
9
  # --- Non-Agent specific events ---
10
10
  WEIBO_POST_COMPLETED = "weibo_post_completed" # Example, keep as is
11
11
  TOOL_EXECUTION_COMPLETED = "tool_execution_completed" # Added for generic tool events
12
- TIMER_UPDATE = "timer_update" # Added for Timer tool
13
12
  SHARED_BROWSER_SESSION_CREATED = "shared_browser_session_created" # Added for session-aware tools
14
13
  CREATE_SHARED_SESSION = "create_shared_session" # Added for session-aware tools
15
14
 
16
- # --- Agent Phase Transitions ---
17
- AGENT_PHASE_UNINITIALIZED_ENTERED = "agent_phase_uninitialized_entered"
18
- AGENT_PHASE_BOOTSTRAPPING_STARTED = "agent_phase_bootstrapping_started"
19
- AGENT_PHASE_IDLE_ENTERED = "agent_phase_idle_entered"
20
- AGENT_PHASE_PROCESSING_USER_INPUT_STARTED = "agent_phase_processing_user_input_started"
21
- AGENT_PHASE_AWAITING_LLM_RESPONSE_STARTED = "agent_phase_awaiting_llm_response_started"
22
- AGENT_PHASE_ANALYZING_LLM_RESPONSE_STARTED = "agent_phase_analyzing_llm_response_started"
23
- AGENT_PHASE_AWAITING_TOOL_APPROVAL_STARTED = "agent_phase_awaiting_tool_approval_started"
24
- AGENT_PHASE_TOOL_DENIED_STARTED = "agent_phase_tool_denied_started"
25
- AGENT_PHASE_EXECUTING_TOOL_STARTED = "agent_phase_executing_tool_started"
26
- AGENT_PHASE_PROCESSING_TOOL_RESULT_STARTED = "agent_phase_processing_tool_result_started"
27
- AGENT_PHASE_SHUTTING_DOWN_STARTED = "agent_phase_shutting_down_started"
28
- AGENT_PHASE_SHUTDOWN_COMPLETED = "agent_phase_shutdown_completed"
29
- AGENT_PHASE_ERROR_ENTERED = "agent_phase_error_entered"
15
+ # --- Agent Status Updates ---
16
+ AGENT_STATUS_UPDATED = "agent_status_updated"
30
17
 
31
18
  # --- Agent Data Outputs ---
32
19
  AGENT_DATA_ASSISTANT_CHUNK = "agent_data_assistant_chunk"
33
- AGENT_DATA_ASSISTANT_CHUNK_STREAM_END = "agent_data_assistant_chunk_stream_end"
34
20
  AGENT_DATA_ASSISTANT_COMPLETE_RESPONSE = "agent_data_assistant_complete_response"
21
+ AGENT_DATA_SEGMENT_EVENT = "agent_data_segment_event" # Streaming parser segment events
35
22
  AGENT_DATA_TOOL_LOG = "agent_data_tool_log"
36
23
  AGENT_DATA_TOOL_LOG_STREAM_END = "agent_data_tool_log_stream_end"
37
24
  AGENT_DATA_SYSTEM_TASK_NOTIFICATION_RECEIVED = "agent_data_system_task_notification_received" # NEW
25
+ AGENT_DATA_INTER_AGENT_MESSAGE_RECEIVED = "agent_data_inter_agent_message_received" # NEW: surface inter-agent messages
26
+ AGENT_DATA_TODO_LIST_UPDATED = "agent_data_todo_list_updated"
27
+ AGENT_ARTIFACT_PERSISTED = "agent_artifact_persisted" # NEW: artifact persistence confirmation
28
+ AGENT_ARTIFACT_UPDATED = "agent_artifact_updated" # NEW: artifact content updated (e.g., patch_file)
38
29
 
39
30
  # --- Agent Requests for External Interaction ---
40
31
  AGENT_REQUEST_TOOL_INVOCATION_APPROVAL = "agent_request_tool_invocation_approval"
41
32
  AGENT_TOOL_INVOCATION_AUTO_EXECUTING = "agent_tool_invocation_auto_executing"
42
33
 
43
- # --- Agent Errors (not necessarily phase changes, e.g., error during output generation) ---
34
+ # --- Agent Errors (not necessarily status changes, e.g., error during output generation) ---
44
35
  AGENT_ERROR_OUTPUT_GENERATION = "agent_error_output_generation"
45
36
 
46
37
  # --- Agent Team Events ---
47
38
  TEAM_STREAM_EVENT = "team_stream_event" # For unified agent team event stream
48
39
 
49
- # --- Task Board Events ---
50
- TASK_BOARD_TASKS_ADDED = "task_board.tasks.added"
51
- TASK_BOARD_STATUS_UPDATED = "task_board.status.updated"
40
+ # --- Workflow Events ---
41
+ WORKFLOW_STREAM_EVENT = "workflow_stream_event" # For unified workflow event stream
42
+
43
+ # --- Task Plan Events ---
44
+ TASK_PLAN_TASKS_CREATED = "task_plan.tasks.created"
45
+ TASK_PLAN_STATUS_UPDATED = "task_plan.status.updated"
52
46
 
53
47
  def __str__(self):
54
48
  return self.value