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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (466) hide show
  1. autobyteus/agent/agent.py +15 -5
  2. autobyteus/agent/bootstrap_steps/__init__.py +1 -3
  3. autobyteus/agent/bootstrap_steps/agent_bootstrapper.py +3 -59
  4. autobyteus/agent/bootstrap_steps/base_bootstrap_step.py +1 -4
  5. autobyteus/agent/bootstrap_steps/mcp_server_prewarming_step.py +1 -3
  6. autobyteus/agent/bootstrap_steps/system_prompt_processing_step.py +16 -13
  7. autobyteus/agent/bootstrap_steps/workspace_context_initialization_step.py +2 -4
  8. autobyteus/agent/context/agent_config.py +43 -20
  9. autobyteus/agent/context/agent_context.py +23 -18
  10. autobyteus/agent/context/agent_runtime_state.py +19 -19
  11. autobyteus/agent/events/__init__.py +16 -1
  12. autobyteus/agent/events/agent_events.py +43 -3
  13. autobyteus/agent/events/agent_input_event_queue_manager.py +79 -26
  14. autobyteus/agent/events/event_store.py +57 -0
  15. autobyteus/agent/events/notifiers.py +69 -59
  16. autobyteus/agent/events/worker_event_dispatcher.py +21 -64
  17. autobyteus/agent/factory/agent_factory.py +52 -0
  18. autobyteus/agent/handlers/__init__.py +2 -0
  19. autobyteus/agent/handlers/approved_tool_invocation_event_handler.py +51 -34
  20. autobyteus/agent/handlers/bootstrap_event_handler.py +155 -0
  21. autobyteus/agent/handlers/inter_agent_message_event_handler.py +10 -0
  22. autobyteus/agent/handlers/lifecycle_event_logger.py +19 -11
  23. autobyteus/agent/handlers/llm_complete_response_received_event_handler.py +10 -15
  24. autobyteus/agent/handlers/llm_user_message_ready_event_handler.py +188 -48
  25. autobyteus/agent/handlers/tool_execution_approval_event_handler.py +0 -10
  26. autobyteus/agent/handlers/tool_invocation_request_event_handler.py +53 -48
  27. autobyteus/agent/handlers/tool_result_event_handler.py +7 -8
  28. autobyteus/agent/handlers/user_input_message_event_handler.py +10 -3
  29. autobyteus/agent/input_processor/memory_ingest_input_processor.py +40 -0
  30. autobyteus/agent/lifecycle/__init__.py +12 -0
  31. autobyteus/agent/lifecycle/base_processor.py +109 -0
  32. autobyteus/agent/lifecycle/events.py +35 -0
  33. autobyteus/agent/lifecycle/processor_definition.py +36 -0
  34. autobyteus/agent/lifecycle/processor_registry.py +106 -0
  35. autobyteus/agent/llm_request_assembler.py +98 -0
  36. autobyteus/agent/llm_response_processor/__init__.py +1 -8
  37. autobyteus/agent/message/context_file_type.py +1 -1
  38. autobyteus/agent/runtime/agent_runtime.py +29 -21
  39. autobyteus/agent/runtime/agent_worker.py +98 -19
  40. autobyteus/agent/shutdown_steps/__init__.py +2 -0
  41. autobyteus/agent/shutdown_steps/agent_shutdown_orchestrator.py +2 -0
  42. autobyteus/agent/shutdown_steps/tool_cleanup_step.py +58 -0
  43. autobyteus/agent/status/__init__.py +14 -0
  44. autobyteus/agent/status/manager.py +93 -0
  45. autobyteus/agent/status/status_deriver.py +96 -0
  46. autobyteus/agent/{phases/phase_enum.py → status/status_enum.py} +16 -16
  47. autobyteus/agent/status/status_update_utils.py +73 -0
  48. autobyteus/agent/streaming/__init__.py +52 -5
  49. autobyteus/agent/streaming/adapters/__init__.py +18 -0
  50. autobyteus/agent/streaming/adapters/invocation_adapter.py +184 -0
  51. autobyteus/agent/streaming/adapters/tool_call_parsing.py +163 -0
  52. autobyteus/agent/streaming/adapters/tool_syntax_registry.py +67 -0
  53. autobyteus/agent/streaming/agent_event_stream.py +3 -183
  54. autobyteus/agent/streaming/api_tool_call/__init__.py +16 -0
  55. autobyteus/agent/streaming/api_tool_call/file_content_streamer.py +56 -0
  56. autobyteus/agent/streaming/api_tool_call/json_string_field_extractor.py +175 -0
  57. autobyteus/agent/streaming/api_tool_call_streaming_response_handler.py +4 -0
  58. autobyteus/agent/streaming/events/__init__.py +6 -0
  59. autobyteus/agent/streaming/events/stream_event_payloads.py +284 -0
  60. autobyteus/agent/streaming/events/stream_events.py +141 -0
  61. autobyteus/agent/streaming/handlers/__init__.py +15 -0
  62. autobyteus/agent/streaming/handlers/api_tool_call_streaming_response_handler.py +303 -0
  63. autobyteus/agent/streaming/handlers/parsing_streaming_response_handler.py +107 -0
  64. autobyteus/agent/streaming/handlers/pass_through_streaming_response_handler.py +107 -0
  65. autobyteus/agent/streaming/handlers/streaming_handler_factory.py +177 -0
  66. autobyteus/agent/streaming/handlers/streaming_response_handler.py +58 -0
  67. autobyteus/agent/streaming/parser/__init__.py +61 -0
  68. autobyteus/agent/streaming/parser/event_emitter.py +181 -0
  69. autobyteus/agent/streaming/parser/events.py +4 -0
  70. autobyteus/agent/streaming/parser/invocation_adapter.py +4 -0
  71. autobyteus/agent/streaming/parser/json_parsing_strategies/__init__.py +19 -0
  72. autobyteus/agent/streaming/parser/json_parsing_strategies/base.py +32 -0
  73. autobyteus/agent/streaming/parser/json_parsing_strategies/default.py +34 -0
  74. autobyteus/agent/streaming/parser/json_parsing_strategies/gemini.py +31 -0
  75. autobyteus/agent/streaming/parser/json_parsing_strategies/openai.py +64 -0
  76. autobyteus/agent/streaming/parser/json_parsing_strategies/registry.py +75 -0
  77. autobyteus/agent/streaming/parser/parser_context.py +227 -0
  78. autobyteus/agent/streaming/parser/parser_factory.py +132 -0
  79. autobyteus/agent/streaming/parser/sentinel_format.py +7 -0
  80. autobyteus/agent/streaming/parser/state_factory.py +62 -0
  81. autobyteus/agent/streaming/parser/states/__init__.py +1 -0
  82. autobyteus/agent/streaming/parser/states/base_state.py +60 -0
  83. autobyteus/agent/streaming/parser/states/custom_xml_tag_run_bash_parsing_state.py +38 -0
  84. autobyteus/agent/streaming/parser/states/custom_xml_tag_write_file_parsing_state.py +55 -0
  85. autobyteus/agent/streaming/parser/states/delimited_content_state.py +146 -0
  86. autobyteus/agent/streaming/parser/states/json_initialization_state.py +144 -0
  87. autobyteus/agent/streaming/parser/states/json_tool_parsing_state.py +137 -0
  88. autobyteus/agent/streaming/parser/states/sentinel_content_state.py +30 -0
  89. autobyteus/agent/streaming/parser/states/sentinel_initialization_state.py +117 -0
  90. autobyteus/agent/streaming/parser/states/text_state.py +78 -0
  91. autobyteus/agent/streaming/parser/states/xml_patch_file_tool_parsing_state.py +328 -0
  92. autobyteus/agent/streaming/parser/states/xml_run_bash_tool_parsing_state.py +129 -0
  93. autobyteus/agent/streaming/parser/states/xml_tag_initialization_state.py +151 -0
  94. autobyteus/agent/streaming/parser/states/xml_tool_parsing_state.py +63 -0
  95. autobyteus/agent/streaming/parser/states/xml_write_file_tool_parsing_state.py +343 -0
  96. autobyteus/agent/streaming/parser/strategies/__init__.py +17 -0
  97. autobyteus/agent/streaming/parser/strategies/base.py +24 -0
  98. autobyteus/agent/streaming/parser/strategies/json_tool_strategy.py +26 -0
  99. autobyteus/agent/streaming/parser/strategies/registry.py +28 -0
  100. autobyteus/agent/streaming/parser/strategies/sentinel_strategy.py +23 -0
  101. autobyteus/agent/streaming/parser/strategies/xml_tag_strategy.py +21 -0
  102. autobyteus/agent/streaming/parser/stream_scanner.py +167 -0
  103. autobyteus/agent/streaming/parser/streaming_parser.py +212 -0
  104. autobyteus/agent/streaming/parser/tool_call_parsing.py +4 -0
  105. autobyteus/agent/streaming/parser/tool_constants.py +7 -0
  106. autobyteus/agent/streaming/parser/tool_syntax_registry.py +4 -0
  107. autobyteus/agent/streaming/parser/xml_tool_parsing_state_registry.py +55 -0
  108. autobyteus/agent/streaming/parsing_streaming_response_handler.py +4 -0
  109. autobyteus/agent/streaming/pass_through_streaming_response_handler.py +4 -0
  110. autobyteus/agent/streaming/queue_streamer.py +3 -57
  111. autobyteus/agent/streaming/segments/__init__.py +5 -0
  112. autobyteus/agent/streaming/segments/segment_events.py +81 -0
  113. autobyteus/agent/streaming/stream_event_payloads.py +2 -223
  114. autobyteus/agent/streaming/stream_events.py +3 -140
  115. autobyteus/agent/streaming/streaming_handler_factory.py +4 -0
  116. autobyteus/agent/streaming/streaming_response_handler.py +4 -0
  117. autobyteus/agent/streaming/streams/__init__.py +5 -0
  118. autobyteus/agent/streaming/streams/agent_event_stream.py +197 -0
  119. autobyteus/agent/streaming/utils/__init__.py +5 -0
  120. autobyteus/agent/streaming/utils/queue_streamer.py +59 -0
  121. autobyteus/agent/system_prompt_processor/__init__.py +2 -0
  122. autobyteus/agent/system_prompt_processor/available_skills_processor.py +96 -0
  123. autobyteus/agent/system_prompt_processor/base_processor.py +1 -1
  124. autobyteus/agent/system_prompt_processor/processor_meta.py +15 -2
  125. autobyteus/agent/system_prompt_processor/tool_manifest_injector_processor.py +39 -58
  126. autobyteus/agent/token_budget.py +56 -0
  127. autobyteus/agent/tool_execution_result_processor/memory_ingest_tool_result_processor.py +29 -0
  128. autobyteus/agent/tool_invocation.py +16 -40
  129. autobyteus/agent/tool_invocation_preprocessor/__init__.py +9 -0
  130. autobyteus/agent/tool_invocation_preprocessor/base_preprocessor.py +45 -0
  131. autobyteus/agent/tool_invocation_preprocessor/processor_definition.py +15 -0
  132. autobyteus/agent/tool_invocation_preprocessor/processor_meta.py +33 -0
  133. autobyteus/agent/tool_invocation_preprocessor/processor_registry.py +60 -0
  134. autobyteus/agent/utils/wait_for_idle.py +12 -14
  135. autobyteus/agent/workspace/base_workspace.py +6 -27
  136. autobyteus/agent_team/agent_team.py +3 -3
  137. autobyteus/agent_team/agent_team_builder.py +1 -41
  138. autobyteus/agent_team/bootstrap_steps/__init__.py +0 -4
  139. autobyteus/agent_team/bootstrap_steps/agent_configuration_preparation_step.py +8 -18
  140. autobyteus/agent_team/bootstrap_steps/agent_team_bootstrapper.py +4 -16
  141. autobyteus/agent_team/bootstrap_steps/base_agent_team_bootstrap_step.py +1 -2
  142. autobyteus/agent_team/bootstrap_steps/coordinator_initialization_step.py +1 -2
  143. autobyteus/agent_team/bootstrap_steps/task_notifier_initialization_step.py +1 -2
  144. autobyteus/agent_team/bootstrap_steps/team_context_initialization_step.py +4 -4
  145. autobyteus/agent_team/context/agent_team_config.py +6 -3
  146. autobyteus/agent_team/context/agent_team_context.py +25 -3
  147. autobyteus/agent_team/context/agent_team_runtime_state.py +9 -6
  148. autobyteus/agent_team/events/__init__.py +11 -0
  149. autobyteus/agent_team/events/agent_team_event_dispatcher.py +22 -9
  150. autobyteus/agent_team/events/agent_team_events.py +16 -0
  151. autobyteus/agent_team/events/event_store.py +57 -0
  152. autobyteus/agent_team/factory/agent_team_factory.py +8 -0
  153. autobyteus/agent_team/handlers/inter_agent_message_request_event_handler.py +18 -2
  154. autobyteus/agent_team/handlers/lifecycle_agent_team_event_handler.py +21 -5
  155. autobyteus/agent_team/handlers/process_user_message_event_handler.py +17 -8
  156. autobyteus/agent_team/handlers/tool_approval_team_event_handler.py +19 -4
  157. autobyteus/agent_team/runtime/agent_team_runtime.py +41 -10
  158. autobyteus/agent_team/runtime/agent_team_worker.py +69 -5
  159. autobyteus/agent_team/status/__init__.py +14 -0
  160. autobyteus/agent_team/status/agent_team_status.py +18 -0
  161. autobyteus/agent_team/status/agent_team_status_manager.py +33 -0
  162. autobyteus/agent_team/status/status_deriver.py +62 -0
  163. autobyteus/agent_team/status/status_update_utils.py +42 -0
  164. autobyteus/agent_team/streaming/__init__.py +2 -2
  165. autobyteus/agent_team/streaming/agent_team_event_notifier.py +6 -6
  166. autobyteus/agent_team/streaming/agent_team_stream_event_payloads.py +4 -4
  167. autobyteus/agent_team/streaming/agent_team_stream_events.py +3 -3
  168. autobyteus/agent_team/system_prompt_processor/__init__.py +6 -0
  169. autobyteus/agent_team/system_prompt_processor/team_manifest_injector_processor.py +76 -0
  170. autobyteus/agent_team/task_notification/task_notification_mode.py +19 -0
  171. autobyteus/agent_team/utils/wait_for_idle.py +4 -4
  172. autobyteus/cli/agent_cli.py +18 -10
  173. autobyteus/cli/agent_team_tui/app.py +14 -11
  174. autobyteus/cli/agent_team_tui/state.py +13 -15
  175. autobyteus/cli/agent_team_tui/widgets/agent_list_sidebar.py +15 -15
  176. autobyteus/cli/agent_team_tui/widgets/focus_pane.py +143 -36
  177. autobyteus/cli/agent_team_tui/widgets/renderables.py +1 -1
  178. autobyteus/cli/agent_team_tui/widgets/shared.py +25 -25
  179. autobyteus/cli/cli_display.py +193 -44
  180. autobyteus/cli/workflow_tui/app.py +9 -10
  181. autobyteus/cli/workflow_tui/state.py +14 -16
  182. autobyteus/cli/workflow_tui/widgets/agent_list_sidebar.py +15 -15
  183. autobyteus/cli/workflow_tui/widgets/focus_pane.py +137 -35
  184. autobyteus/cli/workflow_tui/widgets/renderables.py +1 -1
  185. autobyteus/cli/workflow_tui/widgets/shared.py +25 -25
  186. autobyteus/clients/autobyteus_client.py +94 -1
  187. autobyteus/events/event_types.py +11 -18
  188. autobyteus/llm/api/autobyteus_llm.py +33 -29
  189. autobyteus/llm/api/claude_llm.py +142 -36
  190. autobyteus/llm/api/gemini_llm.py +163 -59
  191. autobyteus/llm/api/grok_llm.py +1 -1
  192. autobyteus/llm/api/minimax_llm.py +26 -0
  193. autobyteus/llm/api/mistral_llm.py +113 -87
  194. autobyteus/llm/api/ollama_llm.py +9 -42
  195. autobyteus/llm/api/openai_compatible_llm.py +127 -91
  196. autobyteus/llm/api/openai_llm.py +3 -3
  197. autobyteus/llm/api/openai_responses_llm.py +324 -0
  198. autobyteus/llm/api/zhipu_llm.py +21 -2
  199. autobyteus/llm/autobyteus_provider.py +70 -60
  200. autobyteus/llm/base_llm.py +85 -81
  201. autobyteus/llm/converters/__init__.py +14 -0
  202. autobyteus/llm/converters/anthropic_tool_call_converter.py +37 -0
  203. autobyteus/llm/converters/gemini_tool_call_converter.py +57 -0
  204. autobyteus/llm/converters/mistral_tool_call_converter.py +37 -0
  205. autobyteus/llm/converters/openai_tool_call_converter.py +38 -0
  206. autobyteus/llm/extensions/base_extension.py +6 -12
  207. autobyteus/llm/extensions/token_usage_tracking_extension.py +45 -18
  208. autobyteus/llm/llm_factory.py +282 -204
  209. autobyteus/llm/lmstudio_provider.py +60 -49
  210. autobyteus/llm/models.py +35 -2
  211. autobyteus/llm/ollama_provider.py +60 -49
  212. autobyteus/llm/ollama_provider_resolver.py +0 -1
  213. autobyteus/llm/prompt_renderers/__init__.py +19 -0
  214. autobyteus/llm/prompt_renderers/anthropic_prompt_renderer.py +104 -0
  215. autobyteus/llm/prompt_renderers/autobyteus_prompt_renderer.py +19 -0
  216. autobyteus/llm/prompt_renderers/base_prompt_renderer.py +10 -0
  217. autobyteus/llm/prompt_renderers/gemini_prompt_renderer.py +63 -0
  218. autobyteus/llm/prompt_renderers/mistral_prompt_renderer.py +87 -0
  219. autobyteus/llm/prompt_renderers/ollama_prompt_renderer.py +51 -0
  220. autobyteus/llm/prompt_renderers/openai_chat_renderer.py +97 -0
  221. autobyteus/llm/prompt_renderers/openai_responses_renderer.py +101 -0
  222. autobyteus/llm/providers.py +1 -3
  223. autobyteus/llm/token_counter/claude_token_counter.py +56 -25
  224. autobyteus/llm/token_counter/mistral_token_counter.py +12 -8
  225. autobyteus/llm/token_counter/openai_token_counter.py +24 -5
  226. autobyteus/llm/token_counter/token_counter_factory.py +12 -5
  227. autobyteus/llm/utils/llm_config.py +6 -12
  228. autobyteus/llm/utils/media_payload_formatter.py +27 -20
  229. autobyteus/llm/utils/messages.py +55 -3
  230. autobyteus/llm/utils/response_types.py +3 -0
  231. autobyteus/llm/utils/tool_call_delta.py +31 -0
  232. autobyteus/memory/__init__.py +32 -0
  233. autobyteus/memory/active_transcript.py +69 -0
  234. autobyteus/memory/compaction/__init__.py +9 -0
  235. autobyteus/memory/compaction/compaction_result.py +8 -0
  236. autobyteus/memory/compaction/compactor.py +89 -0
  237. autobyteus/memory/compaction/summarizer.py +11 -0
  238. autobyteus/memory/compaction_snapshot_builder.py +84 -0
  239. autobyteus/memory/memory_manager.py +183 -0
  240. autobyteus/memory/models/__init__.py +14 -0
  241. autobyteus/memory/models/episodic_item.py +41 -0
  242. autobyteus/memory/models/memory_types.py +7 -0
  243. autobyteus/memory/models/raw_trace_item.py +79 -0
  244. autobyteus/memory/models/semantic_item.py +41 -0
  245. autobyteus/memory/models/tool_interaction.py +20 -0
  246. autobyteus/memory/policies/__init__.py +5 -0
  247. autobyteus/memory/policies/compaction_policy.py +16 -0
  248. autobyteus/memory/retrieval/__init__.py +7 -0
  249. autobyteus/memory/retrieval/memory_bundle.py +11 -0
  250. autobyteus/memory/retrieval/retriever.py +13 -0
  251. autobyteus/memory/store/__init__.py +7 -0
  252. autobyteus/memory/store/base_store.py +14 -0
  253. autobyteus/memory/store/file_store.py +98 -0
  254. autobyteus/memory/tool_interaction_builder.py +46 -0
  255. autobyteus/memory/turn_tracker.py +9 -0
  256. autobyteus/multimedia/audio/api/autobyteus_audio_client.py +19 -5
  257. autobyteus/multimedia/audio/api/gemini_audio_client.py +108 -16
  258. autobyteus/multimedia/audio/audio_client_factory.py +47 -9
  259. autobyteus/multimedia/audio/audio_model.py +2 -1
  260. autobyteus/multimedia/image/api/autobyteus_image_client.py +19 -5
  261. autobyteus/multimedia/image/api/gemini_image_client.py +38 -17
  262. autobyteus/multimedia/image/api/openai_image_client.py +125 -43
  263. autobyteus/multimedia/image/autobyteus_image_provider.py +2 -1
  264. autobyteus/multimedia/image/image_client_factory.py +47 -15
  265. autobyteus/multimedia/image/image_model.py +5 -2
  266. autobyteus/multimedia/providers.py +3 -2
  267. autobyteus/skills/loader.py +71 -0
  268. autobyteus/skills/model.py +11 -0
  269. autobyteus/skills/registry.py +70 -0
  270. autobyteus/task_management/tools/todo_tools/add_todo.py +2 -2
  271. autobyteus/task_management/tools/todo_tools/create_todo_list.py +2 -2
  272. autobyteus/task_management/tools/todo_tools/update_todo_status.py +2 -2
  273. autobyteus/tools/__init__.py +34 -47
  274. autobyteus/tools/base_tool.py +7 -0
  275. autobyteus/tools/file/__init__.py +2 -6
  276. autobyteus/tools/file/patch_file.py +149 -0
  277. autobyteus/tools/file/read_file.py +36 -5
  278. autobyteus/tools/file/write_file.py +4 -1
  279. autobyteus/tools/functional_tool.py +43 -6
  280. autobyteus/tools/mcp/__init__.py +2 -0
  281. autobyteus/tools/mcp/config_service.py +5 -1
  282. autobyteus/tools/mcp/server/__init__.py +2 -0
  283. autobyteus/tools/mcp/server/http_managed_mcp_server.py +1 -1
  284. autobyteus/tools/mcp/server/websocket_managed_mcp_server.py +141 -0
  285. autobyteus/tools/mcp/server_instance_manager.py +8 -1
  286. autobyteus/tools/mcp/types.py +61 -0
  287. autobyteus/tools/multimedia/audio_tools.py +70 -17
  288. autobyteus/tools/multimedia/download_media_tool.py +18 -4
  289. autobyteus/tools/multimedia/image_tools.py +246 -62
  290. autobyteus/tools/operation_executor/journal_manager.py +107 -0
  291. autobyteus/tools/operation_executor/operation_event_buffer.py +57 -0
  292. autobyteus/tools/operation_executor/operation_event_producer.py +29 -0
  293. autobyteus/tools/operation_executor/operation_executor.py +58 -0
  294. autobyteus/tools/registry/tool_definition.py +43 -2
  295. autobyteus/tools/skill/load_skill.py +50 -0
  296. autobyteus/tools/terminal/__init__.py +45 -0
  297. autobyteus/tools/terminal/ansi_utils.py +32 -0
  298. autobyteus/tools/terminal/background_process_manager.py +233 -0
  299. autobyteus/tools/terminal/output_buffer.py +105 -0
  300. autobyteus/tools/terminal/prompt_detector.py +63 -0
  301. autobyteus/tools/terminal/pty_session.py +241 -0
  302. autobyteus/tools/terminal/session_factory.py +20 -0
  303. autobyteus/tools/terminal/terminal_session_manager.py +226 -0
  304. autobyteus/tools/terminal/tools/__init__.py +13 -0
  305. autobyteus/tools/terminal/tools/get_process_output.py +81 -0
  306. autobyteus/tools/terminal/tools/run_bash.py +109 -0
  307. autobyteus/tools/terminal/tools/start_background_process.py +104 -0
  308. autobyteus/tools/terminal/tools/stop_background_process.py +67 -0
  309. autobyteus/tools/terminal/types.py +54 -0
  310. autobyteus/tools/terminal/wsl_tmux_session.py +221 -0
  311. autobyteus/tools/terminal/wsl_utils.py +156 -0
  312. autobyteus/tools/transaction_management/backup_handler.py +48 -0
  313. autobyteus/tools/transaction_management/operation_lifecycle_manager.py +62 -0
  314. autobyteus/tools/usage/__init__.py +1 -2
  315. autobyteus/tools/usage/formatters/__init__.py +17 -1
  316. autobyteus/tools/usage/formatters/base_formatter.py +8 -0
  317. autobyteus/tools/usage/formatters/default_xml_schema_formatter.py +2 -2
  318. autobyteus/tools/usage/formatters/mistral_json_schema_formatter.py +18 -0
  319. autobyteus/tools/usage/formatters/patch_file_xml_example_formatter.py +64 -0
  320. autobyteus/tools/usage/formatters/patch_file_xml_schema_formatter.py +31 -0
  321. autobyteus/tools/usage/formatters/run_bash_xml_example_formatter.py +32 -0
  322. autobyteus/tools/usage/formatters/run_bash_xml_schema_formatter.py +36 -0
  323. autobyteus/tools/usage/formatters/write_file_xml_example_formatter.py +53 -0
  324. autobyteus/tools/usage/formatters/write_file_xml_schema_formatter.py +31 -0
  325. autobyteus/tools/usage/providers/tool_manifest_provider.py +10 -10
  326. autobyteus/tools/usage/registries/__init__.py +1 -3
  327. autobyteus/tools/usage/registries/tool_formatting_registry.py +115 -8
  328. autobyteus/tools/usage/tool_schema_provider.py +51 -0
  329. autobyteus/tools/web/__init__.py +4 -0
  330. autobyteus/tools/web/read_url_tool.py +80 -0
  331. autobyteus/utils/diff_utils.py +271 -0
  332. autobyteus/utils/download_utils.py +109 -0
  333. autobyteus/utils/file_utils.py +57 -2
  334. autobyteus/utils/gemini_helper.py +56 -0
  335. autobyteus/utils/gemini_model_mapping.py +71 -0
  336. autobyteus/utils/llm_output_formatter.py +75 -0
  337. autobyteus/utils/tool_call_format.py +36 -0
  338. autobyteus/workflow/agentic_workflow.py +3 -3
  339. autobyteus/workflow/bootstrap_steps/agent_tool_injection_step.py +2 -2
  340. autobyteus/workflow/bootstrap_steps/base_workflow_bootstrap_step.py +2 -2
  341. autobyteus/workflow/bootstrap_steps/coordinator_initialization_step.py +2 -2
  342. autobyteus/workflow/bootstrap_steps/coordinator_prompt_preparation_step.py +3 -9
  343. autobyteus/workflow/bootstrap_steps/workflow_bootstrapper.py +6 -6
  344. autobyteus/workflow/bootstrap_steps/workflow_runtime_queue_initialization_step.py +2 -2
  345. autobyteus/workflow/context/workflow_context.py +3 -3
  346. autobyteus/workflow/context/workflow_runtime_state.py +5 -5
  347. autobyteus/workflow/events/workflow_event_dispatcher.py +5 -5
  348. autobyteus/workflow/handlers/lifecycle_workflow_event_handler.py +3 -3
  349. autobyteus/workflow/handlers/process_user_message_event_handler.py +5 -5
  350. autobyteus/workflow/handlers/tool_approval_workflow_event_handler.py +2 -2
  351. autobyteus/workflow/runtime/workflow_runtime.py +8 -8
  352. autobyteus/workflow/runtime/workflow_worker.py +3 -3
  353. autobyteus/workflow/status/__init__.py +11 -0
  354. autobyteus/workflow/status/workflow_status.py +19 -0
  355. autobyteus/workflow/status/workflow_status_manager.py +48 -0
  356. autobyteus/workflow/streaming/__init__.py +2 -2
  357. autobyteus/workflow/streaming/workflow_event_notifier.py +7 -7
  358. autobyteus/workflow/streaming/workflow_stream_event_payloads.py +4 -4
  359. autobyteus/workflow/streaming/workflow_stream_events.py +3 -3
  360. autobyteus/workflow/utils/wait_for_idle.py +4 -4
  361. autobyteus-1.2.3.dist-info/METADATA +293 -0
  362. autobyteus-1.2.3.dist-info/RECORD +600 -0
  363. {autobyteus-1.2.1.dist-info → autobyteus-1.2.3.dist-info}/WHEEL +1 -1
  364. {autobyteus-1.2.1.dist-info → autobyteus-1.2.3.dist-info}/top_level.txt +0 -1
  365. autobyteus/agent/bootstrap_steps/agent_runtime_queue_initialization_step.py +0 -57
  366. autobyteus/agent/hooks/__init__.py +0 -16
  367. autobyteus/agent/hooks/base_phase_hook.py +0 -78
  368. autobyteus/agent/hooks/hook_definition.py +0 -36
  369. autobyteus/agent/hooks/hook_meta.py +0 -37
  370. autobyteus/agent/hooks/hook_registry.py +0 -106
  371. autobyteus/agent/llm_response_processor/provider_aware_tool_usage_processor.py +0 -103
  372. autobyteus/agent/phases/__init__.py +0 -18
  373. autobyteus/agent/phases/discover.py +0 -53
  374. autobyteus/agent/phases/manager.py +0 -265
  375. autobyteus/agent/phases/transition_decorator.py +0 -40
  376. autobyteus/agent/phases/transition_info.py +0 -33
  377. autobyteus/agent/remote_agent.py +0 -244
  378. autobyteus/agent/workspace/workspace_definition.py +0 -36
  379. autobyteus/agent/workspace/workspace_meta.py +0 -37
  380. autobyteus/agent/workspace/workspace_registry.py +0 -72
  381. autobyteus/agent_team/bootstrap_steps/agent_team_runtime_queue_initialization_step.py +0 -25
  382. autobyteus/agent_team/bootstrap_steps/coordinator_prompt_preparation_step.py +0 -85
  383. autobyteus/agent_team/phases/__init__.py +0 -11
  384. autobyteus/agent_team/phases/agent_team_operational_phase.py +0 -19
  385. autobyteus/agent_team/phases/agent_team_phase_manager.py +0 -48
  386. autobyteus/llm/api/bedrock_llm.py +0 -92
  387. autobyteus/llm/api/groq_llm.py +0 -94
  388. autobyteus/llm/api/nvidia_llm.py +0 -108
  389. autobyteus/llm/utils/token_pricing_config.py +0 -87
  390. autobyteus/rpc/__init__.py +0 -73
  391. autobyteus/rpc/client/__init__.py +0 -17
  392. autobyteus/rpc/client/abstract_client_connection.py +0 -124
  393. autobyteus/rpc/client/client_connection_manager.py +0 -153
  394. autobyteus/rpc/client/sse_client_connection.py +0 -306
  395. autobyteus/rpc/client/stdio_client_connection.py +0 -280
  396. autobyteus/rpc/config/__init__.py +0 -13
  397. autobyteus/rpc/config/agent_server_config.py +0 -153
  398. autobyteus/rpc/config/agent_server_registry.py +0 -152
  399. autobyteus/rpc/hosting.py +0 -244
  400. autobyteus/rpc/protocol.py +0 -244
  401. autobyteus/rpc/server/__init__.py +0 -20
  402. autobyteus/rpc/server/agent_server_endpoint.py +0 -181
  403. autobyteus/rpc/server/base_method_handler.py +0 -40
  404. autobyteus/rpc/server/method_handlers.py +0 -259
  405. autobyteus/rpc/server/sse_server_handler.py +0 -182
  406. autobyteus/rpc/server/stdio_server_handler.py +0 -151
  407. autobyteus/rpc/server_main.py +0 -198
  408. autobyteus/rpc/transport_type.py +0 -13
  409. autobyteus/tools/bash/__init__.py +0 -2
  410. autobyteus/tools/bash/bash_executor.py +0 -100
  411. autobyteus/tools/browser/__init__.py +0 -2
  412. autobyteus/tools/browser/session_aware/browser_session_aware_navigate_to.py +0 -75
  413. autobyteus/tools/browser/session_aware/browser_session_aware_tool.py +0 -30
  414. autobyteus/tools/browser/session_aware/browser_session_aware_web_element_trigger.py +0 -154
  415. autobyteus/tools/browser/session_aware/browser_session_aware_webpage_reader.py +0 -89
  416. autobyteus/tools/browser/session_aware/browser_session_aware_webpage_screenshot_taker.py +0 -107
  417. autobyteus/tools/browser/session_aware/factory/browser_session_aware_web_element_trigger_factory.py +0 -14
  418. autobyteus/tools/browser/session_aware/factory/browser_session_aware_webpage_reader_factory.py +0 -26
  419. autobyteus/tools/browser/session_aware/factory/browser_session_aware_webpage_screenshot_taker_factory.py +0 -14
  420. autobyteus/tools/browser/session_aware/shared_browser_session.py +0 -11
  421. autobyteus/tools/browser/session_aware/shared_browser_session_manager.py +0 -25
  422. autobyteus/tools/browser/session_aware/web_element_action.py +0 -20
  423. autobyteus/tools/browser/standalone/__init__.py +0 -6
  424. autobyteus/tools/browser/standalone/factory/__init__.py +0 -0
  425. autobyteus/tools/browser/standalone/factory/webpage_reader_factory.py +0 -25
  426. autobyteus/tools/browser/standalone/factory/webpage_screenshot_taker_factory.py +0 -14
  427. autobyteus/tools/browser/standalone/navigate_to.py +0 -84
  428. autobyteus/tools/browser/standalone/web_page_pdf_generator.py +0 -101
  429. autobyteus/tools/browser/standalone/webpage_image_downloader.py +0 -169
  430. autobyteus/tools/browser/standalone/webpage_reader.py +0 -105
  431. autobyteus/tools/browser/standalone/webpage_screenshot_taker.py +0 -105
  432. autobyteus/tools/file/edit_file.py +0 -200
  433. autobyteus/tools/file/list_directory.py +0 -168
  434. autobyteus/tools/file/search_files.py +0 -188
  435. autobyteus/tools/timer.py +0 -175
  436. autobyteus/tools/usage/parsers/__init__.py +0 -22
  437. autobyteus/tools/usage/parsers/_json_extractor.py +0 -99
  438. autobyteus/tools/usage/parsers/_string_decoders.py +0 -18
  439. autobyteus/tools/usage/parsers/anthropic_xml_tool_usage_parser.py +0 -10
  440. autobyteus/tools/usage/parsers/base_parser.py +0 -41
  441. autobyteus/tools/usage/parsers/default_json_tool_usage_parser.py +0 -83
  442. autobyteus/tools/usage/parsers/default_xml_tool_usage_parser.py +0 -316
  443. autobyteus/tools/usage/parsers/exceptions.py +0 -13
  444. autobyteus/tools/usage/parsers/gemini_json_tool_usage_parser.py +0 -77
  445. autobyteus/tools/usage/parsers/openai_json_tool_usage_parser.py +0 -149
  446. autobyteus/tools/usage/parsers/provider_aware_tool_usage_parser.py +0 -59
  447. autobyteus/tools/usage/registries/tool_usage_parser_registry.py +0 -62
  448. autobyteus/workflow/phases/__init__.py +0 -11
  449. autobyteus/workflow/phases/workflow_operational_phase.py +0 -19
  450. autobyteus/workflow/phases/workflow_phase_manager.py +0 -48
  451. autobyteus-1.2.1.dist-info/METADATA +0 -205
  452. autobyteus-1.2.1.dist-info/RECORD +0 -511
  453. examples/__init__.py +0 -1
  454. examples/agent_team/__init__.py +0 -1
  455. examples/discover_phase_transitions.py +0 -104
  456. examples/run_agentic_software_engineer.py +0 -239
  457. examples/run_browser_agent.py +0 -262
  458. examples/run_google_slides_agent.py +0 -287
  459. examples/run_mcp_browser_client.py +0 -174
  460. examples/run_mcp_google_slides_client.py +0 -270
  461. examples/run_mcp_list_tools.py +0 -189
  462. examples/run_poem_writer.py +0 -284
  463. examples/run_sqlite_agent.py +0 -295
  464. /autobyteus/{tools/browser/session_aware → skills}/__init__.py +0 -0
  465. /autobyteus/tools/{browser/session_aware/factory → skill}/__init__.py +0 -0
  466. {autobyteus-1.2.1.dist-info → autobyteus-1.2.3.dist-info}/licenses/LICENSE +0 -0
@@ -1,6 +1,8 @@
1
1
  # file: autobyteus/autobyteus/agent/factory/agent_factory.py
2
2
  import logging
3
3
  import random
4
+ import os
5
+ from pathlib import Path
4
6
  from typing import Optional, TYPE_CHECKING, Dict, List
5
7
 
6
8
  # LLMFactory is no longer needed here.
@@ -13,6 +15,11 @@ from autobyteus.agent.workspace.base_workspace import BaseAgentWorkspace
13
15
  from autobyteus.agent.handlers import *
14
16
  from autobyteus.utils.singleton import SingletonMeta
15
17
  from autobyteus.tools.base_tool import BaseTool
18
+ from autobyteus.memory import FileMemoryStore, MemoryManager
19
+ from autobyteus.agent.input_processor.memory_ingest_input_processor import MemoryIngestInputProcessor
20
+ from autobyteus.agent.tool_execution_result_processor.memory_ingest_tool_result_processor import (
21
+ MemoryIngestToolResultProcessor,
22
+ )
16
23
 
17
24
  if TYPE_CHECKING:
18
25
  from autobyteus.agent.runtime.agent_runtime import AgentRuntime
@@ -41,9 +48,16 @@ class AgentFactory(metaclass=SingletonMeta):
41
48
  registry.register(ToolExecutionApprovalEvent, ToolExecutionApprovalEventHandler())
42
49
  registry.register(LLMUserMessageReadyEvent, LLMUserMessageReadyEventHandler())
43
50
  registry.register(ApprovedToolInvocationEvent, ApprovedToolInvocationEventHandler())
51
+ bootstrap_handler = BootstrapEventHandler()
52
+ registry.register(BootstrapStartedEvent, bootstrap_handler)
53
+ registry.register(BootstrapStepRequestedEvent, bootstrap_handler)
54
+ registry.register(BootstrapStepCompletedEvent, bootstrap_handler)
55
+ registry.register(BootstrapCompletedEvent, bootstrap_handler)
44
56
  lifecycle_logger_instance = LifecycleEventLogger()
45
57
  registry.register(AgentReadyEvent, lifecycle_logger_instance)
46
58
  registry.register(AgentStoppedEvent, lifecycle_logger_instance)
59
+ registry.register(AgentIdleEvent, lifecycle_logger_instance)
60
+ registry.register(ShutdownRequestedEvent, lifecycle_logger_instance)
47
61
  registry.register(AgentErrorEvent, lifecycle_logger_instance)
48
62
  return registry
49
63
 
@@ -69,18 +83,56 @@ class AgentFactory(metaclass=SingletonMeta):
69
83
 
70
84
  return tool_instances_dict
71
85
 
86
+ def _prepare_skills(self, agent_id: str, config: AgentConfig):
87
+ """
88
+ Registers skills from paths and ensures all skill names are valid.
89
+ """
90
+ from autobyteus.skills.registry import SkillRegistry
91
+ import os
92
+
93
+ registry = SkillRegistry()
94
+ updated_skills = []
95
+ for skill_item in config.skills:
96
+ # Check if it's a path (absolute or relative to current working directory)
97
+ if os.path.isabs(skill_item) or os.path.exists(skill_item):
98
+ try:
99
+ skill = registry.register_skill_from_path(skill_item)
100
+ updated_skills.append(skill.name)
101
+ except Exception as e:
102
+ logger.error(f"Agent '{agent_id}': Failed to register skill from path '{skill_item}': {e}")
103
+ else:
104
+ updated_skills.append(skill_item)
105
+
106
+ config.skills = updated_skills
107
+
72
108
  def _create_runtime(self,
73
109
  agent_id: str,
74
110
  config: AgentConfig
75
111
  ) -> 'AgentRuntime':
76
112
  from autobyteus.agent.runtime.agent_runtime import AgentRuntime
77
113
 
114
+ # Prepare skills (resolve paths to names and register them)
115
+ self._prepare_skills(agent_id, config)
116
+
78
117
  # The workspace and initial custom data are now passed directly from the config to the state.
79
118
  runtime_state = AgentRuntimeState(
80
119
  agent_id=agent_id,
81
120
  workspace=config.workspace,
82
121
  custom_data=config.initial_custom_data
83
122
  )
123
+
124
+ # Memory manager (file-backed) initialization
125
+ memory_dir = os.getenv("AUTOBYTEUS_MEMORY_DIR")
126
+ if memory_dir is None:
127
+ memory_dir = str(Path.cwd() / "memory")
128
+ memory_store = FileMemoryStore(base_dir=memory_dir, agent_id=agent_id)
129
+ runtime_state.memory_manager = MemoryManager(store=memory_store)
130
+
131
+ # Ensure memory ingest processors are present
132
+ if not any(isinstance(p, MemoryIngestInputProcessor) for p in config.input_processors):
133
+ config.input_processors.append(MemoryIngestInputProcessor())
134
+ if not any(isinstance(p, MemoryIngestToolResultProcessor) for p in config.tool_execution_result_processors):
135
+ config.tool_execution_result_processors.append(MemoryIngestToolResultProcessor())
84
136
 
85
137
  # --- Set pre-initialized instances on the state ---
86
138
  runtime_state.llm_instance = config.llm_instance
@@ -14,6 +14,7 @@ from .tool_invocation_request_event_handler import ToolInvocationRequestEventHan
14
14
  from .tool_result_event_handler import ToolResultEventHandler
15
15
  from .approved_tool_invocation_event_handler import ApprovedToolInvocationEventHandler
16
16
  from .tool_execution_approval_event_handler import ToolExecutionApprovalEventHandler
17
+ from .bootstrap_event_handler import BootstrapEventHandler
17
18
 
18
19
  # General Purpose and Lifecycle Handlers
19
20
  from .generic_event_handler import GenericEventHandler
@@ -31,6 +32,7 @@ __all__ = [
31
32
  "ToolResultEventHandler",
32
33
  "ApprovedToolInvocationEventHandler",
33
34
  "ToolExecutionApprovalEventHandler",
35
+ "BootstrapEventHandler",
34
36
  "GenericEventHandler",
35
37
  "LifecycleEventLogger",
36
38
  ]
@@ -1,12 +1,13 @@
1
1
  # file: autobyteus/autobyteus/agent/handlers/approved_tool_invocation_event_handler.py
2
2
  import logging
3
- import json
3
+
4
4
  import traceback
5
5
  from typing import TYPE_CHECKING, Optional
6
6
 
7
7
  from autobyteus.agent.handlers.base_event_handler import AgentEventHandler
8
8
  from autobyteus.agent.events import ApprovedToolInvocationEvent, ToolResultEvent
9
9
  from autobyteus.agent.tool_invocation import ToolInvocation
10
+ from autobyteus.utils.llm_output_formatter import format_to_clean_string
10
11
 
11
12
  if TYPE_CHECKING:
12
13
  from autobyteus.agent.context import AgentContext
@@ -38,18 +39,38 @@ class ApprovedToolInvocationEventHandler(AgentEventHandler):
38
39
  agent_id = context.agent_id
39
40
 
40
41
  notifier: Optional['AgentExternalEventNotifier'] = None
41
- if context.phase_manager:
42
- notifier = context.phase_manager.notifier
42
+ if context.status_manager:
43
+ notifier = context.status_manager.notifier
43
44
 
44
45
  if not notifier: # pragma: no cover
45
46
  logger.error(f"Agent '{agent_id}': Notifier not available in ApprovedToolInvocationEventHandler. Tool interaction logs will not be emitted.")
46
47
 
47
48
  logger.info(f"Agent '{agent_id}' handling ApprovedToolInvocationEvent for tool: '{tool_name}' (ID: {invocation_id}) with args: {arguments}")
48
49
 
49
- try:
50
- args_str = json.dumps(arguments)
51
- except TypeError: # pragma: no cover
52
- args_str = str(arguments)
50
+ # Run tool invocation preprocessors before execution
51
+ processors = context.config.tool_invocation_preprocessors
52
+ if processors:
53
+ sorted_processors = sorted(processors, key=lambda p: p.get_order())
54
+ for processor in sorted_processors:
55
+ try:
56
+ tool_invocation = await processor.process(tool_invocation, context)
57
+ tool_name = tool_invocation.name
58
+ arguments = tool_invocation.arguments
59
+ invocation_id = tool_invocation.id
60
+ except Exception as e:
61
+ error_message = f"Error in tool invocation preprocessor '{processor.get_name()}' for tool '{tool_name}': {e}"
62
+ logger.error(f"Agent '{agent_id}': {error_message}", exc_info=True)
63
+ result_event = ToolResultEvent(
64
+ tool_name=tool_name,
65
+ result=None,
66
+ error=error_message,
67
+ tool_invocation_id=invocation_id,
68
+ turn_id=tool_invocation.turn_id,
69
+ )
70
+ await context.input_event_queues.enqueue_tool_result(result_event)
71
+ return
72
+
73
+ args_str = format_to_clean_string(arguments)
53
74
  log_msg_call = f"[APPROVED_TOOL_CALL] Agent_ID: {agent_id}, Tool: {tool_name}, Invocation_ID: {invocation_id}, Arguments: {args_str}"
54
75
 
55
76
  if notifier:
@@ -69,13 +90,13 @@ class ApprovedToolInvocationEventHandler(AgentEventHandler):
69
90
  if not tool_instance:
70
91
  error_message = f"Tool '{tool_name}' not found or configured for agent '{agent_id}'."
71
92
  logger.error(error_message)
72
- result_event = ToolResultEvent(tool_name=tool_name, result=None, error=error_message, tool_invocation_id=invocation_id)
73
- context.add_message_to_history({
74
- "role": "tool",
75
- "tool_call_id": invocation_id,
76
- "name": tool_name,
77
- "content": f"Error: Approved tool '{tool_name}' execution failed. Reason: {error_message}",
78
- })
93
+ result_event = ToolResultEvent(
94
+ tool_name=tool_name,
95
+ result=None,
96
+ error=error_message,
97
+ tool_invocation_id=invocation_id,
98
+ turn_id=tool_invocation.turn_id,
99
+ )
79
100
  log_msg_error = f"[APPROVED_TOOL_ERROR] {error_message}"
80
101
  if notifier:
81
102
  try:
@@ -94,21 +115,17 @@ class ApprovedToolInvocationEventHandler(AgentEventHandler):
94
115
  logger.debug(f"Executing approved tool '{tool_name}' for agent '{agent_id}'. Invocation ID: {invocation_id}")
95
116
  execution_result = await tool_instance.execute(context=context, **arguments)
96
117
 
97
- try:
98
- result_json_for_log = json.dumps(execution_result)
99
- except (TypeError, ValueError):
100
- result_json_for_log = json.dumps(str(execution_result))
118
+ result_json_for_log = format_to_clean_string(execution_result)
101
119
 
102
120
  logger.info(f"Approved tool '{tool_name}' (ID: {invocation_id}) executed successfully by agent '{agent_id}'.")
103
- result_event = ToolResultEvent(tool_name=tool_name, result=execution_result, error=None, tool_invocation_id=invocation_id)
104
-
105
- history_content = str(execution_result)
106
- context.add_message_to_history({
107
- "role": "tool",
108
- "tool_call_id": invocation_id,
109
- "name": tool_name,
110
- "content": history_content,
111
- })
121
+ result_event = ToolResultEvent(
122
+ tool_name=tool_name,
123
+ result=execution_result,
124
+ error=None,
125
+ tool_invocation_id=invocation_id,
126
+ tool_args=arguments,
127
+ turn_id=tool_invocation.turn_id,
128
+ )
112
129
  log_msg_result = f"[APPROVED_TOOL_RESULT] {result_json_for_log}"
113
130
  if notifier:
114
131
  try:
@@ -122,13 +139,13 @@ class ApprovedToolInvocationEventHandler(AgentEventHandler):
122
139
  error_message = f"Error executing approved tool '{tool_name}' (ID: {invocation_id}): {str(e)}"
123
140
  error_details = traceback.format_exc()
124
141
  logger.error(f"Agent '{agent_id}' {error_message}", exc_info=True)
125
- result_event = ToolResultEvent(tool_name=tool_name, result=None, error=error_message, tool_invocation_id=invocation_id)
126
- context.add_message_to_history({
127
- "role": "tool",
128
- "tool_call_id": invocation_id,
129
- "name": tool_name,
130
- "content": f"Error: Approved tool '{tool_name}' execution failed. Reason: {error_message}",
131
- })
142
+ result_event = ToolResultEvent(
143
+ tool_name=tool_name,
144
+ result=None,
145
+ error=error_message,
146
+ tool_invocation_id=invocation_id,
147
+ turn_id=tool_invocation.turn_id,
148
+ )
132
149
  log_msg_exception = f"[APPROVED_TOOL_EXCEPTION] {error_message}\nDetails:\n{error_details}"
133
150
  if notifier:
134
151
  try:
@@ -0,0 +1,155 @@
1
+ # file: autobyteus/autobyteus/agent/handlers/bootstrap_event_handler.py
2
+ import logging
3
+ from typing import List, Optional, TYPE_CHECKING
4
+
5
+ from autobyteus.agent.bootstrap_steps.agent_bootstrapper import AgentBootstrapper
6
+ from autobyteus.agent.bootstrap_steps.base_bootstrap_step import BaseBootstrapStep
7
+ from autobyteus.agent.events import (
8
+ AgentErrorEvent,
9
+ AgentReadyEvent,
10
+ BootstrapStartedEvent,
11
+ BootstrapStepRequestedEvent,
12
+ BootstrapStepCompletedEvent,
13
+ BootstrapCompletedEvent,
14
+ )
15
+ from autobyteus.agent.handlers.base_event_handler import AgentEventHandler
16
+
17
+ if TYPE_CHECKING:
18
+ from autobyteus.agent.context import AgentContext
19
+
20
+ logger = logging.getLogger(__name__)
21
+
22
+ _BOOTSTRAP_STEPS_KEY = "_bootstrap_steps"
23
+
24
+
25
+ class BootstrapEventHandler(AgentEventHandler):
26
+ """
27
+ Orchestrates the agent bootstrap sequence using internal lifecycle events.
28
+ """
29
+
30
+ def __init__(self, steps: Optional[List[BaseBootstrapStep]] = None) -> None:
31
+ self._bootstrapper = AgentBootstrapper(steps=steps)
32
+
33
+ async def handle(self, event: object, context: 'AgentContext') -> None:
34
+ if isinstance(event, BootstrapStartedEvent):
35
+ await self._handle_bootstrap_started(context)
36
+ return
37
+
38
+ if isinstance(event, BootstrapStepRequestedEvent):
39
+ await self._handle_bootstrap_step_requested(event, context)
40
+ return
41
+
42
+ if isinstance(event, BootstrapStepCompletedEvent):
43
+ await self._handle_bootstrap_step_completed(event, context)
44
+ return
45
+
46
+ if isinstance(event, BootstrapCompletedEvent):
47
+ await self._handle_bootstrap_completed(event, context)
48
+ return
49
+
50
+ logger.warning(f"BootstrapEventHandler received unexpected event type: {type(event).__name__}")
51
+
52
+ async def _handle_bootstrap_started(self, context: 'AgentContext') -> None:
53
+ steps = list(self._bootstrapper.bootstrap_steps)
54
+ context.state.custom_data[_BOOTSTRAP_STEPS_KEY] = steps
55
+
56
+ if not steps:
57
+ logger.info(f"Agent '{context.agent_id}': No bootstrap steps configured. Marking bootstrap complete.")
58
+ await context.input_event_queues.enqueue_internal_system_event(
59
+ BootstrapCompletedEvent(success=True)
60
+ )
61
+ return
62
+
63
+ logger.info(f"Agent '{context.agent_id}': Bootstrap started with {len(steps)} steps.")
64
+ await context.input_event_queues.enqueue_internal_system_event(
65
+ BootstrapStepRequestedEvent(step_index=0)
66
+ )
67
+
68
+ async def _handle_bootstrap_step_requested(self, event: BootstrapStepRequestedEvent, context: 'AgentContext') -> None:
69
+ steps: Optional[List[BaseBootstrapStep]] = context.state.custom_data.get(_BOOTSTRAP_STEPS_KEY)
70
+ if not steps:
71
+ error_message = "Bootstrap steps list missing from context during step request."
72
+ logger.error(f"Agent '{context.agent_id}': {error_message}")
73
+ await self._notify_bootstrap_error(context, error_message)
74
+ await context.input_event_queues.enqueue_internal_system_event(
75
+ BootstrapCompletedEvent(success=False, error_message=error_message)
76
+ )
77
+ return
78
+
79
+ step_index = event.step_index
80
+ if step_index < 0 or step_index >= len(steps):
81
+ error_message = f"Invalid bootstrap step index {step_index}."
82
+ logger.error(f"Agent '{context.agent_id}': {error_message}")
83
+ await self._notify_bootstrap_error(context, error_message)
84
+ await context.input_event_queues.enqueue_internal_system_event(
85
+ BootstrapCompletedEvent(success=False, error_message=error_message)
86
+ )
87
+ return
88
+
89
+ step = steps[step_index]
90
+ step_name = step.__class__.__name__
91
+ logger.debug(f"Agent '{context.agent_id}': Executing bootstrap step {step_index + 1}/{len(steps)}: {step_name}")
92
+
93
+ try:
94
+ success = await step.execute(context)
95
+ except Exception as e: # pragma: no cover
96
+ error_message = f"Exception during bootstrap step '{step_name}': {e}"
97
+ logger.error(f"Agent '{context.agent_id}': {error_message}", exc_info=True)
98
+ success = False
99
+ if not success:
100
+ error_message = f"Bootstrap step '{step_name}' failed."
101
+ await self._notify_bootstrap_error(context, error_message)
102
+
103
+ await context.input_event_queues.enqueue_internal_system_event(
104
+ BootstrapStepCompletedEvent(
105
+ step_index=step_index,
106
+ step_name=step_name,
107
+ success=success,
108
+ error_message=None if success else f"Step '{step_name}' failed",
109
+ )
110
+ )
111
+
112
+ async def _handle_bootstrap_step_completed(self, event: BootstrapStepCompletedEvent, context: 'AgentContext') -> None:
113
+ if not event.success:
114
+ await context.input_event_queues.enqueue_internal_system_event(
115
+ BootstrapCompletedEvent(success=False, error_message=event.error_message)
116
+ )
117
+ return
118
+
119
+ steps: Optional[List[BaseBootstrapStep]] = context.state.custom_data.get(_BOOTSTRAP_STEPS_KEY)
120
+ if not steps:
121
+ error_message = "Bootstrap steps list missing during step completion."
122
+ logger.error(f"Agent '{context.agent_id}': {error_message}")
123
+ await self._notify_bootstrap_error(context, error_message)
124
+ await context.input_event_queues.enqueue_internal_system_event(
125
+ BootstrapCompletedEvent(success=False, error_message=error_message)
126
+ )
127
+ return
128
+
129
+ next_index = event.step_index + 1
130
+ if next_index < len(steps):
131
+ await context.input_event_queues.enqueue_internal_system_event(
132
+ BootstrapStepRequestedEvent(step_index=next_index)
133
+ )
134
+ return
135
+
136
+ await context.input_event_queues.enqueue_internal_system_event(
137
+ BootstrapCompletedEvent(success=True)
138
+ )
139
+
140
+ async def _handle_bootstrap_completed(self, event: BootstrapCompletedEvent, context: 'AgentContext') -> None:
141
+ if not event.success:
142
+ logger.error(
143
+ f"Agent '{context.agent_id}': Bootstrap completed with failure. "
144
+ f"Error: {event.error_message}"
145
+ )
146
+ await self._notify_bootstrap_error(context, event.error_message or "Bootstrap failed.")
147
+ return
148
+
149
+ logger.info(f"Agent '{context.agent_id}': Bootstrap completed successfully. Emitting AgentReadyEvent.")
150
+ await context.input_event_queues.enqueue_internal_system_event(AgentReadyEvent())
151
+
152
+ async def _notify_bootstrap_error(self, context: 'AgentContext', error_message: str) -> None:
153
+ await context.input_event_queues.enqueue_internal_system_event(
154
+ AgentErrorEvent(error_message=error_message, exception_details=error_message)
155
+ )
@@ -48,6 +48,16 @@ class InterAgentMessageReceivedEventHandler(AgentEventHandler):
48
48
  f"'{inter_agent_msg.sender_agent_id}', type '{inter_agent_msg.message_type.value}'. "
49
49
  f"Content: '{inter_agent_msg.content}'"
50
50
  )
51
+
52
+ # Surface this inter-agent message to external subscribers (UI, etc.)
53
+ if context.status_manager and context.status_manager.notifier:
54
+ notifier: 'AgentExternalEventNotifier' = context.status_manager.notifier
55
+ notifier.notify_agent_data_inter_agent_message_received({
56
+ "sender_agent_id": inter_agent_msg.sender_agent_id,
57
+ "recipient_role_name": inter_agent_msg.recipient_role_name,
58
+ "content": inter_agent_msg.content,
59
+ "message_type": inter_agent_msg.message_type.value,
60
+ })
51
61
 
52
62
  content_for_llm = (
53
63
  f"You have received a message from another agent.\n"
@@ -8,9 +8,11 @@ from autobyteus.agent.events import (
8
8
  AgentReadyEvent, # MODIFIED: Renamed from AgentStartedEvent
9
9
  AgentStoppedEvent,
10
10
  AgentErrorEvent,
11
+ AgentIdleEvent,
12
+ ShutdownRequestedEvent,
11
13
  LifecycleEvent
12
14
  )
13
- from autobyteus.agent.phases import AgentOperationalPhase # Import new phase enum
15
+ from autobyteus.agent.status.status_enum import AgentStatus # Import new status enum
14
16
 
15
17
  if TYPE_CHECKING:
16
18
  from autobyteus.agent.context import AgentContext
@@ -20,8 +22,8 @@ logger = logging.getLogger(__name__)
20
22
  class LifecycleEventLogger(AgentEventHandler):
21
23
  """
22
24
  Logs various lifecycle events for an agent.
23
- This handler does not modify agent state directly; phase changes are managed
24
- by AgentPhaseManager.
25
+ This handler does not modify agent state directly; status changes are projected
26
+ from events.
25
27
  """
26
28
 
27
29
  async def handle(self,
@@ -32,33 +34,39 @@ class LifecycleEventLogger(AgentEventHandler):
32
34
 
33
35
  Args:
34
36
  event: The lifecycle event object (AgentReadyEvent, AgentStoppedEvent, etc.).
35
- context: The composite AgentContext (used for agent_id and current phase).
37
+ context: The composite AgentContext (used for agent_id and current status).
36
38
  """
37
39
 
38
40
  agent_id = context.agent_id
39
- # MODIFIED: Use current_phase instead of status
40
- current_phase_val = context.current_phase.value if context.current_phase else "None (Phase not set)"
41
+ # MODIFIED: Use current_status instead of status
42
+ current_status_val = context.current_status.value if context.current_status else "None (Status not set)"
41
43
 
42
44
  if isinstance(event, AgentReadyEvent): # MODIFIED: Check for AgentReadyEvent
43
- logger.info(f"Agent '{agent_id}' Logged AgentReadyEvent. Current agent phase: {current_phase_val}") # MODIFIED log message
45
+ logger.info(f"Agent '{agent_id}' Logged AgentReadyEvent. Current agent status: {current_status_val}") # MODIFIED log message
44
46
 
45
47
  elif isinstance(event, AgentStoppedEvent):
46
- logger.info(f"Agent '{agent_id}' Logged AgentStoppedEvent. Current agent phase: {current_phase_val}")
48
+ logger.info(f"Agent '{agent_id}' Logged AgentStoppedEvent. Current agent status: {current_status_val}")
49
+
50
+ elif isinstance(event, AgentIdleEvent):
51
+ logger.info(f"Agent '{agent_id}' Logged AgentIdleEvent. Current agent status: {current_status_val}")
52
+
53
+ elif isinstance(event, ShutdownRequestedEvent):
54
+ logger.info(f"Agent '{agent_id}' Logged ShutdownRequestedEvent. Current agent status: {current_status_val}")
47
55
 
48
56
  elif isinstance(event, AgentErrorEvent):
49
57
  logger.error(
50
58
  f"Agent '{agent_id}' Logged AgentErrorEvent: {event.error_message}. "
51
- f"Details: {event.exception_details}. Current agent phase: {current_phase_val}"
59
+ f"Details: {event.exception_details}. Current agent status: {current_status_val}"
52
60
  )
53
61
 
54
62
  else: # pragma: no cover
55
63
  if isinstance(event, LifecycleEvent):
56
64
  logger.warning(
57
65
  f"LifecycleEventLogger for agent '{agent_id}' received an unhandled "
58
- f"specific LifecycleEvent type: {type(event)}. Event: {event}. Current phase: {current_phase_val}"
66
+ f"specific LifecycleEvent type: {type(event)}. Event: {event}. Current status: {current_status_val}"
59
67
  )
60
68
  else:
61
69
  logger.warning(
62
70
  f"LifecycleEventLogger for agent '{agent_id}' received an "
63
- f"unexpected event type: {type(event)}. Event: {event}. Current phase: {current_phase_val}"
71
+ f"unexpected event type: {type(event)}. Event: {event}. Current status: {current_status_val}"
64
72
  )
@@ -6,7 +6,6 @@ from autobyteus.agent.handlers.base_event_handler import AgentEventHandler
6
6
  from autobyteus.agent.events import LLMCompleteResponseReceivedEvent
7
7
  from autobyteus.llm.utils.response_types import CompleteResponse
8
8
  from autobyteus.agent.llm_response_processor import BaseLLMResponseProcessor
9
- from autobyteus.tools.usage.parsers.exceptions import ToolUsageParseException
10
9
 
11
10
 
12
11
  if TYPE_CHECKING:
@@ -49,8 +48,8 @@ class LLMCompleteResponseReceivedEventHandler(AgentEventHandler):
49
48
  any_processor_took_action = False
50
49
 
51
50
  notifier: Optional['AgentExternalEventNotifier'] = None
52
- if context.phase_manager:
53
- notifier = context.phase_manager.notifier
51
+ if context.status_manager:
52
+ notifier = context.status_manager.notifier
54
53
 
55
54
  if not notifier: # pragma: no cover
56
55
  logger.error(f"Agent '{agent_id}': Notifier not available in LLMCompleteResponseReceivedEventHandler. Cannot emit complete response event.")
@@ -63,8 +62,15 @@ class LLMCompleteResponseReceivedEventHandler(AgentEventHandler):
63
62
  f"Proceeding to treat LLM response as output for this leg."
64
63
  )
65
64
  else:
65
+ valid_processors = []
66
+ for p in processor_instances_to_try:
67
+ if isinstance(p, BaseLLMResponseProcessor):
68
+ valid_processors.append(p)
69
+ else:
70
+ logger.error(f"Agent '{agent_id}': Invalid LLM response processor type in config: {type(p)}. Skipping.")
71
+
66
72
  # Sort processors by their order attribute
67
- sorted_processors = sorted(processor_instances_to_try, key=lambda p: p.get_order())
73
+ sorted_processors = sorted(valid_processors, key=lambda p: p.get_order())
68
74
  processor_names = [p.get_name() for p in sorted_processors]
69
75
  logger.debug(f"Agent '{agent_id}': Attempting LLM response processing in order: {processor_names}")
70
76
 
@@ -94,17 +100,6 @@ class LLMCompleteResponseReceivedEventHandler(AgentEventHandler):
94
100
  else:
95
101
  logger.debug(f"Agent '{agent_id}': LLMResponseProcessor '{processor_name_for_log}' did not handle the response.")
96
102
 
97
- except ToolUsageParseException as e_parse:
98
- # This is the key change: Catch the specific parsing exception
99
- logger.warning(f"Agent '{agent_id}': LLMResponseProcessor '{processor_name_for_log}' failed to parse tool usage: {e_parse}")
100
- if notifier:
101
- notifier.notify_agent_error_output_generation(
102
- error_source=f"LLMResponseProcessor.{processor_name_for_log}",
103
- error_message="The model's response contained a malformed tool call that could not be understood.",
104
- error_details=str(e_parse)
105
- )
106
- # A parsing failure should not prevent other processors from running.
107
-
108
103
  except Exception as e: # pragma: no cover
109
104
  logger.error(f"Agent '{agent_id}': Error while using LLMResponseProcessor '{processor_name_for_log}': {e}. This processor is skipped.", exc_info=True)
110
105
  if notifier: