autobyteus 1.2.1__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 (466) 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 +19 -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 +69 -59
  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/runtime/agent_runtime.py +29 -21
  39. autobyteus/agent/runtime/agent_worker.py +98 -19
  40. autobyteus/agent/shutdown_steps/__init__.py +2 -0
  41. autobyteus/agent/shutdown_steps/agent_shutdown_orchestrator.py +2 -0
  42. autobyteus/agent/shutdown_steps/tool_cleanup_step.py +58 -0
  43. autobyteus/agent/status/__init__.py +14 -0
  44. autobyteus/agent/status/manager.py +93 -0
  45. autobyteus/agent/status/status_deriver.py +96 -0
  46. autobyteus/agent/{phases/phase_enum.py → status/status_enum.py} +16 -16
  47. autobyteus/agent/status/status_update_utils.py +73 -0
  48. autobyteus/agent/streaming/__init__.py +52 -5
  49. autobyteus/agent/streaming/adapters/__init__.py +18 -0
  50. autobyteus/agent/streaming/adapters/invocation_adapter.py +184 -0
  51. autobyteus/agent/streaming/adapters/tool_call_parsing.py +163 -0
  52. autobyteus/agent/streaming/adapters/tool_syntax_registry.py +67 -0
  53. autobyteus/agent/streaming/agent_event_stream.py +3 -183
  54. autobyteus/agent/streaming/api_tool_call/__init__.py +16 -0
  55. autobyteus/agent/streaming/api_tool_call/file_content_streamer.py +56 -0
  56. autobyteus/agent/streaming/api_tool_call/json_string_field_extractor.py +175 -0
  57. autobyteus/agent/streaming/api_tool_call_streaming_response_handler.py +4 -0
  58. autobyteus/agent/streaming/events/__init__.py +6 -0
  59. autobyteus/agent/streaming/events/stream_event_payloads.py +284 -0
  60. autobyteus/agent/streaming/events/stream_events.py +141 -0
  61. autobyteus/agent/streaming/handlers/__init__.py +15 -0
  62. autobyteus/agent/streaming/handlers/api_tool_call_streaming_response_handler.py +303 -0
  63. autobyteus/agent/streaming/handlers/parsing_streaming_response_handler.py +107 -0
  64. autobyteus/agent/streaming/handlers/pass_through_streaming_response_handler.py +107 -0
  65. autobyteus/agent/streaming/handlers/streaming_handler_factory.py +177 -0
  66. autobyteus/agent/streaming/handlers/streaming_response_handler.py +58 -0
  67. autobyteus/agent/streaming/parser/__init__.py +61 -0
  68. autobyteus/agent/streaming/parser/event_emitter.py +181 -0
  69. autobyteus/agent/streaming/parser/events.py +4 -0
  70. autobyteus/agent/streaming/parser/invocation_adapter.py +4 -0
  71. autobyteus/agent/streaming/parser/json_parsing_strategies/__init__.py +19 -0
  72. autobyteus/agent/streaming/parser/json_parsing_strategies/base.py +32 -0
  73. autobyteus/agent/streaming/parser/json_parsing_strategies/default.py +34 -0
  74. autobyteus/agent/streaming/parser/json_parsing_strategies/gemini.py +31 -0
  75. autobyteus/agent/streaming/parser/json_parsing_strategies/openai.py +64 -0
  76. autobyteus/agent/streaming/parser/json_parsing_strategies/registry.py +75 -0
  77. autobyteus/agent/streaming/parser/parser_context.py +227 -0
  78. autobyteus/agent/streaming/parser/parser_factory.py +132 -0
  79. autobyteus/agent/streaming/parser/sentinel_format.py +7 -0
  80. autobyteus/agent/streaming/parser/state_factory.py +62 -0
  81. autobyteus/agent/streaming/parser/states/__init__.py +1 -0
  82. autobyteus/agent/streaming/parser/states/base_state.py +60 -0
  83. autobyteus/agent/streaming/parser/states/custom_xml_tag_run_bash_parsing_state.py +38 -0
  84. autobyteus/agent/streaming/parser/states/custom_xml_tag_write_file_parsing_state.py +55 -0
  85. autobyteus/agent/streaming/parser/states/delimited_content_state.py +146 -0
  86. autobyteus/agent/streaming/parser/states/json_initialization_state.py +144 -0
  87. autobyteus/agent/streaming/parser/states/json_tool_parsing_state.py +137 -0
  88. autobyteus/agent/streaming/parser/states/sentinel_content_state.py +30 -0
  89. autobyteus/agent/streaming/parser/states/sentinel_initialization_state.py +117 -0
  90. autobyteus/agent/streaming/parser/states/text_state.py +78 -0
  91. autobyteus/agent/streaming/parser/states/xml_patch_file_tool_parsing_state.py +328 -0
  92. autobyteus/agent/streaming/parser/states/xml_run_bash_tool_parsing_state.py +129 -0
  93. autobyteus/agent/streaming/parser/states/xml_tag_initialization_state.py +151 -0
  94. autobyteus/agent/streaming/parser/states/xml_tool_parsing_state.py +63 -0
  95. autobyteus/agent/streaming/parser/states/xml_write_file_tool_parsing_state.py +343 -0
  96. autobyteus/agent/streaming/parser/strategies/__init__.py +17 -0
  97. autobyteus/agent/streaming/parser/strategies/base.py +24 -0
  98. autobyteus/agent/streaming/parser/strategies/json_tool_strategy.py +26 -0
  99. autobyteus/agent/streaming/parser/strategies/registry.py +28 -0
  100. autobyteus/agent/streaming/parser/strategies/sentinel_strategy.py +23 -0
  101. autobyteus/agent/streaming/parser/strategies/xml_tag_strategy.py +21 -0
  102. autobyteus/agent/streaming/parser/stream_scanner.py +167 -0
  103. autobyteus/agent/streaming/parser/streaming_parser.py +212 -0
  104. autobyteus/agent/streaming/parser/tool_call_parsing.py +4 -0
  105. autobyteus/agent/streaming/parser/tool_constants.py +7 -0
  106. autobyteus/agent/streaming/parser/tool_syntax_registry.py +4 -0
  107. autobyteus/agent/streaming/parser/xml_tool_parsing_state_registry.py +55 -0
  108. autobyteus/agent/streaming/parsing_streaming_response_handler.py +4 -0
  109. autobyteus/agent/streaming/pass_through_streaming_response_handler.py +4 -0
  110. autobyteus/agent/streaming/queue_streamer.py +3 -57
  111. autobyteus/agent/streaming/segments/__init__.py +5 -0
  112. autobyteus/agent/streaming/segments/segment_events.py +81 -0
  113. autobyteus/agent/streaming/stream_event_payloads.py +2 -223
  114. autobyteus/agent/streaming/stream_events.py +3 -140
  115. autobyteus/agent/streaming/streaming_handler_factory.py +4 -0
  116. autobyteus/agent/streaming/streaming_response_handler.py +4 -0
  117. autobyteus/agent/streaming/streams/__init__.py +5 -0
  118. autobyteus/agent/streaming/streams/agent_event_stream.py +197 -0
  119. autobyteus/agent/streaming/utils/__init__.py +5 -0
  120. autobyteus/agent/streaming/utils/queue_streamer.py +59 -0
  121. autobyteus/agent/system_prompt_processor/__init__.py +2 -0
  122. autobyteus/agent/system_prompt_processor/available_skills_processor.py +96 -0
  123. autobyteus/agent/system_prompt_processor/base_processor.py +1 -1
  124. autobyteus/agent/system_prompt_processor/processor_meta.py +15 -2
  125. autobyteus/agent/system_prompt_processor/tool_manifest_injector_processor.py +39 -58
  126. autobyteus/agent/token_budget.py +56 -0
  127. autobyteus/agent/tool_execution_result_processor/memory_ingest_tool_result_processor.py +29 -0
  128. autobyteus/agent/tool_invocation.py +16 -40
  129. autobyteus/agent/tool_invocation_preprocessor/__init__.py +9 -0
  130. autobyteus/agent/tool_invocation_preprocessor/base_preprocessor.py +45 -0
  131. autobyteus/agent/tool_invocation_preprocessor/processor_definition.py +15 -0
  132. autobyteus/agent/tool_invocation_preprocessor/processor_meta.py +33 -0
  133. autobyteus/agent/tool_invocation_preprocessor/processor_registry.py +60 -0
  134. autobyteus/agent/utils/wait_for_idle.py +12 -14
  135. autobyteus/agent/workspace/base_workspace.py +6 -27
  136. autobyteus/agent_team/agent_team.py +3 -3
  137. autobyteus/agent_team/agent_team_builder.py +1 -41
  138. autobyteus/agent_team/bootstrap_steps/__init__.py +0 -4
  139. autobyteus/agent_team/bootstrap_steps/agent_configuration_preparation_step.py +8 -18
  140. autobyteus/agent_team/bootstrap_steps/agent_team_bootstrapper.py +4 -16
  141. autobyteus/agent_team/bootstrap_steps/base_agent_team_bootstrap_step.py +1 -2
  142. autobyteus/agent_team/bootstrap_steps/coordinator_initialization_step.py +1 -2
  143. autobyteus/agent_team/bootstrap_steps/task_notifier_initialization_step.py +1 -2
  144. autobyteus/agent_team/bootstrap_steps/team_context_initialization_step.py +4 -4
  145. autobyteus/agent_team/context/agent_team_config.py +6 -3
  146. autobyteus/agent_team/context/agent_team_context.py +25 -3
  147. autobyteus/agent_team/context/agent_team_runtime_state.py +9 -6
  148. autobyteus/agent_team/events/__init__.py +11 -0
  149. autobyteus/agent_team/events/agent_team_event_dispatcher.py +22 -9
  150. autobyteus/agent_team/events/agent_team_events.py +16 -0
  151. autobyteus/agent_team/events/event_store.py +57 -0
  152. autobyteus/agent_team/factory/agent_team_factory.py +8 -0
  153. autobyteus/agent_team/handlers/inter_agent_message_request_event_handler.py +18 -2
  154. autobyteus/agent_team/handlers/lifecycle_agent_team_event_handler.py +21 -5
  155. autobyteus/agent_team/handlers/process_user_message_event_handler.py +17 -8
  156. autobyteus/agent_team/handlers/tool_approval_team_event_handler.py +19 -4
  157. autobyteus/agent_team/runtime/agent_team_runtime.py +41 -10
  158. autobyteus/agent_team/runtime/agent_team_worker.py +69 -5
  159. autobyteus/agent_team/status/__init__.py +14 -0
  160. autobyteus/agent_team/status/agent_team_status.py +18 -0
  161. autobyteus/agent_team/status/agent_team_status_manager.py +33 -0
  162. autobyteus/agent_team/status/status_deriver.py +62 -0
  163. autobyteus/agent_team/status/status_update_utils.py +42 -0
  164. autobyteus/agent_team/streaming/__init__.py +2 -2
  165. autobyteus/agent_team/streaming/agent_team_event_notifier.py +6 -6
  166. autobyteus/agent_team/streaming/agent_team_stream_event_payloads.py +4 -4
  167. autobyteus/agent_team/streaming/agent_team_stream_events.py +3 -3
  168. autobyteus/agent_team/system_prompt_processor/__init__.py +6 -0
  169. autobyteus/agent_team/system_prompt_processor/team_manifest_injector_processor.py +76 -0
  170. autobyteus/agent_team/task_notification/task_notification_mode.py +19 -0
  171. autobyteus/agent_team/utils/wait_for_idle.py +4 -4
  172. autobyteus/cli/agent_cli.py +18 -10
  173. autobyteus/cli/agent_team_tui/app.py +14 -11
  174. autobyteus/cli/agent_team_tui/state.py +13 -15
  175. autobyteus/cli/agent_team_tui/widgets/agent_list_sidebar.py +15 -15
  176. autobyteus/cli/agent_team_tui/widgets/focus_pane.py +143 -36
  177. autobyteus/cli/agent_team_tui/widgets/renderables.py +1 -1
  178. autobyteus/cli/agent_team_tui/widgets/shared.py +25 -25
  179. autobyteus/cli/cli_display.py +193 -44
  180. autobyteus/cli/workflow_tui/app.py +9 -10
  181. autobyteus/cli/workflow_tui/state.py +14 -16
  182. autobyteus/cli/workflow_tui/widgets/agent_list_sidebar.py +15 -15
  183. autobyteus/cli/workflow_tui/widgets/focus_pane.py +137 -35
  184. autobyteus/cli/workflow_tui/widgets/renderables.py +1 -1
  185. autobyteus/cli/workflow_tui/widgets/shared.py +25 -25
  186. autobyteus/clients/autobyteus_client.py +94 -1
  187. autobyteus/events/event_types.py +11 -18
  188. autobyteus/llm/api/autobyteus_llm.py +33 -29
  189. autobyteus/llm/api/claude_llm.py +142 -36
  190. autobyteus/llm/api/gemini_llm.py +163 -59
  191. autobyteus/llm/api/grok_llm.py +1 -1
  192. autobyteus/llm/api/minimax_llm.py +26 -0
  193. autobyteus/llm/api/mistral_llm.py +113 -87
  194. autobyteus/llm/api/ollama_llm.py +9 -42
  195. autobyteus/llm/api/openai_compatible_llm.py +127 -91
  196. autobyteus/llm/api/openai_llm.py +3 -3
  197. autobyteus/llm/api/openai_responses_llm.py +324 -0
  198. autobyteus/llm/api/zhipu_llm.py +21 -2
  199. autobyteus/llm/autobyteus_provider.py +70 -60
  200. autobyteus/llm/base_llm.py +85 -81
  201. autobyteus/llm/converters/__init__.py +14 -0
  202. autobyteus/llm/converters/anthropic_tool_call_converter.py +37 -0
  203. autobyteus/llm/converters/gemini_tool_call_converter.py +57 -0
  204. autobyteus/llm/converters/mistral_tool_call_converter.py +37 -0
  205. autobyteus/llm/converters/openai_tool_call_converter.py +38 -0
  206. autobyteus/llm/extensions/base_extension.py +6 -12
  207. autobyteus/llm/extensions/token_usage_tracking_extension.py +45 -18
  208. autobyteus/llm/llm_factory.py +282 -204
  209. autobyteus/llm/lmstudio_provider.py +60 -49
  210. autobyteus/llm/models.py +35 -2
  211. autobyteus/llm/ollama_provider.py +60 -49
  212. autobyteus/llm/ollama_provider_resolver.py +0 -1
  213. autobyteus/llm/prompt_renderers/__init__.py +19 -0
  214. autobyteus/llm/prompt_renderers/anthropic_prompt_renderer.py +104 -0
  215. autobyteus/llm/prompt_renderers/autobyteus_prompt_renderer.py +19 -0
  216. autobyteus/llm/prompt_renderers/base_prompt_renderer.py +10 -0
  217. autobyteus/llm/prompt_renderers/gemini_prompt_renderer.py +63 -0
  218. autobyteus/llm/prompt_renderers/mistral_prompt_renderer.py +87 -0
  219. autobyteus/llm/prompt_renderers/ollama_prompt_renderer.py +51 -0
  220. autobyteus/llm/prompt_renderers/openai_chat_renderer.py +97 -0
  221. autobyteus/llm/prompt_renderers/openai_responses_renderer.py +101 -0
  222. autobyteus/llm/providers.py +1 -3
  223. autobyteus/llm/token_counter/claude_token_counter.py +56 -25
  224. autobyteus/llm/token_counter/mistral_token_counter.py +12 -8
  225. autobyteus/llm/token_counter/openai_token_counter.py +24 -5
  226. autobyteus/llm/token_counter/token_counter_factory.py +12 -5
  227. autobyteus/llm/utils/llm_config.py +6 -12
  228. autobyteus/llm/utils/media_payload_formatter.py +27 -20
  229. autobyteus/llm/utils/messages.py +55 -3
  230. autobyteus/llm/utils/response_types.py +3 -0
  231. autobyteus/llm/utils/tool_call_delta.py +31 -0
  232. autobyteus/memory/__init__.py +32 -0
  233. autobyteus/memory/active_transcript.py +69 -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 +183 -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/policies/__init__.py +5 -0
  247. autobyteus/memory/policies/compaction_policy.py +16 -0
  248. autobyteus/memory/retrieval/__init__.py +7 -0
  249. autobyteus/memory/retrieval/memory_bundle.py +11 -0
  250. autobyteus/memory/retrieval/retriever.py +13 -0
  251. autobyteus/memory/store/__init__.py +7 -0
  252. autobyteus/memory/store/base_store.py +14 -0
  253. autobyteus/memory/store/file_store.py +98 -0
  254. autobyteus/memory/tool_interaction_builder.py +46 -0
  255. autobyteus/memory/turn_tracker.py +9 -0
  256. autobyteus/multimedia/audio/api/autobyteus_audio_client.py +19 -5
  257. autobyteus/multimedia/audio/api/gemini_audio_client.py +108 -16
  258. autobyteus/multimedia/audio/audio_client_factory.py +47 -9
  259. autobyteus/multimedia/audio/audio_model.py +2 -1
  260. autobyteus/multimedia/image/api/autobyteus_image_client.py +19 -5
  261. autobyteus/multimedia/image/api/gemini_image_client.py +38 -17
  262. autobyteus/multimedia/image/api/openai_image_client.py +125 -43
  263. autobyteus/multimedia/image/autobyteus_image_provider.py +2 -1
  264. autobyteus/multimedia/image/image_client_factory.py +47 -15
  265. autobyteus/multimedia/image/image_model.py +5 -2
  266. autobyteus/multimedia/providers.py +3 -2
  267. autobyteus/skills/loader.py +71 -0
  268. autobyteus/skills/model.py +11 -0
  269. autobyteus/skills/registry.py +70 -0
  270. autobyteus/task_management/tools/todo_tools/add_todo.py +2 -2
  271. autobyteus/task_management/tools/todo_tools/create_todo_list.py +2 -2
  272. autobyteus/task_management/tools/todo_tools/update_todo_status.py +2 -2
  273. autobyteus/tools/__init__.py +34 -47
  274. autobyteus/tools/base_tool.py +7 -0
  275. autobyteus/tools/file/__init__.py +2 -6
  276. autobyteus/tools/file/patch_file.py +149 -0
  277. autobyteus/tools/file/read_file.py +36 -5
  278. autobyteus/tools/file/write_file.py +4 -1
  279. autobyteus/tools/functional_tool.py +43 -6
  280. autobyteus/tools/mcp/__init__.py +2 -0
  281. autobyteus/tools/mcp/config_service.py +5 -1
  282. autobyteus/tools/mcp/server/__init__.py +2 -0
  283. autobyteus/tools/mcp/server/http_managed_mcp_server.py +1 -1
  284. autobyteus/tools/mcp/server/websocket_managed_mcp_server.py +141 -0
  285. autobyteus/tools/mcp/server_instance_manager.py +8 -1
  286. autobyteus/tools/mcp/types.py +61 -0
  287. autobyteus/tools/multimedia/audio_tools.py +70 -17
  288. autobyteus/tools/multimedia/download_media_tool.py +18 -4
  289. autobyteus/tools/multimedia/image_tools.py +246 -62
  290. autobyteus/tools/operation_executor/journal_manager.py +107 -0
  291. autobyteus/tools/operation_executor/operation_event_buffer.py +57 -0
  292. autobyteus/tools/operation_executor/operation_event_producer.py +29 -0
  293. autobyteus/tools/operation_executor/operation_executor.py +58 -0
  294. autobyteus/tools/registry/tool_definition.py +43 -2
  295. autobyteus/tools/skill/load_skill.py +50 -0
  296. autobyteus/tools/terminal/__init__.py +45 -0
  297. autobyteus/tools/terminal/ansi_utils.py +32 -0
  298. autobyteus/tools/terminal/background_process_manager.py +233 -0
  299. autobyteus/tools/terminal/output_buffer.py +105 -0
  300. autobyteus/tools/terminal/prompt_detector.py +63 -0
  301. autobyteus/tools/terminal/pty_session.py +241 -0
  302. autobyteus/tools/terminal/session_factory.py +20 -0
  303. autobyteus/tools/terminal/terminal_session_manager.py +226 -0
  304. autobyteus/tools/terminal/tools/__init__.py +13 -0
  305. autobyteus/tools/terminal/tools/get_process_output.py +81 -0
  306. autobyteus/tools/terminal/tools/run_bash.py +109 -0
  307. autobyteus/tools/terminal/tools/start_background_process.py +104 -0
  308. autobyteus/tools/terminal/tools/stop_background_process.py +67 -0
  309. autobyteus/tools/terminal/types.py +54 -0
  310. autobyteus/tools/terminal/wsl_tmux_session.py +221 -0
  311. autobyteus/tools/terminal/wsl_utils.py +156 -0
  312. autobyteus/tools/transaction_management/backup_handler.py +48 -0
  313. autobyteus/tools/transaction_management/operation_lifecycle_manager.py +62 -0
  314. autobyteus/tools/usage/__init__.py +1 -2
  315. autobyteus/tools/usage/formatters/__init__.py +17 -1
  316. autobyteus/tools/usage/formatters/base_formatter.py +8 -0
  317. autobyteus/tools/usage/formatters/default_xml_schema_formatter.py +2 -2
  318. autobyteus/tools/usage/formatters/mistral_json_schema_formatter.py +18 -0
  319. autobyteus/tools/usage/formatters/patch_file_xml_example_formatter.py +64 -0
  320. autobyteus/tools/usage/formatters/patch_file_xml_schema_formatter.py +31 -0
  321. autobyteus/tools/usage/formatters/run_bash_xml_example_formatter.py +32 -0
  322. autobyteus/tools/usage/formatters/run_bash_xml_schema_formatter.py +36 -0
  323. autobyteus/tools/usage/formatters/write_file_xml_example_formatter.py +53 -0
  324. autobyteus/tools/usage/formatters/write_file_xml_schema_formatter.py +31 -0
  325. autobyteus/tools/usage/providers/tool_manifest_provider.py +10 -10
  326. autobyteus/tools/usage/registries/__init__.py +1 -3
  327. autobyteus/tools/usage/registries/tool_formatting_registry.py +115 -8
  328. autobyteus/tools/usage/tool_schema_provider.py +51 -0
  329. autobyteus/tools/web/__init__.py +4 -0
  330. autobyteus/tools/web/read_url_tool.py +80 -0
  331. autobyteus/utils/diff_utils.py +271 -0
  332. autobyteus/utils/download_utils.py +109 -0
  333. autobyteus/utils/file_utils.py +57 -2
  334. autobyteus/utils/gemini_helper.py +56 -0
  335. autobyteus/utils/gemini_model_mapping.py +71 -0
  336. autobyteus/utils/llm_output_formatter.py +75 -0
  337. autobyteus/utils/tool_call_format.py +36 -0
  338. autobyteus/workflow/agentic_workflow.py +3 -3
  339. autobyteus/workflow/bootstrap_steps/agent_tool_injection_step.py +2 -2
  340. autobyteus/workflow/bootstrap_steps/base_workflow_bootstrap_step.py +2 -2
  341. autobyteus/workflow/bootstrap_steps/coordinator_initialization_step.py +2 -2
  342. autobyteus/workflow/bootstrap_steps/coordinator_prompt_preparation_step.py +3 -9
  343. autobyteus/workflow/bootstrap_steps/workflow_bootstrapper.py +6 -6
  344. autobyteus/workflow/bootstrap_steps/workflow_runtime_queue_initialization_step.py +2 -2
  345. autobyteus/workflow/context/workflow_context.py +3 -3
  346. autobyteus/workflow/context/workflow_runtime_state.py +5 -5
  347. autobyteus/workflow/events/workflow_event_dispatcher.py +5 -5
  348. autobyteus/workflow/handlers/lifecycle_workflow_event_handler.py +3 -3
  349. autobyteus/workflow/handlers/process_user_message_event_handler.py +5 -5
  350. autobyteus/workflow/handlers/tool_approval_workflow_event_handler.py +2 -2
  351. autobyteus/workflow/runtime/workflow_runtime.py +8 -8
  352. autobyteus/workflow/runtime/workflow_worker.py +3 -3
  353. autobyteus/workflow/status/__init__.py +11 -0
  354. autobyteus/workflow/status/workflow_status.py +19 -0
  355. autobyteus/workflow/status/workflow_status_manager.py +48 -0
  356. autobyteus/workflow/streaming/__init__.py +2 -2
  357. autobyteus/workflow/streaming/workflow_event_notifier.py +7 -7
  358. autobyteus/workflow/streaming/workflow_stream_event_payloads.py +4 -4
  359. autobyteus/workflow/streaming/workflow_stream_events.py +3 -3
  360. autobyteus/workflow/utils/wait_for_idle.py +4 -4
  361. autobyteus-1.2.3.dist-info/METADATA +293 -0
  362. autobyteus-1.2.3.dist-info/RECORD +600 -0
  363. {autobyteus-1.2.1.dist-info → autobyteus-1.2.3.dist-info}/WHEEL +1 -1
  364. {autobyteus-1.2.1.dist-info → autobyteus-1.2.3.dist-info}/top_level.txt +0 -1
  365. autobyteus/agent/bootstrap_steps/agent_runtime_queue_initialization_step.py +0 -57
  366. autobyteus/agent/hooks/__init__.py +0 -16
  367. autobyteus/agent/hooks/base_phase_hook.py +0 -78
  368. autobyteus/agent/hooks/hook_definition.py +0 -36
  369. autobyteus/agent/hooks/hook_meta.py +0 -37
  370. autobyteus/agent/hooks/hook_registry.py +0 -106
  371. autobyteus/agent/llm_response_processor/provider_aware_tool_usage_processor.py +0 -103
  372. autobyteus/agent/phases/__init__.py +0 -18
  373. autobyteus/agent/phases/discover.py +0 -53
  374. autobyteus/agent/phases/manager.py +0 -265
  375. autobyteus/agent/phases/transition_decorator.py +0 -40
  376. autobyteus/agent/phases/transition_info.py +0 -33
  377. autobyteus/agent/remote_agent.py +0 -244
  378. autobyteus/agent/workspace/workspace_definition.py +0 -36
  379. autobyteus/agent/workspace/workspace_meta.py +0 -37
  380. autobyteus/agent/workspace/workspace_registry.py +0 -72
  381. autobyteus/agent_team/bootstrap_steps/agent_team_runtime_queue_initialization_step.py +0 -25
  382. autobyteus/agent_team/bootstrap_steps/coordinator_prompt_preparation_step.py +0 -85
  383. autobyteus/agent_team/phases/__init__.py +0 -11
  384. autobyteus/agent_team/phases/agent_team_operational_phase.py +0 -19
  385. autobyteus/agent_team/phases/agent_team_phase_manager.py +0 -48
  386. autobyteus/llm/api/bedrock_llm.py +0 -92
  387. autobyteus/llm/api/groq_llm.py +0 -94
  388. autobyteus/llm/api/nvidia_llm.py +0 -108
  389. autobyteus/llm/utils/token_pricing_config.py +0 -87
  390. autobyteus/rpc/__init__.py +0 -73
  391. autobyteus/rpc/client/__init__.py +0 -17
  392. autobyteus/rpc/client/abstract_client_connection.py +0 -124
  393. autobyteus/rpc/client/client_connection_manager.py +0 -153
  394. autobyteus/rpc/client/sse_client_connection.py +0 -306
  395. autobyteus/rpc/client/stdio_client_connection.py +0 -280
  396. autobyteus/rpc/config/__init__.py +0 -13
  397. autobyteus/rpc/config/agent_server_config.py +0 -153
  398. autobyteus/rpc/config/agent_server_registry.py +0 -152
  399. autobyteus/rpc/hosting.py +0 -244
  400. autobyteus/rpc/protocol.py +0 -244
  401. autobyteus/rpc/server/__init__.py +0 -20
  402. autobyteus/rpc/server/agent_server_endpoint.py +0 -181
  403. autobyteus/rpc/server/base_method_handler.py +0 -40
  404. autobyteus/rpc/server/method_handlers.py +0 -259
  405. autobyteus/rpc/server/sse_server_handler.py +0 -182
  406. autobyteus/rpc/server/stdio_server_handler.py +0 -151
  407. autobyteus/rpc/server_main.py +0 -198
  408. autobyteus/rpc/transport_type.py +0 -13
  409. autobyteus/tools/bash/__init__.py +0 -2
  410. autobyteus/tools/bash/bash_executor.py +0 -100
  411. autobyteus/tools/browser/__init__.py +0 -2
  412. autobyteus/tools/browser/session_aware/browser_session_aware_navigate_to.py +0 -75
  413. autobyteus/tools/browser/session_aware/browser_session_aware_tool.py +0 -30
  414. autobyteus/tools/browser/session_aware/browser_session_aware_web_element_trigger.py +0 -154
  415. autobyteus/tools/browser/session_aware/browser_session_aware_webpage_reader.py +0 -89
  416. autobyteus/tools/browser/session_aware/browser_session_aware_webpage_screenshot_taker.py +0 -107
  417. autobyteus/tools/browser/session_aware/factory/browser_session_aware_web_element_trigger_factory.py +0 -14
  418. autobyteus/tools/browser/session_aware/factory/browser_session_aware_webpage_reader_factory.py +0 -26
  419. autobyteus/tools/browser/session_aware/factory/browser_session_aware_webpage_screenshot_taker_factory.py +0 -14
  420. autobyteus/tools/browser/session_aware/shared_browser_session.py +0 -11
  421. autobyteus/tools/browser/session_aware/shared_browser_session_manager.py +0 -25
  422. autobyteus/tools/browser/session_aware/web_element_action.py +0 -20
  423. autobyteus/tools/browser/standalone/__init__.py +0 -6
  424. autobyteus/tools/browser/standalone/factory/__init__.py +0 -0
  425. autobyteus/tools/browser/standalone/factory/webpage_reader_factory.py +0 -25
  426. autobyteus/tools/browser/standalone/factory/webpage_screenshot_taker_factory.py +0 -14
  427. autobyteus/tools/browser/standalone/navigate_to.py +0 -84
  428. autobyteus/tools/browser/standalone/web_page_pdf_generator.py +0 -101
  429. autobyteus/tools/browser/standalone/webpage_image_downloader.py +0 -169
  430. autobyteus/tools/browser/standalone/webpage_reader.py +0 -105
  431. autobyteus/tools/browser/standalone/webpage_screenshot_taker.py +0 -105
  432. autobyteus/tools/file/edit_file.py +0 -200
  433. autobyteus/tools/file/list_directory.py +0 -168
  434. autobyteus/tools/file/search_files.py +0 -188
  435. autobyteus/tools/timer.py +0 -175
  436. autobyteus/tools/usage/parsers/__init__.py +0 -22
  437. autobyteus/tools/usage/parsers/_json_extractor.py +0 -99
  438. autobyteus/tools/usage/parsers/_string_decoders.py +0 -18
  439. autobyteus/tools/usage/parsers/anthropic_xml_tool_usage_parser.py +0 -10
  440. autobyteus/tools/usage/parsers/base_parser.py +0 -41
  441. autobyteus/tools/usage/parsers/default_json_tool_usage_parser.py +0 -83
  442. autobyteus/tools/usage/parsers/default_xml_tool_usage_parser.py +0 -316
  443. autobyteus/tools/usage/parsers/exceptions.py +0 -13
  444. autobyteus/tools/usage/parsers/gemini_json_tool_usage_parser.py +0 -77
  445. autobyteus/tools/usage/parsers/openai_json_tool_usage_parser.py +0 -149
  446. autobyteus/tools/usage/parsers/provider_aware_tool_usage_parser.py +0 -59
  447. autobyteus/tools/usage/registries/tool_usage_parser_registry.py +0 -62
  448. autobyteus/workflow/phases/__init__.py +0 -11
  449. autobyteus/workflow/phases/workflow_operational_phase.py +0 -19
  450. autobyteus/workflow/phases/workflow_phase_manager.py +0 -48
  451. autobyteus-1.2.1.dist-info/METADATA +0 -205
  452. autobyteus-1.2.1.dist-info/RECORD +0 -511
  453. examples/__init__.py +0 -1
  454. examples/agent_team/__init__.py +0 -1
  455. examples/discover_phase_transitions.py +0 -104
  456. examples/run_agentic_software_engineer.py +0 -239
  457. examples/run_browser_agent.py +0 -262
  458. examples/run_google_slides_agent.py +0 -287
  459. examples/run_mcp_browser_client.py +0 -174
  460. examples/run_mcp_google_slides_client.py +0 -270
  461. examples/run_mcp_list_tools.py +0 -189
  462. examples/run_poem_writer.py +0 -284
  463. examples/run_sqlite_agent.py +0 -295
  464. /autobyteus/{tools/browser/session_aware → skills}/__init__.py +0 -0
  465. /autobyteus/tools/{browser/session_aware/factory → skill}/__init__.py +0 -0
  466. {autobyteus-1.2.1.dist-info → autobyteus-1.2.3.dist-info}/licenses/LICENSE +0 -0
@@ -1,75 +0,0 @@
1
- from autobyteus.tools.browser.session_aware.browser_session_aware_tool import BrowserSessionAwareTool
2
- from autobyteus.tools.browser.session_aware.shared_browser_session import SharedBrowserSession
3
- from autobyteus.tools.tool_config import ToolConfig
4
- from autobyteus.tools.tool_category import ToolCategory
5
- from urllib.parse import urlparse
6
- from typing import Optional, TYPE_CHECKING, Any
7
- import logging
8
-
9
- from autobyteus.utils.parameter_schema import ParameterSchema, ParameterDefinition, ParameterType
10
-
11
- if TYPE_CHECKING:
12
- from autobyteus.agent.context import AgentContext
13
-
14
- logger = logging.getLogger(__name__)
15
-
16
- class BrowserSessionAwareNavigateTo(BrowserSessionAwareTool):
17
- """
18
- A session-aware tool for navigating to a specified website using a shared browser session.
19
- """
20
- CATEGORY = ToolCategory.WEB
21
-
22
- def __init__(self, config: Optional[ToolConfig] = None):
23
- super().__init__(config=config)
24
- logger.debug("navigate_to tool (session-aware) initialized.")
25
-
26
- @classmethod
27
- def get_name(cls) -> str:
28
- return "navigate_to"
29
-
30
- @classmethod
31
- def get_description(cls) -> str:
32
- return ("Navigates the shared browser session to a specified URL. "
33
- "Returns a success or failure message based on navigation status.")
34
-
35
- @classmethod
36
- def get_argument_schema(cls) -> Optional[ParameterSchema]:
37
- schema = ParameterSchema()
38
- schema.add_parameter(ParameterDefinition(
39
- name="webpage_url",
40
- param_type=ParameterType.STRING,
41
- description="The fully qualified URL of the website to navigate to (e.g., 'https://example.com').",
42
- required=True
43
- ))
44
- return schema
45
-
46
- async def perform_action(self, shared_session: SharedBrowserSession, webpage_url: str) -> str:
47
- logger.info(f"navigate_to (session-aware) performing action for URL: {webpage_url}")
48
-
49
- if not self._is_valid_url(webpage_url):
50
- raise ValueError(f"Invalid URL format: {webpage_url}. Must include scheme and netloc.")
51
-
52
- try:
53
- response = await shared_session.page.goto(webpage_url, wait_until="networkidle", timeout=60000)
54
-
55
- if response and response.ok:
56
- success_msg = f"The navigate_to command to {webpage_url} is executed successfully."
57
- logger.info(success_msg)
58
- return success_msg
59
- else:
60
- status = response.status if response else "Unknown"
61
- failure_msg = f"The navigate_to command to {webpage_url} failed with status {status}."
62
- logger.warning(failure_msg)
63
- return failure_msg
64
- except Exception as e:
65
- logger.error(f"Error during shared session navigation to '{webpage_url}': {e}", exc_info=True)
66
- return f"Error navigating to {webpage_url}: {str(e)}"
67
-
68
-
69
- @staticmethod
70
- def _is_valid_url(url_string: str) -> bool:
71
- try:
72
- result = urlparse(url_string)
73
- return all([result.scheme, result.netloc])
74
- except ValueError:
75
- return False
@@ -1,30 +0,0 @@
1
- # File: autobyteus/tools/browser/session_aware/browser_session_aware_tool.py
2
-
3
- from autobyteus.tools.base_tool import BaseTool
4
- from autobyteus.tools.tool_config import ToolConfig
5
- from autobyteus.tools.browser.session_aware.shared_browser_session_manager import SharedBrowserSessionManager
6
- from autobyteus.events.event_types import EventType
7
- from typing import Optional
8
-
9
- class BrowserSessionAwareTool(BaseTool):
10
- def __init__(self, config: Optional[ToolConfig] = None):
11
- super().__init__(config=config)
12
- self.shared_browser_session_manager = SharedBrowserSessionManager()
13
-
14
- async def _execute(self, **kwargs):
15
- shared_session = self.shared_browser_session_manager.get_shared_browser_session()
16
-
17
- if not shared_session:
18
- webpage_url = kwargs.get('webpage_url')
19
- if not webpage_url:
20
- raise ValueError("The 'webpage_url' keyword argument must be specified when creating a new shared session.")
21
-
22
- await self.shared_browser_session_manager.create_shared_browser_session()
23
- shared_session = self.shared_browser_session_manager.get_shared_browser_session()
24
- await shared_session.page.goto(webpage_url)
25
- self.emit(EventType.SHARED_BROWSER_SESSION_CREATED, shared_session=shared_session)
26
-
27
- return await self.perform_action(shared_session, **kwargs)
28
-
29
- async def perform_action(self, shared_session, **kwargs):
30
- raise NotImplementedError("Subclasses must implement this method")
@@ -1,154 +0,0 @@
1
- # File: autobyteus/tools/browser/session_aware/browser_session_aware_web_element_trigger.py
2
-
3
- import xml.etree.ElementTree as ET
4
- from typing import Optional, TYPE_CHECKING, Dict, Any
5
- import logging
6
-
7
- from autobyteus.tools.browser.session_aware.browser_session_aware_tool import BrowserSessionAwareTool
8
- from autobyteus.tools.browser.session_aware.shared_browser_session import SharedBrowserSession
9
- from autobyteus.tools.browser.session_aware.web_element_action import WebElementAction
10
- from autobyteus.utils.parameter_schema import ParameterSchema, ParameterDefinition, ParameterType
11
- from autobyteus.tools.tool_config import ToolConfig
12
- from autobyteus.tools.tool_category import ToolCategory
13
-
14
- if TYPE_CHECKING:
15
- pass
16
-
17
- logger = logging.getLogger(__name__)
18
-
19
- class BrowserSessionAwareWebElementTrigger(BrowserSessionAwareTool):
20
- """
21
- A session-aware tool to trigger actions on web elements identified by a CSS selector.
22
- """
23
- CATEGORY = ToolCategory.WEB
24
-
25
- def __init__(self, config: Optional[ToolConfig] = None):
26
- super().__init__(config=config)
27
- logger.debug("trigger_web_element (session-aware) tool initialized.")
28
-
29
- @classmethod
30
- def get_name(cls) -> str:
31
- return "trigger_web_element"
32
-
33
- @classmethod
34
- def get_description(cls) -> str:
35
- action_names = ', '.join(str(action) for action in WebElementAction)
36
- return (f"Triggers actions on web elements on the current page in a shared browser session. "
37
- f"Supported actions: {action_names}. "
38
- f"Returns a confirmation message upon successful execution.")
39
-
40
- @classmethod
41
- def get_argument_schema(cls) -> Optional[ParameterSchema]:
42
- schema = ParameterSchema()
43
- schema.add_parameter(ParameterDefinition(
44
- name="webpage_url",
45
- param_type=ParameterType.STRING,
46
- description="URL of the webpage. Required if no browser session is active or to ensure context.",
47
- required=True
48
- ))
49
- schema.add_parameter(ParameterDefinition(
50
- name="css_selector",
51
- param_type=ParameterType.STRING,
52
- description="CSS selector to find the target web element.",
53
- required=True
54
- ))
55
- schema.add_parameter(ParameterDefinition(
56
- name="action",
57
- param_type=ParameterType.ENUM,
58
- description=f"Type of interaction to perform. Must be one of: {', '.join(str(act) for act in WebElementAction)}.",
59
- required=True,
60
- enum_values=[str(act) for act in WebElementAction]
61
- ))
62
- schema.add_parameter(ParameterDefinition(
63
- name="params",
64
- param_type=ParameterType.STRING,
65
- description="Optional XML-formatted string containing additional parameters for specific actions (e.g., text for 'type', option for 'select'). Example: <param><name>text</name><value>Hello</value></param>",
66
- required=False
67
- ))
68
- return schema
69
-
70
- async def perform_action(
71
- self,
72
- shared_session: SharedBrowserSession,
73
- css_selector: str,
74
- action: str,
75
- webpage_url: str,
76
- params: Optional[str] = ""
77
- ) -> str:
78
- logger.info(f"trigger_web_element performing action '{action}' on selector '{css_selector}' for page related to URL '{webpage_url}'. Params: '{params[:50]}...'")
79
-
80
- try:
81
- action_enum = WebElementAction.from_string(action)
82
- except ValueError as e:
83
- logger.error(f"Invalid action string '{action}' passed to perform_action despite schema validation: {e}")
84
- raise
85
-
86
- parsed_params = self._parse_xml_params(params if params else "")
87
-
88
- element = shared_session.page.locator(css_selector)
89
-
90
- try:
91
- await element.wait_for(state="visible", timeout=10000)
92
- except Exception as e_wait:
93
- error_msg = f"Element with selector '{css_selector}' not visible or found within timeout on page {shared_session.page.url}. Error: {e_wait}"
94
- logger.warning(error_msg)
95
- raise ValueError(error_msg) from e_wait
96
-
97
- if action_enum == WebElementAction.CLICK:
98
- await element.click()
99
- elif action_enum == WebElementAction.TYPE:
100
- text_to_type = parsed_params.get("text")
101
- if text_to_type is None:
102
- raise ValueError("'text' parameter is required for 'type' action.")
103
- await element.fill("")
104
- await element.type(text_to_type)
105
- elif action_enum == WebElementAction.SELECT:
106
- option_value = parsed_params.get("option")
107
- if option_value is None:
108
- raise ValueError("'option' parameter is required for 'select' action.")
109
- await element.select_option(option_value)
110
- elif action_enum == WebElementAction.CHECK:
111
- state_str = parsed_params.get("state", "true")
112
- is_checked_state = state_str.lower() == "true"
113
- if is_checked_state:
114
- await element.check()
115
- else:
116
- await element.uncheck()
117
- elif action_enum == WebElementAction.SUBMIT:
118
- logger.warning("WebElementAction.SUBMIT is interpreted as a click. Ensure CSS selector targets a submit button or form element intended for click-based submission.")
119
- await element.click()
120
- elif action_enum == WebElementAction.HOVER:
121
- await element.hover()
122
- elif action_enum == WebElementAction.DOUBLE_CLICK:
123
- await element.dblclick()
124
- else:
125
- raise ValueError(f"Unsupported action: {action_enum}")
126
-
127
- success_msg = f"The trigger_web_element action '{action_enum}' on selector '{css_selector}' was executed."
128
- logger.info(success_msg)
129
- return success_msg
130
-
131
- def _parse_xml_params(self, params_xml_str: str) -> Dict[str, str]:
132
- if not params_xml_str:
133
- return {}
134
-
135
- try:
136
- if not params_xml_str.strip().startswith("<root>"):
137
- xml_string_to_parse = f"<root>{params_xml_str}</root>"
138
- else:
139
- xml_string_to_parse = params_xml_str
140
-
141
- root = ET.fromstring(xml_string_to_parse)
142
- parsed_params: Dict[str, str] = {}
143
- for param_node in root.findall('param'):
144
- name_elem = param_node.find('name')
145
- value_elem = param_node.find('value')
146
- if name_elem is not None and name_elem.text and value_elem is not None and value_elem.text is not None:
147
- parsed_params[name_elem.text] = value_elem.text
148
- elif name_elem is not None and name_elem.text and value_elem is not None and value_elem.text is None:
149
- parsed_params[name_elem.text] = ""
150
-
151
- return parsed_params
152
- except ET.ParseError as e_parse:
153
- logger.warning(f"Failed to parse params XML string: '{params_xml_str}'. Error: {e_parse}. Returning empty params.")
154
- return {}
@@ -1,89 +0,0 @@
1
- # File: autobyteus/tools/browser/session_aware/browser_session_aware_webpage_reader.py
2
-
3
- import logging
4
- from typing import Optional, TYPE_CHECKING, Any
5
- from autobyteus.tools.browser.session_aware.browser_session_aware_tool import BrowserSessionAwareTool
6
- from autobyteus.tools.browser.session_aware.shared_browser_session import SharedBrowserSession
7
- from autobyteus.tools.tool_config import ToolConfig
8
- from autobyteus.utils.parameter_schema import ParameterSchema, ParameterDefinition, ParameterType
9
- from autobyteus.tools.tool_category import ToolCategory
10
- from autobyteus.utils.html_cleaner import clean, CleaningMode
11
-
12
- if TYPE_CHECKING:
13
- from autobyteus.agent.context import AgentContext
14
-
15
- logger = logging.getLogger(__name__)
16
-
17
- class BrowserSessionAwareWebPageReader(BrowserSessionAwareTool):
18
- """
19
- A session-aware tool to read and clean HTML content from the current page
20
- in a shared browser session.
21
- """
22
- CATEGORY = ToolCategory.WEB
23
-
24
- def __init__(self, config: Optional[ToolConfig] = None):
25
- super().__init__(config=config)
26
-
27
- cleaning_mode_to_use = CleaningMode.THOROUGH
28
- if config:
29
- cleaning_mode_value = config.get('cleaning_mode')
30
- if cleaning_mode_value:
31
- if isinstance(cleaning_mode_value, str):
32
- try:
33
- cleaning_mode_to_use = CleaningMode(cleaning_mode_value.upper())
34
- except ValueError:
35
- cleaning_mode_to_use = CleaningMode.THOROUGH
36
- elif isinstance(cleaning_mode_value, CleaningMode):
37
- cleaning_mode_to_use = cleaning_mode_value
38
-
39
- self.cleaning_mode = cleaning_mode_to_use
40
- logger.debug(f"read_webpage (session-aware) tool initialized with cleaning_mode: {self.cleaning_mode}")
41
-
42
- @classmethod
43
- def get_name(cls) -> str:
44
- return "read_webpage"
45
-
46
- @classmethod
47
- def get_description(cls) -> str:
48
- return ("Reads and cleans the HTML content from the current page in a shared browser session. "
49
- "The level of HTML cleanup can be configured at tool instantiation.")
50
-
51
- @classmethod
52
- def get_argument_schema(cls) -> Optional[ParameterSchema]:
53
- schema = ParameterSchema()
54
- schema.add_parameter(ParameterDefinition(
55
- name="webpage_url",
56
- param_type=ParameterType.STRING,
57
- description="URL of the webpage. Required if no browser session is active or to ensure context. Tool reads current page content after navigation if applicable.",
58
- required=True
59
- ))
60
- return schema
61
-
62
- @classmethod
63
- def get_config_schema(cls) -> Optional[ParameterSchema]:
64
- schema = ParameterSchema()
65
- schema.add_parameter(ParameterDefinition(
66
- name="cleaning_mode",
67
- param_type=ParameterType.ENUM,
68
- description="Level of HTML content cleanup (BASIC or THOROUGH). Applied to the read webpage content.",
69
- required=False,
70
- default_value="THOROUGH",
71
- enum_values=[mode.name for mode in CleaningMode]
72
- ))
73
- return schema
74
-
75
- async def perform_action(
76
- self,
77
- shared_session: SharedBrowserSession,
78
- webpage_url: str
79
- ) -> str:
80
- logger.info(f"read_webpage (session-aware) performing action. Current page URL: {shared_session.page.url}, cleaning_mode: {self.cleaning_mode}")
81
-
82
- try:
83
- page_content = await shared_session.page.content()
84
- cleaned_content = clean(page_content, self.cleaning_mode)
85
- logger.debug(f"Read and cleaned content from {shared_session.page.url}. Cleaned length: {len(cleaned_content)}")
86
- return cleaned_content
87
- except Exception as e:
88
- logger.error(f"Error reading page content in shared session from {shared_session.page.url}: {e}", exc_info=True)
89
- raise RuntimeError(f"Failed to read page content from shared session: {str(e)}")
@@ -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"take_webpage_screenshot (session-aware) initialized. Full page: {self.full_page}, Format: {self.image_format}")
36
-
37
- @classmethod
38
- def get_name(cls) -> str:
39
- return "take_webpage_screenshot"
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"take_webpage_screenshot (session-aware) 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()