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,12 +1,10 @@
1
1
  # file: autobyteus/autobyteus/agent/system_prompt_processor/tool_manifest_injector_processor.py
2
2
  import logging
3
- from typing import Dict, TYPE_CHECKING, List
3
+ from typing import Dict, List, TYPE_CHECKING
4
4
 
5
5
  from .base_processor import BaseSystemPromptProcessor
6
6
  from autobyteus.tools.registry import default_tool_registry, ToolDefinition
7
7
  from autobyteus.tools.usage.providers import ToolManifestProvider
8
- from autobyteus.prompt.prompt_template import PromptTemplate
9
- from autobyteus.llm.providers import LLMProvider
10
8
 
11
9
  if TYPE_CHECKING:
12
10
  from autobyteus.tools.base_tool import BaseTool
@@ -14,19 +12,12 @@ if TYPE_CHECKING:
14
12
 
15
13
  logger = logging.getLogger(__name__)
16
14
 
15
+
17
16
  class ToolManifestInjectorProcessor(BaseSystemPromptProcessor):
18
17
  """
19
- Injects a tool manifest into the system prompt using Jinja2-style placeholders.
20
- It primarily targets the '{{tools}}' variable. It uses PromptTemplate for
21
- rendering and delegates manifest generation to a ToolManifestProvider.
22
- It automatically determines whether to use XML or JSON based on the LLM provider.
18
+ Appends an 'Accessible Tools' section to the system prompt.
19
+ Automatically determines XML or JSON format based on the LLM provider.
23
20
  """
24
- # The '{{tools}}' placeholder is now handled by Jinja2 via PromptTemplate.
25
- DEFAULT_PREFIX_FOR_TOOLS_ONLY_PROMPT = "You have access to a set of tools. Use them by outputting the appropriate tool call format. The user can only see the output of the tool, not the call itself. The available tools are:\n\n"
26
-
27
- def __init__(self):
28
- self._manifest_provider = ToolManifestProvider()
29
- logger.debug(f"{self.get_name()} initialized.")
30
21
 
31
22
  @classmethod
32
23
  def get_name(cls) -> str:
@@ -34,63 +25,53 @@ class ToolManifestInjectorProcessor(BaseSystemPromptProcessor):
34
25
 
35
26
  @classmethod
36
27
  def get_order(cls) -> int:
37
- """Explicitly set to default, as it's often the only system prompt processor."""
38
28
  return 500
39
29
 
40
30
  @classmethod
41
31
  def is_mandatory(cls) -> bool:
42
- """This processor is essential for the LLM to know which tools are available."""
43
32
  return True
44
33
 
45
- def process(self, system_prompt: str, tool_instances: Dict[str, 'BaseTool'], agent_id: str, context: 'AgentContext') -> str:
46
- try:
47
- prompt_template = PromptTemplate(template=system_prompt)
48
- except Exception as e:
49
- logger.error(f"Failed to create PromptTemplate from system prompt for agent '{agent_id}'. Error: {e}", exc_info=True)
50
- # Return original prompt on Jinja2 parsing failure
51
- return system_prompt
34
+ def __init__(self):
35
+ self._manifest_provider = None
52
36
 
53
- # Check if the 'tools' variable is actually in the template
54
- if "tools" not in prompt_template.required_vars:
37
+ def process(
38
+ self,
39
+ system_prompt: str,
40
+ tool_instances: Dict[str, 'BaseTool'],
41
+ agent_id: str,
42
+ context: 'AgentContext'
43
+ ) -> str:
44
+ if not tool_instances:
45
+ logger.info(f"Agent '{agent_id}': No tools configured. Skipping tool injection.")
55
46
  return system_prompt
56
47
 
48
+ # Get LLM provider for format selection
57
49
  llm_provider = None
58
50
  if context.llm_instance and context.llm_instance.model:
59
51
  llm_provider = context.llm_instance.model.provider
60
-
61
- # Retrieve the override flag from the agent's configuration.
62
- use_xml_tool_format = context.config.use_xml_tool_format
63
52
 
64
- # Generate the manifest string for the 'tools' variable.
65
- tools_manifest: str
66
- if not tool_instances:
67
- logger.info(f"{self.get_name()}: The '{{{{tools}}}}' placeholder is present, but no tools are instantiated. Using 'No tools available.'")
68
- tools_manifest = "No tools available for this agent."
69
- else:
70
- tool_definitions: List[ToolDefinition] = [
71
- td for name in tool_instances if (td := default_tool_registry.get_tool_definition(name))
72
- ]
53
+ # Get tool definitions
54
+ tool_definitions: List[ToolDefinition] = [
55
+ td for name in tool_instances if (td := default_tool_registry.get_tool_definition(name))
56
+ ]
57
+
58
+ if not tool_definitions:
59
+ logger.warning(f"Agent '{agent_id}': Tools configured but no definitions found in registry.")
60
+ return system_prompt
73
61
 
74
- try:
75
- # Delegate manifest generation to the provider, passing the override flag.
76
- tools_manifest = self._manifest_provider.provide(
77
- tool_definitions=tool_definitions,
78
- provider=llm_provider,
79
- use_xml_tool_format=use_xml_tool_format
80
- )
81
- except Exception as e:
82
- logger.exception(f"An unexpected error occurred during tool manifest generation for agent '{agent_id}': {e}")
83
- tools_manifest = "Error: Could not generate tool descriptions."
84
-
85
- # Check if the prompt *only* contains the 'tools' variable by rendering with an empty string
86
- rendered_without_tools = prompt_template.fill({"tools": ""})
87
- is_tools_only_prompt = not rendered_without_tools.strip()
62
+ # Generate manifest
63
+ try:
64
+ if self._manifest_provider is None:
65
+ self._manifest_provider = ToolManifestProvider()
66
+ tools_manifest = self._manifest_provider.provide(
67
+ tool_definitions=tool_definitions,
68
+ provider=llm_provider,
69
+ )
70
+ except Exception as e:
71
+ logger.exception(f"Agent '{agent_id}': Failed to generate tool manifest: {e}")
72
+ return system_prompt
88
73
 
89
- if is_tools_only_prompt:
90
- logger.info(f"{self.get_name()}: Prompt contains only the tools placeholder. Prepending default instructions.")
91
- return self.DEFAULT_PREFIX_FOR_TOOLS_ONLY_PROMPT + tools_manifest
92
- else:
93
- # For prompts that contain other text, add a newline for better formatting before filling the template.
94
- tools_description_with_newline = f"\n{tools_manifest}"
95
- final_prompt = prompt_template.fill({"tools": tools_description_with_newline})
96
- return final_prompt
74
+ # Append tools section
75
+ tools_block = f"\n\n## Accessible Tools\n\n{tools_manifest}"
76
+ logger.info(f"Agent '{agent_id}': Injected {len(tool_definitions)} tools.")
77
+ return system_prompt + tools_block
@@ -0,0 +1,56 @@
1
+ from dataclasses import dataclass
2
+ from typing import Optional
3
+
4
+ from autobyteus.llm.models import LLMModel
5
+ from autobyteus.llm.utils.llm_config import LLMConfig
6
+ from autobyteus.memory.policies.compaction_policy import CompactionPolicy
7
+
8
+
9
+ @dataclass(frozen=True)
10
+ class TokenBudget:
11
+ max_context_tokens: int
12
+ max_output_tokens: int
13
+ safety_margin_tokens: int
14
+ compaction_ratio: float
15
+ input_budget: int
16
+
17
+
18
+ def resolve_token_budget(
19
+ model: LLMModel,
20
+ config: LLMConfig,
21
+ policy: CompactionPolicy,
22
+ ) -> Optional[TokenBudget]:
23
+ max_context_tokens = model.max_context_tokens or config.token_limit
24
+ if not max_context_tokens:
25
+ return None
26
+
27
+ max_output_tokens = config.max_tokens or 0
28
+
29
+ if config.safety_margin_tokens is not None:
30
+ safety_margin = config.safety_margin_tokens
31
+ elif model.default_safety_margin_tokens is not None:
32
+ safety_margin = model.default_safety_margin_tokens
33
+ else:
34
+ safety_margin = policy.safety_margin_tokens
35
+
36
+ if config.compaction_ratio is not None:
37
+ compaction_ratio = config.compaction_ratio
38
+ elif model.default_compaction_ratio is not None:
39
+ compaction_ratio = model.default_compaction_ratio
40
+ else:
41
+ compaction_ratio = policy.trigger_ratio
42
+
43
+ input_budget = max(0, max_context_tokens - max_output_tokens - safety_margin)
44
+
45
+ return TokenBudget(
46
+ max_context_tokens=max_context_tokens,
47
+ max_output_tokens=max_output_tokens,
48
+ safety_margin_tokens=safety_margin,
49
+ compaction_ratio=compaction_ratio,
50
+ input_budget=input_budget,
51
+ )
52
+
53
+
54
+ def apply_compaction_policy(policy: CompactionPolicy, budget: TokenBudget) -> None:
55
+ policy.trigger_ratio = budget.compaction_ratio
56
+ policy.safety_margin_tokens = budget.safety_margin_tokens
@@ -0,0 +1,29 @@
1
+ import logging
2
+ from typing import TYPE_CHECKING
3
+
4
+ from autobyteus.agent.tool_execution_result_processor.base_processor import BaseToolExecutionResultProcessor
5
+
6
+ if TYPE_CHECKING:
7
+ from autobyteus.agent.context import AgentContext
8
+ from autobyteus.agent.events import ToolResultEvent
9
+
10
+ logger = logging.getLogger(__name__)
11
+
12
+
13
+ class MemoryIngestToolResultProcessor(BaseToolExecutionResultProcessor):
14
+ @classmethod
15
+ def get_order(cls) -> int:
16
+ return 900
17
+
18
+ async def process(self, event: "ToolResultEvent", context: "AgentContext") -> "ToolResultEvent":
19
+ memory_manager = getattr(context.state, "memory_manager", None)
20
+ if memory_manager:
21
+ if event.turn_id:
22
+ memory_manager.ingest_tool_result(event)
23
+ logger.debug("MemoryIngestToolResultProcessor stored tool result for turn_id %s", event.turn_id)
24
+ else:
25
+ logger.debug(
26
+ "MemoryIngestToolResultProcessor skipping tool result without turn_id for tool '%s'",
27
+ event.tool_name,
28
+ )
29
+ return event
@@ -1,9 +1,6 @@
1
1
  # file: autobyteus/autobyteus/agent/tool_invocation.py
2
- import uuid
3
- import hashlib
4
- import json
5
2
  import logging
6
- from typing import Optional, Dict, Any, List, TYPE_CHECKING
3
+ from typing import Dict, Any, List, TYPE_CHECKING, Optional
7
4
  from dataclasses import dataclass, field
8
5
 
9
6
  if TYPE_CHECKING:
@@ -12,48 +9,26 @@ if TYPE_CHECKING:
12
9
  logger = logging.getLogger(__name__)
13
10
 
14
11
  class ToolInvocation:
15
- def __init__(self, name: Optional[str] = None, arguments: Optional[Dict[str, Any]] = None, id: Optional[str] = None):
12
+ def __init__(self, name: str, arguments: Dict[str, Any], id: str, turn_id: str = None):
16
13
  """
17
14
  Represents a tool invocation request.
18
15
 
19
16
  Args:
20
17
  name: The name of the tool to be invoked.
21
18
  arguments: A dictionary of arguments for the tool.
22
- id: Optional. A unique identifier for this tool invocation.
23
- If None, a deterministic ID will be generated based on the tool name and arguments.
19
+ id: Required. A unique identifier for this tool invocation.
24
20
  """
25
- self.name: Optional[str] = name
26
- self.arguments: Optional[Dict[str, Any]] = arguments
27
-
28
- if id is not None:
29
- self.id: str = id
30
- elif self.name is not None and self.arguments is not None:
31
- self.id: str = self._generate_deterministic_id(self.name, self.arguments)
32
- else:
33
- # Fallback to UUID if name/args are not provided during init, though this is an edge case.
34
- self.id: str = f"call_{uuid.uuid4().hex}"
35
-
36
- @staticmethod
37
- def _generate_deterministic_id(name: str, arguments: Dict[str, Any]) -> str:
38
- """
39
- Generates a deterministic ID for the tool invocation based on its content.
40
- """
41
- # Create a canonical representation of the arguments
42
- # sort_keys=True ensures that the order of keys doesn't change the hash
43
- # ensure_ascii=False is critical for cross-language compatibility with JS
44
- canonical_args = json.dumps(arguments, sort_keys=True, separators=(',', ':'), ensure_ascii=False)
45
-
46
- # Create a string to hash
47
- hash_string = f"{name}:{canonical_args}"
48
-
49
- # --- ADDED LOGGING ---
50
- logger.debug(f"Generating tool invocation ID from hash_string: '{hash_string}'")
51
-
52
- # Use SHA256 for a robust hash
53
- sha256_hash = hashlib.sha256(hash_string.encode('utf-8')).hexdigest()
54
-
55
- # Prepend a prefix for clarity and use the full hash.
56
- return f"call_{sha256_hash}"
21
+ if not id:
22
+ raise ValueError("ToolInvocation requires a non-empty id.")
23
+ if not name:
24
+ raise ValueError("ToolInvocation requires a non-empty name.")
25
+ if arguments is None:
26
+ raise ValueError("ToolInvocation requires arguments.")
27
+
28
+ self.name: str = name
29
+ self.arguments: Dict[str, Any] = arguments
30
+ self.id: str = id
31
+ self.turn_id: Optional[str] = turn_id
57
32
 
58
33
  def is_valid(self) -> bool:
59
34
  """
@@ -63,7 +38,8 @@ class ToolInvocation:
63
38
  return self.name is not None and self.arguments is not None
64
39
 
65
40
  def __repr__(self) -> str:
66
- return (f"ToolInvocation(id='{self.id}', name='{self.name}', "
41
+ turn_id_repr = f", turn_id='{self.turn_id}'" if self.turn_id else ""
42
+ return (f"ToolInvocation(id='{self.id}', name='{self.name}'{turn_id_repr}, "
67
43
  f"arguments={self.arguments})")
68
44
 
69
45
 
@@ -0,0 +1,9 @@
1
+ from .base_preprocessor import BaseToolInvocationPreprocessor
2
+ from .processor_definition import ToolInvocationPreprocessorDefinition
3
+ from .processor_registry import default_tool_invocation_preprocessor_registry
4
+
5
+ __all__ = [
6
+ "BaseToolInvocationPreprocessor",
7
+ "ToolInvocationPreprocessorDefinition",
8
+ "default_tool_invocation_preprocessor_registry",
9
+ ]
@@ -0,0 +1,45 @@
1
+ import logging
2
+ from abc import ABC, abstractmethod
3
+ from typing import TYPE_CHECKING
4
+
5
+ from .processor_meta import ToolInvocationPreprocessorMeta
6
+
7
+ if TYPE_CHECKING:
8
+ from autobyteus.agent.context import AgentContext
9
+ from autobyteus.agent.tool_invocation import ToolInvocation
10
+
11
+ logger = logging.getLogger(__name__)
12
+
13
+
14
+ class BaseToolInvocationPreprocessor(ABC, metaclass=ToolInvocationPreprocessorMeta):
15
+ """
16
+ Pre-execution processors that can mutate or validate a ToolInvocation
17
+ before the tool is executed.
18
+ """
19
+
20
+ @classmethod
21
+ def get_name(cls) -> str:
22
+ return cls.__name__
23
+
24
+ @classmethod
25
+ def get_order(cls) -> int:
26
+ """Lower numbers run earlier."""
27
+ return 500
28
+
29
+ @classmethod
30
+ def is_mandatory(cls) -> bool:
31
+ return False
32
+
33
+ @abstractmethod
34
+ async def process(self,
35
+ invocation: 'ToolInvocation',
36
+ context: 'AgentContext') -> 'ToolInvocation':
37
+ """
38
+ Process and return the (potentially modified) ToolInvocation.
39
+ May raise to signal failure; caller should handle and surface as tool error.
40
+ """
41
+ raise NotImplementedError
42
+
43
+ def __repr__(self) -> str:
44
+ return f"<{self.__class__.__name__}>"
45
+
@@ -0,0 +1,15 @@
1
+ from typing import TYPE_CHECKING, Type
2
+
3
+ if TYPE_CHECKING:
4
+ from .base_preprocessor import BaseToolInvocationPreprocessor
5
+
6
+
7
+ class ToolInvocationPreprocessorDefinition:
8
+ """
9
+ Lightweight container binding a name to a preprocessor class.
10
+ Mirrors the pattern used by other processor registries.
11
+ """
12
+ def __init__(self, name: str, processor_class: Type['BaseToolInvocationPreprocessor']):
13
+ self.name = name
14
+ self.processor_class: Type['BaseToolInvocationPreprocessor'] = processor_class
15
+
@@ -0,0 +1,33 @@
1
+ import logging
2
+ from abc import ABCMeta
3
+
4
+ from .processor_registry import default_tool_invocation_preprocessor_registry
5
+ from .processor_definition import ToolInvocationPreprocessorDefinition
6
+
7
+ logger = logging.getLogger(__name__)
8
+
9
+
10
+ class ToolInvocationPreprocessorMeta(ABCMeta):
11
+ """
12
+ Metaclass to auto-register concrete preprocessors.
13
+ """
14
+ def __init__(cls, name, bases, dct):
15
+ super().__init__(name, bases, dct)
16
+
17
+ if name == "BaseToolInvocationPreprocessor" or getattr(cls, "__abstractmethods__", None):
18
+ logger.debug(f"Skipping registration for abstract tool invocation preprocessor class: {name}")
19
+ return
20
+
21
+ try:
22
+ processor_name = cls.get_name()
23
+ if not processor_name or not isinstance(processor_name, str):
24
+ logger.error(f"Tool invocation preprocessor class {name} must return valid string from get_name(); skipping.")
25
+ return
26
+ definition = ToolInvocationPreprocessorDefinition(name=processor_name, processor_class=cls)
27
+ default_tool_invocation_preprocessor_registry.register_preprocessor(definition)
28
+ logger.info(f"Auto-registered tool invocation preprocessor '{processor_name}' from class {name}.")
29
+ except AttributeError as e:
30
+ logger.error(f"Tool invocation preprocessor class {name} missing required methods ({e}); skipping registration.")
31
+ except Exception as e:
32
+ logger.error(f"Failed to auto-register tool invocation preprocessor class {name}: {e}", exc_info=True)
33
+
@@ -0,0 +1,60 @@
1
+ import logging
2
+ from typing import TYPE_CHECKING, Dict, List, Optional
3
+
4
+ from autobyteus.utils.singleton import SingletonMeta
5
+ from autobyteus.agent.processor_option import ProcessorOption
6
+ from .processor_definition import ToolInvocationPreprocessorDefinition
7
+
8
+ if TYPE_CHECKING:
9
+ from .base_preprocessor import BaseToolInvocationPreprocessor
10
+
11
+ logger = logging.getLogger(__name__)
12
+
13
+
14
+ class ToolInvocationPreprocessorRegistry(metaclass=SingletonMeta):
15
+ """
16
+ Registry for ToolInvocationPreprocessor definitions.
17
+ """
18
+ def __init__(self):
19
+ self._definitions: Dict[str, ToolInvocationPreprocessorDefinition] = {}
20
+ logger.info("ToolInvocationPreprocessorRegistry initialized.")
21
+
22
+ def register_preprocessor(self, definition: ToolInvocationPreprocessorDefinition) -> None:
23
+ if not isinstance(definition, ToolInvocationPreprocessorDefinition):
24
+ raise TypeError(f"Expected ToolInvocationPreprocessorDefinition, got {type(definition).__name__}")
25
+ name = definition.name
26
+ if name in self._definitions:
27
+ logger.warning(f"Overwriting existing tool invocation preprocessor definition '{name}'.")
28
+ self._definitions[name] = definition
29
+ logger.info(f"Tool invocation preprocessor definition '{name}' registered.")
30
+
31
+ def get_preprocessor_definition(self, name: str) -> Optional[ToolInvocationPreprocessorDefinition]:
32
+ return self._definitions.get(name)
33
+
34
+ def get_preprocessor(self, name: str) -> Optional['BaseToolInvocationPreprocessor']:
35
+ definition = self.get_preprocessor_definition(name)
36
+ if definition:
37
+ try:
38
+ return definition.processor_class()
39
+ except Exception as e:
40
+ logger.error(f"Failed to instantiate tool invocation preprocessor '{name}': {e}", exc_info=True)
41
+ return None
42
+ return None
43
+
44
+ def list_preprocessor_names(self) -> List[str]:
45
+ return list(self._definitions.keys())
46
+
47
+ # Backwards-compatible alias used by some services
48
+ def get_processor(self, name: str) -> Optional['BaseToolInvocationPreprocessor']:
49
+ return self.get_preprocessor(name)
50
+
51
+ def get_ordered_processor_options(self) -> List[ProcessorOption]:
52
+ definitions = list(self._definitions.values())
53
+ sorted_defs = sorted(definitions, key=lambda d: d.processor_class.get_order())
54
+ return [ProcessorOption(name=d.name, is_mandatory=d.processor_class.is_mandatory()) for d in sorted_defs]
55
+
56
+ def get_all_definitions(self) -> Dict[str, ToolInvocationPreprocessorDefinition]:
57
+ return dict(self._definitions)
58
+
59
+
60
+ default_tool_invocation_preprocessor_registry = ToolInvocationPreprocessorRegistry()
@@ -1,25 +1,23 @@
1
1
  # file: autobyteus/autobyteus/agent/utils/wait_for_idle.py
2
2
  import asyncio
3
3
  import logging
4
- from typing import Optional
5
4
 
6
5
  from autobyteus.agent.agent import Agent
7
6
  from autobyteus.agent.streaming.agent_event_stream import AgentEventStream
8
- from autobyteus.agent.streaming.stream_events import StreamEventType
9
- from autobyteus.agent.phases import AgentOperationalPhase
7
+ from autobyteus.agent.status.status_enum import AgentStatus
10
8
 
11
9
  logger = logging.getLogger(__name__)
12
10
 
13
11
  async def _wait_loop(streamer: AgentEventStream, agent_id: str):
14
- """Internal helper to listen for the IDLE or ERROR event."""
15
- async for event in streamer.all_events():
16
- if event.event_type == StreamEventType.AGENT_IDLE:
12
+ """Internal helper to listen for the IDLE or ERROR status update."""
13
+ async for status_update in streamer.stream_status_updates():
14
+ if status_update.new_status == AgentStatus.IDLE:
17
15
  logger.info(f"Agent '{agent_id}' has become idle.")
18
16
  return
19
- if event.event_type == StreamEventType.ERROR_EVENT:
20
- error_message = f"Agent '{agent_id}' entered an error state while waiting for idle: {event.data}"
21
- logger.error(error_message)
22
- raise RuntimeError(error_message)
17
+ if status_update.new_status == AgentStatus.ERROR:
18
+ error_message = f"Agent '{agent_id}' entered an error state while waiting for idle: {status_update}"
19
+ logger.error(error_message)
20
+ raise RuntimeError(error_message)
23
21
 
24
22
 
25
23
  async def wait_for_agent_to_be_idle(agent: Agent, timeout: float = 30.0):
@@ -41,12 +39,12 @@ async def wait_for_agent_to_be_idle(agent: Agent, timeout: float = 30.0):
41
39
  if not isinstance(agent, Agent):
42
40
  raise TypeError("The 'agent' argument must be an instance of the Agent class.")
43
41
 
44
- current_phase = agent.get_current_phase()
45
- if current_phase.is_terminal():
46
- logger.warning(f"Agent '{agent.agent_id}' is already in a terminal state ({current_phase.value}) and will not become idle.")
42
+ current_status = agent.get_current_status()
43
+ if current_status.is_terminal():
44
+ logger.warning(f"Agent '{agent.agent_id}' is already in a terminal state ({current_status.value}) and will not become idle.")
47
45
  return
48
46
 
49
- if current_phase == AgentOperationalPhase.IDLE:
47
+ if current_status == AgentStatus.IDLE:
50
48
  logger.debug(f"Agent '{agent.agent_id}' is already idle.")
51
49
  return
52
50
 
@@ -2,9 +2,7 @@
2
2
  import logging
3
3
  import uuid
4
4
  from abc import ABC, abstractmethod
5
- from typing import Optional, Any, Dict, TYPE_CHECKING
6
- from autobyteus.utils.parameter_schema import ParameterSchema
7
- from autobyteus.agent.workspace.workspace_meta import WorkspaceMeta
5
+ from typing import Optional, TYPE_CHECKING
8
6
  from autobyteus.agent.workspace.workspace_config import WorkspaceConfig
9
7
 
10
8
  if TYPE_CHECKING:
@@ -12,13 +10,13 @@ if TYPE_CHECKING:
12
10
 
13
11
  logger = logging.getLogger(__name__)
14
12
 
15
- class BaseAgentWorkspace(ABC, metaclass=WorkspaceMeta):
13
+ class BaseAgentWorkspace(ABC):
16
14
  """
17
15
  Abstract base class for an agent's workspace or working environment.
18
16
 
19
17
  A workspace is a passive data container that describes an agent's operating
20
- environment (e.g., a local directory, SSH connection details). It does not
21
- implement active operations itself; that is the responsibility of Tools.
18
+ environment (e.g., a local directory). It does not implement active operations
19
+ itself; that is the responsibility of Tools.
22
20
  """
23
21
 
24
22
  def __init__(self, config: Optional[WorkspaceConfig] = None):
@@ -26,7 +24,7 @@ class BaseAgentWorkspace(ABC, metaclass=WorkspaceMeta):
26
24
  Initializes the BaseAgentWorkspace.
27
25
 
28
26
  Args:
29
- config: Optional configuration for the workspace (e.g., base path, credentials).
27
+ config: Optional configuration for the workspace (e.g., base path).
30
28
  """
31
29
  self._config: WorkspaceConfig = config or WorkspaceConfig()
32
30
  self.context: Optional['AgentContext'] = None
@@ -68,25 +66,6 @@ class BaseAgentWorkspace(ABC, metaclass=WorkspaceMeta):
68
66
  """
69
67
  return self.workspace_id
70
68
 
71
- # --- Methods for self-description ---
72
-
73
- @classmethod
74
- @abstractmethod
75
- def get_workspace_type_name(cls) -> str:
76
- """Returns the unique, machine-readable type name for this workspace (e.g., 'local_workspace')."""
77
- pass
78
-
79
- @classmethod
80
- @abstractmethod
81
- def get_description(cls) -> str:
82
- """Returns a user-friendly description of this workspace type."""
83
- pass
84
-
85
- @classmethod
86
- @abstractmethod
87
- def get_config_schema(cls) -> ParameterSchema:
88
- """Returns the ParameterSchema defining the configuration arguments needed to create an instance of this workspace."""
89
- pass
90
-
91
69
  def __repr__(self) -> str:
92
70
  return f"<{self.__class__.__name__} workspace_id='{self.workspace_id}' agent_id='{self.agent_id or 'N/A'}>"
71
+
@@ -5,7 +5,7 @@ from typing import Optional
5
5
  from autobyteus.agent_team.runtime.agent_team_runtime import AgentTeamRuntime
6
6
  from autobyteus.agent_team.events.agent_team_events import ProcessUserMessageEvent, ToolApprovalTeamEvent
7
7
  from autobyteus.agent.message.agent_input_user_message import AgentInputUserMessage
8
- from autobyteus.agent_team.phases.agent_team_operational_phase import AgentTeamOperationalPhase
8
+ from autobyteus.agent_team.status.agent_team_status import AgentTeamStatus
9
9
 
10
10
  logger = logging.getLogger(__name__)
11
11
 
@@ -89,5 +89,5 @@ class AgentTeam:
89
89
  """Checks if the agent team's worker is running."""
90
90
  return self._runtime.is_running
91
91
 
92
- def get_current_phase(self) -> AgentTeamOperationalPhase:
93
- return self._runtime.context.state.current_phase
92
+ def get_current_status(self) -> AgentTeamStatus:
93
+ return self._runtime.context.state.current_status