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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (472) hide show
  1. autobyteus/agent/agent.py +15 -5
  2. autobyteus/agent/bootstrap_steps/__init__.py +3 -3
  3. autobyteus/agent/bootstrap_steps/agent_bootstrapper.py +5 -59
  4. autobyteus/agent/bootstrap_steps/base_bootstrap_step.py +1 -4
  5. autobyteus/agent/bootstrap_steps/mcp_server_prewarming_step.py +1 -3
  6. autobyteus/agent/bootstrap_steps/system_prompt_processing_step.py +16 -13
  7. autobyteus/agent/bootstrap_steps/working_context_snapshot_restore_step.py +38 -0
  8. autobyteus/agent/bootstrap_steps/workspace_context_initialization_step.py +2 -4
  9. autobyteus/agent/context/agent_config.py +47 -20
  10. autobyteus/agent/context/agent_context.py +23 -18
  11. autobyteus/agent/context/agent_runtime_state.py +21 -19
  12. autobyteus/agent/events/__init__.py +16 -1
  13. autobyteus/agent/events/agent_events.py +43 -3
  14. autobyteus/agent/events/agent_input_event_queue_manager.py +79 -26
  15. autobyteus/agent/events/event_store.py +57 -0
  16. autobyteus/agent/events/notifiers.py +69 -59
  17. autobyteus/agent/events/worker_event_dispatcher.py +21 -64
  18. autobyteus/agent/factory/agent_factory.py +83 -6
  19. autobyteus/agent/handlers/__init__.py +2 -0
  20. autobyteus/agent/handlers/approved_tool_invocation_event_handler.py +51 -34
  21. autobyteus/agent/handlers/bootstrap_event_handler.py +155 -0
  22. autobyteus/agent/handlers/inter_agent_message_event_handler.py +10 -0
  23. autobyteus/agent/handlers/lifecycle_event_logger.py +19 -11
  24. autobyteus/agent/handlers/llm_complete_response_received_event_handler.py +10 -15
  25. autobyteus/agent/handlers/llm_user_message_ready_event_handler.py +188 -48
  26. autobyteus/agent/handlers/tool_execution_approval_event_handler.py +0 -10
  27. autobyteus/agent/handlers/tool_invocation_request_event_handler.py +53 -48
  28. autobyteus/agent/handlers/tool_result_event_handler.py +7 -8
  29. autobyteus/agent/handlers/user_input_message_event_handler.py +10 -3
  30. autobyteus/agent/input_processor/memory_ingest_input_processor.py +44 -0
  31. autobyteus/agent/lifecycle/__init__.py +12 -0
  32. autobyteus/agent/lifecycle/base_processor.py +109 -0
  33. autobyteus/agent/lifecycle/events.py +35 -0
  34. autobyteus/agent/lifecycle/processor_definition.py +36 -0
  35. autobyteus/agent/lifecycle/processor_registry.py +106 -0
  36. autobyteus/agent/llm_request_assembler.py +98 -0
  37. autobyteus/agent/llm_response_processor/__init__.py +1 -8
  38. autobyteus/agent/message/context_file_type.py +1 -1
  39. autobyteus/agent/runtime/agent_runtime.py +29 -21
  40. autobyteus/agent/runtime/agent_worker.py +98 -19
  41. autobyteus/agent/shutdown_steps/__init__.py +2 -0
  42. autobyteus/agent/shutdown_steps/agent_shutdown_orchestrator.py +2 -0
  43. autobyteus/agent/shutdown_steps/tool_cleanup_step.py +58 -0
  44. autobyteus/agent/status/__init__.py +14 -0
  45. autobyteus/agent/status/manager.py +93 -0
  46. autobyteus/agent/status/status_deriver.py +96 -0
  47. autobyteus/agent/{phases/phase_enum.py → status/status_enum.py} +16 -16
  48. autobyteus/agent/status/status_update_utils.py +73 -0
  49. autobyteus/agent/streaming/__init__.py +52 -5
  50. autobyteus/agent/streaming/adapters/__init__.py +18 -0
  51. autobyteus/agent/streaming/adapters/invocation_adapter.py +184 -0
  52. autobyteus/agent/streaming/adapters/tool_call_parsing.py +163 -0
  53. autobyteus/agent/streaming/adapters/tool_syntax_registry.py +67 -0
  54. autobyteus/agent/streaming/agent_event_stream.py +3 -183
  55. autobyteus/agent/streaming/api_tool_call/__init__.py +16 -0
  56. autobyteus/agent/streaming/api_tool_call/file_content_streamer.py +56 -0
  57. autobyteus/agent/streaming/api_tool_call/json_string_field_extractor.py +175 -0
  58. autobyteus/agent/streaming/api_tool_call_streaming_response_handler.py +4 -0
  59. autobyteus/agent/streaming/events/__init__.py +6 -0
  60. autobyteus/agent/streaming/events/stream_event_payloads.py +284 -0
  61. autobyteus/agent/streaming/events/stream_events.py +141 -0
  62. autobyteus/agent/streaming/handlers/__init__.py +15 -0
  63. autobyteus/agent/streaming/handlers/api_tool_call_streaming_response_handler.py +303 -0
  64. autobyteus/agent/streaming/handlers/parsing_streaming_response_handler.py +107 -0
  65. autobyteus/agent/streaming/handlers/pass_through_streaming_response_handler.py +107 -0
  66. autobyteus/agent/streaming/handlers/streaming_handler_factory.py +177 -0
  67. autobyteus/agent/streaming/handlers/streaming_response_handler.py +58 -0
  68. autobyteus/agent/streaming/parser/__init__.py +61 -0
  69. autobyteus/agent/streaming/parser/event_emitter.py +181 -0
  70. autobyteus/agent/streaming/parser/events.py +4 -0
  71. autobyteus/agent/streaming/parser/invocation_adapter.py +4 -0
  72. autobyteus/agent/streaming/parser/json_parsing_strategies/__init__.py +19 -0
  73. autobyteus/agent/streaming/parser/json_parsing_strategies/base.py +32 -0
  74. autobyteus/agent/streaming/parser/json_parsing_strategies/default.py +34 -0
  75. autobyteus/agent/streaming/parser/json_parsing_strategies/gemini.py +31 -0
  76. autobyteus/agent/streaming/parser/json_parsing_strategies/openai.py +64 -0
  77. autobyteus/agent/streaming/parser/json_parsing_strategies/registry.py +75 -0
  78. autobyteus/agent/streaming/parser/parser_context.py +227 -0
  79. autobyteus/agent/streaming/parser/parser_factory.py +132 -0
  80. autobyteus/agent/streaming/parser/sentinel_format.py +7 -0
  81. autobyteus/agent/streaming/parser/state_factory.py +62 -0
  82. autobyteus/agent/streaming/parser/states/__init__.py +1 -0
  83. autobyteus/agent/streaming/parser/states/base_state.py +60 -0
  84. autobyteus/agent/streaming/parser/states/custom_xml_tag_run_bash_parsing_state.py +38 -0
  85. autobyteus/agent/streaming/parser/states/custom_xml_tag_write_file_parsing_state.py +55 -0
  86. autobyteus/agent/streaming/parser/states/delimited_content_state.py +146 -0
  87. autobyteus/agent/streaming/parser/states/json_initialization_state.py +144 -0
  88. autobyteus/agent/streaming/parser/states/json_tool_parsing_state.py +137 -0
  89. autobyteus/agent/streaming/parser/states/sentinel_content_state.py +30 -0
  90. autobyteus/agent/streaming/parser/states/sentinel_initialization_state.py +117 -0
  91. autobyteus/agent/streaming/parser/states/text_state.py +78 -0
  92. autobyteus/agent/streaming/parser/states/xml_patch_file_tool_parsing_state.py +328 -0
  93. autobyteus/agent/streaming/parser/states/xml_run_bash_tool_parsing_state.py +129 -0
  94. autobyteus/agent/streaming/parser/states/xml_tag_initialization_state.py +151 -0
  95. autobyteus/agent/streaming/parser/states/xml_tool_parsing_state.py +63 -0
  96. autobyteus/agent/streaming/parser/states/xml_write_file_tool_parsing_state.py +343 -0
  97. autobyteus/agent/streaming/parser/strategies/__init__.py +17 -0
  98. autobyteus/agent/streaming/parser/strategies/base.py +24 -0
  99. autobyteus/agent/streaming/parser/strategies/json_tool_strategy.py +26 -0
  100. autobyteus/agent/streaming/parser/strategies/registry.py +28 -0
  101. autobyteus/agent/streaming/parser/strategies/sentinel_strategy.py +23 -0
  102. autobyteus/agent/streaming/parser/strategies/xml_tag_strategy.py +21 -0
  103. autobyteus/agent/streaming/parser/stream_scanner.py +167 -0
  104. autobyteus/agent/streaming/parser/streaming_parser.py +212 -0
  105. autobyteus/agent/streaming/parser/tool_call_parsing.py +4 -0
  106. autobyteus/agent/streaming/parser/tool_constants.py +7 -0
  107. autobyteus/agent/streaming/parser/tool_syntax_registry.py +4 -0
  108. autobyteus/agent/streaming/parser/xml_tool_parsing_state_registry.py +55 -0
  109. autobyteus/agent/streaming/parsing_streaming_response_handler.py +4 -0
  110. autobyteus/agent/streaming/pass_through_streaming_response_handler.py +4 -0
  111. autobyteus/agent/streaming/queue_streamer.py +3 -57
  112. autobyteus/agent/streaming/segments/__init__.py +5 -0
  113. autobyteus/agent/streaming/segments/segment_events.py +82 -0
  114. autobyteus/agent/streaming/stream_event_payloads.py +2 -223
  115. autobyteus/agent/streaming/stream_events.py +3 -140
  116. autobyteus/agent/streaming/streaming_handler_factory.py +4 -0
  117. autobyteus/agent/streaming/streaming_response_handler.py +4 -0
  118. autobyteus/agent/streaming/streams/__init__.py +5 -0
  119. autobyteus/agent/streaming/streams/agent_event_stream.py +197 -0
  120. autobyteus/agent/streaming/utils/__init__.py +5 -0
  121. autobyteus/agent/streaming/utils/queue_streamer.py +59 -0
  122. autobyteus/agent/system_prompt_processor/__init__.py +2 -0
  123. autobyteus/agent/system_prompt_processor/available_skills_processor.py +96 -0
  124. autobyteus/agent/system_prompt_processor/base_processor.py +1 -1
  125. autobyteus/agent/system_prompt_processor/processor_meta.py +15 -2
  126. autobyteus/agent/system_prompt_processor/tool_manifest_injector_processor.py +39 -58
  127. autobyteus/agent/token_budget.py +56 -0
  128. autobyteus/agent/tool_execution_result_processor/memory_ingest_tool_result_processor.py +29 -0
  129. autobyteus/agent/tool_invocation.py +16 -40
  130. autobyteus/agent/tool_invocation_preprocessor/__init__.py +9 -0
  131. autobyteus/agent/tool_invocation_preprocessor/base_preprocessor.py +45 -0
  132. autobyteus/agent/tool_invocation_preprocessor/processor_definition.py +15 -0
  133. autobyteus/agent/tool_invocation_preprocessor/processor_meta.py +33 -0
  134. autobyteus/agent/tool_invocation_preprocessor/processor_registry.py +60 -0
  135. autobyteus/agent/utils/wait_for_idle.py +12 -14
  136. autobyteus/agent/workspace/base_workspace.py +6 -27
  137. autobyteus/agent_team/agent_team.py +3 -3
  138. autobyteus/agent_team/agent_team_builder.py +1 -41
  139. autobyteus/agent_team/bootstrap_steps/__init__.py +0 -4
  140. autobyteus/agent_team/bootstrap_steps/agent_configuration_preparation_step.py +8 -18
  141. autobyteus/agent_team/bootstrap_steps/agent_team_bootstrapper.py +4 -16
  142. autobyteus/agent_team/bootstrap_steps/base_agent_team_bootstrap_step.py +1 -2
  143. autobyteus/agent_team/bootstrap_steps/coordinator_initialization_step.py +1 -2
  144. autobyteus/agent_team/bootstrap_steps/task_notifier_initialization_step.py +1 -2
  145. autobyteus/agent_team/bootstrap_steps/team_context_initialization_step.py +4 -4
  146. autobyteus/agent_team/context/agent_team_config.py +6 -3
  147. autobyteus/agent_team/context/agent_team_context.py +25 -3
  148. autobyteus/agent_team/context/agent_team_runtime_state.py +9 -6
  149. autobyteus/agent_team/events/__init__.py +11 -0
  150. autobyteus/agent_team/events/agent_team_event_dispatcher.py +22 -9
  151. autobyteus/agent_team/events/agent_team_events.py +16 -0
  152. autobyteus/agent_team/events/event_store.py +57 -0
  153. autobyteus/agent_team/factory/agent_team_factory.py +8 -0
  154. autobyteus/agent_team/handlers/inter_agent_message_request_event_handler.py +18 -2
  155. autobyteus/agent_team/handlers/lifecycle_agent_team_event_handler.py +21 -5
  156. autobyteus/agent_team/handlers/process_user_message_event_handler.py +17 -8
  157. autobyteus/agent_team/handlers/tool_approval_team_event_handler.py +19 -4
  158. autobyteus/agent_team/runtime/agent_team_runtime.py +41 -10
  159. autobyteus/agent_team/runtime/agent_team_worker.py +69 -5
  160. autobyteus/agent_team/status/__init__.py +14 -0
  161. autobyteus/agent_team/status/agent_team_status.py +18 -0
  162. autobyteus/agent_team/status/agent_team_status_manager.py +33 -0
  163. autobyteus/agent_team/status/status_deriver.py +62 -0
  164. autobyteus/agent_team/status/status_update_utils.py +42 -0
  165. autobyteus/agent_team/streaming/__init__.py +2 -2
  166. autobyteus/agent_team/streaming/agent_team_event_notifier.py +6 -6
  167. autobyteus/agent_team/streaming/agent_team_stream_event_payloads.py +4 -4
  168. autobyteus/agent_team/streaming/agent_team_stream_events.py +3 -3
  169. autobyteus/agent_team/system_prompt_processor/__init__.py +6 -0
  170. autobyteus/agent_team/system_prompt_processor/team_manifest_injector_processor.py +76 -0
  171. autobyteus/agent_team/task_notification/task_notification_mode.py +19 -0
  172. autobyteus/agent_team/utils/wait_for_idle.py +4 -4
  173. autobyteus/cli/agent_cli.py +18 -10
  174. autobyteus/cli/agent_team_tui/app.py +14 -11
  175. autobyteus/cli/agent_team_tui/state.py +13 -15
  176. autobyteus/cli/agent_team_tui/widgets/agent_list_sidebar.py +15 -15
  177. autobyteus/cli/agent_team_tui/widgets/focus_pane.py +143 -36
  178. autobyteus/cli/agent_team_tui/widgets/renderables.py +1 -1
  179. autobyteus/cli/agent_team_tui/widgets/shared.py +25 -25
  180. autobyteus/cli/cli_display.py +193 -44
  181. autobyteus/cli/workflow_tui/app.py +9 -10
  182. autobyteus/cli/workflow_tui/state.py +14 -16
  183. autobyteus/cli/workflow_tui/widgets/agent_list_sidebar.py +15 -15
  184. autobyteus/cli/workflow_tui/widgets/focus_pane.py +137 -35
  185. autobyteus/cli/workflow_tui/widgets/renderables.py +1 -1
  186. autobyteus/cli/workflow_tui/widgets/shared.py +25 -25
  187. autobyteus/clients/autobyteus_client.py +94 -1
  188. autobyteus/events/event_types.py +11 -18
  189. autobyteus/llm/api/autobyteus_llm.py +33 -29
  190. autobyteus/llm/api/claude_llm.py +142 -36
  191. autobyteus/llm/api/gemini_llm.py +163 -59
  192. autobyteus/llm/api/grok_llm.py +1 -1
  193. autobyteus/llm/api/minimax_llm.py +26 -0
  194. autobyteus/llm/api/mistral_llm.py +113 -87
  195. autobyteus/llm/api/ollama_llm.py +9 -42
  196. autobyteus/llm/api/openai_compatible_llm.py +127 -91
  197. autobyteus/llm/api/openai_llm.py +3 -3
  198. autobyteus/llm/api/openai_responses_llm.py +324 -0
  199. autobyteus/llm/api/zhipu_llm.py +21 -2
  200. autobyteus/llm/autobyteus_provider.py +70 -60
  201. autobyteus/llm/base_llm.py +85 -81
  202. autobyteus/llm/converters/__init__.py +14 -0
  203. autobyteus/llm/converters/anthropic_tool_call_converter.py +37 -0
  204. autobyteus/llm/converters/gemini_tool_call_converter.py +57 -0
  205. autobyteus/llm/converters/mistral_tool_call_converter.py +37 -0
  206. autobyteus/llm/converters/openai_tool_call_converter.py +38 -0
  207. autobyteus/llm/extensions/base_extension.py +6 -12
  208. autobyteus/llm/extensions/token_usage_tracking_extension.py +45 -18
  209. autobyteus/llm/llm_factory.py +282 -204
  210. autobyteus/llm/lmstudio_provider.py +60 -49
  211. autobyteus/llm/models.py +35 -2
  212. autobyteus/llm/ollama_provider.py +60 -49
  213. autobyteus/llm/ollama_provider_resolver.py +0 -1
  214. autobyteus/llm/prompt_renderers/__init__.py +19 -0
  215. autobyteus/llm/prompt_renderers/anthropic_prompt_renderer.py +104 -0
  216. autobyteus/llm/prompt_renderers/autobyteus_prompt_renderer.py +19 -0
  217. autobyteus/llm/prompt_renderers/base_prompt_renderer.py +10 -0
  218. autobyteus/llm/prompt_renderers/gemini_prompt_renderer.py +63 -0
  219. autobyteus/llm/prompt_renderers/mistral_prompt_renderer.py +87 -0
  220. autobyteus/llm/prompt_renderers/ollama_prompt_renderer.py +51 -0
  221. autobyteus/llm/prompt_renderers/openai_chat_renderer.py +97 -0
  222. autobyteus/llm/prompt_renderers/openai_responses_renderer.py +101 -0
  223. autobyteus/llm/providers.py +1 -3
  224. autobyteus/llm/token_counter/claude_token_counter.py +56 -25
  225. autobyteus/llm/token_counter/mistral_token_counter.py +12 -8
  226. autobyteus/llm/token_counter/openai_token_counter.py +24 -5
  227. autobyteus/llm/token_counter/token_counter_factory.py +12 -5
  228. autobyteus/llm/utils/llm_config.py +6 -12
  229. autobyteus/llm/utils/media_payload_formatter.py +27 -20
  230. autobyteus/llm/utils/messages.py +55 -3
  231. autobyteus/llm/utils/response_types.py +3 -0
  232. autobyteus/llm/utils/tool_call_delta.py +31 -0
  233. autobyteus/memory/__init__.py +35 -0
  234. autobyteus/memory/compaction/__init__.py +9 -0
  235. autobyteus/memory/compaction/compaction_result.py +8 -0
  236. autobyteus/memory/compaction/compactor.py +89 -0
  237. autobyteus/memory/compaction/summarizer.py +11 -0
  238. autobyteus/memory/compaction_snapshot_builder.py +84 -0
  239. autobyteus/memory/memory_manager.py +205 -0
  240. autobyteus/memory/models/__init__.py +14 -0
  241. autobyteus/memory/models/episodic_item.py +41 -0
  242. autobyteus/memory/models/memory_types.py +7 -0
  243. autobyteus/memory/models/raw_trace_item.py +79 -0
  244. autobyteus/memory/models/semantic_item.py +41 -0
  245. autobyteus/memory/models/tool_interaction.py +20 -0
  246. autobyteus/memory/path_resolver.py +27 -0
  247. autobyteus/memory/policies/__init__.py +5 -0
  248. autobyteus/memory/policies/compaction_policy.py +16 -0
  249. autobyteus/memory/restore/__init__.py +1 -0
  250. autobyteus/memory/restore/working_context_snapshot_bootstrapper.py +61 -0
  251. autobyteus/memory/retrieval/__init__.py +7 -0
  252. autobyteus/memory/retrieval/memory_bundle.py +11 -0
  253. autobyteus/memory/retrieval/retriever.py +13 -0
  254. autobyteus/memory/store/__init__.py +9 -0
  255. autobyteus/memory/store/base_store.py +14 -0
  256. autobyteus/memory/store/file_store.py +98 -0
  257. autobyteus/memory/store/working_context_snapshot_store.py +28 -0
  258. autobyteus/memory/tool_interaction_builder.py +46 -0
  259. autobyteus/memory/turn_tracker.py +9 -0
  260. autobyteus/memory/working_context_snapshot.py +69 -0
  261. autobyteus/memory/working_context_snapshot_serializer.py +135 -0
  262. autobyteus/multimedia/audio/api/autobyteus_audio_client.py +19 -5
  263. autobyteus/multimedia/audio/api/gemini_audio_client.py +109 -16
  264. autobyteus/multimedia/audio/audio_client_factory.py +47 -9
  265. autobyteus/multimedia/audio/audio_model.py +2 -1
  266. autobyteus/multimedia/image/api/autobyteus_image_client.py +19 -5
  267. autobyteus/multimedia/image/api/gemini_image_client.py +39 -17
  268. autobyteus/multimedia/image/api/openai_image_client.py +125 -43
  269. autobyteus/multimedia/image/autobyteus_image_provider.py +2 -1
  270. autobyteus/multimedia/image/image_client_factory.py +47 -15
  271. autobyteus/multimedia/image/image_model.py +5 -2
  272. autobyteus/multimedia/providers.py +3 -2
  273. autobyteus/skills/loader.py +71 -0
  274. autobyteus/skills/model.py +11 -0
  275. autobyteus/skills/registry.py +70 -0
  276. autobyteus/task_management/tools/todo_tools/add_todo.py +2 -2
  277. autobyteus/task_management/tools/todo_tools/create_todo_list.py +2 -2
  278. autobyteus/task_management/tools/todo_tools/update_todo_status.py +2 -2
  279. autobyteus/tools/__init__.py +34 -47
  280. autobyteus/tools/base_tool.py +7 -0
  281. autobyteus/tools/file/__init__.py +2 -6
  282. autobyteus/tools/file/patch_file.py +149 -0
  283. autobyteus/tools/file/read_file.py +36 -5
  284. autobyteus/tools/file/write_file.py +4 -1
  285. autobyteus/tools/functional_tool.py +43 -6
  286. autobyteus/tools/mcp/__init__.py +2 -0
  287. autobyteus/tools/mcp/config_service.py +5 -1
  288. autobyteus/tools/mcp/server/__init__.py +2 -0
  289. autobyteus/tools/mcp/server/http_managed_mcp_server.py +1 -1
  290. autobyteus/tools/mcp/server/websocket_managed_mcp_server.py +141 -0
  291. autobyteus/tools/mcp/server_instance_manager.py +8 -1
  292. autobyteus/tools/mcp/types.py +61 -0
  293. autobyteus/tools/multimedia/audio_tools.py +70 -17
  294. autobyteus/tools/multimedia/download_media_tool.py +18 -4
  295. autobyteus/tools/multimedia/image_tools.py +246 -62
  296. autobyteus/tools/operation_executor/journal_manager.py +107 -0
  297. autobyteus/tools/operation_executor/operation_event_buffer.py +57 -0
  298. autobyteus/tools/operation_executor/operation_event_producer.py +29 -0
  299. autobyteus/tools/operation_executor/operation_executor.py +58 -0
  300. autobyteus/tools/registry/tool_definition.py +43 -2
  301. autobyteus/tools/skill/load_skill.py +50 -0
  302. autobyteus/tools/terminal/__init__.py +45 -0
  303. autobyteus/tools/terminal/ansi_utils.py +32 -0
  304. autobyteus/tools/terminal/background_process_manager.py +233 -0
  305. autobyteus/tools/terminal/output_buffer.py +105 -0
  306. autobyteus/tools/terminal/prompt_detector.py +63 -0
  307. autobyteus/tools/terminal/pty_session.py +241 -0
  308. autobyteus/tools/terminal/session_factory.py +20 -0
  309. autobyteus/tools/terminal/terminal_session_manager.py +226 -0
  310. autobyteus/tools/terminal/tools/__init__.py +13 -0
  311. autobyteus/tools/terminal/tools/get_process_output.py +81 -0
  312. autobyteus/tools/terminal/tools/run_bash.py +109 -0
  313. autobyteus/tools/terminal/tools/start_background_process.py +104 -0
  314. autobyteus/tools/terminal/tools/stop_background_process.py +67 -0
  315. autobyteus/tools/terminal/types.py +54 -0
  316. autobyteus/tools/terminal/wsl_tmux_session.py +221 -0
  317. autobyteus/tools/terminal/wsl_utils.py +156 -0
  318. autobyteus/tools/transaction_management/backup_handler.py +48 -0
  319. autobyteus/tools/transaction_management/operation_lifecycle_manager.py +62 -0
  320. autobyteus/tools/usage/__init__.py +1 -2
  321. autobyteus/tools/usage/formatters/__init__.py +17 -1
  322. autobyteus/tools/usage/formatters/base_formatter.py +8 -0
  323. autobyteus/tools/usage/formatters/default_xml_schema_formatter.py +2 -2
  324. autobyteus/tools/usage/formatters/mistral_json_schema_formatter.py +18 -0
  325. autobyteus/tools/usage/formatters/patch_file_xml_example_formatter.py +64 -0
  326. autobyteus/tools/usage/formatters/patch_file_xml_schema_formatter.py +31 -0
  327. autobyteus/tools/usage/formatters/run_bash_xml_example_formatter.py +32 -0
  328. autobyteus/tools/usage/formatters/run_bash_xml_schema_formatter.py +36 -0
  329. autobyteus/tools/usage/formatters/write_file_xml_example_formatter.py +53 -0
  330. autobyteus/tools/usage/formatters/write_file_xml_schema_formatter.py +31 -0
  331. autobyteus/tools/usage/providers/tool_manifest_provider.py +10 -10
  332. autobyteus/tools/usage/registries/__init__.py +1 -3
  333. autobyteus/tools/usage/registries/tool_formatting_registry.py +115 -8
  334. autobyteus/tools/usage/tool_schema_provider.py +51 -0
  335. autobyteus/tools/web/__init__.py +4 -0
  336. autobyteus/tools/web/read_url_tool.py +80 -0
  337. autobyteus/utils/diff_utils.py +271 -0
  338. autobyteus/utils/download_utils.py +109 -0
  339. autobyteus/utils/file_utils.py +57 -2
  340. autobyteus/utils/gemini_helper.py +64 -0
  341. autobyteus/utils/gemini_model_mapping.py +71 -0
  342. autobyteus/utils/llm_output_formatter.py +75 -0
  343. autobyteus/utils/tool_call_format.py +36 -0
  344. autobyteus/workflow/agentic_workflow.py +3 -3
  345. autobyteus/workflow/bootstrap_steps/agent_tool_injection_step.py +2 -2
  346. autobyteus/workflow/bootstrap_steps/base_workflow_bootstrap_step.py +2 -2
  347. autobyteus/workflow/bootstrap_steps/coordinator_initialization_step.py +2 -2
  348. autobyteus/workflow/bootstrap_steps/coordinator_prompt_preparation_step.py +3 -9
  349. autobyteus/workflow/bootstrap_steps/workflow_bootstrapper.py +6 -6
  350. autobyteus/workflow/bootstrap_steps/workflow_runtime_queue_initialization_step.py +2 -2
  351. autobyteus/workflow/context/workflow_context.py +3 -3
  352. autobyteus/workflow/context/workflow_runtime_state.py +5 -5
  353. autobyteus/workflow/events/workflow_event_dispatcher.py +5 -5
  354. autobyteus/workflow/handlers/lifecycle_workflow_event_handler.py +3 -3
  355. autobyteus/workflow/handlers/process_user_message_event_handler.py +5 -5
  356. autobyteus/workflow/handlers/tool_approval_workflow_event_handler.py +2 -2
  357. autobyteus/workflow/runtime/workflow_runtime.py +8 -8
  358. autobyteus/workflow/runtime/workflow_worker.py +3 -3
  359. autobyteus/workflow/status/__init__.py +11 -0
  360. autobyteus/workflow/status/workflow_status.py +19 -0
  361. autobyteus/workflow/status/workflow_status_manager.py +48 -0
  362. autobyteus/workflow/streaming/__init__.py +2 -2
  363. autobyteus/workflow/streaming/workflow_event_notifier.py +7 -7
  364. autobyteus/workflow/streaming/workflow_stream_event_payloads.py +4 -4
  365. autobyteus/workflow/streaming/workflow_stream_events.py +3 -3
  366. autobyteus/workflow/utils/wait_for_idle.py +4 -4
  367. autobyteus-1.3.0.dist-info/METADATA +293 -0
  368. autobyteus-1.3.0.dist-info/RECORD +606 -0
  369. {autobyteus-1.2.1.dist-info → autobyteus-1.3.0.dist-info}/WHEEL +1 -1
  370. {autobyteus-1.2.1.dist-info → autobyteus-1.3.0.dist-info}/top_level.txt +0 -1
  371. autobyteus/agent/bootstrap_steps/agent_runtime_queue_initialization_step.py +0 -57
  372. autobyteus/agent/hooks/__init__.py +0 -16
  373. autobyteus/agent/hooks/base_phase_hook.py +0 -78
  374. autobyteus/agent/hooks/hook_definition.py +0 -36
  375. autobyteus/agent/hooks/hook_meta.py +0 -37
  376. autobyteus/agent/hooks/hook_registry.py +0 -106
  377. autobyteus/agent/llm_response_processor/provider_aware_tool_usage_processor.py +0 -103
  378. autobyteus/agent/phases/__init__.py +0 -18
  379. autobyteus/agent/phases/discover.py +0 -53
  380. autobyteus/agent/phases/manager.py +0 -265
  381. autobyteus/agent/phases/transition_decorator.py +0 -40
  382. autobyteus/agent/phases/transition_info.py +0 -33
  383. autobyteus/agent/remote_agent.py +0 -244
  384. autobyteus/agent/workspace/workspace_definition.py +0 -36
  385. autobyteus/agent/workspace/workspace_meta.py +0 -37
  386. autobyteus/agent/workspace/workspace_registry.py +0 -72
  387. autobyteus/agent_team/bootstrap_steps/agent_team_runtime_queue_initialization_step.py +0 -25
  388. autobyteus/agent_team/bootstrap_steps/coordinator_prompt_preparation_step.py +0 -85
  389. autobyteus/agent_team/phases/__init__.py +0 -11
  390. autobyteus/agent_team/phases/agent_team_operational_phase.py +0 -19
  391. autobyteus/agent_team/phases/agent_team_phase_manager.py +0 -48
  392. autobyteus/llm/api/bedrock_llm.py +0 -92
  393. autobyteus/llm/api/groq_llm.py +0 -94
  394. autobyteus/llm/api/nvidia_llm.py +0 -108
  395. autobyteus/llm/utils/token_pricing_config.py +0 -87
  396. autobyteus/rpc/__init__.py +0 -73
  397. autobyteus/rpc/client/__init__.py +0 -17
  398. autobyteus/rpc/client/abstract_client_connection.py +0 -124
  399. autobyteus/rpc/client/client_connection_manager.py +0 -153
  400. autobyteus/rpc/client/sse_client_connection.py +0 -306
  401. autobyteus/rpc/client/stdio_client_connection.py +0 -280
  402. autobyteus/rpc/config/__init__.py +0 -13
  403. autobyteus/rpc/config/agent_server_config.py +0 -153
  404. autobyteus/rpc/config/agent_server_registry.py +0 -152
  405. autobyteus/rpc/hosting.py +0 -244
  406. autobyteus/rpc/protocol.py +0 -244
  407. autobyteus/rpc/server/__init__.py +0 -20
  408. autobyteus/rpc/server/agent_server_endpoint.py +0 -181
  409. autobyteus/rpc/server/base_method_handler.py +0 -40
  410. autobyteus/rpc/server/method_handlers.py +0 -259
  411. autobyteus/rpc/server/sse_server_handler.py +0 -182
  412. autobyteus/rpc/server/stdio_server_handler.py +0 -151
  413. autobyteus/rpc/server_main.py +0 -198
  414. autobyteus/rpc/transport_type.py +0 -13
  415. autobyteus/tools/bash/__init__.py +0 -2
  416. autobyteus/tools/bash/bash_executor.py +0 -100
  417. autobyteus/tools/browser/__init__.py +0 -2
  418. autobyteus/tools/browser/session_aware/browser_session_aware_navigate_to.py +0 -75
  419. autobyteus/tools/browser/session_aware/browser_session_aware_tool.py +0 -30
  420. autobyteus/tools/browser/session_aware/browser_session_aware_web_element_trigger.py +0 -154
  421. autobyteus/tools/browser/session_aware/browser_session_aware_webpage_reader.py +0 -89
  422. autobyteus/tools/browser/session_aware/browser_session_aware_webpage_screenshot_taker.py +0 -107
  423. autobyteus/tools/browser/session_aware/factory/browser_session_aware_web_element_trigger_factory.py +0 -14
  424. autobyteus/tools/browser/session_aware/factory/browser_session_aware_webpage_reader_factory.py +0 -26
  425. autobyteus/tools/browser/session_aware/factory/browser_session_aware_webpage_screenshot_taker_factory.py +0 -14
  426. autobyteus/tools/browser/session_aware/shared_browser_session.py +0 -11
  427. autobyteus/tools/browser/session_aware/shared_browser_session_manager.py +0 -25
  428. autobyteus/tools/browser/session_aware/web_element_action.py +0 -20
  429. autobyteus/tools/browser/standalone/__init__.py +0 -6
  430. autobyteus/tools/browser/standalone/factory/__init__.py +0 -0
  431. autobyteus/tools/browser/standalone/factory/webpage_reader_factory.py +0 -25
  432. autobyteus/tools/browser/standalone/factory/webpage_screenshot_taker_factory.py +0 -14
  433. autobyteus/tools/browser/standalone/navigate_to.py +0 -84
  434. autobyteus/tools/browser/standalone/web_page_pdf_generator.py +0 -101
  435. autobyteus/tools/browser/standalone/webpage_image_downloader.py +0 -169
  436. autobyteus/tools/browser/standalone/webpage_reader.py +0 -105
  437. autobyteus/tools/browser/standalone/webpage_screenshot_taker.py +0 -105
  438. autobyteus/tools/file/edit_file.py +0 -200
  439. autobyteus/tools/file/list_directory.py +0 -168
  440. autobyteus/tools/file/search_files.py +0 -188
  441. autobyteus/tools/timer.py +0 -175
  442. autobyteus/tools/usage/parsers/__init__.py +0 -22
  443. autobyteus/tools/usage/parsers/_json_extractor.py +0 -99
  444. autobyteus/tools/usage/parsers/_string_decoders.py +0 -18
  445. autobyteus/tools/usage/parsers/anthropic_xml_tool_usage_parser.py +0 -10
  446. autobyteus/tools/usage/parsers/base_parser.py +0 -41
  447. autobyteus/tools/usage/parsers/default_json_tool_usage_parser.py +0 -83
  448. autobyteus/tools/usage/parsers/default_xml_tool_usage_parser.py +0 -316
  449. autobyteus/tools/usage/parsers/exceptions.py +0 -13
  450. autobyteus/tools/usage/parsers/gemini_json_tool_usage_parser.py +0 -77
  451. autobyteus/tools/usage/parsers/openai_json_tool_usage_parser.py +0 -149
  452. autobyteus/tools/usage/parsers/provider_aware_tool_usage_parser.py +0 -59
  453. autobyteus/tools/usage/registries/tool_usage_parser_registry.py +0 -62
  454. autobyteus/workflow/phases/__init__.py +0 -11
  455. autobyteus/workflow/phases/workflow_operational_phase.py +0 -19
  456. autobyteus/workflow/phases/workflow_phase_manager.py +0 -48
  457. autobyteus-1.2.1.dist-info/METADATA +0 -205
  458. autobyteus-1.2.1.dist-info/RECORD +0 -511
  459. examples/__init__.py +0 -1
  460. examples/agent_team/__init__.py +0 -1
  461. examples/discover_phase_transitions.py +0 -104
  462. examples/run_agentic_software_engineer.py +0 -239
  463. examples/run_browser_agent.py +0 -262
  464. examples/run_google_slides_agent.py +0 -287
  465. examples/run_mcp_browser_client.py +0 -174
  466. examples/run_mcp_google_slides_client.py +0 -270
  467. examples/run_mcp_list_tools.py +0 -189
  468. examples/run_poem_writer.py +0 -284
  469. examples/run_sqlite_agent.py +0 -295
  470. /autobyteus/{tools/browser/session_aware → skills}/__init__.py +0 -0
  471. /autobyteus/tools/{browser/session_aware/factory → skill}/__init__.py +0 -0
  472. {autobyteus-1.2.1.dist-info → autobyteus-1.3.0.dist-info}/licenses/LICENSE +0 -0
@@ -1,84 +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("navigate_to (standalone) tool initialized.")
27
-
28
- @classmethod
29
- def get_name(cls) -> str:
30
- return "navigate_to"
31
-
32
- @classmethod
33
- def get_description(cls) -> str:
34
- return "Navigates a standalone browser instance to a specified URL. Returns a success or failure message."
35
-
36
- @classmethod
37
- def get_argument_schema(cls) -> Optional[ParameterSchema]:
38
- schema = ParameterSchema()
39
- schema.add_parameter(ParameterDefinition(
40
- name="url",
41
- param_type=ParameterType.STRING,
42
- description="The fully qualified URL of the website to navigate to (e.g., 'https://example.com').",
43
- required=True
44
- ))
45
- return schema
46
-
47
- async def _execute(self, context: 'AgentContext', url: str) -> str:
48
- logger.info(f"navigate_to (standalone) for agent {context.agent_id} navigating to: {url}")
49
-
50
- if not self._is_valid_url(url):
51
- error_msg = f"Invalid URL format: {url}. Must include scheme (e.g., http, https) and netloc."
52
- logger.warning(f"navigate_to (standalone) validation error for agent {context.agent_id}: {error_msg}")
53
- raise ValueError(error_msg)
54
-
55
- try:
56
- await self.initialize()
57
- if not self.page:
58
- logger.error("Playwright page not initialized in navigate_to (standalone).")
59
- raise RuntimeError("Playwright page not available for navigate_to.")
60
-
61
- response = await self.page.goto(url, wait_until="domcontentloaded", timeout=60000)
62
-
63
- if response and response.ok:
64
- success_msg = f"Successfully navigated to {url}"
65
- logger.info(f"navigate_to (standalone) for agent {context.agent_id}: {success_msg}")
66
- return success_msg
67
- else:
68
- status = response.status if response else "Unknown"
69
- failure_msg = f"Navigation to {url} failed with status {status}"
70
- logger.warning(f"navigate_to (standalone) for agent {context.agent_id}: {failure_msg}")
71
- return failure_msg
72
- except Exception as e:
73
- logger.error(f"Error during navigate_to (standalone) for URL '{url}', agent {context.agent_id}: {e}", exc_info=True)
74
- raise RuntimeError(f"navigate_to (standalone) failed for URL '{url}': {str(e)}")
75
- finally:
76
- await self.close()
77
-
78
- @staticmethod
79
- def _is_valid_url(url_string: str) -> bool:
80
- try:
81
- result = urlparse(url_string)
82
- return all([result.scheme, result.netloc])
83
- except ValueError:
84
- return False
@@ -1,101 +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("generate_webpage_pdf (standalone) tool initialized.")
28
-
29
- @classmethod
30
- def get_name(cls) -> str:
31
- return "generate_webpage_pdf"
32
-
33
- @classmethod
34
- def get_description(cls) -> str:
35
- return ("Generates a PDF (A4 format) of a given webpage URL. "
36
- "Saves it to a specified local directory and returns the absolute file path of the saved PDF.")
37
-
38
- @classmethod
39
- def get_argument_schema(cls) -> Optional[ParameterSchema]:
40
- schema = ParameterSchema()
41
- schema.add_parameter(ParameterDefinition(
42
- name="url",
43
- param_type=ParameterType.STRING,
44
- description="The URL of the webpage to generate a PDF from.",
45
- required=True
46
- ))
47
- schema.add_parameter(ParameterDefinition(
48
- name="save_dir",
49
- param_type=ParameterType.STRING,
50
- description="The local directory path where the generated PDF will be saved. A filename will be auto-generated.",
51
- required=True
52
- ))
53
- return schema
54
-
55
- async def _execute(self, context: 'AgentContext', url: str, save_dir: str) -> str:
56
- logger.info(f"generate_webpage_pdf for agent {context.agent_id} generating PDF for '{url}', saving to directory '{save_dir}'.")
57
-
58
- if not self._is_valid_page_url(url):
59
- raise ValueError(f"Invalid page URL format: {url}. Must be a full URL (e.g., http/https).")
60
-
61
- os.makedirs(save_dir, exist_ok=True)
62
-
63
- try:
64
- parsed_url = urlparse(url)
65
- domain_part = parsed_url.netloc.replace('.', '_')
66
- path_part = parsed_url.path.strip('/').replace('/', '_').replace('.', '_')
67
- safe_url_part = f"{domain_part}_{path_part}"[:50]
68
- if not safe_url_part: safe_url_part = "webpage"
69
- except Exception:
70
- safe_url_part = "webpage"
71
-
72
- import time
73
- timestamp = int(time.time())
74
- pdf_filename = f"{safe_url_part}_{timestamp}.pdf"
75
- full_file_path = os.path.join(save_dir, pdf_filename)
76
-
77
- try:
78
- await self.initialize()
79
- if not self.page:
80
- logger.error("Playwright page not initialized in generate_webpage_pdf.")
81
- raise RuntimeError("Playwright page not available for generate_webpage_pdf.")
82
-
83
- await self.page.goto(url, wait_until="networkidle", timeout=60000)
84
-
85
- await self.page.pdf(path=full_file_path, format='A4', print_background=True)
86
-
87
- absolute_file_path = os.path.abspath(full_file_path)
88
- logger.info(f"PDF generated and saved successfully to {absolute_file_path}")
89
- return absolute_file_path
90
- except Exception as e:
91
- logger.error(f"Error generating PDF for URL '{url}': {e}", exc_info=True)
92
- raise RuntimeError(f"generate_webpage_pdf failed for URL '{url}': {str(e)}")
93
- finally:
94
- await self.close()
95
-
96
- def _is_valid_page_url(self, url_string: str) -> bool:
97
- try:
98
- result = urlparse(url_string)
99
- return all([result.scheme in ['http', 'https'], result.netloc])
100
- except ValueError:
101
- return False
@@ -1,169 +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("download_webpage_images tool initialized.")
28
-
29
- @classmethod
30
- def get_name(cls) -> str:
31
- return "download_webpage_images"
32
-
33
- @classmethod
34
- def get_description(cls) -> str:
35
- return ("Downloads all usable images (excluding SVGs and data URIs) from a webpage URL. "
36
- "Saves them to a specified local directory and returns a list of saved file paths.")
37
-
38
- @classmethod
39
- def get_argument_schema(cls) -> Optional[ParameterSchema]:
40
- schema = ParameterSchema()
41
- schema.add_parameter(ParameterDefinition(
42
- name="url",
43
- param_type=ParameterType.STRING,
44
- description="The URL of the webpage from which to download images.",
45
- required=True
46
- ))
47
- schema.add_parameter(ParameterDefinition(
48
- name="save_dir",
49
- param_type=ParameterType.STRING,
50
- description="The local directory path where downloaded images will be saved.",
51
- required=True
52
- ))
53
- return schema
54
-
55
- async def _execute(self, context: 'AgentContext', url: str, save_dir: str) -> List[str]:
56
- logger.info(f"download_webpage_images for agent {context.agent_id} downloading images from '{url}' to '{save_dir}'.")
57
-
58
- if not self._is_valid_page_url(url):
59
- raise ValueError(f"Invalid page URL format: {url}. Must be a full URL (e.g., http/https).")
60
-
61
- os.makedirs(save_dir, exist_ok=True)
62
-
63
- saved_paths: List[str] = []
64
- try:
65
- await self.initialize()
66
- if not self.page:
67
- logger.error("Playwright page not initialized in download_webpage_images.")
68
- raise RuntimeError("Playwright page not available for download_webpage_images.")
69
-
70
- await self.page.goto(url, wait_until="networkidle", timeout=60000)
71
-
72
- image_srcs: List[str] = await self._get_image_srcs_from_page()
73
- logger.debug(f"Found {len(image_srcs)} image sources on page {url}.")
74
-
75
- download_counter = 0
76
- for i, img_src in enumerate(image_srcs):
77
- if not img_src or img_src.startswith("data:"):
78
- logger.debug(f"Skipping image source (data URI or empty): {img_src[:50]}...")
79
- continue
80
-
81
- full_image_url = urljoin(self.page.url, img_src)
82
-
83
- if self._is_svg(full_image_url):
84
- logger.debug(f"Skipping SVG image: {full_image_url}")
85
- continue
86
-
87
- if not self._is_valid_http_url(full_image_url):
88
- logger.warning(f"Skipping invalid or non-HTTP(S) image URL: {full_image_url}")
89
- continue
90
-
91
- file_path = self._generate_file_path(save_dir, download_counter, full_image_url)
92
- try:
93
- image_response = await self.page.request.get(full_image_url)
94
- if image_response.ok:
95
- image_buffer = await image_response.body()
96
- with open(file_path, "wb") as f:
97
- f.write(image_buffer)
98
- saved_paths.append(os.path.abspath(file_path))
99
- logger.info(f"Downloaded image {download_counter + 1}: {full_image_url} to {file_path}")
100
- download_counter += 1
101
- else:
102
- logger.warning(f"Failed to download image {full_image_url}, status: {image_response.status}")
103
-
104
- except Exception as dl_exc:
105
- logger.error(f"Error downloading image {full_image_url}: {dl_exc}", exc_info=True)
106
-
107
- logger.info(f"Finished downloading images. Total saved: {len(saved_paths)}.")
108
- return saved_paths
109
-
110
- except Exception as e:
111
- logger.error(f"Error in download_webpage_images for URL '{url}': {e}", exc_info=True)
112
- raise RuntimeError(f"download_webpage_images failed for URL '{url}': {str(e)}")
113
- finally:
114
- await self.close()
115
-
116
- async def _get_image_srcs_from_page(self) -> List[str]:
117
- image_elements_data = await self.page.evaluate("""() => {
118
- const sources = new Set();
119
- document.querySelectorAll('img').forEach(img => {
120
- if (img.src && !img.src.startsWith('data:')) sources.add(img.src);
121
- if (img.srcset) {
122
- img.srcset.split(',').forEach(part => {
123
- const url = part.trim().split(' ')[0];
124
- if (url && !url.startsWith('data:')) sources.add(url);
125
- });
126
- }
127
- const dataSrc = img.getAttribute('data-src');
128
- if (dataSrc && !dataSrc.startsWith('data:')) sources.add(dataSrc);
129
- });
130
- return Array.from(sources);
131
- }""")
132
- return image_elements_data if image_elements_data else []
133
-
134
- def _is_valid_page_url(self, url_string: str) -> bool:
135
- try:
136
- result = urlparse(url_string)
137
- return all([result.scheme in ['http', 'https'], result.netloc])
138
- except ValueError:
139
- return False
140
-
141
- def _is_valid_http_url(self, url_string: str) -> bool:
142
- try:
143
- result = urlparse(url_string)
144
- return result.scheme in ['http', 'https']
145
- except ValueError:
146
- return False
147
-
148
- def _is_svg(self, url: str) -> bool:
149
- return url.lower().split('?')[0].endswith('.svg')
150
-
151
- def _generate_file_path(self, directory: str, index: int, url: str) -> str:
152
- try:
153
- parsed_url = urlparse(url)
154
- base_filename = os.path.basename(parsed_url.path)
155
- filename_stem, ext = os.path.splitext(base_filename)
156
- if not ext:
157
- ext = ".jpg"
158
-
159
- import string
160
- valid_chars_fs = "-_.() %s%s" % (string.ascii_letters, string.digits)
161
- safe_stem = ''.join(c for c in filename_stem if c in valid_chars_fs)[:50]
162
- if not safe_stem: safe_stem = f"image_{index}"
163
-
164
- final_filename = f"{safe_stem}{ext}"
165
-
166
- except Exception:
167
- final_filename = f"image_{index}.jpg"
168
-
169
- return os.path.join(directory, final_filename)
@@ -1,105 +0,0 @@
1
- """
2
- File: autobyteus/tools/browser/standalone/webpage_reader.py
3
- This module provides a read_webpage tool for reading and cleaning HTML content from webpages.
4
- """
5
-
6
- import logging
7
- from typing import Optional, TYPE_CHECKING, Any
8
- from autobyteus.tools.base_tool import BaseTool
9
- from autobyteus.tools.tool_config import ToolConfig
10
- from autobyteus.utils.parameter_schema import ParameterSchema, ParameterDefinition, ParameterType
11
- from autobyteus.tools.tool_category import ToolCategory
12
- from brui_core.ui_integrator import UIIntegrator
13
- from autobyteus.utils.html_cleaner import clean, CleaningMode
14
-
15
- if TYPE_CHECKING:
16
- from autobyteus.agent.context import AgentContext
17
-
18
- logger = logging.getLogger(__name__)
19
-
20
- class WebPageReader(BaseTool, UIIntegrator):
21
- """
22
- A class that reads and cleans the HTML content from a given webpage using Playwright.
23
- """
24
- CATEGORY = ToolCategory.WEB
25
-
26
- def __init__(self, config: Optional[ToolConfig] = None):
27
- BaseTool.__init__(self, config=config)
28
- UIIntegrator.__init__(self)
29
-
30
- cleaning_mode_to_use = CleaningMode.THOROUGH
31
- if config:
32
- cleaning_mode_value = config.get('cleaning_mode')
33
- if cleaning_mode_value:
34
- if isinstance(cleaning_mode_value, str):
35
- try:
36
- cleaning_mode_to_use = CleaningMode(cleaning_mode_value.upper())
37
- except ValueError:
38
- logger.warning(f"Invalid cleaning_mode string '{cleaning_mode_value}' in config for read_webpage. Using THOROUGH.")
39
- cleaning_mode_to_use = CleaningMode.THOROUGH
40
- elif isinstance(cleaning_mode_value, CleaningMode):
41
- cleaning_mode_to_use = cleaning_mode_value
42
- else:
43
- logger.warning(f"Invalid type for cleaning_mode in config for read_webpage. Using THOROUGH.")
44
-
45
- self.cleaning_mode = cleaning_mode_to_use
46
- logger.debug(f"read_webpage initialized with cleaning_mode: {self.cleaning_mode}")
47
-
48
- @classmethod
49
- def get_name(cls) -> str:
50
- return "read_webpage"
51
-
52
- @classmethod
53
- def get_description(cls) -> str:
54
- return "Reads and cleans the HTML content from a given webpage URL using Playwright."
55
-
56
- @classmethod
57
- def get_argument_schema(cls) -> Optional[ParameterSchema]:
58
- """Schema for arguments passed to the execute method."""
59
- schema = ParameterSchema()
60
- schema.add_parameter(ParameterDefinition(
61
- name="url",
62
- param_type=ParameterType.STRING,
63
- description="The URL of the webpage to read content from.",
64
- required=True
65
- ))
66
- return schema
67
-
68
- @classmethod
69
- def get_config_schema(cls) -> Optional[ParameterSchema]:
70
- """Schema for parameters to configure the read_webpage instance itself."""
71
- schema = ParameterSchema()
72
- schema.add_parameter(ParameterDefinition(
73
- name="cleaning_mode",
74
- param_type=ParameterType.ENUM,
75
- description="Level of HTML content cleanup for webpage content. BASIC or THOROUGH.",
76
- required=False,
77
- default_value="THOROUGH",
78
- enum_values=[mode.name for mode in CleaningMode]
79
- ))
80
- return schema
81
-
82
- async def _execute(self, context: 'AgentContext', url: str) -> str:
83
- logger.info(f"read_webpage executing for agent {context.agent_id} with URL: '{url}'")
84
-
85
- try:
86
- await self.initialize()
87
- if not self.page:
88
- logger.error("Playwright page not initialized in read_webpage.")
89
- raise RuntimeError("Playwright page not available for read_webpage.")
90
-
91
- await self.page.goto(url, timeout=60000, wait_until="domcontentloaded")
92
- page_content = await self.page.content()
93
-
94
- cleaned_content = clean(page_content, mode=self.cleaning_mode)
95
-
96
- return f'''here is the html of the web page
97
- <WebPageContentStart>
98
- {cleaned_content}
99
- </WebPageContentEnd>
100
- '''
101
- except Exception as e:
102
- logger.error(f"Error reading webpage at URL '{url}': {e}", exc_info=True)
103
- raise RuntimeError(f"read_webpage failed for URL '{url}': {str(e)}")
104
- finally:
105
- await self.close()
@@ -1,105 +0,0 @@
1
- from typing import Optional, TYPE_CHECKING, Any
2
- from autobyteus.tools.base_tool import BaseTool
3
- from autobyteus.tools.tool_config import ToolConfig
4
- from autobyteus.utils.parameter_schema import ParameterSchema, ParameterDefinition, ParameterType
5
- from autobyteus.tools.tool_category import ToolCategory
6
- from brui_core.ui_integrator import UIIntegrator
7
- import logging
8
- import os
9
-
10
- if TYPE_CHECKING:
11
- from autobyteus.agent.context import AgentContext
12
-
13
- logger = logging.getLogger(__name__)
14
-
15
- class WebPageScreenshotTaker(BaseTool, UIIntegrator):
16
- """
17
- A class that takes a screenshot of a given webpage using Playwright and saves it.
18
- """
19
- CATEGORY = ToolCategory.WEB
20
-
21
- def __init__(self, config: Optional[ToolConfig] = None):
22
- BaseTool.__init__(self, config=config)
23
- UIIntegrator.__init__(self)
24
-
25
- self.full_page: bool = True
26
- self.image_format: str = "png"
27
-
28
- if config:
29
- self.full_page = config.get('full_page', True)
30
- self.image_format = str(config.get('image_format', 'png')).lower()
31
- if self.image_format not in ["png", "jpeg"]:
32
- logger.warning(f"Invalid image_format '{self.image_format}' in config. Defaulting to 'png'.")
33
- self.image_format = "png"
34
- logger.debug(f"take_webpage_screenshot initialized. Full page: {self.full_page}, Format: {self.image_format}")
35
-
36
- @classmethod
37
- def get_name(cls) -> str:
38
- return "take_webpage_screenshot"
39
-
40
- @classmethod
41
- def get_description(cls) -> str:
42
- return "Takes a screenshot of a given webpage URL using Playwright and saves it to the specified file path. Returns the absolute path of the saved screenshot."
43
-
44
- @classmethod
45
- def get_argument_schema(cls) -> Optional[ParameterSchema]:
46
- schema = ParameterSchema()
47
- schema.add_parameter(ParameterDefinition(
48
- name="url",
49
- param_type=ParameterType.STRING,
50
- description="The URL of the webpage to take a screenshot of.",
51
- required=True
52
- ))
53
- schema.add_parameter(ParameterDefinition(
54
- name="file_path",
55
- param_type=ParameterType.STRING,
56
- description="The local file path (including filename and extension, e.g., 'screenshots/page.png') where the screenshot will be saved.",
57
- required=True
58
- ))
59
- return schema
60
-
61
- @classmethod
62
- def get_config_schema(cls) -> Optional[ParameterSchema]:
63
- schema = ParameterSchema()
64
- schema.add_parameter(ParameterDefinition(
65
- name="full_page",
66
- param_type=ParameterType.BOOLEAN,
67
- description="Whether to capture the full scrollable page content or just the visible viewport by default for this instance.",
68
- required=False,
69
- default_value=True
70
- ))
71
- schema.add_parameter(ParameterDefinition(
72
- name="image_format",
73
- param_type=ParameterType.ENUM,
74
- description="Default image format for screenshots taken by this instance (png or jpeg).",
75
- required=False,
76
- default_value="png",
77
- enum_values=["png", "jpeg"]
78
- ))
79
- return schema
80
-
81
- async def _execute(self, context: 'AgentContext', url: str, file_path: str) -> str:
82
- logger.info(f"take_webpage_screenshot for agent {context.agent_id} taking screenshot of '{url}', saving to '{file_path}'.")
83
-
84
- output_dir = os.path.dirname(file_path)
85
- if output_dir:
86
- os.makedirs(output_dir, exist_ok=True)
87
-
88
- try:
89
- await self.initialize()
90
- if not self.page:
91
- logger.error("Playwright page not initialized in take_webpage_screenshot.")
92
- raise RuntimeError("Playwright page not available for take_webpage_screenshot.")
93
-
94
- await self.page.goto(url, wait_until="networkidle", timeout=60000)
95
-
96
- await self.page.screenshot(path=file_path, full_page=self.full_page, type=self.image_format) # type: ignore
97
-
98
- absolute_file_path = os.path.abspath(file_path)
99
- logger.info(f"Screenshot saved successfully to {absolute_file_path}")
100
- return absolute_file_path
101
- except Exception as e:
102
- logger.error(f"Error taking screenshot of URL '{url}': {e}", exc_info=True)
103
- raise RuntimeError(f"take_webpage_screenshot failed for URL '{url}': {str(e)}")
104
- finally:
105
- await self.close()