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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (512) hide show
  1. autobyteus/agent/agent.py +15 -5
  2. autobyteus/agent/bootstrap_steps/__init__.py +1 -3
  3. autobyteus/agent/bootstrap_steps/agent_bootstrapper.py +3 -59
  4. autobyteus/agent/bootstrap_steps/base_bootstrap_step.py +1 -4
  5. autobyteus/agent/bootstrap_steps/mcp_server_prewarming_step.py +1 -3
  6. autobyteus/agent/bootstrap_steps/system_prompt_processing_step.py +16 -13
  7. autobyteus/agent/bootstrap_steps/workspace_context_initialization_step.py +2 -4
  8. autobyteus/agent/context/agent_config.py +43 -20
  9. autobyteus/agent/context/agent_context.py +23 -18
  10. autobyteus/agent/context/agent_runtime_state.py +23 -19
  11. autobyteus/agent/events/__init__.py +16 -1
  12. autobyteus/agent/events/agent_events.py +43 -3
  13. autobyteus/agent/events/agent_input_event_queue_manager.py +79 -26
  14. autobyteus/agent/events/event_store.py +57 -0
  15. autobyteus/agent/events/notifiers.py +74 -60
  16. autobyteus/agent/events/worker_event_dispatcher.py +21 -64
  17. autobyteus/agent/factory/agent_factory.py +52 -0
  18. autobyteus/agent/handlers/__init__.py +2 -0
  19. autobyteus/agent/handlers/approved_tool_invocation_event_handler.py +51 -34
  20. autobyteus/agent/handlers/bootstrap_event_handler.py +155 -0
  21. autobyteus/agent/handlers/inter_agent_message_event_handler.py +10 -0
  22. autobyteus/agent/handlers/lifecycle_event_logger.py +19 -11
  23. autobyteus/agent/handlers/llm_complete_response_received_event_handler.py +10 -15
  24. autobyteus/agent/handlers/llm_user_message_ready_event_handler.py +188 -48
  25. autobyteus/agent/handlers/tool_execution_approval_event_handler.py +0 -10
  26. autobyteus/agent/handlers/tool_invocation_request_event_handler.py +53 -48
  27. autobyteus/agent/handlers/tool_result_event_handler.py +7 -8
  28. autobyteus/agent/handlers/user_input_message_event_handler.py +10 -3
  29. autobyteus/agent/input_processor/memory_ingest_input_processor.py +40 -0
  30. autobyteus/agent/lifecycle/__init__.py +12 -0
  31. autobyteus/agent/lifecycle/base_processor.py +109 -0
  32. autobyteus/agent/lifecycle/events.py +35 -0
  33. autobyteus/agent/lifecycle/processor_definition.py +36 -0
  34. autobyteus/agent/lifecycle/processor_registry.py +106 -0
  35. autobyteus/agent/llm_request_assembler.py +98 -0
  36. autobyteus/agent/llm_response_processor/__init__.py +1 -8
  37. autobyteus/agent/message/context_file_type.py +1 -1
  38. autobyteus/agent/message/send_message_to.py +5 -4
  39. autobyteus/agent/runtime/agent_runtime.py +29 -21
  40. autobyteus/agent/runtime/agent_worker.py +98 -19
  41. autobyteus/agent/shutdown_steps/__init__.py +2 -0
  42. autobyteus/agent/shutdown_steps/agent_shutdown_orchestrator.py +2 -0
  43. autobyteus/agent/shutdown_steps/tool_cleanup_step.py +58 -0
  44. autobyteus/agent/status/__init__.py +14 -0
  45. autobyteus/agent/status/manager.py +93 -0
  46. autobyteus/agent/status/status_deriver.py +96 -0
  47. autobyteus/agent/{phases/phase_enum.py → status/status_enum.py} +16 -16
  48. autobyteus/agent/status/status_update_utils.py +73 -0
  49. autobyteus/agent/streaming/__init__.py +52 -5
  50. autobyteus/agent/streaming/adapters/__init__.py +18 -0
  51. autobyteus/agent/streaming/adapters/invocation_adapter.py +184 -0
  52. autobyteus/agent/streaming/adapters/tool_call_parsing.py +163 -0
  53. autobyteus/agent/streaming/adapters/tool_syntax_registry.py +67 -0
  54. autobyteus/agent/streaming/agent_event_stream.py +3 -178
  55. autobyteus/agent/streaming/api_tool_call/__init__.py +16 -0
  56. autobyteus/agent/streaming/api_tool_call/file_content_streamer.py +56 -0
  57. autobyteus/agent/streaming/api_tool_call/json_string_field_extractor.py +175 -0
  58. autobyteus/agent/streaming/api_tool_call_streaming_response_handler.py +4 -0
  59. autobyteus/agent/streaming/events/__init__.py +6 -0
  60. autobyteus/agent/streaming/events/stream_event_payloads.py +284 -0
  61. autobyteus/agent/streaming/events/stream_events.py +141 -0
  62. autobyteus/agent/streaming/handlers/__init__.py +15 -0
  63. autobyteus/agent/streaming/handlers/api_tool_call_streaming_response_handler.py +303 -0
  64. autobyteus/agent/streaming/handlers/parsing_streaming_response_handler.py +107 -0
  65. autobyteus/agent/streaming/handlers/pass_through_streaming_response_handler.py +107 -0
  66. autobyteus/agent/streaming/handlers/streaming_handler_factory.py +177 -0
  67. autobyteus/agent/streaming/handlers/streaming_response_handler.py +58 -0
  68. autobyteus/agent/streaming/parser/__init__.py +61 -0
  69. autobyteus/agent/streaming/parser/event_emitter.py +181 -0
  70. autobyteus/agent/streaming/parser/events.py +4 -0
  71. autobyteus/agent/streaming/parser/invocation_adapter.py +4 -0
  72. autobyteus/agent/streaming/parser/json_parsing_strategies/__init__.py +19 -0
  73. autobyteus/agent/streaming/parser/json_parsing_strategies/base.py +32 -0
  74. autobyteus/agent/streaming/parser/json_parsing_strategies/default.py +34 -0
  75. autobyteus/agent/streaming/parser/json_parsing_strategies/gemini.py +31 -0
  76. autobyteus/agent/streaming/parser/json_parsing_strategies/openai.py +64 -0
  77. autobyteus/agent/streaming/parser/json_parsing_strategies/registry.py +75 -0
  78. autobyteus/agent/streaming/parser/parser_context.py +227 -0
  79. autobyteus/agent/streaming/parser/parser_factory.py +132 -0
  80. autobyteus/agent/streaming/parser/sentinel_format.py +7 -0
  81. autobyteus/agent/streaming/parser/state_factory.py +62 -0
  82. autobyteus/agent/streaming/parser/states/__init__.py +1 -0
  83. autobyteus/agent/streaming/parser/states/base_state.py +60 -0
  84. autobyteus/agent/streaming/parser/states/custom_xml_tag_run_bash_parsing_state.py +38 -0
  85. autobyteus/agent/streaming/parser/states/custom_xml_tag_write_file_parsing_state.py +55 -0
  86. autobyteus/agent/streaming/parser/states/delimited_content_state.py +146 -0
  87. autobyteus/agent/streaming/parser/states/json_initialization_state.py +144 -0
  88. autobyteus/agent/streaming/parser/states/json_tool_parsing_state.py +137 -0
  89. autobyteus/agent/streaming/parser/states/sentinel_content_state.py +30 -0
  90. autobyteus/agent/streaming/parser/states/sentinel_initialization_state.py +117 -0
  91. autobyteus/agent/streaming/parser/states/text_state.py +78 -0
  92. autobyteus/agent/streaming/parser/states/xml_patch_file_tool_parsing_state.py +328 -0
  93. autobyteus/agent/streaming/parser/states/xml_run_bash_tool_parsing_state.py +129 -0
  94. autobyteus/agent/streaming/parser/states/xml_tag_initialization_state.py +151 -0
  95. autobyteus/agent/streaming/parser/states/xml_tool_parsing_state.py +63 -0
  96. autobyteus/agent/streaming/parser/states/xml_write_file_tool_parsing_state.py +343 -0
  97. autobyteus/agent/streaming/parser/strategies/__init__.py +17 -0
  98. autobyteus/agent/streaming/parser/strategies/base.py +24 -0
  99. autobyteus/agent/streaming/parser/strategies/json_tool_strategy.py +26 -0
  100. autobyteus/agent/streaming/parser/strategies/registry.py +28 -0
  101. autobyteus/agent/streaming/parser/strategies/sentinel_strategy.py +23 -0
  102. autobyteus/agent/streaming/parser/strategies/xml_tag_strategy.py +21 -0
  103. autobyteus/agent/streaming/parser/stream_scanner.py +167 -0
  104. autobyteus/agent/streaming/parser/streaming_parser.py +212 -0
  105. autobyteus/agent/streaming/parser/tool_call_parsing.py +4 -0
  106. autobyteus/agent/streaming/parser/tool_constants.py +7 -0
  107. autobyteus/agent/streaming/parser/tool_syntax_registry.py +4 -0
  108. autobyteus/agent/streaming/parser/xml_tool_parsing_state_registry.py +55 -0
  109. autobyteus/agent/streaming/parsing_streaming_response_handler.py +4 -0
  110. autobyteus/agent/streaming/pass_through_streaming_response_handler.py +4 -0
  111. autobyteus/agent/streaming/queue_streamer.py +3 -57
  112. autobyteus/agent/streaming/segments/__init__.py +5 -0
  113. autobyteus/agent/streaming/segments/segment_events.py +81 -0
  114. autobyteus/agent/streaming/stream_event_payloads.py +2 -198
  115. autobyteus/agent/streaming/stream_events.py +3 -128
  116. autobyteus/agent/streaming/streaming_handler_factory.py +4 -0
  117. autobyteus/agent/streaming/streaming_response_handler.py +4 -0
  118. autobyteus/agent/streaming/streams/__init__.py +5 -0
  119. autobyteus/agent/streaming/streams/agent_event_stream.py +197 -0
  120. autobyteus/agent/streaming/utils/__init__.py +5 -0
  121. autobyteus/agent/streaming/utils/queue_streamer.py +59 -0
  122. autobyteus/agent/system_prompt_processor/__init__.py +2 -0
  123. autobyteus/agent/system_prompt_processor/available_skills_processor.py +96 -0
  124. autobyteus/agent/system_prompt_processor/base_processor.py +1 -1
  125. autobyteus/agent/system_prompt_processor/processor_meta.py +15 -2
  126. autobyteus/agent/system_prompt_processor/tool_manifest_injector_processor.py +39 -58
  127. autobyteus/agent/token_budget.py +56 -0
  128. autobyteus/agent/tool_execution_result_processor/memory_ingest_tool_result_processor.py +29 -0
  129. autobyteus/agent/tool_invocation.py +16 -40
  130. autobyteus/agent/tool_invocation_preprocessor/__init__.py +9 -0
  131. autobyteus/agent/tool_invocation_preprocessor/base_preprocessor.py +45 -0
  132. autobyteus/agent/tool_invocation_preprocessor/processor_definition.py +15 -0
  133. autobyteus/agent/tool_invocation_preprocessor/processor_meta.py +33 -0
  134. autobyteus/agent/tool_invocation_preprocessor/processor_registry.py +60 -0
  135. autobyteus/agent/utils/wait_for_idle.py +12 -14
  136. autobyteus/agent/workspace/base_workspace.py +6 -27
  137. autobyteus/agent_team/agent_team.py +3 -3
  138. autobyteus/agent_team/agent_team_builder.py +1 -41
  139. autobyteus/agent_team/bootstrap_steps/__init__.py +0 -4
  140. autobyteus/agent_team/bootstrap_steps/agent_configuration_preparation_step.py +8 -18
  141. autobyteus/agent_team/bootstrap_steps/agent_team_bootstrapper.py +4 -16
  142. autobyteus/agent_team/bootstrap_steps/base_agent_team_bootstrap_step.py +1 -2
  143. autobyteus/agent_team/bootstrap_steps/coordinator_initialization_step.py +1 -2
  144. autobyteus/agent_team/bootstrap_steps/task_notifier_initialization_step.py +5 -6
  145. autobyteus/agent_team/bootstrap_steps/team_context_initialization_step.py +15 -15
  146. autobyteus/agent_team/context/agent_team_config.py +6 -3
  147. autobyteus/agent_team/context/agent_team_context.py +25 -3
  148. autobyteus/agent_team/context/agent_team_runtime_state.py +11 -8
  149. autobyteus/agent_team/events/__init__.py +11 -0
  150. autobyteus/agent_team/events/agent_team_event_dispatcher.py +22 -9
  151. autobyteus/agent_team/events/agent_team_events.py +16 -0
  152. autobyteus/agent_team/events/event_store.py +57 -0
  153. autobyteus/agent_team/factory/agent_team_factory.py +8 -0
  154. autobyteus/agent_team/handlers/inter_agent_message_request_event_handler.py +18 -2
  155. autobyteus/agent_team/handlers/lifecycle_agent_team_event_handler.py +21 -5
  156. autobyteus/agent_team/handlers/process_user_message_event_handler.py +17 -8
  157. autobyteus/agent_team/handlers/tool_approval_team_event_handler.py +19 -4
  158. autobyteus/agent_team/runtime/agent_team_runtime.py +41 -10
  159. autobyteus/agent_team/runtime/agent_team_worker.py +69 -5
  160. autobyteus/agent_team/status/__init__.py +14 -0
  161. autobyteus/agent_team/status/agent_team_status.py +18 -0
  162. autobyteus/agent_team/status/agent_team_status_manager.py +33 -0
  163. autobyteus/agent_team/status/status_deriver.py +62 -0
  164. autobyteus/agent_team/status/status_update_utils.py +42 -0
  165. autobyteus/agent_team/streaming/__init__.py +2 -2
  166. autobyteus/agent_team/streaming/agent_team_event_notifier.py +10 -10
  167. autobyteus/agent_team/streaming/agent_team_stream_event_payloads.py +7 -7
  168. autobyteus/agent_team/streaming/agent_team_stream_events.py +11 -11
  169. autobyteus/agent_team/system_prompt_processor/__init__.py +6 -0
  170. autobyteus/agent_team/system_prompt_processor/team_manifest_injector_processor.py +76 -0
  171. autobyteus/agent_team/task_notification/activation_policy.py +1 -1
  172. autobyteus/agent_team/task_notification/system_event_driven_agent_task_notifier.py +22 -22
  173. autobyteus/agent_team/task_notification/task_notification_mode.py +20 -1
  174. autobyteus/agent_team/utils/wait_for_idle.py +4 -4
  175. autobyteus/cli/agent_cli.py +18 -10
  176. autobyteus/cli/agent_team_tui/app.py +18 -15
  177. autobyteus/cli/agent_team_tui/state.py +21 -23
  178. autobyteus/cli/agent_team_tui/widgets/agent_list_sidebar.py +15 -15
  179. autobyteus/cli/agent_team_tui/widgets/focus_pane.py +146 -39
  180. autobyteus/cli/agent_team_tui/widgets/renderables.py +1 -1
  181. autobyteus/cli/agent_team_tui/widgets/shared.py +26 -26
  182. autobyteus/cli/agent_team_tui/widgets/{task_board_panel.py → task_plan_panel.py} +5 -5
  183. autobyteus/cli/cli_display.py +193 -44
  184. autobyteus/cli/workflow_tui/app.py +9 -10
  185. autobyteus/cli/workflow_tui/state.py +14 -16
  186. autobyteus/cli/workflow_tui/widgets/agent_list_sidebar.py +15 -15
  187. autobyteus/cli/workflow_tui/widgets/focus_pane.py +137 -35
  188. autobyteus/cli/workflow_tui/widgets/renderables.py +1 -1
  189. autobyteus/cli/workflow_tui/widgets/shared.py +25 -25
  190. autobyteus/clients/autobyteus_client.py +94 -1
  191. autobyteus/events/event_types.py +15 -21
  192. autobyteus/llm/api/autobyteus_llm.py +33 -29
  193. autobyteus/llm/api/claude_llm.py +142 -36
  194. autobyteus/llm/api/gemini_llm.py +163 -59
  195. autobyteus/llm/api/grok_llm.py +1 -1
  196. autobyteus/llm/api/minimax_llm.py +26 -0
  197. autobyteus/llm/api/mistral_llm.py +113 -87
  198. autobyteus/llm/api/ollama_llm.py +9 -42
  199. autobyteus/llm/api/openai_compatible_llm.py +127 -91
  200. autobyteus/llm/api/openai_llm.py +3 -3
  201. autobyteus/llm/api/openai_responses_llm.py +324 -0
  202. autobyteus/llm/api/zhipu_llm.py +21 -2
  203. autobyteus/llm/autobyteus_provider.py +70 -60
  204. autobyteus/llm/base_llm.py +85 -81
  205. autobyteus/llm/converters/__init__.py +14 -0
  206. autobyteus/llm/converters/anthropic_tool_call_converter.py +37 -0
  207. autobyteus/llm/converters/gemini_tool_call_converter.py +57 -0
  208. autobyteus/llm/converters/mistral_tool_call_converter.py +37 -0
  209. autobyteus/llm/converters/openai_tool_call_converter.py +38 -0
  210. autobyteus/llm/extensions/base_extension.py +6 -12
  211. autobyteus/llm/extensions/token_usage_tracking_extension.py +45 -18
  212. autobyteus/llm/llm_factory.py +282 -204
  213. autobyteus/llm/lmstudio_provider.py +60 -49
  214. autobyteus/llm/models.py +35 -2
  215. autobyteus/llm/ollama_provider.py +60 -49
  216. autobyteus/llm/ollama_provider_resolver.py +0 -1
  217. autobyteus/llm/prompt_renderers/__init__.py +19 -0
  218. autobyteus/llm/prompt_renderers/anthropic_prompt_renderer.py +104 -0
  219. autobyteus/llm/prompt_renderers/autobyteus_prompt_renderer.py +19 -0
  220. autobyteus/llm/prompt_renderers/base_prompt_renderer.py +10 -0
  221. autobyteus/llm/prompt_renderers/gemini_prompt_renderer.py +63 -0
  222. autobyteus/llm/prompt_renderers/mistral_prompt_renderer.py +87 -0
  223. autobyteus/llm/prompt_renderers/ollama_prompt_renderer.py +51 -0
  224. autobyteus/llm/prompt_renderers/openai_chat_renderer.py +97 -0
  225. autobyteus/llm/prompt_renderers/openai_responses_renderer.py +101 -0
  226. autobyteus/llm/providers.py +1 -3
  227. autobyteus/llm/token_counter/claude_token_counter.py +56 -25
  228. autobyteus/llm/token_counter/mistral_token_counter.py +12 -8
  229. autobyteus/llm/token_counter/openai_token_counter.py +24 -5
  230. autobyteus/llm/token_counter/token_counter_factory.py +12 -5
  231. autobyteus/llm/utils/llm_config.py +6 -12
  232. autobyteus/llm/utils/media_payload_formatter.py +27 -20
  233. autobyteus/llm/utils/messages.py +55 -3
  234. autobyteus/llm/utils/response_types.py +3 -0
  235. autobyteus/llm/utils/tool_call_delta.py +31 -0
  236. autobyteus/memory/__init__.py +32 -0
  237. autobyteus/memory/active_transcript.py +69 -0
  238. autobyteus/memory/compaction/__init__.py +9 -0
  239. autobyteus/memory/compaction/compaction_result.py +8 -0
  240. autobyteus/memory/compaction/compactor.py +89 -0
  241. autobyteus/memory/compaction/summarizer.py +11 -0
  242. autobyteus/memory/compaction_snapshot_builder.py +84 -0
  243. autobyteus/memory/memory_manager.py +183 -0
  244. autobyteus/memory/models/__init__.py +14 -0
  245. autobyteus/memory/models/episodic_item.py +41 -0
  246. autobyteus/memory/models/memory_types.py +7 -0
  247. autobyteus/memory/models/raw_trace_item.py +79 -0
  248. autobyteus/memory/models/semantic_item.py +41 -0
  249. autobyteus/memory/models/tool_interaction.py +20 -0
  250. autobyteus/memory/policies/__init__.py +5 -0
  251. autobyteus/memory/policies/compaction_policy.py +16 -0
  252. autobyteus/memory/retrieval/__init__.py +7 -0
  253. autobyteus/memory/retrieval/memory_bundle.py +11 -0
  254. autobyteus/memory/retrieval/retriever.py +13 -0
  255. autobyteus/memory/store/__init__.py +7 -0
  256. autobyteus/memory/store/base_store.py +14 -0
  257. autobyteus/memory/store/file_store.py +98 -0
  258. autobyteus/memory/tool_interaction_builder.py +46 -0
  259. autobyteus/memory/turn_tracker.py +9 -0
  260. autobyteus/multimedia/audio/api/__init__.py +3 -2
  261. autobyteus/multimedia/audio/api/autobyteus_audio_client.py +19 -5
  262. autobyteus/multimedia/audio/api/gemini_audio_client.py +108 -16
  263. autobyteus/multimedia/audio/api/openai_audio_client.py +112 -0
  264. autobyteus/multimedia/audio/audio_client_factory.py +84 -9
  265. autobyteus/multimedia/audio/audio_model.py +2 -1
  266. autobyteus/multimedia/image/api/autobyteus_image_client.py +19 -5
  267. autobyteus/multimedia/image/api/gemini_image_client.py +38 -17
  268. autobyteus/multimedia/image/api/openai_image_client.py +125 -43
  269. autobyteus/multimedia/image/autobyteus_image_provider.py +2 -1
  270. autobyteus/multimedia/image/image_client_factory.py +47 -15
  271. autobyteus/multimedia/image/image_model.py +5 -2
  272. autobyteus/multimedia/providers.py +3 -2
  273. autobyteus/skills/loader.py +71 -0
  274. autobyteus/skills/model.py +11 -0
  275. autobyteus/skills/registry.py +70 -0
  276. autobyteus/task_management/__init__.py +43 -20
  277. autobyteus/task_management/{base_task_board.py → base_task_plan.py} +16 -13
  278. autobyteus/task_management/converters/__init__.py +2 -2
  279. autobyteus/task_management/converters/{task_board_converter.py → task_plan_converter.py} +13 -13
  280. autobyteus/task_management/events.py +7 -7
  281. autobyteus/task_management/{in_memory_task_board.py → in_memory_task_plan.py} +34 -22
  282. autobyteus/task_management/schemas/__init__.py +3 -0
  283. autobyteus/task_management/schemas/task_status_report.py +2 -2
  284. autobyteus/task_management/schemas/todo_definition.py +15 -0
  285. autobyteus/task_management/todo.py +29 -0
  286. autobyteus/task_management/todo_list.py +75 -0
  287. autobyteus/task_management/tools/__init__.py +24 -8
  288. autobyteus/task_management/tools/task_tools/__init__.py +19 -0
  289. autobyteus/task_management/tools/{assign_task_to.py → task_tools/assign_task_to.py} +18 -18
  290. autobyteus/task_management/tools/{publish_task.py → task_tools/create_task.py} +16 -18
  291. autobyteus/task_management/tools/{publish_tasks.py → task_tools/create_tasks.py} +19 -19
  292. autobyteus/task_management/tools/{get_my_tasks.py → task_tools/get_my_tasks.py} +15 -15
  293. autobyteus/task_management/tools/{get_task_board_status.py → task_tools/get_task_plan_status.py} +16 -16
  294. autobyteus/task_management/tools/{update_task_status.py → task_tools/update_task_status.py} +16 -16
  295. autobyteus/task_management/tools/todo_tools/__init__.py +18 -0
  296. autobyteus/task_management/tools/todo_tools/add_todo.py +78 -0
  297. autobyteus/task_management/tools/todo_tools/create_todo_list.py +79 -0
  298. autobyteus/task_management/tools/todo_tools/get_todo_list.py +55 -0
  299. autobyteus/task_management/tools/todo_tools/update_todo_status.py +85 -0
  300. autobyteus/tools/__init__.py +43 -52
  301. autobyteus/tools/base_tool.py +7 -0
  302. autobyteus/tools/file/__init__.py +9 -0
  303. autobyteus/tools/file/patch_file.py +149 -0
  304. autobyteus/tools/file/{file_reader.py → read_file.py} +38 -7
  305. autobyteus/tools/file/{file_writer.py → write_file.py} +7 -4
  306. autobyteus/tools/functional_tool.py +53 -14
  307. autobyteus/tools/mcp/__init__.py +2 -0
  308. autobyteus/tools/mcp/config_service.py +5 -1
  309. autobyteus/tools/mcp/server/__init__.py +2 -0
  310. autobyteus/tools/mcp/server/http_managed_mcp_server.py +1 -1
  311. autobyteus/tools/mcp/server/websocket_managed_mcp_server.py +141 -0
  312. autobyteus/tools/mcp/server_instance_manager.py +8 -1
  313. autobyteus/tools/mcp/tool.py +3 -3
  314. autobyteus/tools/mcp/tool_registrar.py +5 -2
  315. autobyteus/tools/mcp/types.py +61 -0
  316. autobyteus/tools/multimedia/__init__.py +2 -1
  317. autobyteus/tools/multimedia/audio_tools.py +72 -19
  318. autobyteus/tools/{download_media_tool.py → multimedia/download_media_tool.py} +21 -7
  319. autobyteus/tools/multimedia/image_tools.py +248 -64
  320. autobyteus/tools/multimedia/media_reader_tool.py +1 -1
  321. autobyteus/tools/operation_executor/journal_manager.py +107 -0
  322. autobyteus/tools/operation_executor/operation_event_buffer.py +57 -0
  323. autobyteus/tools/operation_executor/operation_event_producer.py +29 -0
  324. autobyteus/tools/operation_executor/operation_executor.py +58 -0
  325. autobyteus/tools/registry/tool_definition.py +108 -14
  326. autobyteus/tools/registry/tool_registry.py +29 -0
  327. autobyteus/tools/search/__init__.py +17 -0
  328. autobyteus/tools/search/base_strategy.py +35 -0
  329. autobyteus/tools/search/client.py +24 -0
  330. autobyteus/tools/search/factory.py +81 -0
  331. autobyteus/tools/search/google_cse_strategy.py +68 -0
  332. autobyteus/tools/search/providers.py +10 -0
  333. autobyteus/tools/search/serpapi_strategy.py +65 -0
  334. autobyteus/tools/search/serper_strategy.py +87 -0
  335. autobyteus/tools/search_tool.py +83 -0
  336. autobyteus/tools/skill/load_skill.py +50 -0
  337. autobyteus/tools/terminal/__init__.py +45 -0
  338. autobyteus/tools/terminal/ansi_utils.py +32 -0
  339. autobyteus/tools/terminal/background_process_manager.py +233 -0
  340. autobyteus/tools/terminal/output_buffer.py +105 -0
  341. autobyteus/tools/terminal/prompt_detector.py +63 -0
  342. autobyteus/tools/terminal/pty_session.py +241 -0
  343. autobyteus/tools/terminal/session_factory.py +20 -0
  344. autobyteus/tools/terminal/terminal_session_manager.py +226 -0
  345. autobyteus/tools/terminal/tools/__init__.py +13 -0
  346. autobyteus/tools/terminal/tools/get_process_output.py +81 -0
  347. autobyteus/tools/terminal/tools/run_bash.py +109 -0
  348. autobyteus/tools/terminal/tools/start_background_process.py +104 -0
  349. autobyteus/tools/terminal/tools/stop_background_process.py +67 -0
  350. autobyteus/tools/terminal/types.py +54 -0
  351. autobyteus/tools/terminal/wsl_tmux_session.py +221 -0
  352. autobyteus/tools/terminal/wsl_utils.py +156 -0
  353. autobyteus/tools/tool_meta.py +4 -24
  354. autobyteus/tools/transaction_management/backup_handler.py +48 -0
  355. autobyteus/tools/transaction_management/operation_lifecycle_manager.py +62 -0
  356. autobyteus/tools/usage/__init__.py +1 -2
  357. autobyteus/tools/usage/formatters/__init__.py +17 -1
  358. autobyteus/tools/usage/formatters/base_formatter.py +8 -0
  359. autobyteus/tools/usage/formatters/default_xml_schema_formatter.py +2 -2
  360. autobyteus/tools/usage/formatters/mistral_json_schema_formatter.py +18 -0
  361. autobyteus/tools/usage/formatters/patch_file_xml_example_formatter.py +64 -0
  362. autobyteus/tools/usage/formatters/patch_file_xml_schema_formatter.py +31 -0
  363. autobyteus/tools/usage/formatters/run_bash_xml_example_formatter.py +32 -0
  364. autobyteus/tools/usage/formatters/run_bash_xml_schema_formatter.py +36 -0
  365. autobyteus/tools/usage/formatters/write_file_xml_example_formatter.py +53 -0
  366. autobyteus/tools/usage/formatters/write_file_xml_schema_formatter.py +31 -0
  367. autobyteus/tools/usage/providers/tool_manifest_provider.py +10 -10
  368. autobyteus/tools/usage/registries/__init__.py +1 -3
  369. autobyteus/tools/usage/registries/tool_formatting_registry.py +115 -8
  370. autobyteus/tools/usage/tool_schema_provider.py +51 -0
  371. autobyteus/tools/web/__init__.py +4 -0
  372. autobyteus/tools/web/read_url_tool.py +80 -0
  373. autobyteus/utils/diff_utils.py +271 -0
  374. autobyteus/utils/download_utils.py +109 -0
  375. autobyteus/utils/file_utils.py +57 -2
  376. autobyteus/utils/gemini_helper.py +56 -0
  377. autobyteus/utils/gemini_model_mapping.py +71 -0
  378. autobyteus/utils/llm_output_formatter.py +75 -0
  379. autobyteus/utils/tool_call_format.py +36 -0
  380. autobyteus/workflow/agentic_workflow.py +3 -3
  381. autobyteus/workflow/bootstrap_steps/agent_tool_injection_step.py +2 -2
  382. autobyteus/workflow/bootstrap_steps/base_workflow_bootstrap_step.py +2 -2
  383. autobyteus/workflow/bootstrap_steps/coordinator_initialization_step.py +2 -2
  384. autobyteus/workflow/bootstrap_steps/coordinator_prompt_preparation_step.py +4 -11
  385. autobyteus/workflow/bootstrap_steps/workflow_bootstrapper.py +6 -6
  386. autobyteus/workflow/bootstrap_steps/workflow_runtime_queue_initialization_step.py +2 -2
  387. autobyteus/workflow/context/workflow_context.py +3 -3
  388. autobyteus/workflow/context/workflow_runtime_state.py +5 -5
  389. autobyteus/workflow/events/workflow_event_dispatcher.py +5 -5
  390. autobyteus/workflow/handlers/lifecycle_workflow_event_handler.py +3 -3
  391. autobyteus/workflow/handlers/process_user_message_event_handler.py +5 -5
  392. autobyteus/workflow/handlers/tool_approval_workflow_event_handler.py +2 -2
  393. autobyteus/workflow/runtime/workflow_runtime.py +8 -8
  394. autobyteus/workflow/runtime/workflow_worker.py +3 -3
  395. autobyteus/workflow/status/__init__.py +11 -0
  396. autobyteus/workflow/status/workflow_status.py +19 -0
  397. autobyteus/workflow/status/workflow_status_manager.py +48 -0
  398. autobyteus/workflow/streaming/__init__.py +2 -2
  399. autobyteus/workflow/streaming/workflow_event_notifier.py +7 -7
  400. autobyteus/workflow/streaming/workflow_stream_event_payloads.py +4 -4
  401. autobyteus/workflow/streaming/workflow_stream_events.py +3 -3
  402. autobyteus/workflow/utils/wait_for_idle.py +4 -4
  403. autobyteus-1.2.3.dist-info/METADATA +293 -0
  404. autobyteus-1.2.3.dist-info/RECORD +600 -0
  405. {autobyteus-1.2.0.dist-info → autobyteus-1.2.3.dist-info}/WHEEL +1 -1
  406. {autobyteus-1.2.0.dist-info → autobyteus-1.2.3.dist-info}/top_level.txt +0 -1
  407. autobyteus/agent/bootstrap_steps/agent_runtime_queue_initialization_step.py +0 -57
  408. autobyteus/agent/hooks/__init__.py +0 -16
  409. autobyteus/agent/hooks/base_phase_hook.py +0 -78
  410. autobyteus/agent/hooks/hook_definition.py +0 -36
  411. autobyteus/agent/hooks/hook_meta.py +0 -37
  412. autobyteus/agent/hooks/hook_registry.py +0 -106
  413. autobyteus/agent/llm_response_processor/provider_aware_tool_usage_processor.py +0 -103
  414. autobyteus/agent/phases/__init__.py +0 -18
  415. autobyteus/agent/phases/discover.py +0 -53
  416. autobyteus/agent/phases/manager.py +0 -265
  417. autobyteus/agent/phases/transition_decorator.py +0 -40
  418. autobyteus/agent/phases/transition_info.py +0 -33
  419. autobyteus/agent/remote_agent.py +0 -244
  420. autobyteus/agent/workspace/workspace_definition.py +0 -36
  421. autobyteus/agent/workspace/workspace_meta.py +0 -37
  422. autobyteus/agent/workspace/workspace_registry.py +0 -72
  423. autobyteus/agent_team/bootstrap_steps/agent_team_runtime_queue_initialization_step.py +0 -25
  424. autobyteus/agent_team/bootstrap_steps/coordinator_prompt_preparation_step.py +0 -85
  425. autobyteus/agent_team/phases/__init__.py +0 -11
  426. autobyteus/agent_team/phases/agent_team_operational_phase.py +0 -19
  427. autobyteus/agent_team/phases/agent_team_phase_manager.py +0 -48
  428. autobyteus/llm/api/bedrock_llm.py +0 -92
  429. autobyteus/llm/api/groq_llm.py +0 -94
  430. autobyteus/llm/api/nvidia_llm.py +0 -108
  431. autobyteus/llm/utils/token_pricing_config.py +0 -87
  432. autobyteus/person/examples/sample_persons.py +0 -14
  433. autobyteus/person/examples/sample_roles.py +0 -14
  434. autobyteus/person/person.py +0 -29
  435. autobyteus/person/role.py +0 -14
  436. autobyteus/rpc/__init__.py +0 -73
  437. autobyteus/rpc/client/__init__.py +0 -17
  438. autobyteus/rpc/client/abstract_client_connection.py +0 -124
  439. autobyteus/rpc/client/client_connection_manager.py +0 -153
  440. autobyteus/rpc/client/sse_client_connection.py +0 -306
  441. autobyteus/rpc/client/stdio_client_connection.py +0 -280
  442. autobyteus/rpc/config/__init__.py +0 -13
  443. autobyteus/rpc/config/agent_server_config.py +0 -153
  444. autobyteus/rpc/config/agent_server_registry.py +0 -152
  445. autobyteus/rpc/hosting.py +0 -244
  446. autobyteus/rpc/protocol.py +0 -244
  447. autobyteus/rpc/server/__init__.py +0 -20
  448. autobyteus/rpc/server/agent_server_endpoint.py +0 -181
  449. autobyteus/rpc/server/base_method_handler.py +0 -40
  450. autobyteus/rpc/server/method_handlers.py +0 -259
  451. autobyteus/rpc/server/sse_server_handler.py +0 -182
  452. autobyteus/rpc/server/stdio_server_handler.py +0 -151
  453. autobyteus/rpc/server_main.py +0 -198
  454. autobyteus/rpc/transport_type.py +0 -13
  455. autobyteus/tools/bash/__init__.py +0 -2
  456. autobyteus/tools/bash/bash_executor.py +0 -100
  457. autobyteus/tools/browser/__init__.py +0 -2
  458. autobyteus/tools/browser/session_aware/__init__.py +0 -0
  459. autobyteus/tools/browser/session_aware/browser_session_aware_navigate_to.py +0 -75
  460. autobyteus/tools/browser/session_aware/browser_session_aware_tool.py +0 -30
  461. autobyteus/tools/browser/session_aware/browser_session_aware_web_element_trigger.py +0 -154
  462. autobyteus/tools/browser/session_aware/browser_session_aware_webpage_reader.py +0 -89
  463. autobyteus/tools/browser/session_aware/browser_session_aware_webpage_screenshot_taker.py +0 -107
  464. autobyteus/tools/browser/session_aware/factory/__init__.py +0 -0
  465. autobyteus/tools/browser/session_aware/factory/browser_session_aware_web_element_trigger_factory.py +0 -14
  466. autobyteus/tools/browser/session_aware/factory/browser_session_aware_webpage_reader_factory.py +0 -26
  467. autobyteus/tools/browser/session_aware/factory/browser_session_aware_webpage_screenshot_taker_factory.py +0 -14
  468. autobyteus/tools/browser/session_aware/shared_browser_session.py +0 -11
  469. autobyteus/tools/browser/session_aware/shared_browser_session_manager.py +0 -25
  470. autobyteus/tools/browser/session_aware/web_element_action.py +0 -20
  471. autobyteus/tools/browser/standalone/__init__.py +0 -6
  472. autobyteus/tools/browser/standalone/factory/__init__.py +0 -0
  473. autobyteus/tools/browser/standalone/factory/webpage_reader_factory.py +0 -25
  474. autobyteus/tools/browser/standalone/factory/webpage_screenshot_taker_factory.py +0 -14
  475. autobyteus/tools/browser/standalone/navigate_to.py +0 -80
  476. autobyteus/tools/browser/standalone/web_page_pdf_generator.py +0 -97
  477. autobyteus/tools/browser/standalone/webpage_image_downloader.py +0 -165
  478. autobyteus/tools/browser/standalone/webpage_reader.py +0 -101
  479. autobyteus/tools/browser/standalone/webpage_screenshot_taker.py +0 -101
  480. autobyteus/tools/file/file_editor.py +0 -200
  481. autobyteus/tools/google_search.py +0 -149
  482. autobyteus/tools/timer.py +0 -171
  483. autobyteus/tools/usage/parsers/__init__.py +0 -22
  484. autobyteus/tools/usage/parsers/_json_extractor.py +0 -99
  485. autobyteus/tools/usage/parsers/_string_decoders.py +0 -18
  486. autobyteus/tools/usage/parsers/anthropic_xml_tool_usage_parser.py +0 -10
  487. autobyteus/tools/usage/parsers/base_parser.py +0 -41
  488. autobyteus/tools/usage/parsers/default_json_tool_usage_parser.py +0 -83
  489. autobyteus/tools/usage/parsers/default_xml_tool_usage_parser.py +0 -316
  490. autobyteus/tools/usage/parsers/exceptions.py +0 -13
  491. autobyteus/tools/usage/parsers/gemini_json_tool_usage_parser.py +0 -77
  492. autobyteus/tools/usage/parsers/openai_json_tool_usage_parser.py +0 -149
  493. autobyteus/tools/usage/parsers/provider_aware_tool_usage_parser.py +0 -59
  494. autobyteus/tools/usage/registries/tool_usage_parser_registry.py +0 -62
  495. autobyteus/workflow/phases/__init__.py +0 -11
  496. autobyteus/workflow/phases/workflow_operational_phase.py +0 -19
  497. autobyteus/workflow/phases/workflow_phase_manager.py +0 -48
  498. autobyteus-1.2.0.dist-info/METADATA +0 -205
  499. autobyteus-1.2.0.dist-info/RECORD +0 -496
  500. examples/__init__.py +0 -1
  501. examples/agent_team/__init__.py +0 -1
  502. examples/discover_phase_transitions.py +0 -104
  503. examples/run_browser_agent.py +0 -262
  504. examples/run_google_slides_agent.py +0 -287
  505. examples/run_mcp_browser_client.py +0 -174
  506. examples/run_mcp_google_slides_client.py +0 -270
  507. examples/run_mcp_list_tools.py +0 -189
  508. examples/run_poem_writer.py +0 -284
  509. examples/run_sqlite_agent.py +0 -295
  510. /autobyteus/{person → skills}/__init__.py +0 -0
  511. /autobyteus/{person/examples → tools/skill}/__init__.py +0 -0
  512. {autobyteus-1.2.0.dist-info → autobyteus-1.2.3.dist-info}/licenses/LICENSE +0 -0
@@ -1,198 +0,0 @@
1
- # file: autobyteus/autobyteus/rpc/server_main.py
2
- import asyncio
3
- import logging
4
- import argparse
5
- import signal
6
- import sys
7
- from typing import Optional
8
-
9
- from autobyteus.agent.registry.agent_definition import AgentDefinition
10
- from autobyteus.agent.registry.agent_registry import default_definition_registry, default_agent_registry
11
- from autobyteus.agent.agent import Agent
12
- from autobyteus.llm.models import LLMModel
13
-
14
- from autobyteus.rpc.config import AgentServerConfig, default_agent_server_registry
15
- from autobyteus.rpc.server import AgentServerEndpoint
16
- from autobyteus.rpc.transport_type import TransportType
17
-
18
- try:
19
- from autobyteus.agent.input_processor import PassthroughInputProcessor
20
- except ImportError:
21
- print("WARNING: PassthroughInputProcessor not found, EchoAgentDefinition in server_main might fail if used.", file=sys.stderr)
22
-
23
-
24
- logging.basicConfig(
25
- level=logging.INFO,
26
- format='%(asctime)s - %(levelname)s - %(name)s - [%(process)d] - %(message)s',
27
- stream=sys.stderr
28
- )
29
- logger = logging.getLogger(__name__)
30
-
31
-
32
- ECHO_AGENT_DEF: Optional[AgentDefinition] = None
33
- try:
34
- if not default_definition_registry.get("EchoAgent", "echo_responder"):
35
- ECHO_AGENT_DEF = AgentDefinition(
36
- name="EchoAgent",
37
- role="echo_responder",
38
- description="A simple agent that echoes back user messages.",
39
- system_prompt="You are an echo agent. Repeat the user's message precisely.",
40
- tool_names=[],
41
- input_processor_names=["PassthroughInputProcessor"], # Assumes PassthroughInputProcessor is registered
42
- llm_response_processor_names=[]
43
- )
44
- logger.info(f"Example AgentDefinition '{ECHO_AGENT_DEF.name}' created and auto-registered for server_main.")
45
- else:
46
- ECHO_AGENT_DEF = default_definition_registry.get("EchoAgent", "echo_responder")
47
- logger.info(f"Example AgentDefinition 'EchoAgent' already registered. Using existing one for server_main.")
48
- except Exception as e:
49
- logger.error(f"Could not create/retrieve example EchoAgentDefinition: {e}. server_main might fail if it's requested.")
50
-
51
-
52
- shutdown_event = asyncio.Event()
53
- agent_global: Optional[Agent] = None
54
- server_endpoint_global: Optional[AgentServerEndpoint] = None
55
-
56
- async def main():
57
- global agent_global, server_endpoint_global
58
-
59
- parser = argparse.ArgumentParser(description="AutoByteUs Agent RPC Server")
60
- parser.add_argument("--agent-def-name", type=str, required=True, help="Name of the AgentDefinition.")
61
- parser.add_argument("--agent-def-role", type=str, required=True, help="Role of the AgentDefinition.")
62
- parser.add_argument("--llm-model-name", type=str, required=True, help="Name of the LLMModel (e.g., 'GPT_4o_API'). This is the string name for the model, not the enum member itself.")
63
- parser.add_argument("--server-config-id", type=str, required=True, help="ID of the AgentServerConfig.")
64
-
65
- args = parser.parse_args()
66
- logger.info(f"server_main starting with args: {args}")
67
-
68
- agent_definition = default_definition_registry.get(args.agent_def_name, args.agent_def_role)
69
- if not agent_definition:
70
- logger.error(f"AgentDefinition not found for name='{args.agent_def_name}', role='{args.agent_def_role}'.")
71
- sys.exit(1)
72
-
73
- # The llm_model_name from args is already a string, which is what create_agent now expects.
74
- # We still need to validate if it's a known model name for robustness,
75
- # though create_agent (via AgentFactory -> AgentConfig) will also do this.
76
- try:
77
- LLMModel[args.llm_model_name.upper()] # Validate if the name maps to a known LLMModel enum member
78
- except KeyError:
79
- logger.error(f"LLMModel name '{args.llm_model_name}' provided via --llm-model-name is not a recognized LLMModel. Available: {[m.name for m in LLMModel]}")
80
- sys.exit(1)
81
-
82
- server_config = default_agent_server_registry.get_config(args.server_config_id)
83
- if not server_config:
84
- logger.error(f"AgentServerConfig not found for server_config_id='{args.server_config_id}'.")
85
- sys.exit(1)
86
-
87
- try:
88
- # UPDATED: Pass llm_model_name directly as a string.
89
- # AgentRegistry.create_agent -> AgentFactory.create_agent_runtime -> AgentFactory.create_agent_context
90
- # -> AgentConfig now takes llm_model_name: str.
91
- agent = default_agent_registry.create_agent(
92
- definition=agent_definition,
93
- llm_model_name=args.llm_model_name # Pass the string name
94
- # custom_llm_config, custom_tool_config, etc., can be added here if needed
95
- )
96
- agent_global = agent
97
- except Exception as e:
98
- logger.error(f"Failed to create Agent instance: {e}", exc_info=True)
99
- sys.exit(1)
100
-
101
- logger.info(f"Agent instance created with agent_id '{agent.agent_id}'.")
102
-
103
- server_endpoint = AgentServerEndpoint(agent)
104
- server_endpoint_global = server_endpoint
105
- logger.info(f"AgentServerEndpoint instantiated for agent '{agent.agent_id}'.")
106
-
107
- try:
108
- logger.info(f"Starting Agent '{agent.agent_id}' (runtime execution loop)...")
109
- agent.start()
110
-
111
- logger.info(f"Starting AgentServerEndpoint for agent '{agent.agent_id}' with config '{server_config.server_id}' (Transport: {server_config.transport_type.value})...")
112
- await server_endpoint.start(server_config)
113
-
114
- logger.info(f"Agent '{agent.agent_id}' is now hosted and listening via RPC ({server_config.transport_type.value}).")
115
- await shutdown_event.wait()
116
-
117
- except Exception as e:
118
- logger.error(f"Error during server startup or main execution: {e}", exc_info=True)
119
- finally:
120
- logger.info("server_main performing final shutdown...")
121
- if server_endpoint_global and server_endpoint_global.is_running:
122
- logger.info("Stopping AgentServerEndpoint...")
123
- await server_endpoint_global.stop()
124
-
125
- if agent_global and agent_global.is_running:
126
- logger.info(f"Stopping Agent '{agent_global.agent_id}'...")
127
- await agent_global.stop()
128
-
129
- logger.info("server_main has shut down.")
130
-
131
- async def initiate_shutdown_from_signal():
132
- logger.debug("Initiating shutdown via signal...")
133
- shutdown_event.set()
134
-
135
- if __name__ == "__main__":
136
- # Ensure input processors are available if EchoAgentDefinition needs them
137
- # This try-except is more for robustness during development/examples.
138
- try:
139
- # This import ensures that processors like PassthroughInputProcessor are registered
140
- # if EchoAgentDefinition (or others used by server_main) depends on them.
141
- from autobyteus.agent import input_processor # type: ignore
142
- except ImportError as e_proc:
143
- logger.warning(f"Could not import autobyteus.agent.input_processor: {e_proc}. "
144
- "Make sure custom input processors are correctly installed and registered if used by agent definitions.")
145
-
146
-
147
- # Example STDIO server config (remains for testing server_main directly)
148
- stdio_cfg_id = "default_stdio_server_cfg"
149
- if not default_agent_server_registry.get_config(stdio_cfg_id):
150
- example_stdio_cfg = AgentServerConfig(
151
- server_id=stdio_cfg_id,
152
- transport_type=TransportType.STDIO,
153
- # stdio_command is usually for launching this script itself as a subprocess.
154
- # For direct execution of server_main.py, this specific command isn't directly used
155
- # but a valid config is needed if --server-config-id=default_stdio_server_cfg is passed.
156
- stdio_command=["python", "-m", "autobyteus.rpc.server_main",
157
- "--agent-def-name", "EchoAgent",
158
- "--agent-def-role", "echo_responder",
159
- "--llm-model-name", "GPT_4O_API", # Example model name
160
- "--server-config-id", stdio_cfg_id
161
- ]
162
- )
163
- default_agent_server_registry.register_config(example_stdio_cfg)
164
- logger.info(f"Registered example STDIOServerConfig '{stdio_cfg_id}'.")
165
-
166
- # Example SSE server config
167
- sse_cfg_id = "default_sse_server_cfg"
168
- if not default_agent_server_registry.get_config(sse_cfg_id):
169
- example_sse_cfg = AgentServerConfig(
170
- server_id=sse_cfg_id, # This ID is for the server config itself
171
- transport_type=TransportType.SSE,
172
- sse_base_url="http://localhost:8765",
173
- sse_request_endpoint="/invoke_rpc", # Changed from /rpc to avoid clash with potential future global /rpc
174
- sse_events_endpoint="/agent_events" # Changed from /events
175
- )
176
- default_agent_server_registry.register_config(example_sse_cfg)
177
- logger.info(f"Registered example SseServerConfig '{sse_cfg_id}'.")
178
-
179
- loop = asyncio.get_event_loop()
180
- for sig_name_str in ('SIGINT', 'SIGTERM'):
181
- sig_enum_member = getattr(signal, sig_name_str, None)
182
- if sig_enum_member:
183
- try:
184
- loop.add_signal_handler(sig_enum_member, lambda s=sig_name_str: asyncio.create_task(initiate_shutdown_from_signal()))
185
- except (ValueError, RuntimeError, NotImplementedError) as e: # Might fail on Windows for SIGTERM
186
- logger.warning(f"Could not set signal handler for {sig_name_str} on this platform: {e}.")
187
- try:
188
- loop.run_until_complete(main())
189
- except KeyboardInterrupt:
190
- logger.info("KeyboardInterrupt received in main. Shutting down.")
191
- if not shutdown_event.is_set():
192
- if loop.is_running():
193
- asyncio.ensure_future(initiate_shutdown_from_signal(), loop=loop)
194
- else: # Should not happen if loop was running
195
- loop.run_until_complete(initiate_shutdown_from_signal())
196
- finally:
197
- logger.info("Asyncio loop in server_main is finalizing.")
198
-
@@ -1,13 +0,0 @@
1
- # file: autobyteus/autobyteus/rpc/transport_type.py
2
- from enum import Enum
3
-
4
- class TransportType(str, Enum):
5
- """
6
- Defines the transport mechanisms supported for RPC communication.
7
- """
8
- STDIO = "stdio"
9
- SSE = "sse" # Server-Sent Events over HTTP
10
-
11
- def __str__(self) -> str:
12
- return self.value
13
-
@@ -1,2 +0,0 @@
1
- # This file makes 'bash' a package.
2
- # from .bash_executor import bash_executor # Optionally export
@@ -1,100 +0,0 @@
1
- import asyncio
2
- import subprocess
3
- import logging
4
- import shutil
5
- import tempfile
6
- from typing import TYPE_CHECKING, Optional
7
-
8
- from autobyteus.tools import tool
9
- from autobyteus.tools.tool_category import ToolCategory
10
-
11
- if TYPE_CHECKING:
12
- from autobyteus.agent.context import AgentContext
13
-
14
- logger = logging.getLogger(__name__)
15
-
16
- @tool(name="BashExecutor", category=ToolCategory.SYSTEM)
17
- async def bash_executor(context: Optional['AgentContext'], command: str) -> str:
18
- """
19
- Executes bash commands using the '/bin/bash' interpreter.
20
- On success, it returns a formatted string containing the command's standard output (stdout) and/or diagnostic logs.
21
- On failure, it raises an exception.
22
- - If a command has only stdout, its content is returned directly.
23
- - If a command has diagnostic output (from stderr), it will be included and labeled as 'LOGS' in the output.
24
- 'command' is the bash command string to be executed.
25
- The command is executed in the agent's workspace directory if available.
26
- """
27
- if not shutil.which("bash"):
28
- error_msg = "'bash' executable not found in system PATH. The BashExecutor tool cannot be used."
29
- logger.error(error_msg)
30
- raise FileNotFoundError(error_msg)
31
-
32
- agent_id_str = context.agent_id if context else "Non-Agent"
33
-
34
- effective_cwd = None
35
- log_cwd_source = ""
36
-
37
- if context and hasattr(context, 'workspace') and context.workspace:
38
- try:
39
- base_path = context.workspace.get_base_path()
40
- if base_path and isinstance(base_path, str):
41
- effective_cwd = base_path
42
- log_cwd_source = f"agent workspace: {effective_cwd}"
43
- else:
44
- logger.warning(f"Agent '{agent_id_str}' has a workspace, but it provided an invalid base path ('{base_path}'). "
45
- f"Falling back to system temporary directory.")
46
- except Exception as e:
47
- logger.warning(f"Could not retrieve workspace for agent '{agent_id_str}': {e}. "
48
- f"Falling back to system temporary directory.")
49
-
50
- if not effective_cwd:
51
- effective_cwd = tempfile.gettempdir()
52
- log_cwd_source = f"system temporary directory: {effective_cwd}"
53
-
54
- logger.debug(f"Functional BashExecutor tool executing for '{agent_id_str}': {command} in cwd from {log_cwd_source}")
55
-
56
- try:
57
- # Explicitly use 'bash -c' for reliable execution
58
- process = await asyncio.create_subprocess_exec(
59
- 'bash', '-c', command,
60
- stdout=asyncio.subprocess.PIPE,
61
- stderr=asyncio.subprocess.PIPE,
62
- cwd=effective_cwd
63
- )
64
- stdout, stderr = await process.communicate()
65
-
66
- stdout_output = stdout.decode().strip() if stdout else ""
67
- stderr_output = stderr.decode().strip() if stderr else ""
68
-
69
- if process.returncode != 0:
70
- error_message = stderr_output if stderr_output else "Unknown error"
71
- if not error_message and process.returncode != 0:
72
- error_message = f"Command failed with exit code {process.returncode} and no stderr output."
73
-
74
- logger.error(f"Command '{command}' failed with return code {process.returncode}: {error_message}")
75
- raise subprocess.CalledProcessError(
76
- returncode=process.returncode,
77
- cmd=command,
78
- output=stdout_output,
79
- stderr=error_message
80
- )
81
-
82
- # Adaptive return for successful commands to provide maximum context to the agent.
83
- if stdout_output and stderr_output:
84
- return f"STDOUT:\n{stdout_output}\n\nLOGS:\n{stderr_output}"
85
- elif stdout_output:
86
- return stdout_output # Keep it simple for commands with only stdout
87
- elif stderr_output:
88
- return f"LOGS:\n{stderr_output}"
89
- else:
90
- return "Command executed successfully with no output."
91
-
92
- except subprocess.CalledProcessError:
93
- raise
94
- except FileNotFoundError:
95
- # This can be raised by create_subprocess_exec if 'bash' is not found, despite the initial check.
96
- logger.error("'bash' executable not found when attempting to execute command. Please ensure it is installed and in the PATH.")
97
- raise
98
- except Exception as e:
99
- logger.exception(f"An error occurred while preparing or executing command '{command}': {str(e)}")
100
- raise RuntimeError(f"Failed to execute command '{command}': {str(e)}")
@@ -1,2 +0,0 @@
1
- # This file makes 'browser' a package.
2
- # It can be empty or import submodules/subpackages.
File without changes
@@ -1,75 +0,0 @@
1
- from autobyteus.tools.browser.session_aware.browser_session_aware_tool import BrowserSessionAwareTool
2
- from autobyteus.tools.browser.session_aware.shared_browser_session import SharedBrowserSession
3
- from autobyteus.tools.tool_config import ToolConfig
4
- from autobyteus.tools.tool_category import ToolCategory
5
- from urllib.parse import urlparse
6
- from typing import Optional, TYPE_CHECKING, Any
7
- import logging
8
-
9
- from autobyteus.utils.parameter_schema import ParameterSchema, ParameterDefinition, ParameterType
10
-
11
- if TYPE_CHECKING:
12
- from autobyteus.agent.context import AgentContext
13
-
14
- logger = logging.getLogger(__name__)
15
-
16
- class BrowserSessionAwareNavigateTo(BrowserSessionAwareTool):
17
- """
18
- A session-aware tool for navigating to a specified website using a shared browser session.
19
- """
20
- CATEGORY = ToolCategory.WEB
21
-
22
- def __init__(self, config: Optional[ToolConfig] = None):
23
- super().__init__(config=config)
24
- logger.debug("BrowserSessionAwareNavigateTo tool initialized.")
25
-
26
- @classmethod
27
- def get_name(cls) -> str:
28
- return "NavigateTo"
29
-
30
- @classmethod
31
- def get_description(cls) -> str:
32
- return ("Navigates the shared browser session to a specified URL. "
33
- "Returns a success or failure message based on navigation status.")
34
-
35
- @classmethod
36
- def get_argument_schema(cls) -> Optional[ParameterSchema]:
37
- schema = ParameterSchema()
38
- schema.add_parameter(ParameterDefinition(
39
- name="webpage_url",
40
- param_type=ParameterType.STRING,
41
- description="The fully qualified URL of the website to navigate to (e.g., 'https://example.com').",
42
- required=True
43
- ))
44
- return schema
45
-
46
- async def perform_action(self, shared_session: SharedBrowserSession, webpage_url: str) -> str:
47
- logger.info(f"BrowserSessionAwareNavigateTo performing action for URL: {webpage_url}")
48
-
49
- if not self._is_valid_url(webpage_url):
50
- raise ValueError(f"Invalid URL format: {webpage_url}. Must include scheme and netloc.")
51
-
52
- try:
53
- response = await shared_session.page.goto(webpage_url, wait_until="networkidle", timeout=60000)
54
-
55
- if response and response.ok:
56
- success_msg = f"The NavigateTo command to {webpage_url} is executed successfully."
57
- logger.info(success_msg)
58
- return success_msg
59
- else:
60
- status = response.status if response else "Unknown"
61
- failure_msg = f"The NavigationTo command to {webpage_url} failed with status {status}."
62
- logger.warning(failure_msg)
63
- return failure_msg
64
- except Exception as e:
65
- logger.error(f"Error during shared session navigation to '{webpage_url}': {e}", exc_info=True)
66
- return f"Error navigating to {webpage_url}: {str(e)}"
67
-
68
-
69
- @staticmethod
70
- def _is_valid_url(url_string: str) -> bool:
71
- try:
72
- result = urlparse(url_string)
73
- return all([result.scheme, result.netloc])
74
- except ValueError:
75
- return False
@@ -1,30 +0,0 @@
1
- # File: autobyteus/tools/browser/session_aware/browser_session_aware_tool.py
2
-
3
- from autobyteus.tools.base_tool import BaseTool
4
- from autobyteus.tools.tool_config import ToolConfig
5
- from autobyteus.tools.browser.session_aware.shared_browser_session_manager import SharedBrowserSessionManager
6
- from autobyteus.events.event_types import EventType
7
- from typing import Optional
8
-
9
- class BrowserSessionAwareTool(BaseTool):
10
- def __init__(self, config: Optional[ToolConfig] = None):
11
- super().__init__(config=config)
12
- self.shared_browser_session_manager = SharedBrowserSessionManager()
13
-
14
- async def _execute(self, **kwargs):
15
- shared_session = self.shared_browser_session_manager.get_shared_browser_session()
16
-
17
- if not shared_session:
18
- webpage_url = kwargs.get('webpage_url')
19
- if not webpage_url:
20
- raise ValueError("The 'webpage_url' keyword argument must be specified when creating a new shared session.")
21
-
22
- await self.shared_browser_session_manager.create_shared_browser_session()
23
- shared_session = self.shared_browser_session_manager.get_shared_browser_session()
24
- await shared_session.page.goto(webpage_url)
25
- self.emit(EventType.SHARED_BROWSER_SESSION_CREATED, shared_session=shared_session)
26
-
27
- return await self.perform_action(shared_session, **kwargs)
28
-
29
- async def perform_action(self, shared_session, **kwargs):
30
- raise NotImplementedError("Subclasses must implement this method")
@@ -1,154 +0,0 @@
1
- # File: autobyteus/tools/browser/session_aware/browser_session_aware_web_element_trigger.py
2
-
3
- import xml.etree.ElementTree as ET
4
- from typing import Optional, TYPE_CHECKING, Dict, Any
5
- import logging
6
-
7
- from autobyteus.tools.browser.session_aware.browser_session_aware_tool import BrowserSessionAwareTool
8
- from autobyteus.tools.browser.session_aware.shared_browser_session import SharedBrowserSession
9
- from autobyteus.tools.browser.session_aware.web_element_action import WebElementAction
10
- from autobyteus.utils.parameter_schema import ParameterSchema, ParameterDefinition, ParameterType
11
- from autobyteus.tools.tool_config import ToolConfig
12
- from autobyteus.tools.tool_category import ToolCategory
13
-
14
- if TYPE_CHECKING:
15
- pass
16
-
17
- logger = logging.getLogger(__name__)
18
-
19
- class BrowserSessionAwareWebElementTrigger(BrowserSessionAwareTool):
20
- """
21
- A session-aware tool to trigger actions on web elements identified by a CSS selector.
22
- """
23
- CATEGORY = ToolCategory.WEB
24
-
25
- def __init__(self, config: Optional[ToolConfig] = None):
26
- super().__init__(config=config)
27
- logger.debug("BrowserSessionAwareWebElementTrigger tool initialized.")
28
-
29
- @classmethod
30
- def get_name(cls) -> str:
31
- return "WebElementTrigger"
32
-
33
- @classmethod
34
- def get_description(cls) -> str:
35
- action_names = ', '.join(str(action) for action in WebElementAction)
36
- return (f"Triggers actions on web elements on the current page in a shared browser session. "
37
- f"Supported actions: {action_names}. "
38
- f"Returns a confirmation message upon successful execution.")
39
-
40
- @classmethod
41
- def get_argument_schema(cls) -> Optional[ParameterSchema]:
42
- schema = ParameterSchema()
43
- schema.add_parameter(ParameterDefinition(
44
- name="webpage_url",
45
- param_type=ParameterType.STRING,
46
- description="URL of the webpage. Required if no browser session is active or to ensure context.",
47
- required=True
48
- ))
49
- schema.add_parameter(ParameterDefinition(
50
- name="css_selector",
51
- param_type=ParameterType.STRING,
52
- description="CSS selector to find the target web element.",
53
- required=True
54
- ))
55
- schema.add_parameter(ParameterDefinition(
56
- name="action",
57
- param_type=ParameterType.ENUM,
58
- description=f"Type of interaction to perform. Must be one of: {', '.join(str(act) for act in WebElementAction)}.",
59
- required=True,
60
- enum_values=[str(act) for act in WebElementAction]
61
- ))
62
- schema.add_parameter(ParameterDefinition(
63
- name="params",
64
- param_type=ParameterType.STRING,
65
- description="Optional XML-formatted string containing additional parameters for specific actions (e.g., text for 'type', option for 'select'). Example: <param><name>text</name><value>Hello</value></param>",
66
- required=False
67
- ))
68
- return schema
69
-
70
- async def perform_action(
71
- self,
72
- shared_session: SharedBrowserSession,
73
- css_selector: str,
74
- action: str,
75
- webpage_url: str,
76
- params: Optional[str] = ""
77
- ) -> str:
78
- logger.info(f"WebElementTrigger performing action '{action}' on selector '{css_selector}' for page related to URL '{webpage_url}'. Params: '{params[:50]}...'")
79
-
80
- try:
81
- action_enum = WebElementAction.from_string(action)
82
- except ValueError as e:
83
- logger.error(f"Invalid action string '{action}' passed to perform_action despite schema validation: {e}")
84
- raise
85
-
86
- parsed_params = self._parse_xml_params(params if params else "")
87
-
88
- element = shared_session.page.locator(css_selector)
89
-
90
- try:
91
- await element.wait_for(state="visible", timeout=10000)
92
- except Exception as e_wait:
93
- error_msg = f"Element with selector '{css_selector}' not visible or found within timeout on page {shared_session.page.url}. Error: {e_wait}"
94
- logger.warning(error_msg)
95
- raise ValueError(error_msg) from e_wait
96
-
97
- if action_enum == WebElementAction.CLICK:
98
- await element.click()
99
- elif action_enum == WebElementAction.TYPE:
100
- text_to_type = parsed_params.get("text")
101
- if text_to_type is None:
102
- raise ValueError("'text' parameter is required for 'type' action.")
103
- await element.fill("")
104
- await element.type(text_to_type)
105
- elif action_enum == WebElementAction.SELECT:
106
- option_value = parsed_params.get("option")
107
- if option_value is None:
108
- raise ValueError("'option' parameter is required for 'select' action.")
109
- await element.select_option(option_value)
110
- elif action_enum == WebElementAction.CHECK:
111
- state_str = parsed_params.get("state", "true")
112
- is_checked_state = state_str.lower() == "true"
113
- if is_checked_state:
114
- await element.check()
115
- else:
116
- await element.uncheck()
117
- elif action_enum == WebElementAction.SUBMIT:
118
- logger.warning("WebElementAction.SUBMIT is interpreted as a click. Ensure CSS selector targets a submit button or form element intended for click-based submission.")
119
- await element.click()
120
- elif action_enum == WebElementAction.HOVER:
121
- await element.hover()
122
- elif action_enum == WebElementAction.DOUBLE_CLICK:
123
- await element.dblclick()
124
- else:
125
- raise ValueError(f"Unsupported action: {action_enum}")
126
-
127
- success_msg = f"The WebElementTrigger action '{action_enum}' on selector '{css_selector}' was executed."
128
- logger.info(success_msg)
129
- return success_msg
130
-
131
- def _parse_xml_params(self, params_xml_str: str) -> Dict[str, str]:
132
- if not params_xml_str:
133
- return {}
134
-
135
- try:
136
- if not params_xml_str.strip().startswith("<root>"):
137
- xml_string_to_parse = f"<root>{params_xml_str}</root>"
138
- else:
139
- xml_string_to_parse = params_xml_str
140
-
141
- root = ET.fromstring(xml_string_to_parse)
142
- parsed_params: Dict[str, str] = {}
143
- for param_node in root.findall('param'):
144
- name_elem = param_node.find('name')
145
- value_elem = param_node.find('value')
146
- if name_elem is not None and name_elem.text and value_elem is not None and value_elem.text is not None:
147
- parsed_params[name_elem.text] = value_elem.text
148
- elif name_elem is not None and name_elem.text and value_elem is not None and value_elem.text is None:
149
- parsed_params[name_elem.text] = ""
150
-
151
- return parsed_params
152
- except ET.ParseError as e_parse:
153
- logger.warning(f"Failed to parse params XML string: '{params_xml_str}'. Error: {e_parse}. Returning empty params.")
154
- return {}
@@ -1,89 +0,0 @@
1
- # File: autobyteus/tools/browser/session_aware/browser_session_aware_webpage_reader.py
2
-
3
- import logging
4
- from typing import Optional, TYPE_CHECKING, Any
5
- from autobyteus.tools.browser.session_aware.browser_session_aware_tool import BrowserSessionAwareTool
6
- from autobyteus.tools.browser.session_aware.shared_browser_session import SharedBrowserSession
7
- from autobyteus.tools.tool_config import ToolConfig
8
- from autobyteus.utils.parameter_schema import ParameterSchema, ParameterDefinition, ParameterType
9
- from autobyteus.tools.tool_category import ToolCategory
10
- from autobyteus.utils.html_cleaner import clean, CleaningMode
11
-
12
- if TYPE_CHECKING:
13
- from autobyteus.agent.context import AgentContext
14
-
15
- logger = logging.getLogger(__name__)
16
-
17
- class BrowserSessionAwareWebPageReader(BrowserSessionAwareTool):
18
- """
19
- A session-aware tool to read and clean HTML content from the current page
20
- in a shared browser session.
21
- """
22
- CATEGORY = ToolCategory.WEB
23
-
24
- def __init__(self, config: Optional[ToolConfig] = None):
25
- super().__init__(config=config)
26
-
27
- cleaning_mode_to_use = CleaningMode.THOROUGH
28
- if config:
29
- cleaning_mode_value = config.get('cleaning_mode')
30
- if cleaning_mode_value:
31
- if isinstance(cleaning_mode_value, str):
32
- try:
33
- cleaning_mode_to_use = CleaningMode(cleaning_mode_value.upper())
34
- except ValueError:
35
- cleaning_mode_to_use = CleaningMode.THOROUGH
36
- elif isinstance(cleaning_mode_value, CleaningMode):
37
- cleaning_mode_to_use = cleaning_mode_value
38
-
39
- self.cleaning_mode = cleaning_mode_to_use
40
- logger.debug(f"BrowserSessionAwareWebPageReader initialized with cleaning_mode: {self.cleaning_mode}")
41
-
42
- @classmethod
43
- def get_name(cls) -> str:
44
- return "WebPageReader"
45
-
46
- @classmethod
47
- def get_description(cls) -> str:
48
- return ("Reads and cleans the HTML content from the current page in a shared browser session. "
49
- "The level of HTML cleanup can be configured at tool instantiation.")
50
-
51
- @classmethod
52
- def get_argument_schema(cls) -> Optional[ParameterSchema]:
53
- schema = ParameterSchema()
54
- schema.add_parameter(ParameterDefinition(
55
- name="webpage_url",
56
- param_type=ParameterType.STRING,
57
- description="URL of the webpage. Required if no browser session is active or to ensure context. Tool reads current page content after navigation if applicable.",
58
- required=True
59
- ))
60
- return schema
61
-
62
- @classmethod
63
- def get_config_schema(cls) -> Optional[ParameterSchema]:
64
- schema = ParameterSchema()
65
- schema.add_parameter(ParameterDefinition(
66
- name="cleaning_mode",
67
- param_type=ParameterType.ENUM,
68
- description="Level of HTML content cleanup (BASIC or THOROUGH). Applied to the read webpage content.",
69
- required=False,
70
- default_value="THOROUGH",
71
- enum_values=[mode.name for mode in CleaningMode]
72
- ))
73
- return schema
74
-
75
- async def perform_action(
76
- self,
77
- shared_session: SharedBrowserSession,
78
- webpage_url: str
79
- ) -> str:
80
- logger.info(f"BrowserSessionAwareWebPageReader performing action. Current page URL: {shared_session.page.url}, cleaning_mode: {self.cleaning_mode}")
81
-
82
- try:
83
- page_content = await shared_session.page.content()
84
- cleaned_content = clean(page_content, self.cleaning_mode)
85
- logger.debug(f"Read and cleaned content from {shared_session.page.url}. Cleaned length: {len(cleaned_content)}")
86
- return cleaned_content
87
- except Exception as e:
88
- logger.error(f"Error reading page content in shared session from {shared_session.page.url}: {e}", exc_info=True)
89
- raise RuntimeError(f"Failed to read page content from shared session: {str(e)}")