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
@@ -6,16 +6,20 @@ import threading
6
6
  import concurrent.futures
7
7
  from typing import TYPE_CHECKING, Optional, Any, Callable, Awaitable, List
8
8
 
9
- from autobyteus.agent.phases import AgentOperationalPhase
9
+ from autobyteus.agent.status.status_enum import AgentStatus
10
10
  from autobyteus.agent.events import (
11
11
  BaseEvent,
12
12
  AgentErrorEvent,
13
13
  AgentStoppedEvent,
14
+ AgentInputEventQueueManager,
15
+ BootstrapStartedEvent,
16
+ AgentEventStore,
14
17
  )
15
18
  from autobyteus.agent.events import WorkerEventDispatcher
16
19
  from autobyteus.agent.runtime.agent_thread_pool_manager import AgentThreadPoolManager
17
- from autobyteus.agent.bootstrap_steps.agent_bootstrapper import AgentBootstrapper
18
20
  from autobyteus.agent.shutdown_steps import AgentShutdownOrchestrator
21
+ from autobyteus.agent.status.status_deriver import AgentStatusDeriver
22
+ from autobyteus.agent.status.status_update_utils import apply_event_and_derive_status
19
23
 
20
24
  if TYPE_CHECKING:
21
25
  from autobyteus.agent.context import AgentContext
@@ -35,13 +39,12 @@ class AgentWorker:
35
39
  event_handler_registry: 'EventHandlerRegistry'):
36
40
  self.context: 'AgentContext' = context
37
41
 
38
- self.phase_manager = self.context.phase_manager
39
- if not self.phase_manager: # pragma: no cover
40
- raise ValueError(f"AgentWorker for '{self.context.agent_id}': AgentPhaseManager not found.")
42
+ self.status_manager = self.context.status_manager
43
+ if not self.status_manager: # pragma: no cover
44
+ raise ValueError(f"AgentWorker for '{self.context.agent_id}': AgentStatusManager not found.")
41
45
 
42
46
  self.worker_event_dispatcher = WorkerEventDispatcher(
43
- event_handler_registry=event_handler_registry,
44
- phase_manager=self.phase_manager
47
+ event_handler_registry=event_handler_registry
45
48
  )
46
49
 
47
50
  self._thread_pool_manager = AgentThreadPoolManager()
@@ -58,16 +61,70 @@ class AgentWorker:
58
61
 
59
62
  async def _initialize(self) -> bool:
60
63
  """
61
- Runs the agent's initialization sequence by using an AgentBootstrapper.
64
+ Runs the agent's initialization sequence via bootstrap events.
62
65
  Returns True on success, False on failure.
63
66
  """
64
67
  agent_id = self.context.agent_id
65
- logger.info(f"Agent '{agent_id}': Starting internal initialization process using AgentBootstrapper.")
68
+ logger.info(f"Agent '{agent_id}': Starting internal initialization process using bootstrap events.")
66
69
 
67
- bootstrapper = AgentBootstrapper() # Using default steps
68
- initialization_successful = await bootstrapper.run(self.context, self.phase_manager)
70
+ await self.context.input_event_queues.enqueue_internal_system_event(BootstrapStartedEvent())
69
71
 
70
- return initialization_successful
72
+ while self.context.current_status not in [AgentStatus.IDLE, AgentStatus.ERROR]:
73
+ if self._async_stop_event and self._async_stop_event.is_set():
74
+ break
75
+ try:
76
+ queue_event_tuple = await asyncio.wait_for(
77
+ self.context.state.input_event_queues.get_next_internal_event(), timeout=0.1
78
+ )
79
+ except asyncio.TimeoutError:
80
+ continue
81
+
82
+ if queue_event_tuple is None:
83
+ continue
84
+
85
+ _queue_name, event_obj = queue_event_tuple
86
+ await self.worker_event_dispatcher.dispatch(event_obj, self.context)
87
+ await asyncio.sleep(0)
88
+
89
+ return self.context.current_status == AgentStatus.IDLE
90
+
91
+ async def _runtime_init(self) -> bool:
92
+ """
93
+ Initializes the minimal runtime prerequisites required for event handling.
94
+ This must run before any event-driven bootstrap steps.
95
+ """
96
+ agent_id = self.context.agent_id
97
+ if self.context.state.event_store is None:
98
+ self.context.state.event_store = AgentEventStore(agent_id=agent_id)
99
+ logger.info(f"Agent '{agent_id}': Runtime init completed (event store initialized).")
100
+
101
+ if self.context.state.status_deriver is None:
102
+ self.context.state.status_deriver = AgentStatusDeriver()
103
+ logger.info(f"Agent '{agent_id}': Runtime init completed (status deriver initialized).")
104
+
105
+ if self.context.state.input_event_queues is not None:
106
+ logger.debug(f"Agent '{agent_id}': Runtime init skipped; input event queues already initialized.")
107
+ return True
108
+
109
+ try:
110
+ queue_size = getattr(self.context.config, "input_event_queue_size", 0)
111
+ if queue_size is None:
112
+ queue_size = 0
113
+ if queue_size < 0:
114
+ logger.warning(
115
+ f"Agent '{agent_id}': input_event_queue_size must be >= 0. "
116
+ f"Got {queue_size}. Falling back to unbounded queues."
117
+ )
118
+ queue_size = 0
119
+
120
+ self.context.state.input_event_queues = AgentInputEventQueueManager(queue_size=queue_size)
121
+ logger.info(
122
+ f"Agent '{agent_id}': Runtime init completed (input queues initialized, size={queue_size})."
123
+ )
124
+ return True
125
+ except Exception as e:
126
+ logger.critical(f"Agent '{agent_id}': Runtime init failed while initializing input queues: {e}", exc_info=True)
127
+ return False
71
128
 
72
129
  def add_done_callback(self, callback: Callable[[concurrent.futures.Future], None]):
73
130
  """Adds a callback to be executed when the worker's thread completes."""
@@ -113,12 +170,16 @@ class AgentWorker:
113
170
  self._worker_loop.run_until_complete(self.async_run())
114
171
  except Exception as e:
115
172
  logger.error(f"AgentWorker '{agent_id}': Unhandled exception in _run_managed_thread_loop: {e}", exc_info=True)
116
- if self.phase_manager and not self.context.current_phase.is_terminal():
173
+ if not self.context.current_status.is_terminal():
117
174
  try:
118
- # Since this is a sync context, we must run the async phase manager method in a temporary event loop.
119
- asyncio.run(self.phase_manager.notify_error_occurred(f"Worker thread fatal error: {e}", traceback.format_exc()))
175
+ self._apply_event_and_derive_status_sync(
176
+ AgentErrorEvent(
177
+ error_message=f"Worker thread fatal error: {e}",
178
+ exception_details=traceback.format_exc()
179
+ )
180
+ )
120
181
  except Exception as run_e:
121
- logger.critical(f"AgentWorker '{agent_id}': Failed to run async error notification from sync context: {run_e}")
182
+ logger.critical(f"AgentWorker '{agent_id}': Failed to emit derived error from sync context: {run_e}")
122
183
  finally:
123
184
  if self._worker_loop:
124
185
  try:
@@ -145,6 +206,13 @@ class AgentWorker:
145
206
  logger.info(f"AgentWorker '{agent_id}' async_run(): Starting.")
146
207
 
147
208
  # --- Direct Initialization ---
209
+ runtime_init_successful = await self._runtime_init()
210
+ if not runtime_init_successful:
211
+ logger.critical(f"AgentWorker '{agent_id}' failed during runtime init. Worker is shutting down.")
212
+ if self._async_stop_event and not self._async_stop_event.is_set():
213
+ self._async_stop_event.set()
214
+ return
215
+
148
216
  initialization_successful = await self._initialize()
149
217
  if not initialization_successful:
150
218
  logger.critical(f"AgentWorker '{agent_id}' failed to initialize. Worker is shutting down.")
@@ -156,9 +224,14 @@ class AgentWorker:
156
224
  logger.info(f"AgentWorker '{agent_id}' initialized successfully. Entering main event loop.")
157
225
  while not self._async_stop_event.is_set():
158
226
  try:
159
- queue_event_tuple = await asyncio.wait_for(
160
- self.context.state.input_event_queues.get_next_input_event(), timeout=0.1
161
- )
227
+ if self.context.current_status == AgentStatus.BOOTSTRAPPING:
228
+ queue_event_tuple = await asyncio.wait_for(
229
+ self.context.state.input_event_queues.get_next_internal_event(), timeout=0.1
230
+ )
231
+ else:
232
+ queue_event_tuple = await asyncio.wait_for(
233
+ self.context.state.input_event_queues.get_next_input_event(), timeout=0.1
234
+ )
162
235
  except asyncio.TimeoutError:
163
236
  if self._async_stop_event.is_set(): break
164
237
  continue
@@ -229,6 +302,12 @@ class AgentWorker:
229
302
 
230
303
  self._is_active = False
231
304
 
305
+ def _apply_event_and_derive_status_sync(self, event: BaseEvent) -> None:
306
+ try:
307
+ asyncio.run(apply_event_and_derive_status(event, self.context))
308
+ except Exception as e: # pragma: no cover
309
+ logger.error(f"AgentWorker '{self.context.agent_id}': Failed to project status: {e}", exc_info=True)
310
+
232
311
 
233
312
  def is_alive(self) -> bool:
234
313
  return self._thread_future is not None and not self._thread_future.done()
@@ -7,11 +7,13 @@ These steps are orchestrated by the AgentShutdownOrchestrator.
7
7
  from .base_shutdown_step import BaseShutdownStep
8
8
  from .llm_instance_cleanup_step import LLMInstanceCleanupStep
9
9
  from .mcp_server_cleanup_step import McpServerCleanupStep
10
+ from .tool_cleanup_step import ToolCleanupStep
10
11
  from .agent_shutdown_orchestrator import AgentShutdownOrchestrator
11
12
 
12
13
  __all__ = [
13
14
  "BaseShutdownStep",
14
15
  "LLMInstanceCleanupStep",
15
16
  "McpServerCleanupStep",
17
+ "ToolCleanupStep",
16
18
  "AgentShutdownOrchestrator",
17
19
  ]
@@ -5,6 +5,7 @@ from typing import TYPE_CHECKING, List, Optional
5
5
  from .base_shutdown_step import BaseShutdownStep
6
6
  from .llm_instance_cleanup_step import LLMInstanceCleanupStep
7
7
  from .mcp_server_cleanup_step import McpServerCleanupStep
8
+ from .tool_cleanup_step import ToolCleanupStep
8
9
 
9
10
  if TYPE_CHECKING:
10
11
  from autobyteus.agent.context import AgentContext
@@ -27,6 +28,7 @@ class AgentShutdownOrchestrator:
27
28
  if steps is None:
28
29
  self.shutdown_steps: List[BaseShutdownStep] = [
29
30
  LLMInstanceCleanupStep(),
31
+ ToolCleanupStep(),
30
32
  McpServerCleanupStep(),
31
33
  ]
32
34
  logger.debug("AgentShutdownOrchestrator initialized with default steps.")
@@ -0,0 +1,58 @@
1
+ import asyncio
2
+ import logging
3
+ from typing import TYPE_CHECKING
4
+
5
+ from .base_shutdown_step import BaseShutdownStep
6
+
7
+ if TYPE_CHECKING:
8
+ from autobyteus.agent.context import AgentContext
9
+ from autobyteus.tools.base_tool import BaseTool
10
+
11
+ logger = logging.getLogger(__name__)
12
+
13
+
14
+ class ToolCleanupStep(BaseShutdownStep):
15
+ """
16
+ Shutdown step responsible for cleaning up all tool instances retained in the agent context.
17
+ """
18
+
19
+ def __init__(self):
20
+ logger.debug("ToolCleanupStep initialized.")
21
+
22
+ async def execute(self, context: 'AgentContext') -> bool:
23
+ agent_id = context.agent_id
24
+ logger.info(f"Agent '{agent_id}': Executing ToolCleanupStep.")
25
+
26
+ tool_instances = context.tool_instances
27
+ if not tool_instances:
28
+ logger.debug(f"Agent '{agent_id}': No tool instances found. Skipping ToolCleanupStep.")
29
+ return True
30
+
31
+ all_cleanups_succeeded = True
32
+
33
+ for tool_name, tool_instance in tool_instances.items():
34
+ try:
35
+ cleanup_func = getattr(tool_instance, "cleanup", None)
36
+ if cleanup_func is None:
37
+ logger.debug(f"Agent '{agent_id}': Tool '{tool_name}' has no cleanup hook. Skipping.")
38
+ continue
39
+
40
+ logger.info(f"Agent '{agent_id}': Cleaning up tool '{tool_name}'.")
41
+ if asyncio.iscoroutinefunction(cleanup_func):
42
+ await cleanup_func()
43
+ else:
44
+ cleanup_func()
45
+ logger.debug(f"Agent '{agent_id}': Tool '{tool_name}' cleanup completed.")
46
+ except Exception as exc: # pragma: no cover - defensive logging
47
+ all_cleanups_succeeded = False
48
+ logger.error(
49
+ f"Agent '{agent_id}': Error during cleanup of tool '{tool_name}': {exc}",
50
+ exc_info=True,
51
+ )
52
+
53
+ if all_cleanups_succeeded:
54
+ logger.info(f"Agent '{agent_id}': ToolCleanupStep completed successfully.")
55
+ else:
56
+ logger.warning(f"Agent '{agent_id}': ToolCleanupStep completed with errors; see logs above.")
57
+
58
+ return all_cleanups_succeeded
@@ -0,0 +1,14 @@
1
+ # file: autobyteus/autobyteus/agent/status/__init__.py
2
+ """
3
+ This package contains components for defining and describing agent operational statuses
4
+ and their updates.
5
+ """
6
+ from .status_enum import AgentStatus
7
+ from .manager import AgentStatusManager
8
+ from .status_deriver import AgentStatusDeriver
9
+
10
+ __all__ = [
11
+ "AgentStatus",
12
+ "AgentStatusManager",
13
+ "AgentStatusDeriver",
14
+ ]
@@ -0,0 +1,93 @@
1
+
2
+ # file: autobyteus/autobyteus/agent/status/manager.py
3
+ import logging
4
+ from typing import TYPE_CHECKING, Optional, Dict, Any, List
5
+
6
+ from autobyteus.agent.status.status_enum import AgentStatus
7
+
8
+ if TYPE_CHECKING:
9
+ from autobyteus.agent.context import AgentContext
10
+ from autobyteus.agent.events.notifiers import AgentExternalEventNotifier
11
+
12
+
13
+ logger = logging.getLogger(__name__)
14
+
15
+ class AgentStatusManager:
16
+ """
17
+ Handles lifecycle processor execution and external status notifications.
18
+ Status is derived from events; this manager does not own the source of truth.
19
+ """
20
+ def __init__(self, context: 'AgentContext', notifier: Optional['AgentExternalEventNotifier'] = None):
21
+ self.context: 'AgentContext' = context
22
+ if notifier is None:
23
+ raise ValueError("AgentStatusManager requires a notifier.")
24
+ self.notifier = notifier
25
+ if not isinstance(self.context.current_status, AgentStatus):
26
+ self.context.current_status = AgentStatus.UNINITIALIZED
27
+
28
+ logger.debug(
29
+ f"AgentStatusManager initialized for agent_id '{self.context.agent_id}'. "
30
+ f"Initial status: {self.context.current_status.value}. Notifier provided: {bool(notifier)}"
31
+ )
32
+
33
+ async def _execute_lifecycle_processors(self, old_status: AgentStatus, new_status: AgentStatus, event_data: Optional[Dict[str, Any]] = None):
34
+ """
35
+ Execute lifecycle processors for the given status update.
36
+ Maps internal status changes to simple LifecycleEvent values.
37
+ """
38
+ from autobyteus.agent.lifecycle import LifecycleEvent
39
+
40
+ # Map status changes to lifecycle events
41
+ lifecycle_event = None
42
+ if old_status == AgentStatus.BOOTSTRAPPING and new_status == AgentStatus.IDLE:
43
+ lifecycle_event = LifecycleEvent.AGENT_READY
44
+ elif new_status == AgentStatus.AWAITING_LLM_RESPONSE:
45
+ lifecycle_event = LifecycleEvent.BEFORE_LLM_CALL
46
+ elif old_status == AgentStatus.AWAITING_LLM_RESPONSE and new_status == AgentStatus.ANALYZING_LLM_RESPONSE:
47
+ lifecycle_event = LifecycleEvent.AFTER_LLM_RESPONSE
48
+ elif new_status == AgentStatus.EXECUTING_TOOL:
49
+ lifecycle_event = LifecycleEvent.BEFORE_TOOL_EXECUTE
50
+ elif old_status == AgentStatus.EXECUTING_TOOL:
51
+ lifecycle_event = LifecycleEvent.AFTER_TOOL_EXECUTE
52
+ elif new_status == AgentStatus.SHUTTING_DOWN:
53
+ lifecycle_event = LifecycleEvent.AGENT_SHUTTING_DOWN
54
+
55
+ if lifecycle_event is None:
56
+ return
57
+
58
+ # Find and execute matching processors
59
+ processors_to_run = [
60
+ p for p in self.context.config.lifecycle_processors
61
+ if p.event == lifecycle_event
62
+ ]
63
+
64
+ if not processors_to_run:
65
+ return
66
+
67
+ # Sort by order
68
+ sorted_processors = sorted(processors_to_run, key=lambda p: p.get_order())
69
+ processor_names = [p.get_name() for p in sorted_processors]
70
+ logger.info(f"Agent '{self.context.agent_id}': Executing {len(sorted_processors)} lifecycle processors for '{lifecycle_event.value}': {processor_names}")
71
+
72
+ for processor in sorted_processors:
73
+ try:
74
+ await processor.process(self.context, event_data or {})
75
+ logger.debug(f"Agent '{self.context.agent_id}': Lifecycle processor '{processor.get_name()}' executed successfully.")
76
+ except Exception as e:
77
+ logger.error(f"Agent '{self.context.agent_id}': Error executing lifecycle processor "
78
+ f"'{processor.get_name()}' for '{lifecycle_event.value}': {e}",
79
+ exc_info=True)
80
+
81
+ async def emit_status_update(self,
82
+ old_status: AgentStatus,
83
+ new_status: AgentStatus,
84
+ additional_data: Optional[Dict[str, Any]] = None) -> None:
85
+ """
86
+ Emits notifier events and lifecycle processors for a status update
87
+ derived from the event stream.
88
+ """
89
+ if old_status == new_status:
90
+ return
91
+
92
+ await self._execute_lifecycle_processors(old_status, new_status, additional_data)
93
+ self.notifier.notify_status_updated(new_status, old_status, additional_data)
@@ -0,0 +1,96 @@
1
+ # file: autobyteus/autobyteus/agent/status/status_deriver.py
2
+ import logging
3
+ from typing import Optional, Tuple, TYPE_CHECKING
4
+
5
+ from autobyteus.agent.status.status_enum import AgentStatus
6
+ from autobyteus.agent.events.agent_events import (
7
+ AgentReadyEvent,
8
+ AgentStoppedEvent,
9
+ AgentErrorEvent,
10
+ AgentIdleEvent,
11
+ ShutdownRequestedEvent,
12
+ BootstrapStartedEvent,
13
+ BootstrapCompletedEvent,
14
+ UserMessageReceivedEvent,
15
+ InterAgentMessageReceivedEvent,
16
+ LLMUserMessageReadyEvent,
17
+ LLMCompleteResponseReceivedEvent,
18
+ PendingToolInvocationEvent,
19
+ ToolExecutionApprovalEvent,
20
+ ApprovedToolInvocationEvent,
21
+ ToolResultEvent,
22
+ )
23
+
24
+ if TYPE_CHECKING:
25
+ from autobyteus.agent.context import AgentContext
26
+ from autobyteus.agent.events.agent_events import BaseEvent
27
+
28
+ logger = logging.getLogger(__name__)
29
+
30
+
31
+ class AgentStatusDeriver:
32
+ """
33
+ Derives agent status from an event stream.
34
+ This is a pure read-model: no side effects beyond status updates.
35
+ """
36
+ def __init__(self, initial_status: AgentStatus = AgentStatus.UNINITIALIZED):
37
+ self._current_status = initial_status
38
+ logger.debug(f"AgentStatusDeriver initialized with status '{initial_status.value}'.")
39
+
40
+ @property
41
+ def current_status(self) -> AgentStatus:
42
+ return self._current_status
43
+
44
+ def apply(self, event: 'BaseEvent', context: Optional['AgentContext'] = None) -> Tuple[AgentStatus, AgentStatus]:
45
+ old_status = self._current_status
46
+ new_status = self._reduce(event, old_status, context)
47
+ self._current_status = new_status
48
+ return old_status, new_status
49
+
50
+ def _reduce(self, event: 'BaseEvent', current_status: AgentStatus, context: Optional['AgentContext']) -> AgentStatus:
51
+ if isinstance(event, BootstrapStartedEvent):
52
+ return AgentStatus.BOOTSTRAPPING
53
+ if isinstance(event, BootstrapCompletedEvent):
54
+ return current_status
55
+ if isinstance(event, AgentReadyEvent):
56
+ return AgentStatus.IDLE
57
+ if isinstance(event, AgentIdleEvent):
58
+ return AgentStatus.IDLE
59
+ if isinstance(event, ShutdownRequestedEvent):
60
+ if current_status == AgentStatus.ERROR:
61
+ return current_status
62
+ return AgentStatus.SHUTTING_DOWN
63
+ if isinstance(event, AgentStoppedEvent):
64
+ if current_status == AgentStatus.ERROR:
65
+ return AgentStatus.ERROR
66
+ return AgentStatus.SHUTDOWN_COMPLETE
67
+ if isinstance(event, AgentErrorEvent):
68
+ return AgentStatus.ERROR
69
+
70
+ if isinstance(event, (UserMessageReceivedEvent, InterAgentMessageReceivedEvent)):
71
+ return AgentStatus.PROCESSING_USER_INPUT
72
+ if isinstance(event, LLMUserMessageReadyEvent):
73
+ if current_status in [AgentStatus.AWAITING_LLM_RESPONSE, AgentStatus.ERROR]:
74
+ return current_status
75
+ return AgentStatus.AWAITING_LLM_RESPONSE
76
+ if isinstance(event, LLMCompleteResponseReceivedEvent):
77
+ if current_status != AgentStatus.AWAITING_LLM_RESPONSE:
78
+ return current_status
79
+ return AgentStatus.ANALYZING_LLM_RESPONSE
80
+
81
+ if isinstance(event, PendingToolInvocationEvent):
82
+ if context and not context.auto_execute_tools:
83
+ return AgentStatus.AWAITING_TOOL_APPROVAL
84
+ return AgentStatus.EXECUTING_TOOL
85
+ if isinstance(event, ApprovedToolInvocationEvent):
86
+ return AgentStatus.EXECUTING_TOOL
87
+ if isinstance(event, ToolExecutionApprovalEvent):
88
+ if event.is_approved:
89
+ return AgentStatus.EXECUTING_TOOL
90
+ return AgentStatus.TOOL_DENIED
91
+ if isinstance(event, ToolResultEvent):
92
+ if current_status != AgentStatus.EXECUTING_TOOL:
93
+ return current_status
94
+ return AgentStatus.PROCESSING_TOOL_RESULT
95
+
96
+ return current_status
@@ -1,10 +1,10 @@
1
- # file: autobyteus/autobyteus/agent/context/phases/phase_enum.py
1
+ # file: autobyteus/autobyteus/agent/status/status_enum.py
2
2
  from enum import Enum
3
3
 
4
- class AgentOperationalPhase(str, Enum):
4
+ class AgentStatus(str, Enum):
5
5
  """
6
- Defines the fine-grained operational phases of an agent.
7
- This is the single source of truth for an agent's current state of operation.
6
+ Defines the possible operational statuses of an agent.
7
+ Renamed from the legacy operational state enum.
8
8
  """
9
9
  UNINITIALIZED = "uninitialized" # Agent object created, but runtime not started or fully set up.
10
10
  BOOTSTRAPPING = "bootstrapping" # Agent is running its internal initialization/bootstrap sequence.
@@ -27,23 +27,23 @@ class AgentOperationalPhase(str, Enum):
27
27
  return self.value
28
28
 
29
29
  def is_initializing(self) -> bool:
30
- """Checks if the agent is in any of the initializing phases."""
30
+ """Checks if the agent is in any of the initializing statuses."""
31
31
  return self in [
32
- AgentOperationalPhase.BOOTSTRAPPING,
32
+ AgentStatus.BOOTSTRAPPING,
33
33
  ]
34
34
 
35
35
  def is_processing(self) -> bool:
36
- """Checks if the agent is in any active processing phase (post-initialization, pre-shutdown)."""
36
+ """Checks if the agent is in any active processing status (post-initialization, pre-shutdown)."""
37
37
  return self in [
38
- AgentOperationalPhase.PROCESSING_USER_INPUT,
39
- AgentOperationalPhase.AWAITING_LLM_RESPONSE,
40
- AgentOperationalPhase.ANALYZING_LLM_RESPONSE,
41
- AgentOperationalPhase.AWAITING_TOOL_APPROVAL,
42
- AgentOperationalPhase.TOOL_DENIED,
43
- AgentOperationalPhase.EXECUTING_TOOL,
44
- AgentOperationalPhase.PROCESSING_TOOL_RESULT,
38
+ AgentStatus.PROCESSING_USER_INPUT,
39
+ AgentStatus.AWAITING_LLM_RESPONSE,
40
+ AgentStatus.ANALYZING_LLM_RESPONSE,
41
+ AgentStatus.AWAITING_TOOL_APPROVAL,
42
+ AgentStatus.TOOL_DENIED,
43
+ AgentStatus.EXECUTING_TOOL,
44
+ AgentStatus.PROCESSING_TOOL_RESULT,
45
45
  ]
46
46
 
47
47
  def is_terminal(self) -> bool:
48
- """Checks if the phase is a terminal state (shutdown or error)."""
49
- return self in [AgentOperationalPhase.SHUTDOWN_COMPLETE, AgentOperationalPhase.ERROR]
48
+ """Checks if the status is a terminal state (shutdown or error)."""
49
+ return self in [AgentStatus.SHUTDOWN_COMPLETE, AgentStatus.ERROR]
@@ -0,0 +1,73 @@
1
+ # file: autobyteus/autobyteus/agent/status/status_update_utils.py
2
+ import logging
3
+ from typing import Optional, Tuple, TYPE_CHECKING
4
+
5
+ from autobyteus.agent.status.status_enum import AgentStatus
6
+ from autobyteus.agent.events.agent_events import (
7
+ AgentErrorEvent,
8
+ PendingToolInvocationEvent,
9
+ ApprovedToolInvocationEvent,
10
+ ToolExecutionApprovalEvent,
11
+ ToolResultEvent,
12
+ )
13
+
14
+ if TYPE_CHECKING:
15
+ from autobyteus.agent.context import AgentContext
16
+ from autobyteus.agent.events.agent_events import BaseEvent
17
+
18
+ logger = logging.getLogger(__name__)
19
+
20
+
21
+ def build_status_update_data(event: 'BaseEvent',
22
+ context: 'AgentContext',
23
+ new_status: AgentStatus) -> Optional[dict]:
24
+ if new_status == AgentStatus.PROCESSING_USER_INPUT:
25
+ return {"trigger": type(event).__name__}
26
+
27
+ if new_status == AgentStatus.EXECUTING_TOOL:
28
+ tool_name = None
29
+ if isinstance(event, PendingToolInvocationEvent):
30
+ tool_name = event.tool_invocation.name
31
+ elif isinstance(event, ApprovedToolInvocationEvent):
32
+ tool_name = event.tool_invocation.name
33
+ elif isinstance(event, ToolExecutionApprovalEvent):
34
+ pending_invocation = context.state.pending_tool_approvals.get(event.tool_invocation_id)
35
+ tool_name = pending_invocation.name if pending_invocation else "unknown_tool"
36
+ if tool_name:
37
+ return {"tool_name": tool_name}
38
+
39
+ if new_status == AgentStatus.PROCESSING_TOOL_RESULT and isinstance(event, ToolResultEvent):
40
+ return {"tool_name": event.tool_name}
41
+
42
+ if new_status == AgentStatus.TOOL_DENIED and isinstance(event, ToolExecutionApprovalEvent):
43
+ pending_invocation = context.state.pending_tool_approvals.get(event.tool_invocation_id)
44
+ tool_name = pending_invocation.name if pending_invocation else "unknown_tool"
45
+ return {"tool_name": tool_name, "denial_for_tool": tool_name}
46
+
47
+ if new_status == AgentStatus.ERROR and isinstance(event, AgentErrorEvent):
48
+ return {"error_message": event.error_message, "error_details": event.exception_details}
49
+
50
+ return None
51
+
52
+
53
+ async def apply_event_and_derive_status(event: 'BaseEvent',
54
+ context: 'AgentContext') -> Tuple[AgentStatus, AgentStatus]:
55
+ if context.state.event_store:
56
+ try:
57
+ context.state.event_store.append(event)
58
+ except Exception as exc: # pragma: no cover
59
+ logger.error(f"Failed to append event to store: {exc}", exc_info=True)
60
+
61
+ if not context.state.status_deriver:
62
+ return context.current_status, context.current_status
63
+
64
+ old_status, new_status = context.state.status_deriver.apply(event, context)
65
+ if old_status != new_status:
66
+ context.current_status = new_status
67
+ additional_data = build_status_update_data(event, context, new_status)
68
+ if context.status_manager:
69
+ await context.status_manager.emit_status_update(
70
+ old_status, new_status, additional_data=additional_data
71
+ )
72
+
73
+ return old_status, new_status
@@ -1,15 +1,62 @@
1
1
  # file: autobyteus/autobyteus/agent/streaming/__init__.py
2
2
  """
3
- Components related to agent output streaming, including event models, stream consumers, and streamer utilities.
3
+ Components related to agent output streaming.
4
+
5
+ Main components:
6
+ - StreamingResponseHandler: High-level handler for LLM response parsing
7
+ - StreamingParser: Low-level character-by-character parser
8
+ - SegmentEvent: Structured events for UI streaming
9
+
10
+ Legacy components (for backward compatibility):
11
+ - StreamEvent, StreamEventType: Old event format
12
+ - AgentEventStream: Old stream consumer
4
13
  """
5
- from .stream_events import StreamEventType, StreamEvent
6
- from .agent_event_stream import AgentEventStream
7
- from .queue_streamer import stream_queue_items
14
+ from .events.stream_events import StreamEventType, StreamEvent
15
+ from .streams.agent_event_stream import AgentEventStream
16
+ from .utils.queue_streamer import stream_queue_items
17
+ from .handlers.streaming_response_handler import StreamingResponseHandler
18
+ from .handlers.streaming_handler_factory import StreamingResponseHandlerFactory
19
+ from .handlers.parsing_streaming_response_handler import ParsingStreamingResponseHandler
20
+ from .handlers.pass_through_streaming_response_handler import PassThroughStreamingResponseHandler
21
+ from .handlers.api_tool_call_streaming_response_handler import ApiToolCallStreamingResponseHandler
22
+
23
+ # Re-export commonly used parser components
24
+ from .parser import (
25
+ StreamingParser,
26
+ SegmentEvent,
27
+ SegmentType,
28
+ SegmentEventType,
29
+ ToolInvocationAdapter,
30
+ ParserConfig,
31
+ parse_complete_response,
32
+ extract_segments,
33
+ StreamingParserProtocol,
34
+ create_streaming_parser,
35
+ resolve_parser_name,
36
+ )
8
37
 
9
38
  __all__ = [
39
+ # New streaming API
40
+ "StreamingResponseHandler",
41
+ "StreamingResponseHandlerFactory",
42
+ "ParsingStreamingResponseHandler",
43
+ "PassThroughStreamingResponseHandler",
44
+ "ApiToolCallStreamingResponseHandler",
45
+ "StreamingParser",
46
+ "SegmentEvent",
47
+ "SegmentType",
48
+ "SegmentEventType",
49
+ "ToolInvocationAdapter",
50
+ "ParserConfig",
51
+ "parse_complete_response",
52
+ "extract_segments",
53
+ "StreamingParserProtocol",
54
+ "create_streaming_parser",
55
+ "resolve_parser_name",
56
+
57
+ # Legacy (backward compatible)
10
58
  "StreamEventType",
11
59
  "StreamEvent",
12
60
  "AgentEventStream",
13
61
  "stream_queue_items",
14
62
  ]
15
-