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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (472) hide show
  1. autobyteus/agent/agent.py +15 -5
  2. autobyteus/agent/bootstrap_steps/__init__.py +3 -3
  3. autobyteus/agent/bootstrap_steps/agent_bootstrapper.py +5 -59
  4. autobyteus/agent/bootstrap_steps/base_bootstrap_step.py +1 -4
  5. autobyteus/agent/bootstrap_steps/mcp_server_prewarming_step.py +1 -3
  6. autobyteus/agent/bootstrap_steps/system_prompt_processing_step.py +16 -13
  7. autobyteus/agent/bootstrap_steps/working_context_snapshot_restore_step.py +38 -0
  8. autobyteus/agent/bootstrap_steps/workspace_context_initialization_step.py +2 -4
  9. autobyteus/agent/context/agent_config.py +47 -20
  10. autobyteus/agent/context/agent_context.py +23 -18
  11. autobyteus/agent/context/agent_runtime_state.py +21 -19
  12. autobyteus/agent/events/__init__.py +16 -1
  13. autobyteus/agent/events/agent_events.py +43 -3
  14. autobyteus/agent/events/agent_input_event_queue_manager.py +79 -26
  15. autobyteus/agent/events/event_store.py +57 -0
  16. autobyteus/agent/events/notifiers.py +69 -59
  17. autobyteus/agent/events/worker_event_dispatcher.py +21 -64
  18. autobyteus/agent/factory/agent_factory.py +83 -6
  19. autobyteus/agent/handlers/__init__.py +2 -0
  20. autobyteus/agent/handlers/approved_tool_invocation_event_handler.py +51 -34
  21. autobyteus/agent/handlers/bootstrap_event_handler.py +155 -0
  22. autobyteus/agent/handlers/inter_agent_message_event_handler.py +10 -0
  23. autobyteus/agent/handlers/lifecycle_event_logger.py +19 -11
  24. autobyteus/agent/handlers/llm_complete_response_received_event_handler.py +10 -15
  25. autobyteus/agent/handlers/llm_user_message_ready_event_handler.py +188 -48
  26. autobyteus/agent/handlers/tool_execution_approval_event_handler.py +0 -10
  27. autobyteus/agent/handlers/tool_invocation_request_event_handler.py +53 -48
  28. autobyteus/agent/handlers/tool_result_event_handler.py +7 -8
  29. autobyteus/agent/handlers/user_input_message_event_handler.py +10 -3
  30. autobyteus/agent/input_processor/memory_ingest_input_processor.py +44 -0
  31. autobyteus/agent/lifecycle/__init__.py +12 -0
  32. autobyteus/agent/lifecycle/base_processor.py +109 -0
  33. autobyteus/agent/lifecycle/events.py +35 -0
  34. autobyteus/agent/lifecycle/processor_definition.py +36 -0
  35. autobyteus/agent/lifecycle/processor_registry.py +106 -0
  36. autobyteus/agent/llm_request_assembler.py +98 -0
  37. autobyteus/agent/llm_response_processor/__init__.py +1 -8
  38. autobyteus/agent/message/context_file_type.py +1 -1
  39. autobyteus/agent/runtime/agent_runtime.py +29 -21
  40. autobyteus/agent/runtime/agent_worker.py +98 -19
  41. autobyteus/agent/shutdown_steps/__init__.py +2 -0
  42. autobyteus/agent/shutdown_steps/agent_shutdown_orchestrator.py +2 -0
  43. autobyteus/agent/shutdown_steps/tool_cleanup_step.py +58 -0
  44. autobyteus/agent/status/__init__.py +14 -0
  45. autobyteus/agent/status/manager.py +93 -0
  46. autobyteus/agent/status/status_deriver.py +96 -0
  47. autobyteus/agent/{phases/phase_enum.py → status/status_enum.py} +16 -16
  48. autobyteus/agent/status/status_update_utils.py +73 -0
  49. autobyteus/agent/streaming/__init__.py +52 -5
  50. autobyteus/agent/streaming/adapters/__init__.py +18 -0
  51. autobyteus/agent/streaming/adapters/invocation_adapter.py +184 -0
  52. autobyteus/agent/streaming/adapters/tool_call_parsing.py +163 -0
  53. autobyteus/agent/streaming/adapters/tool_syntax_registry.py +67 -0
  54. autobyteus/agent/streaming/agent_event_stream.py +3 -183
  55. autobyteus/agent/streaming/api_tool_call/__init__.py +16 -0
  56. autobyteus/agent/streaming/api_tool_call/file_content_streamer.py +56 -0
  57. autobyteus/agent/streaming/api_tool_call/json_string_field_extractor.py +175 -0
  58. autobyteus/agent/streaming/api_tool_call_streaming_response_handler.py +4 -0
  59. autobyteus/agent/streaming/events/__init__.py +6 -0
  60. autobyteus/agent/streaming/events/stream_event_payloads.py +284 -0
  61. autobyteus/agent/streaming/events/stream_events.py +141 -0
  62. autobyteus/agent/streaming/handlers/__init__.py +15 -0
  63. autobyteus/agent/streaming/handlers/api_tool_call_streaming_response_handler.py +303 -0
  64. autobyteus/agent/streaming/handlers/parsing_streaming_response_handler.py +107 -0
  65. autobyteus/agent/streaming/handlers/pass_through_streaming_response_handler.py +107 -0
  66. autobyteus/agent/streaming/handlers/streaming_handler_factory.py +177 -0
  67. autobyteus/agent/streaming/handlers/streaming_response_handler.py +58 -0
  68. autobyteus/agent/streaming/parser/__init__.py +61 -0
  69. autobyteus/agent/streaming/parser/event_emitter.py +181 -0
  70. autobyteus/agent/streaming/parser/events.py +4 -0
  71. autobyteus/agent/streaming/parser/invocation_adapter.py +4 -0
  72. autobyteus/agent/streaming/parser/json_parsing_strategies/__init__.py +19 -0
  73. autobyteus/agent/streaming/parser/json_parsing_strategies/base.py +32 -0
  74. autobyteus/agent/streaming/parser/json_parsing_strategies/default.py +34 -0
  75. autobyteus/agent/streaming/parser/json_parsing_strategies/gemini.py +31 -0
  76. autobyteus/agent/streaming/parser/json_parsing_strategies/openai.py +64 -0
  77. autobyteus/agent/streaming/parser/json_parsing_strategies/registry.py +75 -0
  78. autobyteus/agent/streaming/parser/parser_context.py +227 -0
  79. autobyteus/agent/streaming/parser/parser_factory.py +132 -0
  80. autobyteus/agent/streaming/parser/sentinel_format.py +7 -0
  81. autobyteus/agent/streaming/parser/state_factory.py +62 -0
  82. autobyteus/agent/streaming/parser/states/__init__.py +1 -0
  83. autobyteus/agent/streaming/parser/states/base_state.py +60 -0
  84. autobyteus/agent/streaming/parser/states/custom_xml_tag_run_bash_parsing_state.py +38 -0
  85. autobyteus/agent/streaming/parser/states/custom_xml_tag_write_file_parsing_state.py +55 -0
  86. autobyteus/agent/streaming/parser/states/delimited_content_state.py +146 -0
  87. autobyteus/agent/streaming/parser/states/json_initialization_state.py +144 -0
  88. autobyteus/agent/streaming/parser/states/json_tool_parsing_state.py +137 -0
  89. autobyteus/agent/streaming/parser/states/sentinel_content_state.py +30 -0
  90. autobyteus/agent/streaming/parser/states/sentinel_initialization_state.py +117 -0
  91. autobyteus/agent/streaming/parser/states/text_state.py +78 -0
  92. autobyteus/agent/streaming/parser/states/xml_patch_file_tool_parsing_state.py +328 -0
  93. autobyteus/agent/streaming/parser/states/xml_run_bash_tool_parsing_state.py +129 -0
  94. autobyteus/agent/streaming/parser/states/xml_tag_initialization_state.py +151 -0
  95. autobyteus/agent/streaming/parser/states/xml_tool_parsing_state.py +63 -0
  96. autobyteus/agent/streaming/parser/states/xml_write_file_tool_parsing_state.py +343 -0
  97. autobyteus/agent/streaming/parser/strategies/__init__.py +17 -0
  98. autobyteus/agent/streaming/parser/strategies/base.py +24 -0
  99. autobyteus/agent/streaming/parser/strategies/json_tool_strategy.py +26 -0
  100. autobyteus/agent/streaming/parser/strategies/registry.py +28 -0
  101. autobyteus/agent/streaming/parser/strategies/sentinel_strategy.py +23 -0
  102. autobyteus/agent/streaming/parser/strategies/xml_tag_strategy.py +21 -0
  103. autobyteus/agent/streaming/parser/stream_scanner.py +167 -0
  104. autobyteus/agent/streaming/parser/streaming_parser.py +212 -0
  105. autobyteus/agent/streaming/parser/tool_call_parsing.py +4 -0
  106. autobyteus/agent/streaming/parser/tool_constants.py +7 -0
  107. autobyteus/agent/streaming/parser/tool_syntax_registry.py +4 -0
  108. autobyteus/agent/streaming/parser/xml_tool_parsing_state_registry.py +55 -0
  109. autobyteus/agent/streaming/parsing_streaming_response_handler.py +4 -0
  110. autobyteus/agent/streaming/pass_through_streaming_response_handler.py +4 -0
  111. autobyteus/agent/streaming/queue_streamer.py +3 -57
  112. autobyteus/agent/streaming/segments/__init__.py +5 -0
  113. autobyteus/agent/streaming/segments/segment_events.py +82 -0
  114. autobyteus/agent/streaming/stream_event_payloads.py +2 -223
  115. autobyteus/agent/streaming/stream_events.py +3 -140
  116. autobyteus/agent/streaming/streaming_handler_factory.py +4 -0
  117. autobyteus/agent/streaming/streaming_response_handler.py +4 -0
  118. autobyteus/agent/streaming/streams/__init__.py +5 -0
  119. autobyteus/agent/streaming/streams/agent_event_stream.py +197 -0
  120. autobyteus/agent/streaming/utils/__init__.py +5 -0
  121. autobyteus/agent/streaming/utils/queue_streamer.py +59 -0
  122. autobyteus/agent/system_prompt_processor/__init__.py +2 -0
  123. autobyteus/agent/system_prompt_processor/available_skills_processor.py +96 -0
  124. autobyteus/agent/system_prompt_processor/base_processor.py +1 -1
  125. autobyteus/agent/system_prompt_processor/processor_meta.py +15 -2
  126. autobyteus/agent/system_prompt_processor/tool_manifest_injector_processor.py +39 -58
  127. autobyteus/agent/token_budget.py +56 -0
  128. autobyteus/agent/tool_execution_result_processor/memory_ingest_tool_result_processor.py +29 -0
  129. autobyteus/agent/tool_invocation.py +16 -40
  130. autobyteus/agent/tool_invocation_preprocessor/__init__.py +9 -0
  131. autobyteus/agent/tool_invocation_preprocessor/base_preprocessor.py +45 -0
  132. autobyteus/agent/tool_invocation_preprocessor/processor_definition.py +15 -0
  133. autobyteus/agent/tool_invocation_preprocessor/processor_meta.py +33 -0
  134. autobyteus/agent/tool_invocation_preprocessor/processor_registry.py +60 -0
  135. autobyteus/agent/utils/wait_for_idle.py +12 -14
  136. autobyteus/agent/workspace/base_workspace.py +6 -27
  137. autobyteus/agent_team/agent_team.py +3 -3
  138. autobyteus/agent_team/agent_team_builder.py +1 -41
  139. autobyteus/agent_team/bootstrap_steps/__init__.py +0 -4
  140. autobyteus/agent_team/bootstrap_steps/agent_configuration_preparation_step.py +8 -18
  141. autobyteus/agent_team/bootstrap_steps/agent_team_bootstrapper.py +4 -16
  142. autobyteus/agent_team/bootstrap_steps/base_agent_team_bootstrap_step.py +1 -2
  143. autobyteus/agent_team/bootstrap_steps/coordinator_initialization_step.py +1 -2
  144. autobyteus/agent_team/bootstrap_steps/task_notifier_initialization_step.py +1 -2
  145. autobyteus/agent_team/bootstrap_steps/team_context_initialization_step.py +4 -4
  146. autobyteus/agent_team/context/agent_team_config.py +6 -3
  147. autobyteus/agent_team/context/agent_team_context.py +25 -3
  148. autobyteus/agent_team/context/agent_team_runtime_state.py +9 -6
  149. autobyteus/agent_team/events/__init__.py +11 -0
  150. autobyteus/agent_team/events/agent_team_event_dispatcher.py +22 -9
  151. autobyteus/agent_team/events/agent_team_events.py +16 -0
  152. autobyteus/agent_team/events/event_store.py +57 -0
  153. autobyteus/agent_team/factory/agent_team_factory.py +8 -0
  154. autobyteus/agent_team/handlers/inter_agent_message_request_event_handler.py +18 -2
  155. autobyteus/agent_team/handlers/lifecycle_agent_team_event_handler.py +21 -5
  156. autobyteus/agent_team/handlers/process_user_message_event_handler.py +17 -8
  157. autobyteus/agent_team/handlers/tool_approval_team_event_handler.py +19 -4
  158. autobyteus/agent_team/runtime/agent_team_runtime.py +41 -10
  159. autobyteus/agent_team/runtime/agent_team_worker.py +69 -5
  160. autobyteus/agent_team/status/__init__.py +14 -0
  161. autobyteus/agent_team/status/agent_team_status.py +18 -0
  162. autobyteus/agent_team/status/agent_team_status_manager.py +33 -0
  163. autobyteus/agent_team/status/status_deriver.py +62 -0
  164. autobyteus/agent_team/status/status_update_utils.py +42 -0
  165. autobyteus/agent_team/streaming/__init__.py +2 -2
  166. autobyteus/agent_team/streaming/agent_team_event_notifier.py +6 -6
  167. autobyteus/agent_team/streaming/agent_team_stream_event_payloads.py +4 -4
  168. autobyteus/agent_team/streaming/agent_team_stream_events.py +3 -3
  169. autobyteus/agent_team/system_prompt_processor/__init__.py +6 -0
  170. autobyteus/agent_team/system_prompt_processor/team_manifest_injector_processor.py +76 -0
  171. autobyteus/agent_team/task_notification/task_notification_mode.py +19 -0
  172. autobyteus/agent_team/utils/wait_for_idle.py +4 -4
  173. autobyteus/cli/agent_cli.py +18 -10
  174. autobyteus/cli/agent_team_tui/app.py +14 -11
  175. autobyteus/cli/agent_team_tui/state.py +13 -15
  176. autobyteus/cli/agent_team_tui/widgets/agent_list_sidebar.py +15 -15
  177. autobyteus/cli/agent_team_tui/widgets/focus_pane.py +143 -36
  178. autobyteus/cli/agent_team_tui/widgets/renderables.py +1 -1
  179. autobyteus/cli/agent_team_tui/widgets/shared.py +25 -25
  180. autobyteus/cli/cli_display.py +193 -44
  181. autobyteus/cli/workflow_tui/app.py +9 -10
  182. autobyteus/cli/workflow_tui/state.py +14 -16
  183. autobyteus/cli/workflow_tui/widgets/agent_list_sidebar.py +15 -15
  184. autobyteus/cli/workflow_tui/widgets/focus_pane.py +137 -35
  185. autobyteus/cli/workflow_tui/widgets/renderables.py +1 -1
  186. autobyteus/cli/workflow_tui/widgets/shared.py +25 -25
  187. autobyteus/clients/autobyteus_client.py +94 -1
  188. autobyteus/events/event_types.py +11 -18
  189. autobyteus/llm/api/autobyteus_llm.py +33 -29
  190. autobyteus/llm/api/claude_llm.py +142 -36
  191. autobyteus/llm/api/gemini_llm.py +163 -59
  192. autobyteus/llm/api/grok_llm.py +1 -1
  193. autobyteus/llm/api/minimax_llm.py +26 -0
  194. autobyteus/llm/api/mistral_llm.py +113 -87
  195. autobyteus/llm/api/ollama_llm.py +9 -42
  196. autobyteus/llm/api/openai_compatible_llm.py +127 -91
  197. autobyteus/llm/api/openai_llm.py +3 -3
  198. autobyteus/llm/api/openai_responses_llm.py +324 -0
  199. autobyteus/llm/api/zhipu_llm.py +21 -2
  200. autobyteus/llm/autobyteus_provider.py +70 -60
  201. autobyteus/llm/base_llm.py +85 -81
  202. autobyteus/llm/converters/__init__.py +14 -0
  203. autobyteus/llm/converters/anthropic_tool_call_converter.py +37 -0
  204. autobyteus/llm/converters/gemini_tool_call_converter.py +57 -0
  205. autobyteus/llm/converters/mistral_tool_call_converter.py +37 -0
  206. autobyteus/llm/converters/openai_tool_call_converter.py +38 -0
  207. autobyteus/llm/extensions/base_extension.py +6 -12
  208. autobyteus/llm/extensions/token_usage_tracking_extension.py +45 -18
  209. autobyteus/llm/llm_factory.py +282 -204
  210. autobyteus/llm/lmstudio_provider.py +60 -49
  211. autobyteus/llm/models.py +35 -2
  212. autobyteus/llm/ollama_provider.py +60 -49
  213. autobyteus/llm/ollama_provider_resolver.py +0 -1
  214. autobyteus/llm/prompt_renderers/__init__.py +19 -0
  215. autobyteus/llm/prompt_renderers/anthropic_prompt_renderer.py +104 -0
  216. autobyteus/llm/prompt_renderers/autobyteus_prompt_renderer.py +19 -0
  217. autobyteus/llm/prompt_renderers/base_prompt_renderer.py +10 -0
  218. autobyteus/llm/prompt_renderers/gemini_prompt_renderer.py +63 -0
  219. autobyteus/llm/prompt_renderers/mistral_prompt_renderer.py +87 -0
  220. autobyteus/llm/prompt_renderers/ollama_prompt_renderer.py +51 -0
  221. autobyteus/llm/prompt_renderers/openai_chat_renderer.py +97 -0
  222. autobyteus/llm/prompt_renderers/openai_responses_renderer.py +101 -0
  223. autobyteus/llm/providers.py +1 -3
  224. autobyteus/llm/token_counter/claude_token_counter.py +56 -25
  225. autobyteus/llm/token_counter/mistral_token_counter.py +12 -8
  226. autobyteus/llm/token_counter/openai_token_counter.py +24 -5
  227. autobyteus/llm/token_counter/token_counter_factory.py +12 -5
  228. autobyteus/llm/utils/llm_config.py +6 -12
  229. autobyteus/llm/utils/media_payload_formatter.py +27 -20
  230. autobyteus/llm/utils/messages.py +55 -3
  231. autobyteus/llm/utils/response_types.py +3 -0
  232. autobyteus/llm/utils/tool_call_delta.py +31 -0
  233. autobyteus/memory/__init__.py +35 -0
  234. autobyteus/memory/compaction/__init__.py +9 -0
  235. autobyteus/memory/compaction/compaction_result.py +8 -0
  236. autobyteus/memory/compaction/compactor.py +89 -0
  237. autobyteus/memory/compaction/summarizer.py +11 -0
  238. autobyteus/memory/compaction_snapshot_builder.py +84 -0
  239. autobyteus/memory/memory_manager.py +205 -0
  240. autobyteus/memory/models/__init__.py +14 -0
  241. autobyteus/memory/models/episodic_item.py +41 -0
  242. autobyteus/memory/models/memory_types.py +7 -0
  243. autobyteus/memory/models/raw_trace_item.py +79 -0
  244. autobyteus/memory/models/semantic_item.py +41 -0
  245. autobyteus/memory/models/tool_interaction.py +20 -0
  246. autobyteus/memory/path_resolver.py +27 -0
  247. autobyteus/memory/policies/__init__.py +5 -0
  248. autobyteus/memory/policies/compaction_policy.py +16 -0
  249. autobyteus/memory/restore/__init__.py +1 -0
  250. autobyteus/memory/restore/working_context_snapshot_bootstrapper.py +61 -0
  251. autobyteus/memory/retrieval/__init__.py +7 -0
  252. autobyteus/memory/retrieval/memory_bundle.py +11 -0
  253. autobyteus/memory/retrieval/retriever.py +13 -0
  254. autobyteus/memory/store/__init__.py +9 -0
  255. autobyteus/memory/store/base_store.py +14 -0
  256. autobyteus/memory/store/file_store.py +98 -0
  257. autobyteus/memory/store/working_context_snapshot_store.py +28 -0
  258. autobyteus/memory/tool_interaction_builder.py +46 -0
  259. autobyteus/memory/turn_tracker.py +9 -0
  260. autobyteus/memory/working_context_snapshot.py +69 -0
  261. autobyteus/memory/working_context_snapshot_serializer.py +135 -0
  262. autobyteus/multimedia/audio/api/autobyteus_audio_client.py +19 -5
  263. autobyteus/multimedia/audio/api/gemini_audio_client.py +109 -16
  264. autobyteus/multimedia/audio/audio_client_factory.py +47 -9
  265. autobyteus/multimedia/audio/audio_model.py +2 -1
  266. autobyteus/multimedia/image/api/autobyteus_image_client.py +19 -5
  267. autobyteus/multimedia/image/api/gemini_image_client.py +39 -17
  268. autobyteus/multimedia/image/api/openai_image_client.py +125 -43
  269. autobyteus/multimedia/image/autobyteus_image_provider.py +2 -1
  270. autobyteus/multimedia/image/image_client_factory.py +47 -15
  271. autobyteus/multimedia/image/image_model.py +5 -2
  272. autobyteus/multimedia/providers.py +3 -2
  273. autobyteus/skills/loader.py +71 -0
  274. autobyteus/skills/model.py +11 -0
  275. autobyteus/skills/registry.py +70 -0
  276. autobyteus/task_management/tools/todo_tools/add_todo.py +2 -2
  277. autobyteus/task_management/tools/todo_tools/create_todo_list.py +2 -2
  278. autobyteus/task_management/tools/todo_tools/update_todo_status.py +2 -2
  279. autobyteus/tools/__init__.py +34 -47
  280. autobyteus/tools/base_tool.py +7 -0
  281. autobyteus/tools/file/__init__.py +2 -6
  282. autobyteus/tools/file/patch_file.py +149 -0
  283. autobyteus/tools/file/read_file.py +36 -5
  284. autobyteus/tools/file/write_file.py +4 -1
  285. autobyteus/tools/functional_tool.py +43 -6
  286. autobyteus/tools/mcp/__init__.py +2 -0
  287. autobyteus/tools/mcp/config_service.py +5 -1
  288. autobyteus/tools/mcp/server/__init__.py +2 -0
  289. autobyteus/tools/mcp/server/http_managed_mcp_server.py +1 -1
  290. autobyteus/tools/mcp/server/websocket_managed_mcp_server.py +141 -0
  291. autobyteus/tools/mcp/server_instance_manager.py +8 -1
  292. autobyteus/tools/mcp/types.py +61 -0
  293. autobyteus/tools/multimedia/audio_tools.py +70 -17
  294. autobyteus/tools/multimedia/download_media_tool.py +18 -4
  295. autobyteus/tools/multimedia/image_tools.py +246 -62
  296. autobyteus/tools/operation_executor/journal_manager.py +107 -0
  297. autobyteus/tools/operation_executor/operation_event_buffer.py +57 -0
  298. autobyteus/tools/operation_executor/operation_event_producer.py +29 -0
  299. autobyteus/tools/operation_executor/operation_executor.py +58 -0
  300. autobyteus/tools/registry/tool_definition.py +43 -2
  301. autobyteus/tools/skill/load_skill.py +50 -0
  302. autobyteus/tools/terminal/__init__.py +45 -0
  303. autobyteus/tools/terminal/ansi_utils.py +32 -0
  304. autobyteus/tools/terminal/background_process_manager.py +233 -0
  305. autobyteus/tools/terminal/output_buffer.py +105 -0
  306. autobyteus/tools/terminal/prompt_detector.py +63 -0
  307. autobyteus/tools/terminal/pty_session.py +241 -0
  308. autobyteus/tools/terminal/session_factory.py +20 -0
  309. autobyteus/tools/terminal/terminal_session_manager.py +226 -0
  310. autobyteus/tools/terminal/tools/__init__.py +13 -0
  311. autobyteus/tools/terminal/tools/get_process_output.py +81 -0
  312. autobyteus/tools/terminal/tools/run_bash.py +109 -0
  313. autobyteus/tools/terminal/tools/start_background_process.py +104 -0
  314. autobyteus/tools/terminal/tools/stop_background_process.py +67 -0
  315. autobyteus/tools/terminal/types.py +54 -0
  316. autobyteus/tools/terminal/wsl_tmux_session.py +221 -0
  317. autobyteus/tools/terminal/wsl_utils.py +156 -0
  318. autobyteus/tools/transaction_management/backup_handler.py +48 -0
  319. autobyteus/tools/transaction_management/operation_lifecycle_manager.py +62 -0
  320. autobyteus/tools/usage/__init__.py +1 -2
  321. autobyteus/tools/usage/formatters/__init__.py +17 -1
  322. autobyteus/tools/usage/formatters/base_formatter.py +8 -0
  323. autobyteus/tools/usage/formatters/default_xml_schema_formatter.py +2 -2
  324. autobyteus/tools/usage/formatters/mistral_json_schema_formatter.py +18 -0
  325. autobyteus/tools/usage/formatters/patch_file_xml_example_formatter.py +64 -0
  326. autobyteus/tools/usage/formatters/patch_file_xml_schema_formatter.py +31 -0
  327. autobyteus/tools/usage/formatters/run_bash_xml_example_formatter.py +32 -0
  328. autobyteus/tools/usage/formatters/run_bash_xml_schema_formatter.py +36 -0
  329. autobyteus/tools/usage/formatters/write_file_xml_example_formatter.py +53 -0
  330. autobyteus/tools/usage/formatters/write_file_xml_schema_formatter.py +31 -0
  331. autobyteus/tools/usage/providers/tool_manifest_provider.py +10 -10
  332. autobyteus/tools/usage/registries/__init__.py +1 -3
  333. autobyteus/tools/usage/registries/tool_formatting_registry.py +115 -8
  334. autobyteus/tools/usage/tool_schema_provider.py +51 -0
  335. autobyteus/tools/web/__init__.py +4 -0
  336. autobyteus/tools/web/read_url_tool.py +80 -0
  337. autobyteus/utils/diff_utils.py +271 -0
  338. autobyteus/utils/download_utils.py +109 -0
  339. autobyteus/utils/file_utils.py +57 -2
  340. autobyteus/utils/gemini_helper.py +64 -0
  341. autobyteus/utils/gemini_model_mapping.py +71 -0
  342. autobyteus/utils/llm_output_formatter.py +75 -0
  343. autobyteus/utils/tool_call_format.py +36 -0
  344. autobyteus/workflow/agentic_workflow.py +3 -3
  345. autobyteus/workflow/bootstrap_steps/agent_tool_injection_step.py +2 -2
  346. autobyteus/workflow/bootstrap_steps/base_workflow_bootstrap_step.py +2 -2
  347. autobyteus/workflow/bootstrap_steps/coordinator_initialization_step.py +2 -2
  348. autobyteus/workflow/bootstrap_steps/coordinator_prompt_preparation_step.py +3 -9
  349. autobyteus/workflow/bootstrap_steps/workflow_bootstrapper.py +6 -6
  350. autobyteus/workflow/bootstrap_steps/workflow_runtime_queue_initialization_step.py +2 -2
  351. autobyteus/workflow/context/workflow_context.py +3 -3
  352. autobyteus/workflow/context/workflow_runtime_state.py +5 -5
  353. autobyteus/workflow/events/workflow_event_dispatcher.py +5 -5
  354. autobyteus/workflow/handlers/lifecycle_workflow_event_handler.py +3 -3
  355. autobyteus/workflow/handlers/process_user_message_event_handler.py +5 -5
  356. autobyteus/workflow/handlers/tool_approval_workflow_event_handler.py +2 -2
  357. autobyteus/workflow/runtime/workflow_runtime.py +8 -8
  358. autobyteus/workflow/runtime/workflow_worker.py +3 -3
  359. autobyteus/workflow/status/__init__.py +11 -0
  360. autobyteus/workflow/status/workflow_status.py +19 -0
  361. autobyteus/workflow/status/workflow_status_manager.py +48 -0
  362. autobyteus/workflow/streaming/__init__.py +2 -2
  363. autobyteus/workflow/streaming/workflow_event_notifier.py +7 -7
  364. autobyteus/workflow/streaming/workflow_stream_event_payloads.py +4 -4
  365. autobyteus/workflow/streaming/workflow_stream_events.py +3 -3
  366. autobyteus/workflow/utils/wait_for_idle.py +4 -4
  367. autobyteus-1.3.0.dist-info/METADATA +293 -0
  368. autobyteus-1.3.0.dist-info/RECORD +606 -0
  369. {autobyteus-1.2.1.dist-info → autobyteus-1.3.0.dist-info}/WHEEL +1 -1
  370. {autobyteus-1.2.1.dist-info → autobyteus-1.3.0.dist-info}/top_level.txt +0 -1
  371. autobyteus/agent/bootstrap_steps/agent_runtime_queue_initialization_step.py +0 -57
  372. autobyteus/agent/hooks/__init__.py +0 -16
  373. autobyteus/agent/hooks/base_phase_hook.py +0 -78
  374. autobyteus/agent/hooks/hook_definition.py +0 -36
  375. autobyteus/agent/hooks/hook_meta.py +0 -37
  376. autobyteus/agent/hooks/hook_registry.py +0 -106
  377. autobyteus/agent/llm_response_processor/provider_aware_tool_usage_processor.py +0 -103
  378. autobyteus/agent/phases/__init__.py +0 -18
  379. autobyteus/agent/phases/discover.py +0 -53
  380. autobyteus/agent/phases/manager.py +0 -265
  381. autobyteus/agent/phases/transition_decorator.py +0 -40
  382. autobyteus/agent/phases/transition_info.py +0 -33
  383. autobyteus/agent/remote_agent.py +0 -244
  384. autobyteus/agent/workspace/workspace_definition.py +0 -36
  385. autobyteus/agent/workspace/workspace_meta.py +0 -37
  386. autobyteus/agent/workspace/workspace_registry.py +0 -72
  387. autobyteus/agent_team/bootstrap_steps/agent_team_runtime_queue_initialization_step.py +0 -25
  388. autobyteus/agent_team/bootstrap_steps/coordinator_prompt_preparation_step.py +0 -85
  389. autobyteus/agent_team/phases/__init__.py +0 -11
  390. autobyteus/agent_team/phases/agent_team_operational_phase.py +0 -19
  391. autobyteus/agent_team/phases/agent_team_phase_manager.py +0 -48
  392. autobyteus/llm/api/bedrock_llm.py +0 -92
  393. autobyteus/llm/api/groq_llm.py +0 -94
  394. autobyteus/llm/api/nvidia_llm.py +0 -108
  395. autobyteus/llm/utils/token_pricing_config.py +0 -87
  396. autobyteus/rpc/__init__.py +0 -73
  397. autobyteus/rpc/client/__init__.py +0 -17
  398. autobyteus/rpc/client/abstract_client_connection.py +0 -124
  399. autobyteus/rpc/client/client_connection_manager.py +0 -153
  400. autobyteus/rpc/client/sse_client_connection.py +0 -306
  401. autobyteus/rpc/client/stdio_client_connection.py +0 -280
  402. autobyteus/rpc/config/__init__.py +0 -13
  403. autobyteus/rpc/config/agent_server_config.py +0 -153
  404. autobyteus/rpc/config/agent_server_registry.py +0 -152
  405. autobyteus/rpc/hosting.py +0 -244
  406. autobyteus/rpc/protocol.py +0 -244
  407. autobyteus/rpc/server/__init__.py +0 -20
  408. autobyteus/rpc/server/agent_server_endpoint.py +0 -181
  409. autobyteus/rpc/server/base_method_handler.py +0 -40
  410. autobyteus/rpc/server/method_handlers.py +0 -259
  411. autobyteus/rpc/server/sse_server_handler.py +0 -182
  412. autobyteus/rpc/server/stdio_server_handler.py +0 -151
  413. autobyteus/rpc/server_main.py +0 -198
  414. autobyteus/rpc/transport_type.py +0 -13
  415. autobyteus/tools/bash/__init__.py +0 -2
  416. autobyteus/tools/bash/bash_executor.py +0 -100
  417. autobyteus/tools/browser/__init__.py +0 -2
  418. autobyteus/tools/browser/session_aware/browser_session_aware_navigate_to.py +0 -75
  419. autobyteus/tools/browser/session_aware/browser_session_aware_tool.py +0 -30
  420. autobyteus/tools/browser/session_aware/browser_session_aware_web_element_trigger.py +0 -154
  421. autobyteus/tools/browser/session_aware/browser_session_aware_webpage_reader.py +0 -89
  422. autobyteus/tools/browser/session_aware/browser_session_aware_webpage_screenshot_taker.py +0 -107
  423. autobyteus/tools/browser/session_aware/factory/browser_session_aware_web_element_trigger_factory.py +0 -14
  424. autobyteus/tools/browser/session_aware/factory/browser_session_aware_webpage_reader_factory.py +0 -26
  425. autobyteus/tools/browser/session_aware/factory/browser_session_aware_webpage_screenshot_taker_factory.py +0 -14
  426. autobyteus/tools/browser/session_aware/shared_browser_session.py +0 -11
  427. autobyteus/tools/browser/session_aware/shared_browser_session_manager.py +0 -25
  428. autobyteus/tools/browser/session_aware/web_element_action.py +0 -20
  429. autobyteus/tools/browser/standalone/__init__.py +0 -6
  430. autobyteus/tools/browser/standalone/factory/__init__.py +0 -0
  431. autobyteus/tools/browser/standalone/factory/webpage_reader_factory.py +0 -25
  432. autobyteus/tools/browser/standalone/factory/webpage_screenshot_taker_factory.py +0 -14
  433. autobyteus/tools/browser/standalone/navigate_to.py +0 -84
  434. autobyteus/tools/browser/standalone/web_page_pdf_generator.py +0 -101
  435. autobyteus/tools/browser/standalone/webpage_image_downloader.py +0 -169
  436. autobyteus/tools/browser/standalone/webpage_reader.py +0 -105
  437. autobyteus/tools/browser/standalone/webpage_screenshot_taker.py +0 -105
  438. autobyteus/tools/file/edit_file.py +0 -200
  439. autobyteus/tools/file/list_directory.py +0 -168
  440. autobyteus/tools/file/search_files.py +0 -188
  441. autobyteus/tools/timer.py +0 -175
  442. autobyteus/tools/usage/parsers/__init__.py +0 -22
  443. autobyteus/tools/usage/parsers/_json_extractor.py +0 -99
  444. autobyteus/tools/usage/parsers/_string_decoders.py +0 -18
  445. autobyteus/tools/usage/parsers/anthropic_xml_tool_usage_parser.py +0 -10
  446. autobyteus/tools/usage/parsers/base_parser.py +0 -41
  447. autobyteus/tools/usage/parsers/default_json_tool_usage_parser.py +0 -83
  448. autobyteus/tools/usage/parsers/default_xml_tool_usage_parser.py +0 -316
  449. autobyteus/tools/usage/parsers/exceptions.py +0 -13
  450. autobyteus/tools/usage/parsers/gemini_json_tool_usage_parser.py +0 -77
  451. autobyteus/tools/usage/parsers/openai_json_tool_usage_parser.py +0 -149
  452. autobyteus/tools/usage/parsers/provider_aware_tool_usage_parser.py +0 -59
  453. autobyteus/tools/usage/registries/tool_usage_parser_registry.py +0 -62
  454. autobyteus/workflow/phases/__init__.py +0 -11
  455. autobyteus/workflow/phases/workflow_operational_phase.py +0 -19
  456. autobyteus/workflow/phases/workflow_phase_manager.py +0 -48
  457. autobyteus-1.2.1.dist-info/METADATA +0 -205
  458. autobyteus-1.2.1.dist-info/RECORD +0 -511
  459. examples/__init__.py +0 -1
  460. examples/agent_team/__init__.py +0 -1
  461. examples/discover_phase_transitions.py +0 -104
  462. examples/run_agentic_software_engineer.py +0 -239
  463. examples/run_browser_agent.py +0 -262
  464. examples/run_google_slides_agent.py +0 -287
  465. examples/run_mcp_browser_client.py +0 -174
  466. examples/run_mcp_google_slides_client.py +0 -270
  467. examples/run_mcp_list_tools.py +0 -189
  468. examples/run_poem_writer.py +0 -284
  469. examples/run_sqlite_agent.py +0 -295
  470. /autobyteus/{tools/browser/session_aware → skills}/__init__.py +0 -0
  471. /autobyteus/tools/{browser/session_aware/factory → skill}/__init__.py +0 -0
  472. {autobyteus-1.2.1.dist-info → autobyteus-1.3.0.dist-info}/licenses/LICENSE +0 -0
@@ -1,6 +1,6 @@
1
1
  # file: autobyteus/autobyteus/agent/handlers/tool_result_event_handler.py
2
2
  import logging
3
- import json
3
+
4
4
  from typing import TYPE_CHECKING, Optional, List
5
5
 
6
6
  from autobyteus.agent.handlers.base_event_handler import AgentEventHandler
@@ -9,6 +9,7 @@ from autobyteus.agent.tool_execution_result_processor import BaseToolExecutionRe
9
9
  from autobyteus.agent.message.context_file import ContextFile
10
10
  from autobyteus.agent.message import AgentInputUserMessage
11
11
  from autobyteus.agent.sender_type import SenderType
12
+ from autobyteus.utils.llm_output_formatter import format_to_clean_string
12
13
 
13
14
  if TYPE_CHECKING:
14
15
  from autobyteus.agent.context import AgentContext
@@ -81,10 +82,7 @@ class ToolResultEventHandler(AgentEventHandler):
81
82
  aggregated_content_parts.append(content_part)
82
83
  # Handle standard text/JSON results
83
84
  else:
84
- try:
85
- result_str = json.dumps(p_event.result, indent=2) if not isinstance(p_event.result, str) else p_event.result
86
- except TypeError: # pragma: no cover
87
- result_str = str(p_event.result)
85
+ result_str = format_to_clean_string(p_event.result)
88
86
  content_part = (
89
87
  f"Tool: {p_event.tool_name} (ID: {tool_invocation_id})\n"
90
88
  f"Status: Success\n"
@@ -120,7 +118,7 @@ class ToolResultEventHandler(AgentEventHandler):
120
118
  return
121
119
 
122
120
  agent_id = context.agent_id
123
- notifier: Optional['AgentExternalEventNotifier'] = context.phase_manager.notifier if context.phase_manager else None
121
+ notifier: Optional['AgentExternalEventNotifier'] = context.status_manager.notifier if context.status_manager else None
124
122
 
125
123
  # --- Step 1: Immediately process the incoming event ---
126
124
  processed_event = event
@@ -144,7 +142,7 @@ class ToolResultEventHandler(AgentEventHandler):
144
142
  if processed_event.error:
145
143
  log_message = f"[TOOL_RESULT_ERROR_PROCESSED] Agent_ID: {agent_id}, Tool: {processed_event.tool_name}, Invocation_ID: {tool_invocation_id}, Error: {processed_event.error}"
146
144
  else:
147
- log_message = f"[TOOL_RESULT_SUCCESS_PROCESSED] Agent_ID: {agent_id}, Tool: {processed_event.tool_name}, Invocation_ID: {tool_invocation_id}, Result: {str(processed_event.result)}"
145
+ log_message = f"[TOOL_RESULT_SUCCESS_PROCESSED] Agent_ID: {agent_id}, Tool: {processed_event.tool_name}, Invocation_ID: {tool_invocation_id}, Result: {format_to_clean_string(processed_event.result)}"
148
146
 
149
147
  try:
150
148
  log_data = {
@@ -195,7 +193,8 @@ class ToolResultEventHandler(AgentEventHandler):
195
193
  tool_name=original_invocation.name,
196
194
  result=None,
197
195
  error=f"Critical Error: Result for this tool call was lost.",
198
- tool_invocation_id=original_invocation.id
196
+ tool_invocation_id=original_invocation.id,
197
+ turn_id=original_invocation.turn_id,
199
198
  ))
200
199
 
201
200
  await self._dispatch_results_to_input_pipeline(sorted_results, context)
@@ -39,8 +39,8 @@ class UserInputMessageEventHandler(AgentEventHandler):
39
39
 
40
40
  # --- UPDATED LOGIC: Check sender_type for system-generated tasks and notify TUI ---
41
41
  if original_agent_input_user_msg.sender_type == SenderType.SYSTEM:
42
- if context.phase_manager:
43
- notifier: 'AgentExternalEventNotifier' = context.phase_manager.notifier
42
+ if context.status_manager:
43
+ notifier: 'AgentExternalEventNotifier' = context.status_manager.notifier
44
44
  notification_data = {
45
45
  "sender_id": original_agent_input_user_msg.metadata.get("sender_id", "system"),
46
46
  "content": original_agent_input_user_msg.content,
@@ -59,8 +59,15 @@ class UserInputMessageEventHandler(AgentEventHandler):
59
59
 
60
60
  processor_instances = context.config.input_processors
61
61
  if processor_instances:
62
+ valid_processors = []
63
+ for p in processor_instances:
64
+ if isinstance(p, BaseAgentUserInputMessageProcessor):
65
+ valid_processors.append(p)
66
+ else:
67
+ logger.error(f"Agent '{context.agent_id}': Invalid input processor type in config: {type(p)}. Skipping.")
68
+
62
69
  # Sort processors by their order attribute
63
- sorted_processors = sorted(processor_instances, key=lambda p: p.get_order())
70
+ sorted_processors = sorted(valid_processors, key=lambda p: p.get_order())
64
71
  processor_names = [p.get_name() for p in sorted_processors]
65
72
  logger.debug(f"Agent '{context.agent_id}': Applying input processors in order: {processor_names}")
66
73
 
@@ -0,0 +1,44 @@
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
+ from autobyteus.agent.sender_type import SenderType
7
+
8
+ if TYPE_CHECKING:
9
+ from autobyteus.agent.message.agent_input_user_message import AgentInputUserMessage
10
+ from autobyteus.agent.context import AgentContext
11
+ from autobyteus.agent.events import UserMessageReceivedEvent
12
+
13
+ logger = logging.getLogger(__name__)
14
+
15
+
16
+ class MemoryIngestInputProcessor(BaseAgentUserInputMessageProcessor):
17
+ @classmethod
18
+ def get_order(cls) -> int:
19
+ return 900
20
+
21
+ async def process(
22
+ self,
23
+ message: "AgentInputUserMessage",
24
+ context: "AgentContext",
25
+ triggering_event: "UserMessageReceivedEvent",
26
+ ) -> "AgentInputUserMessage":
27
+ memory_manager = getattr(context.state, "memory_manager", None)
28
+ if not memory_manager:
29
+ return message
30
+ if message.sender_type == SenderType.TOOL:
31
+ logger.debug("MemoryIngestInputProcessor skipping TOOL-originated message to avoid duplicate tool results.")
32
+ return message
33
+
34
+ turn_id = memory_manager.start_turn()
35
+ context.state.active_turn_id = turn_id
36
+
37
+ llm_user_message = build_llm_user_message(message)
38
+ memory_manager.ingest_user_message(
39
+ llm_user_message,
40
+ turn_id=turn_id,
41
+ source_event="LLMUserMessageReadyEvent",
42
+ )
43
+ logger.debug("MemoryIngestInputProcessor stored processed user input with turn_id %s", turn_id)
44
+ 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_working_context_snapshot(snapshot_messages)
64
+ self.memory_manager.clear_compaction_request()
65
+ did_compact = True
66
+
67
+ self.memory_manager.working_context_snapshot.append_message(user_message)
68
+ final_messages = self.memory_manager.get_working_context_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_working_context_messages()
95
+ if not existing:
96
+ self.memory_manager.working_context_snapshot.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
@@ -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: