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
@@ -0,0 +1,40 @@
1
+ import logging
2
+ from typing import TYPE_CHECKING
3
+
4
+ from autobyteus.agent.input_processor.base_user_input_processor import BaseAgentUserInputMessageProcessor
5
+ from autobyteus.agent.message.multimodal_message_builder import build_llm_user_message
6
+
7
+ if TYPE_CHECKING:
8
+ from autobyteus.agent.message.agent_input_user_message import AgentInputUserMessage
9
+ from autobyteus.agent.context import AgentContext
10
+ from autobyteus.agent.events import UserMessageReceivedEvent
11
+
12
+ logger = logging.getLogger(__name__)
13
+
14
+
15
+ class MemoryIngestInputProcessor(BaseAgentUserInputMessageProcessor):
16
+ @classmethod
17
+ def get_order(cls) -> int:
18
+ return 900
19
+
20
+ async def process(
21
+ self,
22
+ message: "AgentInputUserMessage",
23
+ context: "AgentContext",
24
+ triggering_event: "UserMessageReceivedEvent",
25
+ ) -> "AgentInputUserMessage":
26
+ memory_manager = getattr(context.state, "memory_manager", None)
27
+ if not memory_manager:
28
+ return message
29
+
30
+ turn_id = memory_manager.start_turn()
31
+ context.state.active_turn_id = turn_id
32
+
33
+ llm_user_message = build_llm_user_message(message)
34
+ memory_manager.ingest_user_message(
35
+ llm_user_message,
36
+ turn_id=turn_id,
37
+ source_event="LLMUserMessageReadyEvent",
38
+ )
39
+ logger.debug("MemoryIngestInputProcessor stored processed user input with turn_id %s", turn_id)
40
+ return message
@@ -0,0 +1,12 @@
1
+ # file: autobyteus/agent/lifecycle/__init__.py
2
+ """
3
+ Lifecycle module provides simplified extension points for agent lifecycle events.
4
+ Replaces the more complex Status Hooks system with a simple processor pattern.
5
+ """
6
+ from autobyteus.agent.lifecycle.events import LifecycleEvent
7
+ from autobyteus.agent.lifecycle.base_processor import BaseLifecycleEventProcessor
8
+
9
+ __all__ = [
10
+ "LifecycleEvent",
11
+ "BaseLifecycleEventProcessor",
12
+ ]
@@ -0,0 +1,109 @@
1
+ # file: autobyteus/agent/lifecycle/base_processor.py
2
+ """
3
+ Base class for lifecycle processors.
4
+ Follows the same pattern as other processors (InputProcessor, LLMResponseProcessor, etc.)
5
+ """
6
+ import logging
7
+ from abc import ABC, abstractmethod, ABCMeta
8
+ from typing import TYPE_CHECKING, Any, Dict
9
+
10
+ from autobyteus.agent.lifecycle.events import LifecycleEvent
11
+
12
+ if TYPE_CHECKING:
13
+ from autobyteus.agent.context import AgentContext
14
+
15
+ logger = logging.getLogger(__name__)
16
+
17
+ class LifecycleEventProcessorMeta(ABCMeta):
18
+ """
19
+ Metaclass that automatically registers subclasses of BaseLifecycleEventProcessor.
20
+ """
21
+ def __new__(mcs, name, bases, namespace):
22
+ cls = super().__new__(mcs, name, bases, namespace)
23
+
24
+ # Avoid registering the base abstract class itself
25
+ if name != "BaseLifecycleEventProcessor":
26
+ # Avoid circular imports by importing inside the method
27
+ from autobyteus.agent.lifecycle.processor_definition import LifecycleEventProcessorDefinition
28
+ from autobyteus.agent.lifecycle.processor_registry import default_lifecycle_event_processor_registry
29
+
30
+ # Use get_name() if available, otherwise class name.
31
+ # Note: get_name is a classmethod on BaseLifecycleEventProcessor, but cls is not fully formed?
32
+ # Actually, standard pattern calls cls.get_name() if defined.
33
+ try:
34
+ # We can instantiate a definition using the class
35
+ reg_name = cls.get_name()
36
+ definition = LifecycleEventProcessorDefinition(name=reg_name, processor_class=cls)
37
+ default_lifecycle_event_processor_registry.register_processor(definition)
38
+ except Exception as e:
39
+ # This might happen if get_name fails or other issues during definition creation
40
+ # Logging as warning because intermediate abstract classes might fail
41
+ logger.debug(f"Skipping auto-registration for {name}: {e}")
42
+
43
+ return cls
44
+
45
+
46
+ class BaseLifecycleEventProcessor(ABC, metaclass=LifecycleEventProcessorMeta):
47
+ """
48
+ Abstract base class for lifecycle event processors.
49
+
50
+ Users extend this class to add custom logic at specific lifecycle events.
51
+ Only requires specifying a single event (unlike the legacy hooks system which required
52
+ source + target status).
53
+
54
+ Example:
55
+ class MySetupProcessor(BaseLifecycleEventProcessor):
56
+ @property
57
+ def event(self) -> LifecycleEvent:
58
+ return LifecycleEvent.AGENT_READY
59
+
60
+ async def process(self, context, event_data):
61
+ print("Agent is ready!")
62
+ """
63
+
64
+ @classmethod
65
+ def get_name(cls) -> str:
66
+ """
67
+ Returns the unique name for this processor.
68
+ Defaults to the class name.
69
+ """
70
+ return cls.__name__
71
+
72
+ @classmethod
73
+ def get_order(cls) -> int:
74
+ """
75
+ Returns the execution order. Lower numbers execute earlier.
76
+ Defaults to 500 (normal priority).
77
+ """
78
+ return 500
79
+
80
+ @classmethod
81
+ def is_mandatory(cls) -> bool:
82
+ """
83
+ Returns True if this processor logic is mandatory and cannot be skipped by user config.
84
+ Defaults to False.
85
+ """
86
+ return False
87
+
88
+ @property
89
+ @abstractmethod
90
+ def event(self) -> LifecycleEvent:
91
+ """The lifecycle event this processor handles."""
92
+ raise NotImplementedError
93
+
94
+ @abstractmethod
95
+ async def process(self, context: 'AgentContext', event_data: Dict[str, Any]) -> None:
96
+ """
97
+ Execute processor logic.
98
+
99
+ Args:
100
+ context: The agent's context with full state access.
101
+ event_data: Event-specific data (e.g., tool_name for tool events).
102
+ """
103
+ raise NotImplementedError
104
+
105
+ def __repr__(self) -> str:
106
+ try:
107
+ return f"<{self.__class__.__name__} event='{self.event.value}'>"
108
+ except (NotImplementedError, AttributeError):
109
+ return f"<{self.__class__.__name__} (unconfigured)>"
@@ -0,0 +1,35 @@
1
+ # file: autobyteus/agent/lifecycle/events.py
2
+ """
3
+ Defines the LifecycleEvent enum for user-facing lifecycle extension points.
4
+ These are simplified, intuitive event names that map internally to status changes.
5
+ """
6
+ from enum import Enum
7
+
8
+
9
+ class LifecycleEvent(str, Enum):
10
+ """
11
+ User-facing lifecycle events for agent extension.
12
+
13
+ These events provide simple, intuitive hook points without requiring
14
+ users to understand the internal status machine.
15
+ """
16
+ AGENT_READY = "agent_ready"
17
+ """Triggered once after bootstrap completes and agent is ready for input."""
18
+
19
+ BEFORE_LLM_CALL = "before_llm_call"
20
+ """Triggered just before sending a request to the LLM."""
21
+
22
+ AFTER_LLM_RESPONSE = "after_llm_response"
23
+ """Triggered after receiving a complete LLM response."""
24
+
25
+ BEFORE_TOOL_EXECUTE = "before_tool_execute"
26
+ """Triggered just before a tool starts execution."""
27
+
28
+ AFTER_TOOL_EXECUTE = "after_tool_execute"
29
+ """Triggered after a tool completes execution."""
30
+
31
+ AGENT_SHUTTING_DOWN = "agent_shutting_down"
32
+ """Triggered when agent shutdown is initiated."""
33
+
34
+ def __str__(self) -> str:
35
+ return self.value
@@ -0,0 +1,36 @@
1
+ # file: autobyteus/agent/lifecycle/processor_definition.py
2
+ import logging
3
+ from typing import Type, TYPE_CHECKING
4
+
5
+ if TYPE_CHECKING:
6
+ from .base_processor import BaseLifecycleEventProcessor
7
+
8
+ logger = logging.getLogger(__name__)
9
+
10
+ class LifecycleEventProcessorDefinition:
11
+ """
12
+ Represents the definition of a lifecycle event processor.
13
+ Contains its registered name and the class itself.
14
+ """
15
+ def __init__(self, name: str, processor_class: Type['BaseLifecycleEventProcessor']):
16
+ """
17
+ Initializes the LifecycleEventProcessorDefinition.
18
+
19
+ Args:
20
+ name: The unique registered name of the processor.
21
+ processor_class: The class of the lifecycle event processor.
22
+
23
+ Raises:
24
+ ValueError: If name is empty or processor_class is not a type.
25
+ """
26
+ if not name or not isinstance(name, str):
27
+ raise ValueError("Processor name must be a non-empty string.")
28
+ if not isinstance(processor_class, type):
29
+ raise ValueError("processor_class must be a class type.")
30
+
31
+ self.name: str = name
32
+ self.processor_class: Type['BaseLifecycleEventProcessor'] = processor_class
33
+ logger.debug(f"LifecycleEventProcessorDefinition created: name='{name}', class='{processor_class.__name__}'.")
34
+
35
+ def __repr__(self) -> str:
36
+ return f"<LifecycleEventProcessorDefinition name='{self.name}', class='{self.processor_class.__name__}'>"
@@ -0,0 +1,106 @@
1
+ # file: autobyteus/agent/lifecycle/processor_registry.py
2
+ import logging
3
+ from typing import TYPE_CHECKING, Dict, List, Optional, Type
4
+
5
+ from autobyteus.utils.singleton import SingletonMeta
6
+ from .processor_definition import LifecycleEventProcessorDefinition
7
+
8
+ if TYPE_CHECKING:
9
+ from .base_processor import BaseLifecycleEventProcessor
10
+
11
+ logger = logging.getLogger(__name__)
12
+
13
+ class LifecycleEventProcessorRegistry(metaclass=SingletonMeta):
14
+ """
15
+ A singleton registry for LifecycleEventProcessorDefinition objects.
16
+ Processors are typically auto-registered via LifecycleEventProcessorMeta.
17
+ """
18
+
19
+ def __init__(self):
20
+ """Initializes the LifecycleEventProcessorRegistry with an empty store."""
21
+ self._definitions: Dict[str, LifecycleEventProcessorDefinition] = {}
22
+ logger.info("LifecycleEventProcessorRegistry initialized.")
23
+
24
+ def register_processor(self, definition: LifecycleEventProcessorDefinition) -> None:
25
+ """
26
+ Registers a lifecycle event processor definition.
27
+ """
28
+ if not isinstance(definition, LifecycleEventProcessorDefinition):
29
+ raise TypeError(f"Expected LifecycleEventProcessorDefinition instance, got {type(definition).__name__}.")
30
+
31
+ processor_name = definition.name
32
+ if processor_name in self._definitions:
33
+ logger.warning(f"Overwriting existing lifecycle event processor definition for name: '{processor_name}'.")
34
+
35
+ self._definitions[processor_name] = definition
36
+ logger.info(f"Lifecycle event processor definition '{processor_name}' (class: '{definition.processor_class.__name__}') registered successfully.")
37
+
38
+ def get_processor_definition(self, name: str) -> Optional[LifecycleEventProcessorDefinition]:
39
+ """
40
+ Retrieves a lifecycle event processor definition by its name.
41
+ """
42
+ if not isinstance(name, str):
43
+ logger.warning(f"Attempted to retrieve lifecycle event processor definition with non-string name: {type(name).__name__}.")
44
+ return None
45
+ definition = self._definitions.get(name)
46
+ if not definition:
47
+ logger.debug(f"Lifecycle event processor definition with name '{name}' not found in registry.")
48
+ return definition
49
+
50
+ def get_processor(self, name: str) -> Optional['BaseLifecycleEventProcessor']:
51
+ """
52
+ Retrieves an instance of a lifecycle event processor by its name.
53
+ """
54
+ definition = self.get_processor_definition(name)
55
+ if definition:
56
+ try:
57
+ return definition.processor_class()
58
+ except Exception as e:
59
+ logger.error(f"Failed to instantiate lifecycle event processor '{name}' from class '{definition.processor_class.__name__}': {e}", exc_info=True)
60
+ return None
61
+ return None
62
+
63
+ def list_processor_names(self) -> List[str]:
64
+ """
65
+ Returns an unordered list of names of all registered lifecycle processor definitions.
66
+ """
67
+ return list(self._definitions.keys())
68
+
69
+ def get_ordered_processor_options(self) -> List['ProcessorOption']:
70
+ """
71
+ Returns a list of ProcessorOption objects, sorted by their execution order.
72
+ """
73
+ from autobyteus.agent.processor_option import ProcessorOption
74
+ definitions = list(self._definitions.values())
75
+ sorted_definitions = sorted(definitions, key=lambda d: d.processor_class.get_order())
76
+ return [
77
+ ProcessorOption(
78
+ name=d.name,
79
+ is_mandatory=d.processor_class.is_mandatory()
80
+ ) for d in sorted_definitions
81
+ ]
82
+
83
+ def get_all_definitions(self) -> Dict[str, LifecycleEventProcessorDefinition]:
84
+ """
85
+ Returns a shallow copy of the dictionary containing all registered lifecycle processor definitions.
86
+ """
87
+ return dict(self._definitions)
88
+
89
+ def clear(self) -> None:
90
+ """Removes all definitions from the registry."""
91
+ count = len(self._definitions)
92
+ self._definitions.clear()
93
+ logger.info(f"Cleared {count} definitions from the LifecycleProcessorRegistry.")
94
+
95
+ def __len__(self) -> int:
96
+ """Returns the number of registered lifecycle processor definitions."""
97
+ return len(self._definitions)
98
+
99
+ def __contains__(self, name: str) -> bool:
100
+ """Checks if a processor definition is in the registry by name."""
101
+ if isinstance(name, str):
102
+ return name in self._definitions
103
+ return False
104
+
105
+ # Default instance of the registry
106
+ default_lifecycle_event_processor_registry = LifecycleEventProcessorRegistry()
@@ -0,0 +1,98 @@
1
+ from dataclasses import dataclass
2
+ from typing import Any, List, Optional, Union
3
+
4
+ from autobyteus.llm.prompt_renderers.base_prompt_renderer import BasePromptRenderer
5
+ from autobyteus.llm.user_message import LLMUserMessage
6
+ from autobyteus.llm.utils.messages import Message, MessageRole
7
+ from autobyteus.memory.compaction_snapshot_builder import CompactionSnapshotBuilder
8
+ from autobyteus.memory.memory_manager import MemoryManager
9
+
10
+
11
+ @dataclass
12
+ class RequestPackage:
13
+ messages: List[Message]
14
+ rendered_payload: Any
15
+ did_compact: bool
16
+
17
+
18
+ class LLMRequestAssembler:
19
+ def __init__(
20
+ self,
21
+ memory_manager: MemoryManager,
22
+ renderer: BasePromptRenderer,
23
+ compaction_snapshot_builder: Optional[CompactionSnapshotBuilder] = None,
24
+ max_episodic: int = 3,
25
+ max_semantic: int = 20,
26
+ ):
27
+ self.memory_manager = memory_manager
28
+ self.renderer = renderer
29
+ self.compaction_snapshot_builder = compaction_snapshot_builder or CompactionSnapshotBuilder()
30
+ self.max_episodic = max_episodic
31
+ self.max_semantic = max_semantic
32
+
33
+ async def prepare_request(
34
+ self,
35
+ processed_user_input: Union[str, LLMUserMessage],
36
+ current_turn_id: Optional[str] = None,
37
+ system_prompt: Optional[str] = None,
38
+ ) -> RequestPackage:
39
+ user_message = self._build_user_message(processed_user_input)
40
+ self._ensure_system_prompt(system_prompt)
41
+
42
+ did_compact = False
43
+ policy = self.memory_manager.compaction_policy
44
+ compactor = self.memory_manager.compactor
45
+
46
+ if self.memory_manager.compaction_required and policy and compactor:
47
+ turn_ids = compactor.select_compaction_window()
48
+ if turn_ids:
49
+ compactor.compact(turn_ids)
50
+ bundle = self.memory_manager.retriever.retrieve(
51
+ max_episodic=self.max_episodic,
52
+ max_semantic=self.max_semantic,
53
+ )
54
+ raw_tail = self.memory_manager.get_raw_tail(
55
+ policy.raw_tail_turns,
56
+ exclude_turn_id=current_turn_id,
57
+ )
58
+ snapshot_messages = self.compaction_snapshot_builder.build(
59
+ system_prompt=system_prompt or "",
60
+ bundle=bundle,
61
+ raw_tail=raw_tail,
62
+ )
63
+ self.memory_manager.reset_transcript(snapshot_messages)
64
+ self.memory_manager.clear_compaction_request()
65
+ did_compact = True
66
+
67
+ self.memory_manager.active_transcript.append_message(user_message)
68
+ final_messages = self.memory_manager.get_transcript_messages()
69
+ rendered_payload = await self.render_payload(final_messages)
70
+
71
+ return RequestPackage(
72
+ messages=final_messages,
73
+ rendered_payload=rendered_payload,
74
+ did_compact=did_compact,
75
+ )
76
+
77
+ async def render_payload(self, messages: List[Message]) -> Any:
78
+ return await self.renderer.render(messages)
79
+
80
+ def _build_user_message(self, processed_user_input: Union[str, LLMUserMessage]) -> Message:
81
+ if isinstance(processed_user_input, LLMUserMessage):
82
+ return Message(
83
+ role=MessageRole.USER,
84
+ content=processed_user_input.content,
85
+ image_urls=processed_user_input.image_urls,
86
+ audio_urls=processed_user_input.audio_urls,
87
+ video_urls=processed_user_input.video_urls,
88
+ )
89
+ return Message(role=MessageRole.USER, content=str(processed_user_input))
90
+
91
+ def _ensure_system_prompt(self, system_prompt: Optional[str]) -> None:
92
+ if not system_prompt:
93
+ return
94
+ existing = self.memory_manager.get_transcript_messages()
95
+ if not existing:
96
+ self.memory_manager.active_transcript.append_message(
97
+ Message(role=MessageRole.SYSTEM, content=system_prompt)
98
+ )
@@ -1,16 +1,9 @@
1
1
  # file: autobyteus/autobyteus/agent/llm_response_processor/__init__.py
2
2
  """
3
- Components for processing LLM responses, primarily for extracting tool invocations.
3
+ Components for processing LLM responses.
4
4
  """
5
5
  from .base_processor import BaseLLMResponseProcessor
6
- from .provider_aware_tool_usage_processor import ProviderAwareToolUsageProcessor
7
-
8
- # This __init__ should only export the high-level processors that live in this directory.
9
- # The low-level parsers and formatters live in the `tools` module and are not
10
- # part of this module's public API.
11
6
 
12
7
  __all__ = [
13
- # Primary public classes
14
8
  "BaseLLMResponseProcessor",
15
- "ProviderAwareToolUsageProcessor",
16
9
  ]
@@ -63,7 +63,7 @@ class ContextFileType(str, Enum):
63
63
  return cls.PYTHON
64
64
  elif extension == ".js":
65
65
  return cls.JAVASCRIPT
66
- elif extension in [".mp3", ".wav", ".m4a", ".flac", ".ogg"]:
66
+ elif extension in [".mp3", ".wav", ".m4a", ".flac", ".ogg", ".aac"]:
67
67
  return cls.AUDIO
68
68
  elif extension in [".mp4", ".mov", ".avi", ".mkv", ".webm"]:
69
69
  return cls.VIDEO
@@ -21,7 +21,7 @@ class SendMessageTo(BaseTool):
21
21
  This tool dynamically retrieves the team communication channel from the
22
22
  agent's context at runtime.
23
23
  """
24
- TOOL_NAME = "SendMessageTo"
24
+ TOOL_NAME = "send_message_to"
25
25
  CATEGORY = ToolCategory.AGENT_COMMUNICATION
26
26
 
27
27
  def __init__(self, config: Optional[ToolConfig] = None):
@@ -30,7 +30,7 @@ class SendMessageTo(BaseTool):
30
30
  """
31
31
  super().__init__(config=config)
32
32
  # The TeamManager is no longer stored as an instance variable.
33
- logger.debug("SendMessageTo tool initialized (stateless).")
33
+ logger.debug("%s tool initialized (stateless).", self.get_name())
34
34
 
35
35
  # The set_team_manager method has been removed.
36
36
 
@@ -81,7 +81,8 @@ class SendMessageTo(BaseTool):
81
81
  # --- NEW: Retrieve TeamManager dynamically from context ---
82
82
  team_context: Optional['AgentTeamContext'] = context.custom_data.get("team_context")
83
83
  if not team_context:
84
- error_msg = "Critical error: SendMessageTo tool is not configured for team communication. It can only be used within a managed AgentTeam."
84
+ error_msg = (f"Critical error: {self.get_name()} tool is not configured for team communication. "
85
+ "It can only be used within a managed AgentTeam.")
85
86
  logger.error(f"Agent '{context.agent_id}': {error_msg}")
86
87
  return f"Error: {error_msg}"
87
88
 
@@ -122,4 +123,4 @@ class SendMessageTo(BaseTool):
122
123
 
123
124
  success_msg = f"Message dispatch for recipient '{recipient_name}' has been successfully requested."
124
125
  logger.info(f"Tool '{self.get_name()}': {success_msg}")
125
- return success_msg
126
+ return success_msg
@@ -6,9 +6,11 @@ import concurrent.futures
6
6
  from typing import Optional, Any, Callable, Awaitable, TYPE_CHECKING
7
7
 
8
8
  from autobyteus.agent.context import AgentContext, AgentContextRegistry
9
- from autobyteus.agent.phases import AgentOperationalPhase, AgentPhaseManager
9
+ from autobyteus.agent.status.status_enum import AgentStatus
10
+ from autobyteus.agent.status.manager import AgentStatusManager
10
11
  from autobyteus.agent.events.notifiers import AgentExternalEventNotifier
11
- from autobyteus.agent.events import BaseEvent
12
+ from autobyteus.agent.events import BaseEvent, AgentErrorEvent, AgentStoppedEvent, ShutdownRequestedEvent
13
+ from autobyteus.agent.status.status_update_utils import apply_event_and_derive_status
12
14
  from autobyteus.agent.handlers import EventHandlerRegistry
13
15
  from autobyteus.agent.runtime.agent_worker import AgentWorker
14
16
 
@@ -30,9 +32,9 @@ class AgentRuntime:
30
32
  self.event_handler_registry: EventHandlerRegistry = event_handler_registry
31
33
 
32
34
  self.external_event_notifier: AgentExternalEventNotifier = AgentExternalEventNotifier(agent_id=self.context.agent_id)
33
- self.phase_manager: AgentPhaseManager = AgentPhaseManager(context=self.context, notifier=self.external_event_notifier)
35
+ self.status_manager: AgentStatusManager = AgentStatusManager(context=self.context, notifier=self.external_event_notifier)
34
36
 
35
- self.context.state.phase_manager_ref = self.phase_manager
37
+ self.context.state.status_manager_ref = self.status_manager
36
38
 
37
39
  self._worker: AgentWorker = AgentWorker(
38
40
  context=self.context,
@@ -88,8 +90,8 @@ class AgentRuntime:
88
90
  return
89
91
 
90
92
  logger.info(f"AgentRuntime for '{agent_id}': Starting worker.")
91
- # The first meaningful phase change to BOOTSTRAPPING is triggered by the AgentBootstrapper
92
- # within the worker's async context.
93
+ # The first meaningful status change to BOOTSTRAPPING is triggered within
94
+ # the worker's async initialization sequence.
93
95
  self._worker.start()
94
96
  logger.info(f"AgentRuntime for '{agent_id}': Worker start command issued. Worker will initialize itself.")
95
97
 
@@ -100,28 +102,31 @@ class AgentRuntime:
100
102
  logger.info(f"AgentRuntime '{agent_id}': Worker thread completed successfully.")
101
103
  except Exception as e:
102
104
  logger.error(f"AgentRuntime '{agent_id}': Worker thread terminated with an exception: {e}", exc_info=True)
103
- if not self.context.current_phase.is_terminal():
104
- # Since the phase manager is now async, we must run it in a new event loop.
105
+ if not self.context.current_status.is_terminal():
105
106
  try:
106
- asyncio.run(self.phase_manager.notify_error_occurred("Worker thread exited unexpectedly.", traceback.format_exc()))
107
+ asyncio.run(self._apply_event_and_derive_status(
108
+ AgentErrorEvent(
109
+ error_message="Worker thread exited unexpectedly.",
110
+ exception_details=traceback.format_exc()
111
+ )
112
+ ))
107
113
  except Exception as run_e:
108
- logger.critical(f"AgentRuntime '{agent_id}': Failed to run async error notification: {run_e}")
114
+ logger.critical(f"AgentRuntime '{agent_id}': Failed to emit derived error: {run_e}")
109
115
 
110
- if not self.context.current_phase.is_terminal():
111
- # Use asyncio.run() to execute the final async phase transition from a sync callback.
116
+ if not self.context.current_status.is_terminal():
112
117
  try:
113
- asyncio.run(self.phase_manager.notify_final_shutdown_complete())
118
+ asyncio.run(self._apply_event_and_derive_status(AgentStoppedEvent()))
114
119
  except Exception as run_e:
115
- logger.critical(f"AgentRuntime '{agent_id}': Failed to run async final shutdown notification: {run_e}")
120
+ logger.critical(f"AgentRuntime '{agent_id}': Failed to emit derived shutdown complete: {run_e}")
116
121
 
117
122
  async def stop(self, timeout: float = 10.0) -> None:
118
123
  agent_id = self.context.agent_id
119
124
  if not self._worker.is_alive() and not self._worker._is_active:
120
- if not self.context.current_phase.is_terminal():
121
- await self.phase_manager.notify_final_shutdown_complete()
125
+ if not self.context.current_status.is_terminal():
126
+ await self._apply_event_and_derive_status(AgentStoppedEvent())
122
127
  return
123
-
124
- await self.phase_manager.notify_shutdown_initiated()
128
+
129
+ await self._apply_event_and_derive_status(ShutdownRequestedEvent())
125
130
  await self._worker.stop(timeout=timeout)
126
131
 
127
132
  # LLM instance cleanup is now handled by the AgentWorker before its loop closes.
@@ -130,12 +135,15 @@ class AgentRuntime:
130
135
  self._context_registry.unregister_context(agent_id)
131
136
  logger.info(f"AgentRuntime for '{agent_id}': Context unregistered.")
132
137
 
133
- await self.phase_manager.notify_final_shutdown_complete()
138
+ await self._apply_event_and_derive_status(AgentStoppedEvent())
134
139
  logger.info(f"AgentRuntime for '{agent_id}' stop() method completed.")
135
140
 
141
+ async def _apply_event_and_derive_status(self, event: BaseEvent) -> None:
142
+ await apply_event_and_derive_status(event, self.context)
143
+
136
144
  @property
137
- def current_phase_property(self) -> AgentOperationalPhase:
138
- return self.context.current_phase
145
+ def current_status_property(self) -> AgentStatus:
146
+ return self.context.current_status
139
147
 
140
148
  @property
141
149
  def is_running(self) -> bool: