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,107 +0,0 @@
1
- # File: autobyteus/tools/browser/session_aware/browser_session_aware_webpage_screenshot_taker.py
2
-
3
- import os
4
- import logging
5
- from typing import Optional, TYPE_CHECKING, Any
6
- from autobyteus.tools.browser.session_aware.browser_session_aware_tool import BrowserSessionAwareTool
7
- from autobyteus.tools.browser.session_aware.shared_browser_session import SharedBrowserSession
8
- from autobyteus.tools.tool_config import ToolConfig
9
- from autobyteus.utils.parameter_schema import ParameterSchema, ParameterDefinition, ParameterType
10
- from autobyteus.tools.tool_category import ToolCategory
11
-
12
- if TYPE_CHECKING:
13
- from autobyteus.agent.context import AgentContext
14
-
15
- logger = logging.getLogger(__name__)
16
-
17
- class BrowserSessionAwareWebPageScreenshotTaker(BrowserSessionAwareTool):
18
- """
19
- A session-aware tool to take a screenshot of the current page in a shared browser session.
20
- """
21
- CATEGORY = ToolCategory.WEB
22
-
23
- def __init__(self, config: Optional[ToolConfig] = None):
24
- super().__init__(config=config)
25
-
26
- self.full_page: bool = True
27
- self.image_format: str = "png"
28
-
29
- if config:
30
- self.full_page = config.get('full_page', True)
31
- self.image_format = str(config.get('image_format', 'png')).lower()
32
- if self.image_format not in ["png", "jpeg"]:
33
- logger.warning(f"Invalid image_format '{self.image_format}' in config. Defaulting to 'png'.")
34
- self.image_format = "png"
35
- logger.debug(f"BrowserSessionAwareWebPageScreenshotTaker initialized. Full page: {self.full_page}, Format: {self.image_format}")
36
-
37
- @classmethod
38
- def get_name(cls) -> str:
39
- return "WebPageScreenshotTaker"
40
-
41
- @classmethod
42
- def get_description(cls) -> str:
43
- return ("Takes a screenshot of the current page in a shared browser session. "
44
- "Saves it to the specified local file path and returns the absolute path of the saved screenshot. "
45
- "Screenshot options (full page, image format) can be set at tool instantiation.")
46
-
47
- @classmethod
48
- def get_argument_schema(cls) -> Optional[ParameterSchema]:
49
- schema = ParameterSchema()
50
- schema.add_parameter(ParameterDefinition(
51
- name="webpage_url",
52
- param_type=ParameterType.STRING,
53
- description="URL of the webpage. Required if no browser session is active or to ensure context. Screenshot is of current page.",
54
- required=True
55
- ))
56
- schema.add_parameter(ParameterDefinition(
57
- name="file_name",
58
- param_type=ParameterType.STRING,
59
- description="The local file path (including filename and extension, e.g., 'session_screenshots/page.png') where the screenshot will be saved.",
60
- required=True
61
- ))
62
- return schema
63
-
64
- @classmethod
65
- def get_config_schema(cls) -> Optional[ParameterSchema]:
66
- schema = ParameterSchema()
67
- schema.add_parameter(ParameterDefinition(
68
- name="full_page",
69
- param_type=ParameterType.BOOLEAN,
70
- description="Default for whether to capture the full scrollable page or just the viewport.",
71
- required=False,
72
- default_value=True
73
- ))
74
- schema.add_parameter(ParameterDefinition(
75
- name="image_format",
76
- param_type=ParameterType.ENUM,
77
- description="Default image format for screenshots (png or jpeg).",
78
- required=False,
79
- default_value="png",
80
- enum_values=["png", "jpeg"]
81
- ))
82
- return schema
83
-
84
- async def perform_action(
85
- self,
86
- shared_session: SharedBrowserSession,
87
- file_name: str,
88
- webpage_url: str
89
- ) -> str:
90
- logger.info(f"BrowserSessionAwareWebPageScreenshotTaker performing action. Saving to '{file_name}'. Current page: {shared_session.page.url}")
91
-
92
- output_dir = os.path.dirname(file_name)
93
- if output_dir:
94
- os.makedirs(output_dir, exist_ok=True)
95
-
96
- try:
97
- await shared_session.page.screenshot(
98
- path=file_name,
99
- full_page=self.full_page,
100
- type=self.image_format # type: ignore
101
- )
102
- absolute_file_path = os.path.abspath(file_name)
103
- logger.info(f"Screenshot of {shared_session.page.url} saved successfully to {absolute_file_path}")
104
- return absolute_file_path
105
- except Exception as e:
106
- logger.error(f"Error taking screenshot in shared session for page {shared_session.page.url}, saving to '{file_name}': {e}", exc_info=True)
107
- raise RuntimeError(f"Failed to take screenshot in shared session: {str(e)}")
@@ -1,14 +0,0 @@
1
- from autobyteus.tools.factory.tool_factory import ToolFactory
2
- from autobyteus.tools.browser.session_aware.browser_session_aware_web_element_trigger import BrowserSessionAwareWebElementTrigger
3
- from typing import Optional, TYPE_CHECKING
4
-
5
- if TYPE_CHECKING:
6
- from autobyteus.tools.tool_config import ToolConfig
7
-
8
- class BrowserSessionAwareWebElementTriggerFactory(ToolFactory):
9
- def create_tool(self, config: Optional['ToolConfig'] = None) -> BrowserSessionAwareWebElementTrigger:
10
- """
11
- Creates an instance of BrowserSessionAwareWebElementTrigger.
12
- The 'config' parameter is ignored by this factory.
13
- """
14
- return BrowserSessionAwareWebElementTrigger()
@@ -1,26 +0,0 @@
1
- from autobyteus.tools.factory.tool_factory import ToolFactory
2
- from autobyteus.tools.browser.session_aware.browser_session_aware_webpage_reader import BrowserSessionAwareWebPageReader
3
- from autobyteus.utils.html_cleaner import CleaningMode
4
- from typing import Optional, TYPE_CHECKING
5
-
6
- if TYPE_CHECKING:
7
- from autobyteus.tools.tool_config import ToolConfig
8
- from autobyteus.tools.base_tool import BaseTool
9
-
10
- class BrowserSessionAwareWebPageReaderFactory(ToolFactory):
11
- def __init__(self, content_cleanup_level: CleaningMode = CleaningMode.THOROUGH):
12
- self.content_cleanup_level = content_cleanup_level
13
-
14
- def create_tool(self, config: Optional['ToolConfig'] = None) -> BrowserSessionAwareWebPageReader:
15
- """
16
- Creates an instance of BrowserSessionAwareWebPageReader.
17
- The 'config' parameter is ignored; configuration is set during factory initialization.
18
- """
19
- # This factory passes its own configuration to the tool's constructor.
20
- # The tool's constructor expects a ToolConfig object.
21
- from autobyteus.tools.tool_config import ToolConfig as ConcreteToolConfig
22
-
23
- tool_creation_config = ConcreteToolConfig(
24
- params={"cleaning_mode": self.content_cleanup_level}
25
- )
26
- return BrowserSessionAwareWebPageReader(config=tool_creation_config)
@@ -1,14 +0,0 @@
1
- from autobyteus.tools.factory.tool_factory import ToolFactory
2
- from autobyteus.tools.browser.session_aware.browser_session_aware_webpage_screenshot_taker import BrowserSessionAwareWebPageScreenshotTaker
3
- from typing import Optional, TYPE_CHECKING
4
-
5
- if TYPE_CHECKING:
6
- from autobyteus.tools.tool_config import ToolConfig
7
-
8
- class BrowserSessionAwareWebPageScreenshotTakerFactory(ToolFactory):
9
- def create_tool(self, config: Optional['ToolConfig'] = None) -> BrowserSessionAwareWebPageScreenshotTaker:
10
- """
11
- Creates an instance of BrowserSessionAwareWebPageScreenshotTaker.
12
- The 'config' parameter is ignored by this factory.
13
- """
14
- return BrowserSessionAwareWebPageScreenshotTaker()
@@ -1,11 +0,0 @@
1
- from brui_core.ui_integrator import UIIntegrator
2
-
3
- class SharedBrowserSession(UIIntegrator):
4
- def __init__(self):
5
- super().__init__()
6
-
7
- async def initialize(self):
8
- await super().initialize()
9
-
10
- async def close(self):
11
- await super().close(close_page=False, close_context=False, close_browser=False)
@@ -1,25 +0,0 @@
1
- from autobyteus.utils.singleton import SingletonMeta
2
- from autobyteus.tools.browser.session_aware.shared_browser_session import SharedBrowserSession
3
- from autobyteus.events.event_emitter import EventEmitter
4
- from autobyteus.events.event_types import EventType
5
-
6
- class SharedBrowserSessionManager(metaclass=SingletonMeta):
7
- def __init__(self):
8
- self.shared_browser_session = None
9
- self.event_emitter = EventEmitter()
10
- self.event_emitter.subscribe(EventType.CREATE_SHARED_SESSION, self.create_shared_browser_session)
11
-
12
- async def create_shared_browser_session(self, **kwargs):
13
- self.shared_browser_session = SharedBrowserSession()
14
- await self.shared_browser_session.initialize()
15
-
16
- async def close_shared_browser_session(self):
17
- if self.shared_browser_session:
18
- await self.shared_browser_session.close()
19
- self.shared_browser_session = None
20
-
21
- def set_shared_browser_session(self, shared_session):
22
- self.shared_browser_session = shared_session
23
-
24
- def get_shared_browser_session(self):
25
- return self.shared_browser_session
@@ -1,20 +0,0 @@
1
- from enum import Enum, auto
2
-
3
- class WebElementAction(Enum):
4
- CLICK = auto()
5
- TYPE = auto()
6
- SELECT = auto()
7
- CHECK = auto()
8
- SUBMIT = auto()
9
- HOVER = auto()
10
- DOUBLE_CLICK = auto()
11
-
12
- def __str__(self):
13
- return self.name.lower()
14
-
15
- @staticmethod
16
- def from_string(action_string):
17
- try:
18
- return WebElementAction[action_string.upper()]
19
- except KeyError:
20
- raise ValueError(f"Unsupported action: {action_string}")
@@ -1,6 +0,0 @@
1
- # This file makes 'standalone' a package under 'browser'.
2
- # from .webpage_reader import WebPageReader
3
- # from .webpage_screenshot_taker import WebPageScreenshotTaker
4
- # from .navigate_to import NavigateTo
5
- # from .webpage_image_downloader import WebPageImageDownloader
6
- # from .web_page_pdf_generator import WebPagePDFGenerator
File without changes
@@ -1,25 +0,0 @@
1
- from autobyteus.tools.factory.tool_factory import ToolFactory
2
- from autobyteus.tools.browser.standalone.webpage_reader import WebPageReader
3
- from autobyteus.utils.html_cleaner import CleaningMode
4
- from typing import Optional, TYPE_CHECKING
5
-
6
- if TYPE_CHECKING:
7
- from autobyteus.tools.tool_config import ToolConfig
8
-
9
- class WebPageReaderFactory(ToolFactory):
10
- def __init__(self, cleaning_mode: CleaningMode = CleaningMode.THOROUGH):
11
- self.cleaning_mode = cleaning_mode
12
-
13
- def create_tool(self, config: Optional['ToolConfig'] = None) -> WebPageReader:
14
- """
15
- Creates an instance of WebPageReader.
16
- The 'config' parameter is ignored; configuration is set during factory initialization.
17
- """
18
- # This factory passes its own configuration to the tool's constructor.
19
- # The tool's constructor expects a ToolConfig object.
20
- from autobyteus.tools.tool_config import ToolConfig as ConcreteToolConfig
21
-
22
- tool_creation_config = ConcreteToolConfig(
23
- params={"cleaning_mode": self.cleaning_mode}
24
- )
25
- return WebPageReader(config=tool_creation_config)
@@ -1,14 +0,0 @@
1
- from autobyteus.tools.factory.tool_factory import ToolFactory
2
- from autobyteus.tools.browser.standalone.webpage_screenshot_taker import WebPageScreenshotTaker
3
- from typing import Optional, TYPE_CHECKING
4
-
5
- if TYPE_CHECKING:
6
- from autobyteus.tools.tool_config import ToolConfig
7
-
8
- class WebPageScreenshotTakerFactory(ToolFactory):
9
- def create_tool(self, config: Optional['ToolConfig'] = None) -> WebPageScreenshotTaker:
10
- """
11
- Creates an instance of WebPageScreenshotTaker.
12
- The 'config' parameter is ignored by this factory.
13
- """
14
- return WebPageScreenshotTaker()
@@ -1,80 +0,0 @@
1
- from autobyteus.tools.base_tool import BaseTool
2
- from autobyteus.tools.tool_config import ToolConfig
3
- from autobyteus.tools.tool_category import ToolCategory
4
- from brui_core.ui_integrator import UIIntegrator
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 NavigateTo(BaseTool, UIIntegrator):
17
- """
18
- A standalone tool for navigating to a specified website using Playwright.
19
- It initializes and closes its own browser instance for each navigation.
20
- """
21
- CATEGORY = ToolCategory.WEB
22
-
23
- def __init__(self, config: Optional[ToolConfig] = None):
24
- BaseTool.__init__(self, config=config)
25
- UIIntegrator.__init__(self)
26
- logger.debug("NavigateTo (standalone) tool initialized.")
27
-
28
- @classmethod
29
- def get_description(cls) -> str:
30
- return "Navigates a standalone browser instance to a specified URL. Returns a success or failure message."
31
-
32
- @classmethod
33
- def get_argument_schema(cls) -> Optional[ParameterSchema]:
34
- schema = ParameterSchema()
35
- schema.add_parameter(ParameterDefinition(
36
- name="url",
37
- param_type=ParameterType.STRING,
38
- description="The fully qualified URL of the website to navigate to (e.g., 'https://example.com').",
39
- required=True
40
- ))
41
- return schema
42
-
43
- async def _execute(self, context: 'AgentContext', url: str) -> str:
44
- logger.info(f"NavigateTo (standalone) for agent {context.agent_id} navigating to: {url}")
45
-
46
- if not self._is_valid_url(url):
47
- error_msg = f"Invalid URL format: {url}. Must include scheme (e.g., http, https) and netloc."
48
- logger.warning(f"NavigateTo (standalone) validation error for agent {context.agent_id}: {error_msg}")
49
- raise ValueError(error_msg)
50
-
51
- try:
52
- await self.initialize()
53
- if not self.page:
54
- logger.error("Playwright page not initialized in NavigateTo (standalone).")
55
- raise RuntimeError("Playwright page not available for NavigateTo.")
56
-
57
- response = await self.page.goto(url, wait_until="domcontentloaded", timeout=60000)
58
-
59
- if response and response.ok:
60
- success_msg = f"Successfully navigated to {url}"
61
- logger.info(f"NavigateTo (standalone) for agent {context.agent_id}: {success_msg}")
62
- return success_msg
63
- else:
64
- status = response.status if response else "Unknown"
65
- failure_msg = f"Navigation to {url} failed with status {status}"
66
- logger.warning(f"NavigateTo (standalone) for agent {context.agent_id}: {failure_msg}")
67
- return failure_msg
68
- except Exception as e:
69
- logger.error(f"Error during NavigateTo (standalone) for URL '{url}', agent {context.agent_id}: {e}", exc_info=True)
70
- raise RuntimeError(f"NavigateTo (standalone) failed for URL '{url}': {str(e)}")
71
- finally:
72
- await self.close()
73
-
74
- @staticmethod
75
- def _is_valid_url(url_string: str) -> bool:
76
- try:
77
- result = urlparse(url_string)
78
- return all([result.scheme, result.netloc])
79
- except ValueError:
80
- return False
@@ -1,97 +0,0 @@
1
- from autobyteus.tools.base_tool import BaseTool
2
- from autobyteus.tools.tool_config import ToolConfig
3
- from autobyteus.tools.tool_category import ToolCategory
4
- from brui_core.ui_integrator import UIIntegrator
5
- import os
6
- import logging
7
- from typing import Optional, TYPE_CHECKING, Any
8
- from urllib.parse import urlparse
9
-
10
- from autobyteus.utils.parameter_schema import ParameterSchema, ParameterDefinition, ParameterType
11
-
12
- if TYPE_CHECKING:
13
- from autobyteus.agent.context import AgentContext
14
-
15
- logger = logging.getLogger(__name__)
16
-
17
- class WebPagePDFGenerator(BaseTool, UIIntegrator):
18
- """
19
- A class that generates a PDF of a given webpage URL using Playwright.
20
- Saves the PDF to a specified directory. This is a standalone browser tool.
21
- """
22
- CATEGORY = ToolCategory.WEB
23
-
24
- def __init__(self, config: Optional[ToolConfig] = None):
25
- BaseTool.__init__(self, config=config)
26
- UIIntegrator.__init__(self)
27
- logger.debug("WebPagePDFGenerator (standalone) tool initialized.")
28
-
29
- @classmethod
30
- def get_description(cls) -> str:
31
- return ("Generates a PDF (A4 format) of a given webpage URL. "
32
- "Saves it to a specified local directory and returns the absolute file path of the saved PDF.")
33
-
34
- @classmethod
35
- def get_argument_schema(cls) -> Optional[ParameterSchema]:
36
- schema = ParameterSchema()
37
- schema.add_parameter(ParameterDefinition(
38
- name="url",
39
- param_type=ParameterType.STRING,
40
- description="The URL of the webpage to generate a PDF from.",
41
- required=True
42
- ))
43
- schema.add_parameter(ParameterDefinition(
44
- name="save_dir",
45
- param_type=ParameterType.STRING,
46
- description="The local directory path where the generated PDF will be saved. A filename will be auto-generated.",
47
- required=True
48
- ))
49
- return schema
50
-
51
- async def _execute(self, context: 'AgentContext', url: str, save_dir: str) -> str:
52
- logger.info(f"WebPagePDFGenerator for agent {context.agent_id} generating PDF for '{url}', saving to directory '{save_dir}'.")
53
-
54
- if not self._is_valid_page_url(url):
55
- raise ValueError(f"Invalid page URL format: {url}. Must be a full URL (e.g., http/https).")
56
-
57
- os.makedirs(save_dir, exist_ok=True)
58
-
59
- try:
60
- parsed_url = urlparse(url)
61
- domain_part = parsed_url.netloc.replace('.', '_')
62
- path_part = parsed_url.path.strip('/').replace('/', '_').replace('.', '_')
63
- safe_url_part = f"{domain_part}_{path_part}"[:50]
64
- if not safe_url_part: safe_url_part = "webpage"
65
- except Exception:
66
- safe_url_part = "webpage"
67
-
68
- import time
69
- timestamp = int(time.time())
70
- pdf_filename = f"{safe_url_part}_{timestamp}.pdf"
71
- full_file_path = os.path.join(save_dir, pdf_filename)
72
-
73
- try:
74
- await self.initialize()
75
- if not self.page:
76
- logger.error("Playwright page not initialized in WebPagePDFGenerator.")
77
- raise RuntimeError("Playwright page not available for WebPagePDFGenerator.")
78
-
79
- await self.page.goto(url, wait_until="networkidle", timeout=60000)
80
-
81
- await self.page.pdf(path=full_file_path, format='A4', print_background=True)
82
-
83
- absolute_file_path = os.path.abspath(full_file_path)
84
- logger.info(f"PDF generated and saved successfully to {absolute_file_path}")
85
- return absolute_file_path
86
- except Exception as e:
87
- logger.error(f"Error generating PDF for URL '{url}': {e}", exc_info=True)
88
- raise RuntimeError(f"WebPagePDFGenerator failed for URL '{url}': {str(e)}")
89
- finally:
90
- await self.close()
91
-
92
- def _is_valid_page_url(self, url_string: str) -> bool:
93
- try:
94
- result = urlparse(url_string)
95
- return all([result.scheme in ['http', 'https'], result.netloc])
96
- except ValueError:
97
- return False
@@ -1,165 +0,0 @@
1
- from autobyteus.tools.base_tool import BaseTool
2
- from autobyteus.tools.tool_config import ToolConfig
3
- from autobyteus.tools.tool_category import ToolCategory
4
- from brui_core.ui_integrator import UIIntegrator
5
- import os
6
- import logging
7
- from urllib.parse import urljoin, urlparse
8
- from typing import Optional, TYPE_CHECKING, Any, List
9
-
10
- from autobyteus.utils.parameter_schema import ParameterSchema, ParameterDefinition, ParameterType
11
-
12
- if TYPE_CHECKING:
13
- from autobyteus.agent.context import AgentContext
14
-
15
- logger = logging.getLogger(__name__)
16
-
17
- class WebPageImageDownloader(BaseTool, UIIntegrator):
18
- """
19
- A class that downloads images (excluding SVGs and data URIs) from a given webpage URL using Playwright.
20
- Saves images to a specified directory.
21
- """
22
- CATEGORY = ToolCategory.WEB
23
-
24
- def __init__(self, config: Optional[ToolConfig] = None):
25
- BaseTool.__init__(self, config=config)
26
- UIIntegrator.__init__(self)
27
- logger.debug("WebPageImageDownloader tool initialized.")
28
-
29
- @classmethod
30
- def get_description(cls) -> str:
31
- return ("Downloads all usable images (excluding SVGs and data URIs) from a webpage URL. "
32
- "Saves them to a specified local directory and returns a list of saved file paths.")
33
-
34
- @classmethod
35
- def get_argument_schema(cls) -> Optional[ParameterSchema]:
36
- schema = ParameterSchema()
37
- schema.add_parameter(ParameterDefinition(
38
- name="url",
39
- param_type=ParameterType.STRING,
40
- description="The URL of the webpage from which to download images.",
41
- required=True
42
- ))
43
- schema.add_parameter(ParameterDefinition(
44
- name="save_dir",
45
- param_type=ParameterType.STRING,
46
- description="The local directory path where downloaded images will be saved.",
47
- required=True
48
- ))
49
- return schema
50
-
51
- async def _execute(self, context: 'AgentContext', url: str, save_dir: str) -> List[str]:
52
- logger.info(f"WebPageImageDownloader for agent {context.agent_id} downloading images from '{url}' to '{save_dir}'.")
53
-
54
- if not self._is_valid_page_url(url):
55
- raise ValueError(f"Invalid page URL format: {url}. Must be a full URL (e.g., http/https).")
56
-
57
- os.makedirs(save_dir, exist_ok=True)
58
-
59
- saved_paths: List[str] = []
60
- try:
61
- await self.initialize()
62
- if not self.page:
63
- logger.error("Playwright page not initialized in WebPageImageDownloader.")
64
- raise RuntimeError("Playwright page not available for WebPageImageDownloader.")
65
-
66
- await self.page.goto(url, wait_until="networkidle", timeout=60000)
67
-
68
- image_srcs: List[str] = await self._get_image_srcs_from_page()
69
- logger.debug(f"Found {len(image_srcs)} image sources on page {url}.")
70
-
71
- download_counter = 0
72
- for i, img_src in enumerate(image_srcs):
73
- if not img_src or img_src.startswith("data:"):
74
- logger.debug(f"Skipping image source (data URI or empty): {img_src[:50]}...")
75
- continue
76
-
77
- full_image_url = urljoin(self.page.url, img_src)
78
-
79
- if self._is_svg(full_image_url):
80
- logger.debug(f"Skipping SVG image: {full_image_url}")
81
- continue
82
-
83
- if not self._is_valid_http_url(full_image_url):
84
- logger.warning(f"Skipping invalid or non-HTTP(S) image URL: {full_image_url}")
85
- continue
86
-
87
- file_path = self._generate_file_path(save_dir, download_counter, full_image_url)
88
- try:
89
- image_response = await self.page.request.get(full_image_url)
90
- if image_response.ok:
91
- image_buffer = await image_response.body()
92
- with open(file_path, "wb") as f:
93
- f.write(image_buffer)
94
- saved_paths.append(os.path.abspath(file_path))
95
- logger.info(f"Downloaded image {download_counter + 1}: {full_image_url} to {file_path}")
96
- download_counter += 1
97
- else:
98
- logger.warning(f"Failed to download image {full_image_url}, status: {image_response.status}")
99
-
100
- except Exception as dl_exc:
101
- logger.error(f"Error downloading image {full_image_url}: {dl_exc}", exc_info=True)
102
-
103
- logger.info(f"Finished downloading images. Total saved: {len(saved_paths)}.")
104
- return saved_paths
105
-
106
- except Exception as e:
107
- logger.error(f"Error in WebPageImageDownloader for URL '{url}': {e}", exc_info=True)
108
- raise RuntimeError(f"WebPageImageDownloader failed for URL '{url}': {str(e)}")
109
- finally:
110
- await self.close()
111
-
112
- async def _get_image_srcs_from_page(self) -> List[str]:
113
- image_elements_data = await self.page.evaluate("""() => {
114
- const sources = new Set();
115
- document.querySelectorAll('img').forEach(img => {
116
- if (img.src && !img.src.startsWith('data:')) sources.add(img.src);
117
- if (img.srcset) {
118
- img.srcset.split(',').forEach(part => {
119
- const url = part.trim().split(' ')[0];
120
- if (url && !url.startsWith('data:')) sources.add(url);
121
- });
122
- }
123
- const dataSrc = img.getAttribute('data-src');
124
- if (dataSrc && !dataSrc.startsWith('data:')) sources.add(dataSrc);
125
- });
126
- return Array.from(sources);
127
- }""")
128
- return image_elements_data if image_elements_data else []
129
-
130
- def _is_valid_page_url(self, url_string: str) -> bool:
131
- try:
132
- result = urlparse(url_string)
133
- return all([result.scheme in ['http', 'https'], result.netloc])
134
- except ValueError:
135
- return False
136
-
137
- def _is_valid_http_url(self, url_string: str) -> bool:
138
- try:
139
- result = urlparse(url_string)
140
- return result.scheme in ['http', 'https']
141
- except ValueError:
142
- return False
143
-
144
- def _is_svg(self, url: str) -> bool:
145
- return url.lower().split('?')[0].endswith('.svg')
146
-
147
- def _generate_file_path(self, directory: str, index: int, url: str) -> str:
148
- try:
149
- parsed_url = urlparse(url)
150
- base_filename = os.path.basename(parsed_url.path)
151
- filename_stem, ext = os.path.splitext(base_filename)
152
- if not ext:
153
- ext = ".jpg"
154
-
155
- import string
156
- valid_chars_fs = "-_.() %s%s" % (string.ascii_letters, string.digits)
157
- safe_stem = ''.join(c for c in filename_stem if c in valid_chars_fs)[:50]
158
- if not safe_stem: safe_stem = f"image_{index}"
159
-
160
- final_filename = f"{safe_stem}{ext}"
161
-
162
- except Exception:
163
- final_filename = f"image_{index}.jpg"
164
-
165
- return os.path.join(directory, final_filename)