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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (512) hide show
  1. autobyteus/agent/agent.py +15 -5
  2. autobyteus/agent/bootstrap_steps/__init__.py +1 -3
  3. autobyteus/agent/bootstrap_steps/agent_bootstrapper.py +3 -59
  4. autobyteus/agent/bootstrap_steps/base_bootstrap_step.py +1 -4
  5. autobyteus/agent/bootstrap_steps/mcp_server_prewarming_step.py +1 -3
  6. autobyteus/agent/bootstrap_steps/system_prompt_processing_step.py +16 -13
  7. autobyteus/agent/bootstrap_steps/workspace_context_initialization_step.py +2 -4
  8. autobyteus/agent/context/agent_config.py +43 -20
  9. autobyteus/agent/context/agent_context.py +23 -18
  10. autobyteus/agent/context/agent_runtime_state.py +23 -19
  11. autobyteus/agent/events/__init__.py +16 -1
  12. autobyteus/agent/events/agent_events.py +43 -3
  13. autobyteus/agent/events/agent_input_event_queue_manager.py +79 -26
  14. autobyteus/agent/events/event_store.py +57 -0
  15. autobyteus/agent/events/notifiers.py +74 -60
  16. autobyteus/agent/events/worker_event_dispatcher.py +21 -64
  17. autobyteus/agent/factory/agent_factory.py +52 -0
  18. autobyteus/agent/handlers/__init__.py +2 -0
  19. autobyteus/agent/handlers/approved_tool_invocation_event_handler.py +51 -34
  20. autobyteus/agent/handlers/bootstrap_event_handler.py +155 -0
  21. autobyteus/agent/handlers/inter_agent_message_event_handler.py +10 -0
  22. autobyteus/agent/handlers/lifecycle_event_logger.py +19 -11
  23. autobyteus/agent/handlers/llm_complete_response_received_event_handler.py +10 -15
  24. autobyteus/agent/handlers/llm_user_message_ready_event_handler.py +188 -48
  25. autobyteus/agent/handlers/tool_execution_approval_event_handler.py +0 -10
  26. autobyteus/agent/handlers/tool_invocation_request_event_handler.py +53 -48
  27. autobyteus/agent/handlers/tool_result_event_handler.py +7 -8
  28. autobyteus/agent/handlers/user_input_message_event_handler.py +10 -3
  29. autobyteus/agent/input_processor/memory_ingest_input_processor.py +40 -0
  30. autobyteus/agent/lifecycle/__init__.py +12 -0
  31. autobyteus/agent/lifecycle/base_processor.py +109 -0
  32. autobyteus/agent/lifecycle/events.py +35 -0
  33. autobyteus/agent/lifecycle/processor_definition.py +36 -0
  34. autobyteus/agent/lifecycle/processor_registry.py +106 -0
  35. autobyteus/agent/llm_request_assembler.py +98 -0
  36. autobyteus/agent/llm_response_processor/__init__.py +1 -8
  37. autobyteus/agent/message/context_file_type.py +1 -1
  38. autobyteus/agent/message/send_message_to.py +5 -4
  39. autobyteus/agent/runtime/agent_runtime.py +29 -21
  40. autobyteus/agent/runtime/agent_worker.py +98 -19
  41. autobyteus/agent/shutdown_steps/__init__.py +2 -0
  42. autobyteus/agent/shutdown_steps/agent_shutdown_orchestrator.py +2 -0
  43. autobyteus/agent/shutdown_steps/tool_cleanup_step.py +58 -0
  44. autobyteus/agent/status/__init__.py +14 -0
  45. autobyteus/agent/status/manager.py +93 -0
  46. autobyteus/agent/status/status_deriver.py +96 -0
  47. autobyteus/agent/{phases/phase_enum.py → status/status_enum.py} +16 -16
  48. autobyteus/agent/status/status_update_utils.py +73 -0
  49. autobyteus/agent/streaming/__init__.py +52 -5
  50. autobyteus/agent/streaming/adapters/__init__.py +18 -0
  51. autobyteus/agent/streaming/adapters/invocation_adapter.py +184 -0
  52. autobyteus/agent/streaming/adapters/tool_call_parsing.py +163 -0
  53. autobyteus/agent/streaming/adapters/tool_syntax_registry.py +67 -0
  54. autobyteus/agent/streaming/agent_event_stream.py +3 -178
  55. autobyteus/agent/streaming/api_tool_call/__init__.py +16 -0
  56. autobyteus/agent/streaming/api_tool_call/file_content_streamer.py +56 -0
  57. autobyteus/agent/streaming/api_tool_call/json_string_field_extractor.py +175 -0
  58. autobyteus/agent/streaming/api_tool_call_streaming_response_handler.py +4 -0
  59. autobyteus/agent/streaming/events/__init__.py +6 -0
  60. autobyteus/agent/streaming/events/stream_event_payloads.py +284 -0
  61. autobyteus/agent/streaming/events/stream_events.py +141 -0
  62. autobyteus/agent/streaming/handlers/__init__.py +15 -0
  63. autobyteus/agent/streaming/handlers/api_tool_call_streaming_response_handler.py +303 -0
  64. autobyteus/agent/streaming/handlers/parsing_streaming_response_handler.py +107 -0
  65. autobyteus/agent/streaming/handlers/pass_through_streaming_response_handler.py +107 -0
  66. autobyteus/agent/streaming/handlers/streaming_handler_factory.py +177 -0
  67. autobyteus/agent/streaming/handlers/streaming_response_handler.py +58 -0
  68. autobyteus/agent/streaming/parser/__init__.py +61 -0
  69. autobyteus/agent/streaming/parser/event_emitter.py +181 -0
  70. autobyteus/agent/streaming/parser/events.py +4 -0
  71. autobyteus/agent/streaming/parser/invocation_adapter.py +4 -0
  72. autobyteus/agent/streaming/parser/json_parsing_strategies/__init__.py +19 -0
  73. autobyteus/agent/streaming/parser/json_parsing_strategies/base.py +32 -0
  74. autobyteus/agent/streaming/parser/json_parsing_strategies/default.py +34 -0
  75. autobyteus/agent/streaming/parser/json_parsing_strategies/gemini.py +31 -0
  76. autobyteus/agent/streaming/parser/json_parsing_strategies/openai.py +64 -0
  77. autobyteus/agent/streaming/parser/json_parsing_strategies/registry.py +75 -0
  78. autobyteus/agent/streaming/parser/parser_context.py +227 -0
  79. autobyteus/agent/streaming/parser/parser_factory.py +132 -0
  80. autobyteus/agent/streaming/parser/sentinel_format.py +7 -0
  81. autobyteus/agent/streaming/parser/state_factory.py +62 -0
  82. autobyteus/agent/streaming/parser/states/__init__.py +1 -0
  83. autobyteus/agent/streaming/parser/states/base_state.py +60 -0
  84. autobyteus/agent/streaming/parser/states/custom_xml_tag_run_bash_parsing_state.py +38 -0
  85. autobyteus/agent/streaming/parser/states/custom_xml_tag_write_file_parsing_state.py +55 -0
  86. autobyteus/agent/streaming/parser/states/delimited_content_state.py +146 -0
  87. autobyteus/agent/streaming/parser/states/json_initialization_state.py +144 -0
  88. autobyteus/agent/streaming/parser/states/json_tool_parsing_state.py +137 -0
  89. autobyteus/agent/streaming/parser/states/sentinel_content_state.py +30 -0
  90. autobyteus/agent/streaming/parser/states/sentinel_initialization_state.py +117 -0
  91. autobyteus/agent/streaming/parser/states/text_state.py +78 -0
  92. autobyteus/agent/streaming/parser/states/xml_patch_file_tool_parsing_state.py +328 -0
  93. autobyteus/agent/streaming/parser/states/xml_run_bash_tool_parsing_state.py +129 -0
  94. autobyteus/agent/streaming/parser/states/xml_tag_initialization_state.py +151 -0
  95. autobyteus/agent/streaming/parser/states/xml_tool_parsing_state.py +63 -0
  96. autobyteus/agent/streaming/parser/states/xml_write_file_tool_parsing_state.py +343 -0
  97. autobyteus/agent/streaming/parser/strategies/__init__.py +17 -0
  98. autobyteus/agent/streaming/parser/strategies/base.py +24 -0
  99. autobyteus/agent/streaming/parser/strategies/json_tool_strategy.py +26 -0
  100. autobyteus/agent/streaming/parser/strategies/registry.py +28 -0
  101. autobyteus/agent/streaming/parser/strategies/sentinel_strategy.py +23 -0
  102. autobyteus/agent/streaming/parser/strategies/xml_tag_strategy.py +21 -0
  103. autobyteus/agent/streaming/parser/stream_scanner.py +167 -0
  104. autobyteus/agent/streaming/parser/streaming_parser.py +212 -0
  105. autobyteus/agent/streaming/parser/tool_call_parsing.py +4 -0
  106. autobyteus/agent/streaming/parser/tool_constants.py +7 -0
  107. autobyteus/agent/streaming/parser/tool_syntax_registry.py +4 -0
  108. autobyteus/agent/streaming/parser/xml_tool_parsing_state_registry.py +55 -0
  109. autobyteus/agent/streaming/parsing_streaming_response_handler.py +4 -0
  110. autobyteus/agent/streaming/pass_through_streaming_response_handler.py +4 -0
  111. autobyteus/agent/streaming/queue_streamer.py +3 -57
  112. autobyteus/agent/streaming/segments/__init__.py +5 -0
  113. autobyteus/agent/streaming/segments/segment_events.py +81 -0
  114. autobyteus/agent/streaming/stream_event_payloads.py +2 -198
  115. autobyteus/agent/streaming/stream_events.py +3 -128
  116. autobyteus/agent/streaming/streaming_handler_factory.py +4 -0
  117. autobyteus/agent/streaming/streaming_response_handler.py +4 -0
  118. autobyteus/agent/streaming/streams/__init__.py +5 -0
  119. autobyteus/agent/streaming/streams/agent_event_stream.py +197 -0
  120. autobyteus/agent/streaming/utils/__init__.py +5 -0
  121. autobyteus/agent/streaming/utils/queue_streamer.py +59 -0
  122. autobyteus/agent/system_prompt_processor/__init__.py +2 -0
  123. autobyteus/agent/system_prompt_processor/available_skills_processor.py +96 -0
  124. autobyteus/agent/system_prompt_processor/base_processor.py +1 -1
  125. autobyteus/agent/system_prompt_processor/processor_meta.py +15 -2
  126. autobyteus/agent/system_prompt_processor/tool_manifest_injector_processor.py +39 -58
  127. autobyteus/agent/token_budget.py +56 -0
  128. autobyteus/agent/tool_execution_result_processor/memory_ingest_tool_result_processor.py +29 -0
  129. autobyteus/agent/tool_invocation.py +16 -40
  130. autobyteus/agent/tool_invocation_preprocessor/__init__.py +9 -0
  131. autobyteus/agent/tool_invocation_preprocessor/base_preprocessor.py +45 -0
  132. autobyteus/agent/tool_invocation_preprocessor/processor_definition.py +15 -0
  133. autobyteus/agent/tool_invocation_preprocessor/processor_meta.py +33 -0
  134. autobyteus/agent/tool_invocation_preprocessor/processor_registry.py +60 -0
  135. autobyteus/agent/utils/wait_for_idle.py +12 -14
  136. autobyteus/agent/workspace/base_workspace.py +6 -27
  137. autobyteus/agent_team/agent_team.py +3 -3
  138. autobyteus/agent_team/agent_team_builder.py +1 -41
  139. autobyteus/agent_team/bootstrap_steps/__init__.py +0 -4
  140. autobyteus/agent_team/bootstrap_steps/agent_configuration_preparation_step.py +8 -18
  141. autobyteus/agent_team/bootstrap_steps/agent_team_bootstrapper.py +4 -16
  142. autobyteus/agent_team/bootstrap_steps/base_agent_team_bootstrap_step.py +1 -2
  143. autobyteus/agent_team/bootstrap_steps/coordinator_initialization_step.py +1 -2
  144. autobyteus/agent_team/bootstrap_steps/task_notifier_initialization_step.py +5 -6
  145. autobyteus/agent_team/bootstrap_steps/team_context_initialization_step.py +15 -15
  146. autobyteus/agent_team/context/agent_team_config.py +6 -3
  147. autobyteus/agent_team/context/agent_team_context.py +25 -3
  148. autobyteus/agent_team/context/agent_team_runtime_state.py +11 -8
  149. autobyteus/agent_team/events/__init__.py +11 -0
  150. autobyteus/agent_team/events/agent_team_event_dispatcher.py +22 -9
  151. autobyteus/agent_team/events/agent_team_events.py +16 -0
  152. autobyteus/agent_team/events/event_store.py +57 -0
  153. autobyteus/agent_team/factory/agent_team_factory.py +8 -0
  154. autobyteus/agent_team/handlers/inter_agent_message_request_event_handler.py +18 -2
  155. autobyteus/agent_team/handlers/lifecycle_agent_team_event_handler.py +21 -5
  156. autobyteus/agent_team/handlers/process_user_message_event_handler.py +17 -8
  157. autobyteus/agent_team/handlers/tool_approval_team_event_handler.py +19 -4
  158. autobyteus/agent_team/runtime/agent_team_runtime.py +41 -10
  159. autobyteus/agent_team/runtime/agent_team_worker.py +69 -5
  160. autobyteus/agent_team/status/__init__.py +14 -0
  161. autobyteus/agent_team/status/agent_team_status.py +18 -0
  162. autobyteus/agent_team/status/agent_team_status_manager.py +33 -0
  163. autobyteus/agent_team/status/status_deriver.py +62 -0
  164. autobyteus/agent_team/status/status_update_utils.py +42 -0
  165. autobyteus/agent_team/streaming/__init__.py +2 -2
  166. autobyteus/agent_team/streaming/agent_team_event_notifier.py +10 -10
  167. autobyteus/agent_team/streaming/agent_team_stream_event_payloads.py +7 -7
  168. autobyteus/agent_team/streaming/agent_team_stream_events.py +11 -11
  169. autobyteus/agent_team/system_prompt_processor/__init__.py +6 -0
  170. autobyteus/agent_team/system_prompt_processor/team_manifest_injector_processor.py +76 -0
  171. autobyteus/agent_team/task_notification/activation_policy.py +1 -1
  172. autobyteus/agent_team/task_notification/system_event_driven_agent_task_notifier.py +22 -22
  173. autobyteus/agent_team/task_notification/task_notification_mode.py +20 -1
  174. autobyteus/agent_team/utils/wait_for_idle.py +4 -4
  175. autobyteus/cli/agent_cli.py +18 -10
  176. autobyteus/cli/agent_team_tui/app.py +18 -15
  177. autobyteus/cli/agent_team_tui/state.py +21 -23
  178. autobyteus/cli/agent_team_tui/widgets/agent_list_sidebar.py +15 -15
  179. autobyteus/cli/agent_team_tui/widgets/focus_pane.py +146 -39
  180. autobyteus/cli/agent_team_tui/widgets/renderables.py +1 -1
  181. autobyteus/cli/agent_team_tui/widgets/shared.py +26 -26
  182. autobyteus/cli/agent_team_tui/widgets/{task_board_panel.py → task_plan_panel.py} +5 -5
  183. autobyteus/cli/cli_display.py +193 -44
  184. autobyteus/cli/workflow_tui/app.py +9 -10
  185. autobyteus/cli/workflow_tui/state.py +14 -16
  186. autobyteus/cli/workflow_tui/widgets/agent_list_sidebar.py +15 -15
  187. autobyteus/cli/workflow_tui/widgets/focus_pane.py +137 -35
  188. autobyteus/cli/workflow_tui/widgets/renderables.py +1 -1
  189. autobyteus/cli/workflow_tui/widgets/shared.py +25 -25
  190. autobyteus/clients/autobyteus_client.py +94 -1
  191. autobyteus/events/event_types.py +15 -21
  192. autobyteus/llm/api/autobyteus_llm.py +33 -29
  193. autobyteus/llm/api/claude_llm.py +142 -36
  194. autobyteus/llm/api/gemini_llm.py +163 -59
  195. autobyteus/llm/api/grok_llm.py +1 -1
  196. autobyteus/llm/api/minimax_llm.py +26 -0
  197. autobyteus/llm/api/mistral_llm.py +113 -87
  198. autobyteus/llm/api/ollama_llm.py +9 -42
  199. autobyteus/llm/api/openai_compatible_llm.py +127 -91
  200. autobyteus/llm/api/openai_llm.py +3 -3
  201. autobyteus/llm/api/openai_responses_llm.py +324 -0
  202. autobyteus/llm/api/zhipu_llm.py +21 -2
  203. autobyteus/llm/autobyteus_provider.py +70 -60
  204. autobyteus/llm/base_llm.py +85 -81
  205. autobyteus/llm/converters/__init__.py +14 -0
  206. autobyteus/llm/converters/anthropic_tool_call_converter.py +37 -0
  207. autobyteus/llm/converters/gemini_tool_call_converter.py +57 -0
  208. autobyteus/llm/converters/mistral_tool_call_converter.py +37 -0
  209. autobyteus/llm/converters/openai_tool_call_converter.py +38 -0
  210. autobyteus/llm/extensions/base_extension.py +6 -12
  211. autobyteus/llm/extensions/token_usage_tracking_extension.py +45 -18
  212. autobyteus/llm/llm_factory.py +282 -204
  213. autobyteus/llm/lmstudio_provider.py +60 -49
  214. autobyteus/llm/models.py +35 -2
  215. autobyteus/llm/ollama_provider.py +60 -49
  216. autobyteus/llm/ollama_provider_resolver.py +0 -1
  217. autobyteus/llm/prompt_renderers/__init__.py +19 -0
  218. autobyteus/llm/prompt_renderers/anthropic_prompt_renderer.py +104 -0
  219. autobyteus/llm/prompt_renderers/autobyteus_prompt_renderer.py +19 -0
  220. autobyteus/llm/prompt_renderers/base_prompt_renderer.py +10 -0
  221. autobyteus/llm/prompt_renderers/gemini_prompt_renderer.py +63 -0
  222. autobyteus/llm/prompt_renderers/mistral_prompt_renderer.py +87 -0
  223. autobyteus/llm/prompt_renderers/ollama_prompt_renderer.py +51 -0
  224. autobyteus/llm/prompt_renderers/openai_chat_renderer.py +97 -0
  225. autobyteus/llm/prompt_renderers/openai_responses_renderer.py +101 -0
  226. autobyteus/llm/providers.py +1 -3
  227. autobyteus/llm/token_counter/claude_token_counter.py +56 -25
  228. autobyteus/llm/token_counter/mistral_token_counter.py +12 -8
  229. autobyteus/llm/token_counter/openai_token_counter.py +24 -5
  230. autobyteus/llm/token_counter/token_counter_factory.py +12 -5
  231. autobyteus/llm/utils/llm_config.py +6 -12
  232. autobyteus/llm/utils/media_payload_formatter.py +27 -20
  233. autobyteus/llm/utils/messages.py +55 -3
  234. autobyteus/llm/utils/response_types.py +3 -0
  235. autobyteus/llm/utils/tool_call_delta.py +31 -0
  236. autobyteus/memory/__init__.py +32 -0
  237. autobyteus/memory/active_transcript.py +69 -0
  238. autobyteus/memory/compaction/__init__.py +9 -0
  239. autobyteus/memory/compaction/compaction_result.py +8 -0
  240. autobyteus/memory/compaction/compactor.py +89 -0
  241. autobyteus/memory/compaction/summarizer.py +11 -0
  242. autobyteus/memory/compaction_snapshot_builder.py +84 -0
  243. autobyteus/memory/memory_manager.py +183 -0
  244. autobyteus/memory/models/__init__.py +14 -0
  245. autobyteus/memory/models/episodic_item.py +41 -0
  246. autobyteus/memory/models/memory_types.py +7 -0
  247. autobyteus/memory/models/raw_trace_item.py +79 -0
  248. autobyteus/memory/models/semantic_item.py +41 -0
  249. autobyteus/memory/models/tool_interaction.py +20 -0
  250. autobyteus/memory/policies/__init__.py +5 -0
  251. autobyteus/memory/policies/compaction_policy.py +16 -0
  252. autobyteus/memory/retrieval/__init__.py +7 -0
  253. autobyteus/memory/retrieval/memory_bundle.py +11 -0
  254. autobyteus/memory/retrieval/retriever.py +13 -0
  255. autobyteus/memory/store/__init__.py +7 -0
  256. autobyteus/memory/store/base_store.py +14 -0
  257. autobyteus/memory/store/file_store.py +98 -0
  258. autobyteus/memory/tool_interaction_builder.py +46 -0
  259. autobyteus/memory/turn_tracker.py +9 -0
  260. autobyteus/multimedia/audio/api/__init__.py +3 -2
  261. autobyteus/multimedia/audio/api/autobyteus_audio_client.py +19 -5
  262. autobyteus/multimedia/audio/api/gemini_audio_client.py +108 -16
  263. autobyteus/multimedia/audio/api/openai_audio_client.py +112 -0
  264. autobyteus/multimedia/audio/audio_client_factory.py +84 -9
  265. autobyteus/multimedia/audio/audio_model.py +2 -1
  266. autobyteus/multimedia/image/api/autobyteus_image_client.py +19 -5
  267. autobyteus/multimedia/image/api/gemini_image_client.py +38 -17
  268. autobyteus/multimedia/image/api/openai_image_client.py +125 -43
  269. autobyteus/multimedia/image/autobyteus_image_provider.py +2 -1
  270. autobyteus/multimedia/image/image_client_factory.py +47 -15
  271. autobyteus/multimedia/image/image_model.py +5 -2
  272. autobyteus/multimedia/providers.py +3 -2
  273. autobyteus/skills/loader.py +71 -0
  274. autobyteus/skills/model.py +11 -0
  275. autobyteus/skills/registry.py +70 -0
  276. autobyteus/task_management/__init__.py +43 -20
  277. autobyteus/task_management/{base_task_board.py → base_task_plan.py} +16 -13
  278. autobyteus/task_management/converters/__init__.py +2 -2
  279. autobyteus/task_management/converters/{task_board_converter.py → task_plan_converter.py} +13 -13
  280. autobyteus/task_management/events.py +7 -7
  281. autobyteus/task_management/{in_memory_task_board.py → in_memory_task_plan.py} +34 -22
  282. autobyteus/task_management/schemas/__init__.py +3 -0
  283. autobyteus/task_management/schemas/task_status_report.py +2 -2
  284. autobyteus/task_management/schemas/todo_definition.py +15 -0
  285. autobyteus/task_management/todo.py +29 -0
  286. autobyteus/task_management/todo_list.py +75 -0
  287. autobyteus/task_management/tools/__init__.py +24 -8
  288. autobyteus/task_management/tools/task_tools/__init__.py +19 -0
  289. autobyteus/task_management/tools/{assign_task_to.py → task_tools/assign_task_to.py} +18 -18
  290. autobyteus/task_management/tools/{publish_task.py → task_tools/create_task.py} +16 -18
  291. autobyteus/task_management/tools/{publish_tasks.py → task_tools/create_tasks.py} +19 -19
  292. autobyteus/task_management/tools/{get_my_tasks.py → task_tools/get_my_tasks.py} +15 -15
  293. autobyteus/task_management/tools/{get_task_board_status.py → task_tools/get_task_plan_status.py} +16 -16
  294. autobyteus/task_management/tools/{update_task_status.py → task_tools/update_task_status.py} +16 -16
  295. autobyteus/task_management/tools/todo_tools/__init__.py +18 -0
  296. autobyteus/task_management/tools/todo_tools/add_todo.py +78 -0
  297. autobyteus/task_management/tools/todo_tools/create_todo_list.py +79 -0
  298. autobyteus/task_management/tools/todo_tools/get_todo_list.py +55 -0
  299. autobyteus/task_management/tools/todo_tools/update_todo_status.py +85 -0
  300. autobyteus/tools/__init__.py +43 -52
  301. autobyteus/tools/base_tool.py +7 -0
  302. autobyteus/tools/file/__init__.py +9 -0
  303. autobyteus/tools/file/patch_file.py +149 -0
  304. autobyteus/tools/file/{file_reader.py → read_file.py} +38 -7
  305. autobyteus/tools/file/{file_writer.py → write_file.py} +7 -4
  306. autobyteus/tools/functional_tool.py +53 -14
  307. autobyteus/tools/mcp/__init__.py +2 -0
  308. autobyteus/tools/mcp/config_service.py +5 -1
  309. autobyteus/tools/mcp/server/__init__.py +2 -0
  310. autobyteus/tools/mcp/server/http_managed_mcp_server.py +1 -1
  311. autobyteus/tools/mcp/server/websocket_managed_mcp_server.py +141 -0
  312. autobyteus/tools/mcp/server_instance_manager.py +8 -1
  313. autobyteus/tools/mcp/tool.py +3 -3
  314. autobyteus/tools/mcp/tool_registrar.py +5 -2
  315. autobyteus/tools/mcp/types.py +61 -0
  316. autobyteus/tools/multimedia/__init__.py +2 -1
  317. autobyteus/tools/multimedia/audio_tools.py +72 -19
  318. autobyteus/tools/{download_media_tool.py → multimedia/download_media_tool.py} +21 -7
  319. autobyteus/tools/multimedia/image_tools.py +248 -64
  320. autobyteus/tools/multimedia/media_reader_tool.py +1 -1
  321. autobyteus/tools/operation_executor/journal_manager.py +107 -0
  322. autobyteus/tools/operation_executor/operation_event_buffer.py +57 -0
  323. autobyteus/tools/operation_executor/operation_event_producer.py +29 -0
  324. autobyteus/tools/operation_executor/operation_executor.py +58 -0
  325. autobyteus/tools/registry/tool_definition.py +108 -14
  326. autobyteus/tools/registry/tool_registry.py +29 -0
  327. autobyteus/tools/search/__init__.py +17 -0
  328. autobyteus/tools/search/base_strategy.py +35 -0
  329. autobyteus/tools/search/client.py +24 -0
  330. autobyteus/tools/search/factory.py +81 -0
  331. autobyteus/tools/search/google_cse_strategy.py +68 -0
  332. autobyteus/tools/search/providers.py +10 -0
  333. autobyteus/tools/search/serpapi_strategy.py +65 -0
  334. autobyteus/tools/search/serper_strategy.py +87 -0
  335. autobyteus/tools/search_tool.py +83 -0
  336. autobyteus/tools/skill/load_skill.py +50 -0
  337. autobyteus/tools/terminal/__init__.py +45 -0
  338. autobyteus/tools/terminal/ansi_utils.py +32 -0
  339. autobyteus/tools/terminal/background_process_manager.py +233 -0
  340. autobyteus/tools/terminal/output_buffer.py +105 -0
  341. autobyteus/tools/terminal/prompt_detector.py +63 -0
  342. autobyteus/tools/terminal/pty_session.py +241 -0
  343. autobyteus/tools/terminal/session_factory.py +20 -0
  344. autobyteus/tools/terminal/terminal_session_manager.py +226 -0
  345. autobyteus/tools/terminal/tools/__init__.py +13 -0
  346. autobyteus/tools/terminal/tools/get_process_output.py +81 -0
  347. autobyteus/tools/terminal/tools/run_bash.py +109 -0
  348. autobyteus/tools/terminal/tools/start_background_process.py +104 -0
  349. autobyteus/tools/terminal/tools/stop_background_process.py +67 -0
  350. autobyteus/tools/terminal/types.py +54 -0
  351. autobyteus/tools/terminal/wsl_tmux_session.py +221 -0
  352. autobyteus/tools/terminal/wsl_utils.py +156 -0
  353. autobyteus/tools/tool_meta.py +4 -24
  354. autobyteus/tools/transaction_management/backup_handler.py +48 -0
  355. autobyteus/tools/transaction_management/operation_lifecycle_manager.py +62 -0
  356. autobyteus/tools/usage/__init__.py +1 -2
  357. autobyteus/tools/usage/formatters/__init__.py +17 -1
  358. autobyteus/tools/usage/formatters/base_formatter.py +8 -0
  359. autobyteus/tools/usage/formatters/default_xml_schema_formatter.py +2 -2
  360. autobyteus/tools/usage/formatters/mistral_json_schema_formatter.py +18 -0
  361. autobyteus/tools/usage/formatters/patch_file_xml_example_formatter.py +64 -0
  362. autobyteus/tools/usage/formatters/patch_file_xml_schema_formatter.py +31 -0
  363. autobyteus/tools/usage/formatters/run_bash_xml_example_formatter.py +32 -0
  364. autobyteus/tools/usage/formatters/run_bash_xml_schema_formatter.py +36 -0
  365. autobyteus/tools/usage/formatters/write_file_xml_example_formatter.py +53 -0
  366. autobyteus/tools/usage/formatters/write_file_xml_schema_formatter.py +31 -0
  367. autobyteus/tools/usage/providers/tool_manifest_provider.py +10 -10
  368. autobyteus/tools/usage/registries/__init__.py +1 -3
  369. autobyteus/tools/usage/registries/tool_formatting_registry.py +115 -8
  370. autobyteus/tools/usage/tool_schema_provider.py +51 -0
  371. autobyteus/tools/web/__init__.py +4 -0
  372. autobyteus/tools/web/read_url_tool.py +80 -0
  373. autobyteus/utils/diff_utils.py +271 -0
  374. autobyteus/utils/download_utils.py +109 -0
  375. autobyteus/utils/file_utils.py +57 -2
  376. autobyteus/utils/gemini_helper.py +56 -0
  377. autobyteus/utils/gemini_model_mapping.py +71 -0
  378. autobyteus/utils/llm_output_formatter.py +75 -0
  379. autobyteus/utils/tool_call_format.py +36 -0
  380. autobyteus/workflow/agentic_workflow.py +3 -3
  381. autobyteus/workflow/bootstrap_steps/agent_tool_injection_step.py +2 -2
  382. autobyteus/workflow/bootstrap_steps/base_workflow_bootstrap_step.py +2 -2
  383. autobyteus/workflow/bootstrap_steps/coordinator_initialization_step.py +2 -2
  384. autobyteus/workflow/bootstrap_steps/coordinator_prompt_preparation_step.py +4 -11
  385. autobyteus/workflow/bootstrap_steps/workflow_bootstrapper.py +6 -6
  386. autobyteus/workflow/bootstrap_steps/workflow_runtime_queue_initialization_step.py +2 -2
  387. autobyteus/workflow/context/workflow_context.py +3 -3
  388. autobyteus/workflow/context/workflow_runtime_state.py +5 -5
  389. autobyteus/workflow/events/workflow_event_dispatcher.py +5 -5
  390. autobyteus/workflow/handlers/lifecycle_workflow_event_handler.py +3 -3
  391. autobyteus/workflow/handlers/process_user_message_event_handler.py +5 -5
  392. autobyteus/workflow/handlers/tool_approval_workflow_event_handler.py +2 -2
  393. autobyteus/workflow/runtime/workflow_runtime.py +8 -8
  394. autobyteus/workflow/runtime/workflow_worker.py +3 -3
  395. autobyteus/workflow/status/__init__.py +11 -0
  396. autobyteus/workflow/status/workflow_status.py +19 -0
  397. autobyteus/workflow/status/workflow_status_manager.py +48 -0
  398. autobyteus/workflow/streaming/__init__.py +2 -2
  399. autobyteus/workflow/streaming/workflow_event_notifier.py +7 -7
  400. autobyteus/workflow/streaming/workflow_stream_event_payloads.py +4 -4
  401. autobyteus/workflow/streaming/workflow_stream_events.py +3 -3
  402. autobyteus/workflow/utils/wait_for_idle.py +4 -4
  403. autobyteus-1.2.3.dist-info/METADATA +293 -0
  404. autobyteus-1.2.3.dist-info/RECORD +600 -0
  405. {autobyteus-1.2.0.dist-info → autobyteus-1.2.3.dist-info}/WHEEL +1 -1
  406. {autobyteus-1.2.0.dist-info → autobyteus-1.2.3.dist-info}/top_level.txt +0 -1
  407. autobyteus/agent/bootstrap_steps/agent_runtime_queue_initialization_step.py +0 -57
  408. autobyteus/agent/hooks/__init__.py +0 -16
  409. autobyteus/agent/hooks/base_phase_hook.py +0 -78
  410. autobyteus/agent/hooks/hook_definition.py +0 -36
  411. autobyteus/agent/hooks/hook_meta.py +0 -37
  412. autobyteus/agent/hooks/hook_registry.py +0 -106
  413. autobyteus/agent/llm_response_processor/provider_aware_tool_usage_processor.py +0 -103
  414. autobyteus/agent/phases/__init__.py +0 -18
  415. autobyteus/agent/phases/discover.py +0 -53
  416. autobyteus/agent/phases/manager.py +0 -265
  417. autobyteus/agent/phases/transition_decorator.py +0 -40
  418. autobyteus/agent/phases/transition_info.py +0 -33
  419. autobyteus/agent/remote_agent.py +0 -244
  420. autobyteus/agent/workspace/workspace_definition.py +0 -36
  421. autobyteus/agent/workspace/workspace_meta.py +0 -37
  422. autobyteus/agent/workspace/workspace_registry.py +0 -72
  423. autobyteus/agent_team/bootstrap_steps/agent_team_runtime_queue_initialization_step.py +0 -25
  424. autobyteus/agent_team/bootstrap_steps/coordinator_prompt_preparation_step.py +0 -85
  425. autobyteus/agent_team/phases/__init__.py +0 -11
  426. autobyteus/agent_team/phases/agent_team_operational_phase.py +0 -19
  427. autobyteus/agent_team/phases/agent_team_phase_manager.py +0 -48
  428. autobyteus/llm/api/bedrock_llm.py +0 -92
  429. autobyteus/llm/api/groq_llm.py +0 -94
  430. autobyteus/llm/api/nvidia_llm.py +0 -108
  431. autobyteus/llm/utils/token_pricing_config.py +0 -87
  432. autobyteus/person/examples/sample_persons.py +0 -14
  433. autobyteus/person/examples/sample_roles.py +0 -14
  434. autobyteus/person/person.py +0 -29
  435. autobyteus/person/role.py +0 -14
  436. autobyteus/rpc/__init__.py +0 -73
  437. autobyteus/rpc/client/__init__.py +0 -17
  438. autobyteus/rpc/client/abstract_client_connection.py +0 -124
  439. autobyteus/rpc/client/client_connection_manager.py +0 -153
  440. autobyteus/rpc/client/sse_client_connection.py +0 -306
  441. autobyteus/rpc/client/stdio_client_connection.py +0 -280
  442. autobyteus/rpc/config/__init__.py +0 -13
  443. autobyteus/rpc/config/agent_server_config.py +0 -153
  444. autobyteus/rpc/config/agent_server_registry.py +0 -152
  445. autobyteus/rpc/hosting.py +0 -244
  446. autobyteus/rpc/protocol.py +0 -244
  447. autobyteus/rpc/server/__init__.py +0 -20
  448. autobyteus/rpc/server/agent_server_endpoint.py +0 -181
  449. autobyteus/rpc/server/base_method_handler.py +0 -40
  450. autobyteus/rpc/server/method_handlers.py +0 -259
  451. autobyteus/rpc/server/sse_server_handler.py +0 -182
  452. autobyteus/rpc/server/stdio_server_handler.py +0 -151
  453. autobyteus/rpc/server_main.py +0 -198
  454. autobyteus/rpc/transport_type.py +0 -13
  455. autobyteus/tools/bash/__init__.py +0 -2
  456. autobyteus/tools/bash/bash_executor.py +0 -100
  457. autobyteus/tools/browser/__init__.py +0 -2
  458. autobyteus/tools/browser/session_aware/__init__.py +0 -0
  459. autobyteus/tools/browser/session_aware/browser_session_aware_navigate_to.py +0 -75
  460. autobyteus/tools/browser/session_aware/browser_session_aware_tool.py +0 -30
  461. autobyteus/tools/browser/session_aware/browser_session_aware_web_element_trigger.py +0 -154
  462. autobyteus/tools/browser/session_aware/browser_session_aware_webpage_reader.py +0 -89
  463. autobyteus/tools/browser/session_aware/browser_session_aware_webpage_screenshot_taker.py +0 -107
  464. autobyteus/tools/browser/session_aware/factory/__init__.py +0 -0
  465. autobyteus/tools/browser/session_aware/factory/browser_session_aware_web_element_trigger_factory.py +0 -14
  466. autobyteus/tools/browser/session_aware/factory/browser_session_aware_webpage_reader_factory.py +0 -26
  467. autobyteus/tools/browser/session_aware/factory/browser_session_aware_webpage_screenshot_taker_factory.py +0 -14
  468. autobyteus/tools/browser/session_aware/shared_browser_session.py +0 -11
  469. autobyteus/tools/browser/session_aware/shared_browser_session_manager.py +0 -25
  470. autobyteus/tools/browser/session_aware/web_element_action.py +0 -20
  471. autobyteus/tools/browser/standalone/__init__.py +0 -6
  472. autobyteus/tools/browser/standalone/factory/__init__.py +0 -0
  473. autobyteus/tools/browser/standalone/factory/webpage_reader_factory.py +0 -25
  474. autobyteus/tools/browser/standalone/factory/webpage_screenshot_taker_factory.py +0 -14
  475. autobyteus/tools/browser/standalone/navigate_to.py +0 -80
  476. autobyteus/tools/browser/standalone/web_page_pdf_generator.py +0 -97
  477. autobyteus/tools/browser/standalone/webpage_image_downloader.py +0 -165
  478. autobyteus/tools/browser/standalone/webpage_reader.py +0 -101
  479. autobyteus/tools/browser/standalone/webpage_screenshot_taker.py +0 -101
  480. autobyteus/tools/file/file_editor.py +0 -200
  481. autobyteus/tools/google_search.py +0 -149
  482. autobyteus/tools/timer.py +0 -171
  483. autobyteus/tools/usage/parsers/__init__.py +0 -22
  484. autobyteus/tools/usage/parsers/_json_extractor.py +0 -99
  485. autobyteus/tools/usage/parsers/_string_decoders.py +0 -18
  486. autobyteus/tools/usage/parsers/anthropic_xml_tool_usage_parser.py +0 -10
  487. autobyteus/tools/usage/parsers/base_parser.py +0 -41
  488. autobyteus/tools/usage/parsers/default_json_tool_usage_parser.py +0 -83
  489. autobyteus/tools/usage/parsers/default_xml_tool_usage_parser.py +0 -316
  490. autobyteus/tools/usage/parsers/exceptions.py +0 -13
  491. autobyteus/tools/usage/parsers/gemini_json_tool_usage_parser.py +0 -77
  492. autobyteus/tools/usage/parsers/openai_json_tool_usage_parser.py +0 -149
  493. autobyteus/tools/usage/parsers/provider_aware_tool_usage_parser.py +0 -59
  494. autobyteus/tools/usage/registries/tool_usage_parser_registry.py +0 -62
  495. autobyteus/workflow/phases/__init__.py +0 -11
  496. autobyteus/workflow/phases/workflow_operational_phase.py +0 -19
  497. autobyteus/workflow/phases/workflow_phase_manager.py +0 -48
  498. autobyteus-1.2.0.dist-info/METADATA +0 -205
  499. autobyteus-1.2.0.dist-info/RECORD +0 -496
  500. examples/__init__.py +0 -1
  501. examples/agent_team/__init__.py +0 -1
  502. examples/discover_phase_transitions.py +0 -104
  503. examples/run_browser_agent.py +0 -262
  504. examples/run_google_slides_agent.py +0 -287
  505. examples/run_mcp_browser_client.py +0 -174
  506. examples/run_mcp_google_slides_client.py +0 -270
  507. examples/run_mcp_list_tools.py +0 -189
  508. examples/run_poem_writer.py +0 -284
  509. examples/run_sqlite_agent.py +0 -295
  510. /autobyteus/{person → skills}/__init__.py +0 -0
  511. /autobyteus/{person/examples → tools/skill}/__init__.py +0 -0
  512. {autobyteus-1.2.0.dist-info → autobyteus-1.2.3.dist-info}/licenses/LICENSE +0 -0
@@ -1,117 +1,74 @@
1
1
  # file: autobyteus/autobyteus/agent/events/worker_event_dispatcher.py
2
- import asyncio
3
2
  import logging
4
3
  import traceback
5
- from typing import TYPE_CHECKING, Optional
4
+ from typing import TYPE_CHECKING
6
5
 
7
- from autobyteus.agent.phases import AgentOperationalPhase
6
+ from autobyteus.agent.status.status_enum import AgentStatus
7
+ from autobyteus.agent.status.status_update_utils import apply_event_and_derive_status
8
8
  from autobyteus.agent.events.agent_events import ( # Updated relative import path if needed, but BaseEvent is fine
9
9
  BaseEvent,
10
- AgentReadyEvent,
11
10
  AgentErrorEvent,
12
- LLMUserMessageReadyEvent,
13
- PendingToolInvocationEvent,
14
- ToolExecutionApprovalEvent,
15
- ToolResultEvent,
11
+ AgentIdleEvent,
16
12
  LLMCompleteResponseReceivedEvent,
17
- UserMessageReceivedEvent,
18
- InterAgentMessageReceivedEvent,
19
13
  )
20
14
 
21
15
  if TYPE_CHECKING:
22
16
  from autobyteus.agent.context import AgentContext
23
17
  from autobyteus.agent.handlers import EventHandlerRegistry
24
- from autobyteus.agent.phases import AgentPhaseManager
25
18
  logger = logging.getLogger(__name__)
26
19
 
27
20
  class WorkerEventDispatcher:
28
21
  """
29
22
  Responsible for dispatching events to their appropriate handlers within an AgentWorker.
30
- It also manages related phase transitions that occur immediately before or after
23
+ It also manages related status updates that occur immediately before or after
31
24
  an event is handled. This component is part of the agent's event system.
32
25
  """
33
26
 
34
27
  def __init__(self,
35
- event_handler_registry: 'EventHandlerRegistry',
36
- phase_manager: 'AgentPhaseManager'):
28
+ event_handler_registry: 'EventHandlerRegistry'):
37
29
  """
38
30
  Initializes the WorkerEventDispatcher.
39
31
 
40
32
  Args:
41
33
  event_handler_registry: The registry for event handlers.
42
- phase_manager: The agent's phase manager.
43
34
  """
44
35
  self.event_handler_registry: 'EventHandlerRegistry' = event_handler_registry
45
- self.phase_manager: 'AgentPhaseManager' = phase_manager
46
36
  logger.debug("WorkerEventDispatcher initialized.")
47
37
 
48
38
  async def dispatch(self, event: BaseEvent, context: 'AgentContext') -> None: # pragma: no cover
49
39
  """
50
- Dispatches an event to its registered handler and manages phase transitions.
40
+ Dispatches an event to its registered handler and manages status updates.
51
41
  """
52
42
  event_class = type(event)
53
43
  handler = self.event_handler_registry.get_handler(event_class)
54
44
  agent_id = context.agent_id
55
45
 
46
+ try:
47
+ await apply_event_and_derive_status(event, context)
48
+ except Exception as e: # pragma: no cover
49
+ logger.error(f"WorkerEventDispatcher '{agent_id}': Status projection failed: {e}", exc_info=True)
50
+
56
51
  if handler:
57
52
  event_class_name = event_class.__name__
58
53
  handler_class_name = type(handler).__name__
59
54
 
60
- current_phase_before_dispatch = context.current_phase
61
-
62
- if current_phase_before_dispatch == AgentOperationalPhase.IDLE:
63
- if isinstance(event, (UserMessageReceivedEvent, InterAgentMessageReceivedEvent)):
64
- await self.phase_manager.notify_processing_input_started(trigger_info=type(event).__name__)
65
-
66
- if isinstance(event, LLMUserMessageReadyEvent):
67
- if current_phase_before_dispatch not in [AgentOperationalPhase.AWAITING_LLM_RESPONSE, AgentOperationalPhase.ERROR]:
68
- await self.phase_manager.notify_awaiting_llm_response()
69
- elif isinstance(event, PendingToolInvocationEvent):
70
- if not context.auto_execute_tools:
71
- await self.phase_manager.notify_tool_execution_pending_approval(event.tool_invocation)
72
- else:
73
- await self.phase_manager.notify_tool_execution_started(event.tool_invocation.name)
74
- elif isinstance(event, ToolExecutionApprovalEvent):
75
- tool_name_for_approval: Optional[str] = None
76
- pending_invocation = context.state.pending_tool_approvals.get(event.tool_invocation_id)
77
- if pending_invocation:
78
- tool_name_for_approval = pending_invocation.name
79
- else:
80
- logger.warning(f"WorkerEventDispatcher '{agent_id}': Could not find pending invocation for ID '{event.tool_invocation_id}' to get tool name for phase notification.")
81
- tool_name_for_approval = "unknown_tool"
82
-
83
- await self.phase_manager.notify_tool_execution_resumed_after_approval(
84
- approved=event.is_approved,
85
- tool_name=tool_name_for_approval
86
- )
87
- elif isinstance(event, ToolResultEvent):
88
- if context.current_phase == AgentOperationalPhase.EXECUTING_TOOL:
89
- await self.phase_manager.notify_processing_tool_result(event.tool_name)
90
- elif isinstance(event, LLMCompleteResponseReceivedEvent):
91
- if context.current_phase == AgentOperationalPhase.AWAITING_LLM_RESPONSE:
92
- await self.phase_manager.notify_analyzing_llm_response()
93
-
94
55
  try:
95
- logger.debug(f"WorkerEventDispatcher '{agent_id}' (Phase: {context.current_phase.value}) dispatching '{event_class_name}' to {handler_class_name}.")
56
+ logger.debug(f"WorkerEventDispatcher '{agent_id}' (Status: {context.current_status.value}) dispatching '{event_class_name}' to {handler_class_name}.")
96
57
  await handler.handle(event, context)
97
- logger.debug(f"WorkerEventDispatcher '{agent_id}' (Phase: {context.current_phase.value}) event '{event_class_name}' handled by {handler_class_name}.")
98
-
99
- if isinstance(event, AgentReadyEvent):
100
- await self.phase_manager.notify_initialization_complete()
101
-
102
- if isinstance(event, LLMCompleteResponseReceivedEvent):
103
- if context.current_phase == AgentOperationalPhase.ANALYZING_LLM_RESPONSE and \
104
- not context.state.pending_tool_approvals and \
105
- context.input_event_queues.tool_invocation_request_queue.empty():
106
- await self.phase_manager.notify_processing_complete_and_idle()
58
+ logger.debug(f"WorkerEventDispatcher '{agent_id}' (Status: {context.current_status.value}) event '{event_class_name}' handled by {handler_class_name}.")
107
59
 
108
60
  except Exception as e:
109
61
  error_details = traceback.format_exc()
110
62
  error_msg = f"WorkerEventDispatcher '{agent_id}' error handling '{event_class_name}' with {handler_class_name}: {e}"
111
63
  logger.error(error_msg, exc_info=True)
112
- await self.phase_manager.notify_error_occurred(error_msg, error_details)
113
64
  await context.input_event_queues.enqueue_internal_system_event(
114
65
  AgentErrorEvent(error_message=error_msg, exception_details=error_details)
115
66
  )
67
+ else:
68
+ if isinstance(event, LLMCompleteResponseReceivedEvent):
69
+ if context.current_status == AgentStatus.ANALYZING_LLM_RESPONSE and \
70
+ not context.state.pending_tool_approvals and \
71
+ context.input_event_queues.tool_invocation_request_queue.empty():
72
+ await context.input_event_queues.enqueue_internal_system_event(AgentIdleEvent())
116
73
  else:
117
- logger.warning(f"WorkerEventDispatcher '{agent_id}' (Phase: {context.current_phase.value}) No handler for '{event_class.__name__}'. Event: {event}")
74
+ logger.warning(f"WorkerEventDispatcher '{agent_id}' (Status: {context.current_status.value}) No handler for '{event_class.__name__}'. Event: {event}")
@@ -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
  )