autobyteus 1.2.1__py3-none-any.whl → 1.3.0__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 (472) hide show
  1. autobyteus/agent/agent.py +15 -5
  2. autobyteus/agent/bootstrap_steps/__init__.py +3 -3
  3. autobyteus/agent/bootstrap_steps/agent_bootstrapper.py +5 -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/working_context_snapshot_restore_step.py +38 -0
  8. autobyteus/agent/bootstrap_steps/workspace_context_initialization_step.py +2 -4
  9. autobyteus/agent/context/agent_config.py +47 -20
  10. autobyteus/agent/context/agent_context.py +23 -18
  11. autobyteus/agent/context/agent_runtime_state.py +21 -19
  12. autobyteus/agent/events/__init__.py +16 -1
  13. autobyteus/agent/events/agent_events.py +43 -3
  14. autobyteus/agent/events/agent_input_event_queue_manager.py +79 -26
  15. autobyteus/agent/events/event_store.py +57 -0
  16. autobyteus/agent/events/notifiers.py +69 -59
  17. autobyteus/agent/events/worker_event_dispatcher.py +21 -64
  18. autobyteus/agent/factory/agent_factory.py +83 -6
  19. autobyteus/agent/handlers/__init__.py +2 -0
  20. autobyteus/agent/handlers/approved_tool_invocation_event_handler.py +51 -34
  21. autobyteus/agent/handlers/bootstrap_event_handler.py +155 -0
  22. autobyteus/agent/handlers/inter_agent_message_event_handler.py +10 -0
  23. autobyteus/agent/handlers/lifecycle_event_logger.py +19 -11
  24. autobyteus/agent/handlers/llm_complete_response_received_event_handler.py +10 -15
  25. autobyteus/agent/handlers/llm_user_message_ready_event_handler.py +188 -48
  26. autobyteus/agent/handlers/tool_execution_approval_event_handler.py +0 -10
  27. autobyteus/agent/handlers/tool_invocation_request_event_handler.py +53 -48
  28. autobyteus/agent/handlers/tool_result_event_handler.py +7 -8
  29. autobyteus/agent/handlers/user_input_message_event_handler.py +10 -3
  30. autobyteus/agent/input_processor/memory_ingest_input_processor.py +44 -0
  31. autobyteus/agent/lifecycle/__init__.py +12 -0
  32. autobyteus/agent/lifecycle/base_processor.py +109 -0
  33. autobyteus/agent/lifecycle/events.py +35 -0
  34. autobyteus/agent/lifecycle/processor_definition.py +36 -0
  35. autobyteus/agent/lifecycle/processor_registry.py +106 -0
  36. autobyteus/agent/llm_request_assembler.py +98 -0
  37. autobyteus/agent/llm_response_processor/__init__.py +1 -8
  38. autobyteus/agent/message/context_file_type.py +1 -1
  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 -183
  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 +82 -0
  114. autobyteus/agent/streaming/stream_event_payloads.py +2 -223
  115. autobyteus/agent/streaming/stream_events.py +3 -140
  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 +1 -2
  145. autobyteus/agent_team/bootstrap_steps/team_context_initialization_step.py +4 -4
  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 +9 -6
  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 +6 -6
  167. autobyteus/agent_team/streaming/agent_team_stream_event_payloads.py +4 -4
  168. autobyteus/agent_team/streaming/agent_team_stream_events.py +3 -3
  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/task_notification_mode.py +19 -0
  172. autobyteus/agent_team/utils/wait_for_idle.py +4 -4
  173. autobyteus/cli/agent_cli.py +18 -10
  174. autobyteus/cli/agent_team_tui/app.py +14 -11
  175. autobyteus/cli/agent_team_tui/state.py +13 -15
  176. autobyteus/cli/agent_team_tui/widgets/agent_list_sidebar.py +15 -15
  177. autobyteus/cli/agent_team_tui/widgets/focus_pane.py +143 -36
  178. autobyteus/cli/agent_team_tui/widgets/renderables.py +1 -1
  179. autobyteus/cli/agent_team_tui/widgets/shared.py +25 -25
  180. autobyteus/cli/cli_display.py +193 -44
  181. autobyteus/cli/workflow_tui/app.py +9 -10
  182. autobyteus/cli/workflow_tui/state.py +14 -16
  183. autobyteus/cli/workflow_tui/widgets/agent_list_sidebar.py +15 -15
  184. autobyteus/cli/workflow_tui/widgets/focus_pane.py +137 -35
  185. autobyteus/cli/workflow_tui/widgets/renderables.py +1 -1
  186. autobyteus/cli/workflow_tui/widgets/shared.py +25 -25
  187. autobyteus/clients/autobyteus_client.py +94 -1
  188. autobyteus/events/event_types.py +11 -18
  189. autobyteus/llm/api/autobyteus_llm.py +33 -29
  190. autobyteus/llm/api/claude_llm.py +142 -36
  191. autobyteus/llm/api/gemini_llm.py +163 -59
  192. autobyteus/llm/api/grok_llm.py +1 -1
  193. autobyteus/llm/api/minimax_llm.py +26 -0
  194. autobyteus/llm/api/mistral_llm.py +113 -87
  195. autobyteus/llm/api/ollama_llm.py +9 -42
  196. autobyteus/llm/api/openai_compatible_llm.py +127 -91
  197. autobyteus/llm/api/openai_llm.py +3 -3
  198. autobyteus/llm/api/openai_responses_llm.py +324 -0
  199. autobyteus/llm/api/zhipu_llm.py +21 -2
  200. autobyteus/llm/autobyteus_provider.py +70 -60
  201. autobyteus/llm/base_llm.py +85 -81
  202. autobyteus/llm/converters/__init__.py +14 -0
  203. autobyteus/llm/converters/anthropic_tool_call_converter.py +37 -0
  204. autobyteus/llm/converters/gemini_tool_call_converter.py +57 -0
  205. autobyteus/llm/converters/mistral_tool_call_converter.py +37 -0
  206. autobyteus/llm/converters/openai_tool_call_converter.py +38 -0
  207. autobyteus/llm/extensions/base_extension.py +6 -12
  208. autobyteus/llm/extensions/token_usage_tracking_extension.py +45 -18
  209. autobyteus/llm/llm_factory.py +282 -204
  210. autobyteus/llm/lmstudio_provider.py +60 -49
  211. autobyteus/llm/models.py +35 -2
  212. autobyteus/llm/ollama_provider.py +60 -49
  213. autobyteus/llm/ollama_provider_resolver.py +0 -1
  214. autobyteus/llm/prompt_renderers/__init__.py +19 -0
  215. autobyteus/llm/prompt_renderers/anthropic_prompt_renderer.py +104 -0
  216. autobyteus/llm/prompt_renderers/autobyteus_prompt_renderer.py +19 -0
  217. autobyteus/llm/prompt_renderers/base_prompt_renderer.py +10 -0
  218. autobyteus/llm/prompt_renderers/gemini_prompt_renderer.py +63 -0
  219. autobyteus/llm/prompt_renderers/mistral_prompt_renderer.py +87 -0
  220. autobyteus/llm/prompt_renderers/ollama_prompt_renderer.py +51 -0
  221. autobyteus/llm/prompt_renderers/openai_chat_renderer.py +97 -0
  222. autobyteus/llm/prompt_renderers/openai_responses_renderer.py +101 -0
  223. autobyteus/llm/providers.py +1 -3
  224. autobyteus/llm/token_counter/claude_token_counter.py +56 -25
  225. autobyteus/llm/token_counter/mistral_token_counter.py +12 -8
  226. autobyteus/llm/token_counter/openai_token_counter.py +24 -5
  227. autobyteus/llm/token_counter/token_counter_factory.py +12 -5
  228. autobyteus/llm/utils/llm_config.py +6 -12
  229. autobyteus/llm/utils/media_payload_formatter.py +27 -20
  230. autobyteus/llm/utils/messages.py +55 -3
  231. autobyteus/llm/utils/response_types.py +3 -0
  232. autobyteus/llm/utils/tool_call_delta.py +31 -0
  233. autobyteus/memory/__init__.py +35 -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 +205 -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/path_resolver.py +27 -0
  247. autobyteus/memory/policies/__init__.py +5 -0
  248. autobyteus/memory/policies/compaction_policy.py +16 -0
  249. autobyteus/memory/restore/__init__.py +1 -0
  250. autobyteus/memory/restore/working_context_snapshot_bootstrapper.py +61 -0
  251. autobyteus/memory/retrieval/__init__.py +7 -0
  252. autobyteus/memory/retrieval/memory_bundle.py +11 -0
  253. autobyteus/memory/retrieval/retriever.py +13 -0
  254. autobyteus/memory/store/__init__.py +9 -0
  255. autobyteus/memory/store/base_store.py +14 -0
  256. autobyteus/memory/store/file_store.py +98 -0
  257. autobyteus/memory/store/working_context_snapshot_store.py +28 -0
  258. autobyteus/memory/tool_interaction_builder.py +46 -0
  259. autobyteus/memory/turn_tracker.py +9 -0
  260. autobyteus/memory/working_context_snapshot.py +69 -0
  261. autobyteus/memory/working_context_snapshot_serializer.py +135 -0
  262. autobyteus/multimedia/audio/api/autobyteus_audio_client.py +19 -5
  263. autobyteus/multimedia/audio/api/gemini_audio_client.py +109 -16
  264. autobyteus/multimedia/audio/audio_client_factory.py +47 -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 +39 -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/tools/todo_tools/add_todo.py +2 -2
  277. autobyteus/task_management/tools/todo_tools/create_todo_list.py +2 -2
  278. autobyteus/task_management/tools/todo_tools/update_todo_status.py +2 -2
  279. autobyteus/tools/__init__.py +34 -47
  280. autobyteus/tools/base_tool.py +7 -0
  281. autobyteus/tools/file/__init__.py +2 -6
  282. autobyteus/tools/file/patch_file.py +149 -0
  283. autobyteus/tools/file/read_file.py +36 -5
  284. autobyteus/tools/file/write_file.py +4 -1
  285. autobyteus/tools/functional_tool.py +43 -6
  286. autobyteus/tools/mcp/__init__.py +2 -0
  287. autobyteus/tools/mcp/config_service.py +5 -1
  288. autobyteus/tools/mcp/server/__init__.py +2 -0
  289. autobyteus/tools/mcp/server/http_managed_mcp_server.py +1 -1
  290. autobyteus/tools/mcp/server/websocket_managed_mcp_server.py +141 -0
  291. autobyteus/tools/mcp/server_instance_manager.py +8 -1
  292. autobyteus/tools/mcp/types.py +61 -0
  293. autobyteus/tools/multimedia/audio_tools.py +70 -17
  294. autobyteus/tools/multimedia/download_media_tool.py +18 -4
  295. autobyteus/tools/multimedia/image_tools.py +246 -62
  296. autobyteus/tools/operation_executor/journal_manager.py +107 -0
  297. autobyteus/tools/operation_executor/operation_event_buffer.py +57 -0
  298. autobyteus/tools/operation_executor/operation_event_producer.py +29 -0
  299. autobyteus/tools/operation_executor/operation_executor.py +58 -0
  300. autobyteus/tools/registry/tool_definition.py +43 -2
  301. autobyteus/tools/skill/load_skill.py +50 -0
  302. autobyteus/tools/terminal/__init__.py +45 -0
  303. autobyteus/tools/terminal/ansi_utils.py +32 -0
  304. autobyteus/tools/terminal/background_process_manager.py +233 -0
  305. autobyteus/tools/terminal/output_buffer.py +105 -0
  306. autobyteus/tools/terminal/prompt_detector.py +63 -0
  307. autobyteus/tools/terminal/pty_session.py +241 -0
  308. autobyteus/tools/terminal/session_factory.py +20 -0
  309. autobyteus/tools/terminal/terminal_session_manager.py +226 -0
  310. autobyteus/tools/terminal/tools/__init__.py +13 -0
  311. autobyteus/tools/terminal/tools/get_process_output.py +81 -0
  312. autobyteus/tools/terminal/tools/run_bash.py +109 -0
  313. autobyteus/tools/terminal/tools/start_background_process.py +104 -0
  314. autobyteus/tools/terminal/tools/stop_background_process.py +67 -0
  315. autobyteus/tools/terminal/types.py +54 -0
  316. autobyteus/tools/terminal/wsl_tmux_session.py +221 -0
  317. autobyteus/tools/terminal/wsl_utils.py +156 -0
  318. autobyteus/tools/transaction_management/backup_handler.py +48 -0
  319. autobyteus/tools/transaction_management/operation_lifecycle_manager.py +62 -0
  320. autobyteus/tools/usage/__init__.py +1 -2
  321. autobyteus/tools/usage/formatters/__init__.py +17 -1
  322. autobyteus/tools/usage/formatters/base_formatter.py +8 -0
  323. autobyteus/tools/usage/formatters/default_xml_schema_formatter.py +2 -2
  324. autobyteus/tools/usage/formatters/mistral_json_schema_formatter.py +18 -0
  325. autobyteus/tools/usage/formatters/patch_file_xml_example_formatter.py +64 -0
  326. autobyteus/tools/usage/formatters/patch_file_xml_schema_formatter.py +31 -0
  327. autobyteus/tools/usage/formatters/run_bash_xml_example_formatter.py +32 -0
  328. autobyteus/tools/usage/formatters/run_bash_xml_schema_formatter.py +36 -0
  329. autobyteus/tools/usage/formatters/write_file_xml_example_formatter.py +53 -0
  330. autobyteus/tools/usage/formatters/write_file_xml_schema_formatter.py +31 -0
  331. autobyteus/tools/usage/providers/tool_manifest_provider.py +10 -10
  332. autobyteus/tools/usage/registries/__init__.py +1 -3
  333. autobyteus/tools/usage/registries/tool_formatting_registry.py +115 -8
  334. autobyteus/tools/usage/tool_schema_provider.py +51 -0
  335. autobyteus/tools/web/__init__.py +4 -0
  336. autobyteus/tools/web/read_url_tool.py +80 -0
  337. autobyteus/utils/diff_utils.py +271 -0
  338. autobyteus/utils/download_utils.py +109 -0
  339. autobyteus/utils/file_utils.py +57 -2
  340. autobyteus/utils/gemini_helper.py +64 -0
  341. autobyteus/utils/gemini_model_mapping.py +71 -0
  342. autobyteus/utils/llm_output_formatter.py +75 -0
  343. autobyteus/utils/tool_call_format.py +36 -0
  344. autobyteus/workflow/agentic_workflow.py +3 -3
  345. autobyteus/workflow/bootstrap_steps/agent_tool_injection_step.py +2 -2
  346. autobyteus/workflow/bootstrap_steps/base_workflow_bootstrap_step.py +2 -2
  347. autobyteus/workflow/bootstrap_steps/coordinator_initialization_step.py +2 -2
  348. autobyteus/workflow/bootstrap_steps/coordinator_prompt_preparation_step.py +3 -9
  349. autobyteus/workflow/bootstrap_steps/workflow_bootstrapper.py +6 -6
  350. autobyteus/workflow/bootstrap_steps/workflow_runtime_queue_initialization_step.py +2 -2
  351. autobyteus/workflow/context/workflow_context.py +3 -3
  352. autobyteus/workflow/context/workflow_runtime_state.py +5 -5
  353. autobyteus/workflow/events/workflow_event_dispatcher.py +5 -5
  354. autobyteus/workflow/handlers/lifecycle_workflow_event_handler.py +3 -3
  355. autobyteus/workflow/handlers/process_user_message_event_handler.py +5 -5
  356. autobyteus/workflow/handlers/tool_approval_workflow_event_handler.py +2 -2
  357. autobyteus/workflow/runtime/workflow_runtime.py +8 -8
  358. autobyteus/workflow/runtime/workflow_worker.py +3 -3
  359. autobyteus/workflow/status/__init__.py +11 -0
  360. autobyteus/workflow/status/workflow_status.py +19 -0
  361. autobyteus/workflow/status/workflow_status_manager.py +48 -0
  362. autobyteus/workflow/streaming/__init__.py +2 -2
  363. autobyteus/workflow/streaming/workflow_event_notifier.py +7 -7
  364. autobyteus/workflow/streaming/workflow_stream_event_payloads.py +4 -4
  365. autobyteus/workflow/streaming/workflow_stream_events.py +3 -3
  366. autobyteus/workflow/utils/wait_for_idle.py +4 -4
  367. autobyteus-1.3.0.dist-info/METADATA +293 -0
  368. autobyteus-1.3.0.dist-info/RECORD +606 -0
  369. {autobyteus-1.2.1.dist-info → autobyteus-1.3.0.dist-info}/WHEEL +1 -1
  370. {autobyteus-1.2.1.dist-info → autobyteus-1.3.0.dist-info}/top_level.txt +0 -1
  371. autobyteus/agent/bootstrap_steps/agent_runtime_queue_initialization_step.py +0 -57
  372. autobyteus/agent/hooks/__init__.py +0 -16
  373. autobyteus/agent/hooks/base_phase_hook.py +0 -78
  374. autobyteus/agent/hooks/hook_definition.py +0 -36
  375. autobyteus/agent/hooks/hook_meta.py +0 -37
  376. autobyteus/agent/hooks/hook_registry.py +0 -106
  377. autobyteus/agent/llm_response_processor/provider_aware_tool_usage_processor.py +0 -103
  378. autobyteus/agent/phases/__init__.py +0 -18
  379. autobyteus/agent/phases/discover.py +0 -53
  380. autobyteus/agent/phases/manager.py +0 -265
  381. autobyteus/agent/phases/transition_decorator.py +0 -40
  382. autobyteus/agent/phases/transition_info.py +0 -33
  383. autobyteus/agent/remote_agent.py +0 -244
  384. autobyteus/agent/workspace/workspace_definition.py +0 -36
  385. autobyteus/agent/workspace/workspace_meta.py +0 -37
  386. autobyteus/agent/workspace/workspace_registry.py +0 -72
  387. autobyteus/agent_team/bootstrap_steps/agent_team_runtime_queue_initialization_step.py +0 -25
  388. autobyteus/agent_team/bootstrap_steps/coordinator_prompt_preparation_step.py +0 -85
  389. autobyteus/agent_team/phases/__init__.py +0 -11
  390. autobyteus/agent_team/phases/agent_team_operational_phase.py +0 -19
  391. autobyteus/agent_team/phases/agent_team_phase_manager.py +0 -48
  392. autobyteus/llm/api/bedrock_llm.py +0 -92
  393. autobyteus/llm/api/groq_llm.py +0 -94
  394. autobyteus/llm/api/nvidia_llm.py +0 -108
  395. autobyteus/llm/utils/token_pricing_config.py +0 -87
  396. autobyteus/rpc/__init__.py +0 -73
  397. autobyteus/rpc/client/__init__.py +0 -17
  398. autobyteus/rpc/client/abstract_client_connection.py +0 -124
  399. autobyteus/rpc/client/client_connection_manager.py +0 -153
  400. autobyteus/rpc/client/sse_client_connection.py +0 -306
  401. autobyteus/rpc/client/stdio_client_connection.py +0 -280
  402. autobyteus/rpc/config/__init__.py +0 -13
  403. autobyteus/rpc/config/agent_server_config.py +0 -153
  404. autobyteus/rpc/config/agent_server_registry.py +0 -152
  405. autobyteus/rpc/hosting.py +0 -244
  406. autobyteus/rpc/protocol.py +0 -244
  407. autobyteus/rpc/server/__init__.py +0 -20
  408. autobyteus/rpc/server/agent_server_endpoint.py +0 -181
  409. autobyteus/rpc/server/base_method_handler.py +0 -40
  410. autobyteus/rpc/server/method_handlers.py +0 -259
  411. autobyteus/rpc/server/sse_server_handler.py +0 -182
  412. autobyteus/rpc/server/stdio_server_handler.py +0 -151
  413. autobyteus/rpc/server_main.py +0 -198
  414. autobyteus/rpc/transport_type.py +0 -13
  415. autobyteus/tools/bash/__init__.py +0 -2
  416. autobyteus/tools/bash/bash_executor.py +0 -100
  417. autobyteus/tools/browser/__init__.py +0 -2
  418. autobyteus/tools/browser/session_aware/browser_session_aware_navigate_to.py +0 -75
  419. autobyteus/tools/browser/session_aware/browser_session_aware_tool.py +0 -30
  420. autobyteus/tools/browser/session_aware/browser_session_aware_web_element_trigger.py +0 -154
  421. autobyteus/tools/browser/session_aware/browser_session_aware_webpage_reader.py +0 -89
  422. autobyteus/tools/browser/session_aware/browser_session_aware_webpage_screenshot_taker.py +0 -107
  423. autobyteus/tools/browser/session_aware/factory/browser_session_aware_web_element_trigger_factory.py +0 -14
  424. autobyteus/tools/browser/session_aware/factory/browser_session_aware_webpage_reader_factory.py +0 -26
  425. autobyteus/tools/browser/session_aware/factory/browser_session_aware_webpage_screenshot_taker_factory.py +0 -14
  426. autobyteus/tools/browser/session_aware/shared_browser_session.py +0 -11
  427. autobyteus/tools/browser/session_aware/shared_browser_session_manager.py +0 -25
  428. autobyteus/tools/browser/session_aware/web_element_action.py +0 -20
  429. autobyteus/tools/browser/standalone/__init__.py +0 -6
  430. autobyteus/tools/browser/standalone/factory/__init__.py +0 -0
  431. autobyteus/tools/browser/standalone/factory/webpage_reader_factory.py +0 -25
  432. autobyteus/tools/browser/standalone/factory/webpage_screenshot_taker_factory.py +0 -14
  433. autobyteus/tools/browser/standalone/navigate_to.py +0 -84
  434. autobyteus/tools/browser/standalone/web_page_pdf_generator.py +0 -101
  435. autobyteus/tools/browser/standalone/webpage_image_downloader.py +0 -169
  436. autobyteus/tools/browser/standalone/webpage_reader.py +0 -105
  437. autobyteus/tools/browser/standalone/webpage_screenshot_taker.py +0 -105
  438. autobyteus/tools/file/edit_file.py +0 -200
  439. autobyteus/tools/file/list_directory.py +0 -168
  440. autobyteus/tools/file/search_files.py +0 -188
  441. autobyteus/tools/timer.py +0 -175
  442. autobyteus/tools/usage/parsers/__init__.py +0 -22
  443. autobyteus/tools/usage/parsers/_json_extractor.py +0 -99
  444. autobyteus/tools/usage/parsers/_string_decoders.py +0 -18
  445. autobyteus/tools/usage/parsers/anthropic_xml_tool_usage_parser.py +0 -10
  446. autobyteus/tools/usage/parsers/base_parser.py +0 -41
  447. autobyteus/tools/usage/parsers/default_json_tool_usage_parser.py +0 -83
  448. autobyteus/tools/usage/parsers/default_xml_tool_usage_parser.py +0 -316
  449. autobyteus/tools/usage/parsers/exceptions.py +0 -13
  450. autobyteus/tools/usage/parsers/gemini_json_tool_usage_parser.py +0 -77
  451. autobyteus/tools/usage/parsers/openai_json_tool_usage_parser.py +0 -149
  452. autobyteus/tools/usage/parsers/provider_aware_tool_usage_parser.py +0 -59
  453. autobyteus/tools/usage/registries/tool_usage_parser_registry.py +0 -62
  454. autobyteus/workflow/phases/__init__.py +0 -11
  455. autobyteus/workflow/phases/workflow_operational_phase.py +0 -19
  456. autobyteus/workflow/phases/workflow_phase_manager.py +0 -48
  457. autobyteus-1.2.1.dist-info/METADATA +0 -205
  458. autobyteus-1.2.1.dist-info/RECORD +0 -511
  459. examples/__init__.py +0 -1
  460. examples/agent_team/__init__.py +0 -1
  461. examples/discover_phase_transitions.py +0 -104
  462. examples/run_agentic_software_engineer.py +0 -239
  463. examples/run_browser_agent.py +0 -262
  464. examples/run_google_slides_agent.py +0 -287
  465. examples/run_mcp_browser_client.py +0 -174
  466. examples/run_mcp_google_slides_client.py +0 -270
  467. examples/run_mcp_list_tools.py +0 -189
  468. examples/run_poem_writer.py +0 -284
  469. examples/run_sqlite_agent.py +0 -295
  470. /autobyteus/{tools/browser/session_aware → skills}/__init__.py +0 -0
  471. /autobyteus/tools/{browser/session_aware/factory → skill}/__init__.py +0 -0
  472. {autobyteus-1.2.1.dist-info → autobyteus-1.3.0.dist-info}/licenses/LICENSE +0 -0
@@ -12,18 +12,19 @@ from textual.message import Message
12
12
  from textual.widgets import Input, Static, Button
13
13
  from textual.containers import VerticalScroll, Horizontal
14
14
 
15
- from autobyteus.agent.phases import AgentOperationalPhase
16
- from autobyteus.agent_team.phases import AgentTeamOperationalPhase
15
+ from autobyteus.agent.status.status_enum import AgentStatus
16
+ from autobyteus.agent_team.status.agent_team_status import AgentTeamStatus
17
17
  from autobyteus.task_management.base_task_plan import TaskStatus
18
18
  from autobyteus.task_management.task import Task
19
19
  from autobyteus.agent.streaming.stream_events import StreamEvent as AgentStreamEvent, StreamEventType as AgentStreamEventType
20
20
  from autobyteus.agent.streaming.stream_event_payloads import (
21
- AgentOperationalPhaseTransitionData, AssistantChunkData, AssistantCompleteResponseData,
21
+ AgentStatusUpdateData, AssistantChunkData, AssistantCompleteResponseData,
22
22
  ErrorEventData, ToolInteractionLogEntryData, ToolInvocationApprovalRequestedData, ToolInvocationAutoExecutingData,
23
- SystemTaskNotificationData
23
+ SystemTaskNotificationData, SegmentEventData
24
24
  )
25
+ from autobyteus.agent.streaming.parser.events import SegmentEventType, SegmentType
25
26
  from .shared import (
26
- AGENT_PHASE_ICONS, TEAM_PHASE_ICONS, SUB_TEAM_ICON, DEFAULT_ICON,
27
+ AGENT_STATUS_ICONS, TEAM_STATUS_ICONS, SUB_TEAM_ICON, DEFAULT_ICON,
27
28
  USER_ICON, ASSISTANT_ICON, TEAM_ICON, AGENT_ICON, SYSTEM_TASK_ICON
28
29
  )
29
30
  from . import renderables
@@ -65,6 +66,8 @@ class FocusPane(Static):
65
66
  # Buffers for batched UI updates to improve performance
66
67
  self._reasoning_buffer: str = ""
67
68
  self._content_buffer: str = ""
69
+ self._segment_types_by_id: Dict[str, SegmentType] = {}
70
+ self._saw_segment_event: bool = False
68
71
 
69
72
  def compose(self):
70
73
  yield Static("Select a node from the sidebar", id="focus-pane-title")
@@ -89,7 +92,15 @@ class FocusPane(Static):
89
92
  return
90
93
 
91
94
  is_approved = event.button.id == "approve-btn"
92
- reason = "User approved via TUI." if is_approved else "User denied via TUI."
95
+
96
+ info_input = self.query_one(Input)
97
+ user_reason = info_input.value.strip()
98
+ info_input.value = "" # Clear the input
99
+
100
+ if user_reason:
101
+ reason = user_reason
102
+ else:
103
+ reason = "User approved via TUI." if is_approved else "User denied via TUI."
93
104
 
94
105
  log_container = self.query_one("#focus-pane-log-container")
95
106
  approval_text = "APPROVED" if is_approved else "DENIED"
@@ -121,8 +132,8 @@ class FocusPane(Static):
121
132
  async def _show_approval_prompt(self):
122
133
  if not self._pending_approval_data: return
123
134
  input_widget = self.query_one(Input)
124
- input_widget.placeholder = "Please approve or deny the tool call..."
125
- input_widget.disabled = True
135
+ input_widget.placeholder = "Optional: Enter a reason for your decision..."
136
+ input_widget.disabled = False
126
137
  button_container = self.query_one("#approval-buttons")
127
138
  await button_container.remove_children()
128
139
  await button_container.mount(
@@ -130,7 +141,7 @@ class FocusPane(Static):
130
141
  Button("Deny", variant="error", id="deny-btn")
131
142
  )
132
143
 
133
- def _update_title(self, agent_phases: Dict[str, AgentOperationalPhase], team_phases: Dict[str, AgentTeamOperationalPhase]):
144
+ def _update_title(self, agent_statuses: Dict[str, AgentStatus], team_statuses: Dict[str, AgentTeamStatus]):
134
145
  """Renders the title of the focus pane with the node's current status."""
135
146
  if not self._focused_node_data:
136
147
  self.query_one("#focus-pane-title").update("Select a node from the sidebar")
@@ -141,31 +152,31 @@ class FocusPane(Static):
141
152
  node_type_str = node_type.replace("_", " ").capitalize()
142
153
 
143
154
  title_icon = DEFAULT_ICON
144
- phase_str = ""
155
+ status_str = ""
145
156
 
146
157
  if node_type == 'agent':
147
158
  title_icon = AGENT_ICON
148
- phase = agent_phases.get(node_name, AgentOperationalPhase.UNINITIALIZED)
149
- phase_str = f" (Status: {phase.value})"
159
+ status = agent_statuses.get(node_name, AgentStatus.UNINITIALIZED)
160
+ status_str = f" (Status: {status.value})"
150
161
  elif node_type == 'subteam':
151
162
  title_icon = SUB_TEAM_ICON
152
- phase = team_phases.get(node_name, AgentTeamOperationalPhase.UNINITIALIZED)
153
- phase_str = f" (Status: {phase.value})"
163
+ status = team_statuses.get(node_name, AgentTeamStatus.UNINITIALIZED)
164
+ status_str = f" (Status: {status.value})"
154
165
  elif node_type == 'team':
155
166
  title_icon = TEAM_ICON
156
- phase = team_phases.get(node_name, AgentTeamOperationalPhase.UNINITIALIZED)
157
- phase_str = f" (Status: {phase.value})"
167
+ status = team_statuses.get(node_name, AgentTeamStatus.UNINITIALIZED)
168
+ status_str = f" (Status: {status.value})"
158
169
 
159
- self.query_one("#focus-pane-title").update(f"{title_icon} {node_type_str}: [bold]{node_name}[/bold]{phase_str}")
170
+ self.query_one("#focus-pane-title").update(f"{title_icon} {node_type_str}: [bold]{node_name}[/bold]{status_str}")
160
171
 
161
- def update_current_node_status(self, all_agent_phases: Dict, all_team_phases: Dict):
172
+ def update_current_node_status(self, all_agent_statuses: Dict, all_team_statuses: Dict):
162
173
  """A lightweight method to only update the title with the latest status."""
163
- self._update_title(all_agent_phases, all_team_phases)
174
+ self._update_title(all_agent_statuses, all_team_statuses)
164
175
 
165
176
  async def update_content(self, node_data: Dict[str, Any], history: List[Any],
166
177
  pending_approval: Optional[ToolInvocationApprovalRequestedData],
167
- all_agent_phases: Dict[str, AgentOperationalPhase],
168
- all_team_phases: Dict[str, AgentTeamOperationalPhase],
178
+ all_agent_statuses: Dict[str, AgentStatus],
179
+ all_team_statuses: Dict[str, AgentTeamStatus],
169
180
  task_plan: Optional[List[Task]],
170
181
  task_statuses: Optional[Dict[str, TaskStatus]]):
171
182
  """The main method to update the entire pane based on new state."""
@@ -174,7 +185,7 @@ class FocusPane(Static):
174
185
  self._focused_node_data = node_data
175
186
  self._pending_approval_data = pending_approval
176
187
 
177
- self._update_title(all_agent_phases, all_team_phases)
188
+ self._update_title(all_agent_statuses, all_team_statuses)
178
189
 
179
190
  log_container = self.query_one("#focus-pane-log-container")
180
191
  await log_container.remove_children()
@@ -192,23 +203,23 @@ class FocusPane(Static):
192
203
  if self._pending_approval_data:
193
204
  await self._show_approval_prompt()
194
205
  elif self._focused_node_data.get("type") in ['team', 'subteam']:
195
- await self._render_team_dashboard(node_data, all_agent_phases, all_team_phases, task_plan, task_statuses)
206
+ await self._render_team_dashboard(node_data, all_agent_statuses, all_team_statuses, task_plan, task_statuses)
196
207
 
197
- async def _render_team_dashboard(self, node_data: Dict[str, Any],
198
- all_agent_phases: Dict[str, AgentOperationalPhase],
199
- all_team_phases: Dict[str, AgentTeamOperationalPhase],
208
+ async def _render_team_dashboard(self, node_data: Dict[str, Any],
209
+ all_agent_statuses: Dict[str, AgentStatus],
210
+ all_team_statuses: Dict[str, AgentTeamStatus],
200
211
  task_plan: Optional[List[Task]],
201
212
  task_statuses: Optional[Dict[str, TaskStatus]]):
202
213
  """Renders a static summary dashboard for a team or sub-team."""
203
214
  log_container = self.query_one("#focus-pane-log-container")
204
215
 
205
- phase = all_team_phases.get(node_data['name'], AgentTeamOperationalPhase.UNINITIALIZED)
206
- phase_icon = TEAM_PHASE_ICONS.get(phase, DEFAULT_ICON)
216
+ status = all_team_statuses.get(node_data['name'], AgentTeamStatus.UNINITIALIZED)
217
+ status_icon = TEAM_STATUS_ICONS.get(status, DEFAULT_ICON)
207
218
  info_text = Text()
208
219
  info_text.append(f"Name: {node_data['name']}\n", style="bold")
209
220
  if node_data.get('role'):
210
221
  info_text.append(f"Role: {node_data['role']}\n")
211
- info_text.append(f"Status: {phase_icon} {phase.value}")
222
+ info_text.append(f"Status: {status_icon} {status.value}")
212
223
  await log_container.mount(Static(Panel(info_text, title="Team Info", border_style="green", title_align="left")))
213
224
 
214
225
  await log_container.mount(TaskPlanPanel(tasks=task_plan, statuses=task_statuses, team_name=node_data['name']))
@@ -218,13 +229,13 @@ class FocusPane(Static):
218
229
  team_text = Text()
219
230
  for name, child_node in children_data.items():
220
231
  if child_node['type'] == 'agent':
221
- agent_phase = all_agent_phases.get(name, AgentOperationalPhase.UNINITIALIZED)
222
- agent_icon = AGENT_PHASE_ICONS.get(agent_phase, DEFAULT_ICON)
223
- team_text.append(f" ▪ {agent_icon} {name} (Agent): {agent_phase.value}\n")
232
+ agent_status = all_agent_statuses.get(name, AgentStatus.UNINITIALIZED)
233
+ agent_icon = AGENT_STATUS_ICONS.get(agent_status, DEFAULT_ICON)
234
+ team_text.append(f" ▪ {agent_icon} {name} (Agent): {agent_status.value}\n")
224
235
  elif child_node['type'] == 'subteam':
225
- wf_phase = all_team_phases.get(name, AgentTeamOperationalPhase.UNINITIALIZED)
226
- wf_icon = TEAM_PHASE_ICONS.get(wf_phase, SUB_TEAM_ICON)
227
- team_text.append(f" ▪ {wf_icon} {name} (Sub-Team): {wf_phase.value}\n")
236
+ wf_status = all_team_statuses.get(name, AgentTeamStatus.UNINITIALIZED)
237
+ wf_icon = TEAM_STATUS_ICONS.get(wf_status, SUB_TEAM_ICON)
238
+ team_text.append(f" ▪ {wf_icon} {name} (Sub-Team): {wf_status.value}\n")
228
239
  await log_container.mount(Static(Panel(team_text, title="Team Status", border_style="blue", title_align="left")))
229
240
 
230
241
  async def _close_thinking_block(self, scroll: bool = True):
@@ -252,10 +263,105 @@ class FocusPane(Static):
252
263
  if scrolled:
253
264
  self.query_one("#focus-pane-log-container").scroll_end(animate=False)
254
265
 
266
+ async def _ensure_thinking_widget(self, log_container: VerticalScroll) -> None:
267
+ if self._thinking_widget is None:
268
+ self.flush_stream_buffers()
269
+ await log_container.mount(Static(""))
270
+ self._thinking_text = Text("<Thinking>\n", style="dim italic cyan")
271
+ self._thinking_widget = Static(self._thinking_text)
272
+ await log_container.mount(self._thinking_widget)
273
+
274
+ async def _ensure_assistant_content_widget(self, log_container: VerticalScroll) -> None:
275
+ if self._assistant_content_widget is None:
276
+ await log_container.mount(Static(""))
277
+ self._assistant_content_text = Text(f"{ASSISTANT_ICON} assistant: ", style="bold green")
278
+ self._assistant_content_widget = Static(self._assistant_content_text)
279
+ await log_container.mount(self._assistant_content_widget)
280
+
281
+ async def _handle_segment_event(self, data: SegmentEventData) -> None:
282
+ log_container = self.query_one("#focus-pane-log-container")
283
+ self._saw_segment_event = True
284
+ try:
285
+ event_type = SegmentEventType(data.event_type)
286
+ except ValueError:
287
+ logger.debug(f"TUI FocusPane: Unknown segment event type '{data.event_type}'.")
288
+ return
289
+
290
+ segment_type = None
291
+ if data.segment_type:
292
+ try:
293
+ segment_type = SegmentType(data.segment_type)
294
+ except ValueError:
295
+ logger.debug(f"TUI FocusPane: Unknown segment type '{data.segment_type}'.")
296
+
297
+ if segment_type is None and data.segment_id in self._segment_types_by_id:
298
+ segment_type = self._segment_types_by_id.get(data.segment_id)
299
+
300
+ metadata = {}
301
+ if isinstance(data.payload, dict):
302
+ metadata = data.payload.get("metadata", {}) or {}
303
+
304
+ if event_type == SegmentEventType.START:
305
+ if segment_type is not None:
306
+ self._segment_types_by_id[data.segment_id] = segment_type
307
+
308
+ if segment_type != SegmentType.REASONING:
309
+ await self._close_thinking_block(scroll=False)
310
+
311
+ if segment_type == SegmentType.REASONING:
312
+ await self._ensure_thinking_widget(log_container)
313
+ return
314
+
315
+ await self._ensure_assistant_content_widget(log_container)
316
+
317
+ if segment_type == SegmentType.WRITE_FILE:
318
+ path = metadata.get("path", "")
319
+ header = f"<write_file path=\"{path}\">" if path else "<write_file>"
320
+ self._content_buffer += f"{header}\n"
321
+ elif segment_type == SegmentType.RUN_BASH:
322
+ self._content_buffer += "<run_bash>\n"
323
+ elif segment_type == SegmentType.TOOL_CALL:
324
+ tool_name = metadata.get("tool_name", "")
325
+ header = f"<tool name=\"{tool_name}\">" if tool_name else "<tool>"
326
+ self._content_buffer += f"{header}\n"
327
+ return
328
+
329
+ if event_type == SegmentEventType.CONTENT:
330
+ delta = ""
331
+ if isinstance(data.payload, dict):
332
+ delta = data.payload.get("delta", "")
333
+
334
+ if segment_type == SegmentType.REASONING:
335
+ await self._ensure_thinking_widget(log_container)
336
+ self._reasoning_buffer += str(delta)
337
+ else:
338
+ await self._ensure_assistant_content_widget(log_container)
339
+ self._content_buffer += str(delta)
340
+ return
341
+
342
+ if event_type == SegmentEventType.END:
343
+ if segment_type == SegmentType.REASONING:
344
+ await self._close_thinking_block()
345
+ self._segment_types_by_id.pop(data.segment_id, None)
346
+ return
347
+
348
+ if segment_type in {SegmentType.WRITE_FILE, SegmentType.RUN_BASH, SegmentType.TOOL_CALL}:
349
+ tag = "write_file" if segment_type == SegmentType.WRITE_FILE else (
350
+ "run_bash" if segment_type == SegmentType.RUN_BASH else "tool"
351
+ )
352
+ self._content_buffer += f"\n</{tag}>\n"
353
+
354
+ self._segment_types_by_id.pop(data.segment_id, None)
355
+ return
356
+
255
357
  async def add_agent_event(self, event: AgentStreamEvent):
256
358
  log_container = self.query_one("#focus-pane-log-container")
257
359
  event_type = event.event_type
258
360
 
361
+ if event_type == AgentStreamEventType.SEGMENT_EVENT and isinstance(event.data, SegmentEventData):
362
+ await self._handle_segment_event(event.data)
363
+ return
364
+
259
365
  if event_type == AgentStreamEventType.ASSISTANT_CHUNK:
260
366
  data: AssistantChunkData = event.data
261
367
  if data.reasoning:
@@ -282,12 +388,13 @@ class FocusPane(Static):
282
388
  await self._close_thinking_block()
283
389
  self._assistant_content_widget = None
284
390
  self._assistant_content_text = None
285
- if not was_streaming_content:
391
+ if not self._saw_segment_event and not was_streaming_content:
286
392
  renderables_list = renderables.render_assistant_complete_response(event.data)
287
393
  if renderables_list:
288
394
  await log_container.mount(Static(""))
289
395
  for item in renderables_list: await log_container.mount(Static(item))
290
396
  log_container.scroll_end(animate=False)
397
+ self._saw_segment_event = False
291
398
  return
292
399
 
293
400
  is_stream_breaking_event = event_type in [
@@ -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,
15
15
  ToolInvocationAutoExecutingData, SystemTaskNotificationData
16
16
  )
@@ -2,34 +2,34 @@
2
2
  Shared constants and data for TUI widgets.
3
3
  """
4
4
  from typing import Dict
5
- from autobyteus.agent.phases import AgentOperationalPhase
6
- from autobyteus.agent_team.phases import AgentTeamOperationalPhase
5
+ from autobyteus.agent.status.status_enum import AgentStatus
6
+ from autobyteus.agent_team.status.agent_team_status import AgentTeamStatus
7
7
  from autobyteus.task_management.base_task_plan import TaskStatus
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
- TEAM_PHASE_ICONS: Dict[AgentTeamOperationalPhase, str] = {
26
- AgentTeamOperationalPhase.UNINITIALIZED: "⚪",
27
- AgentTeamOperationalPhase.BOOTSTRAPPING: "⏳",
28
- AgentTeamOperationalPhase.IDLE: "🟢",
29
- AgentTeamOperationalPhase.PROCESSING: "⚙️",
30
- AgentTeamOperationalPhase.SHUTTING_DOWN: "🌙",
31
- AgentTeamOperationalPhase.SHUTDOWN_COMPLETE: "⚫",
32
- AgentTeamOperationalPhase.ERROR: "❗",
25
+ TEAM_STATUS_ICONS: Dict[AgentTeamStatus, str] = {
26
+ AgentTeamStatus.UNINITIALIZED: "⚪",
27
+ AgentTeamStatus.BOOTSTRAPPING: "⏳",
28
+ AgentTeamStatus.IDLE: "🟢",
29
+ AgentTeamStatus.PROCESSING: "⚙️",
30
+ AgentTeamStatus.SHUTTING_DOWN: "🌙",
31
+ AgentTeamStatus.SHUTDOWN_COMPLETE: "⚫",
32
+ AgentTeamStatus.ERROR: "❗",
33
33
  }
34
34
 
35
35
  TASK_STATUS_ICONS: Dict[TaskStatus, str] = {
@@ -55,6 +55,6 @@ ASSISTANT_ICON = "🤖"
55
55
  TOOL_ICON = "🛠️"
56
56
  PROMPT_ICON = "❓"
57
57
  ERROR_ICON = "💥"
58
- PHASE_ICON = "🔄"
58
+ STATUS_ICON = "🔄"
59
59
  LOG_ICON = "📄"
60
60
  SYSTEM_TASK_ICON = "📥" # NEW