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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (512) hide show
  1. autobyteus/agent/agent.py +15 -5
  2. autobyteus/agent/bootstrap_steps/__init__.py +1 -3
  3. autobyteus/agent/bootstrap_steps/agent_bootstrapper.py +3 -59
  4. autobyteus/agent/bootstrap_steps/base_bootstrap_step.py +1 -4
  5. autobyteus/agent/bootstrap_steps/mcp_server_prewarming_step.py +1 -3
  6. autobyteus/agent/bootstrap_steps/system_prompt_processing_step.py +16 -13
  7. autobyteus/agent/bootstrap_steps/workspace_context_initialization_step.py +2 -4
  8. autobyteus/agent/context/agent_config.py +43 -20
  9. autobyteus/agent/context/agent_context.py +23 -18
  10. autobyteus/agent/context/agent_runtime_state.py +23 -19
  11. autobyteus/agent/events/__init__.py +16 -1
  12. autobyteus/agent/events/agent_events.py +43 -3
  13. autobyteus/agent/events/agent_input_event_queue_manager.py +79 -26
  14. autobyteus/agent/events/event_store.py +57 -0
  15. autobyteus/agent/events/notifiers.py +74 -60
  16. autobyteus/agent/events/worker_event_dispatcher.py +21 -64
  17. autobyteus/agent/factory/agent_factory.py +52 -0
  18. autobyteus/agent/handlers/__init__.py +2 -0
  19. autobyteus/agent/handlers/approved_tool_invocation_event_handler.py +51 -34
  20. autobyteus/agent/handlers/bootstrap_event_handler.py +155 -0
  21. autobyteus/agent/handlers/inter_agent_message_event_handler.py +10 -0
  22. autobyteus/agent/handlers/lifecycle_event_logger.py +19 -11
  23. autobyteus/agent/handlers/llm_complete_response_received_event_handler.py +10 -15
  24. autobyteus/agent/handlers/llm_user_message_ready_event_handler.py +188 -48
  25. autobyteus/agent/handlers/tool_execution_approval_event_handler.py +0 -10
  26. autobyteus/agent/handlers/tool_invocation_request_event_handler.py +53 -48
  27. autobyteus/agent/handlers/tool_result_event_handler.py +7 -8
  28. autobyteus/agent/handlers/user_input_message_event_handler.py +10 -3
  29. autobyteus/agent/input_processor/memory_ingest_input_processor.py +40 -0
  30. autobyteus/agent/lifecycle/__init__.py +12 -0
  31. autobyteus/agent/lifecycle/base_processor.py +109 -0
  32. autobyteus/agent/lifecycle/events.py +35 -0
  33. autobyteus/agent/lifecycle/processor_definition.py +36 -0
  34. autobyteus/agent/lifecycle/processor_registry.py +106 -0
  35. autobyteus/agent/llm_request_assembler.py +98 -0
  36. autobyteus/agent/llm_response_processor/__init__.py +1 -8
  37. autobyteus/agent/message/context_file_type.py +1 -1
  38. autobyteus/agent/message/send_message_to.py +5 -4
  39. autobyteus/agent/runtime/agent_runtime.py +29 -21
  40. autobyteus/agent/runtime/agent_worker.py +98 -19
  41. autobyteus/agent/shutdown_steps/__init__.py +2 -0
  42. autobyteus/agent/shutdown_steps/agent_shutdown_orchestrator.py +2 -0
  43. autobyteus/agent/shutdown_steps/tool_cleanup_step.py +58 -0
  44. autobyteus/agent/status/__init__.py +14 -0
  45. autobyteus/agent/status/manager.py +93 -0
  46. autobyteus/agent/status/status_deriver.py +96 -0
  47. autobyteus/agent/{phases/phase_enum.py → status/status_enum.py} +16 -16
  48. autobyteus/agent/status/status_update_utils.py +73 -0
  49. autobyteus/agent/streaming/__init__.py +52 -5
  50. autobyteus/agent/streaming/adapters/__init__.py +18 -0
  51. autobyteus/agent/streaming/adapters/invocation_adapter.py +184 -0
  52. autobyteus/agent/streaming/adapters/tool_call_parsing.py +163 -0
  53. autobyteus/agent/streaming/adapters/tool_syntax_registry.py +67 -0
  54. autobyteus/agent/streaming/agent_event_stream.py +3 -178
  55. autobyteus/agent/streaming/api_tool_call/__init__.py +16 -0
  56. autobyteus/agent/streaming/api_tool_call/file_content_streamer.py +56 -0
  57. autobyteus/agent/streaming/api_tool_call/json_string_field_extractor.py +175 -0
  58. autobyteus/agent/streaming/api_tool_call_streaming_response_handler.py +4 -0
  59. autobyteus/agent/streaming/events/__init__.py +6 -0
  60. autobyteus/agent/streaming/events/stream_event_payloads.py +284 -0
  61. autobyteus/agent/streaming/events/stream_events.py +141 -0
  62. autobyteus/agent/streaming/handlers/__init__.py +15 -0
  63. autobyteus/agent/streaming/handlers/api_tool_call_streaming_response_handler.py +303 -0
  64. autobyteus/agent/streaming/handlers/parsing_streaming_response_handler.py +107 -0
  65. autobyteus/agent/streaming/handlers/pass_through_streaming_response_handler.py +107 -0
  66. autobyteus/agent/streaming/handlers/streaming_handler_factory.py +177 -0
  67. autobyteus/agent/streaming/handlers/streaming_response_handler.py +58 -0
  68. autobyteus/agent/streaming/parser/__init__.py +61 -0
  69. autobyteus/agent/streaming/parser/event_emitter.py +181 -0
  70. autobyteus/agent/streaming/parser/events.py +4 -0
  71. autobyteus/agent/streaming/parser/invocation_adapter.py +4 -0
  72. autobyteus/agent/streaming/parser/json_parsing_strategies/__init__.py +19 -0
  73. autobyteus/agent/streaming/parser/json_parsing_strategies/base.py +32 -0
  74. autobyteus/agent/streaming/parser/json_parsing_strategies/default.py +34 -0
  75. autobyteus/agent/streaming/parser/json_parsing_strategies/gemini.py +31 -0
  76. autobyteus/agent/streaming/parser/json_parsing_strategies/openai.py +64 -0
  77. autobyteus/agent/streaming/parser/json_parsing_strategies/registry.py +75 -0
  78. autobyteus/agent/streaming/parser/parser_context.py +227 -0
  79. autobyteus/agent/streaming/parser/parser_factory.py +132 -0
  80. autobyteus/agent/streaming/parser/sentinel_format.py +7 -0
  81. autobyteus/agent/streaming/parser/state_factory.py +62 -0
  82. autobyteus/agent/streaming/parser/states/__init__.py +1 -0
  83. autobyteus/agent/streaming/parser/states/base_state.py +60 -0
  84. autobyteus/agent/streaming/parser/states/custom_xml_tag_run_bash_parsing_state.py +38 -0
  85. autobyteus/agent/streaming/parser/states/custom_xml_tag_write_file_parsing_state.py +55 -0
  86. autobyteus/agent/streaming/parser/states/delimited_content_state.py +146 -0
  87. autobyteus/agent/streaming/parser/states/json_initialization_state.py +144 -0
  88. autobyteus/agent/streaming/parser/states/json_tool_parsing_state.py +137 -0
  89. autobyteus/agent/streaming/parser/states/sentinel_content_state.py +30 -0
  90. autobyteus/agent/streaming/parser/states/sentinel_initialization_state.py +117 -0
  91. autobyteus/agent/streaming/parser/states/text_state.py +78 -0
  92. autobyteus/agent/streaming/parser/states/xml_patch_file_tool_parsing_state.py +328 -0
  93. autobyteus/agent/streaming/parser/states/xml_run_bash_tool_parsing_state.py +129 -0
  94. autobyteus/agent/streaming/parser/states/xml_tag_initialization_state.py +151 -0
  95. autobyteus/agent/streaming/parser/states/xml_tool_parsing_state.py +63 -0
  96. autobyteus/agent/streaming/parser/states/xml_write_file_tool_parsing_state.py +343 -0
  97. autobyteus/agent/streaming/parser/strategies/__init__.py +17 -0
  98. autobyteus/agent/streaming/parser/strategies/base.py +24 -0
  99. autobyteus/agent/streaming/parser/strategies/json_tool_strategy.py +26 -0
  100. autobyteus/agent/streaming/parser/strategies/registry.py +28 -0
  101. autobyteus/agent/streaming/parser/strategies/sentinel_strategy.py +23 -0
  102. autobyteus/agent/streaming/parser/strategies/xml_tag_strategy.py +21 -0
  103. autobyteus/agent/streaming/parser/stream_scanner.py +167 -0
  104. autobyteus/agent/streaming/parser/streaming_parser.py +212 -0
  105. autobyteus/agent/streaming/parser/tool_call_parsing.py +4 -0
  106. autobyteus/agent/streaming/parser/tool_constants.py +7 -0
  107. autobyteus/agent/streaming/parser/tool_syntax_registry.py +4 -0
  108. autobyteus/agent/streaming/parser/xml_tool_parsing_state_registry.py +55 -0
  109. autobyteus/agent/streaming/parsing_streaming_response_handler.py +4 -0
  110. autobyteus/agent/streaming/pass_through_streaming_response_handler.py +4 -0
  111. autobyteus/agent/streaming/queue_streamer.py +3 -57
  112. autobyteus/agent/streaming/segments/__init__.py +5 -0
  113. autobyteus/agent/streaming/segments/segment_events.py +81 -0
  114. autobyteus/agent/streaming/stream_event_payloads.py +2 -198
  115. autobyteus/agent/streaming/stream_events.py +3 -128
  116. autobyteus/agent/streaming/streaming_handler_factory.py +4 -0
  117. autobyteus/agent/streaming/streaming_response_handler.py +4 -0
  118. autobyteus/agent/streaming/streams/__init__.py +5 -0
  119. autobyteus/agent/streaming/streams/agent_event_stream.py +197 -0
  120. autobyteus/agent/streaming/utils/__init__.py +5 -0
  121. autobyteus/agent/streaming/utils/queue_streamer.py +59 -0
  122. autobyteus/agent/system_prompt_processor/__init__.py +2 -0
  123. autobyteus/agent/system_prompt_processor/available_skills_processor.py +96 -0
  124. autobyteus/agent/system_prompt_processor/base_processor.py +1 -1
  125. autobyteus/agent/system_prompt_processor/processor_meta.py +15 -2
  126. autobyteus/agent/system_prompt_processor/tool_manifest_injector_processor.py +39 -58
  127. autobyteus/agent/token_budget.py +56 -0
  128. autobyteus/agent/tool_execution_result_processor/memory_ingest_tool_result_processor.py +29 -0
  129. autobyteus/agent/tool_invocation.py +16 -40
  130. autobyteus/agent/tool_invocation_preprocessor/__init__.py +9 -0
  131. autobyteus/agent/tool_invocation_preprocessor/base_preprocessor.py +45 -0
  132. autobyteus/agent/tool_invocation_preprocessor/processor_definition.py +15 -0
  133. autobyteus/agent/tool_invocation_preprocessor/processor_meta.py +33 -0
  134. autobyteus/agent/tool_invocation_preprocessor/processor_registry.py +60 -0
  135. autobyteus/agent/utils/wait_for_idle.py +12 -14
  136. autobyteus/agent/workspace/base_workspace.py +6 -27
  137. autobyteus/agent_team/agent_team.py +3 -3
  138. autobyteus/agent_team/agent_team_builder.py +1 -41
  139. autobyteus/agent_team/bootstrap_steps/__init__.py +0 -4
  140. autobyteus/agent_team/bootstrap_steps/agent_configuration_preparation_step.py +8 -18
  141. autobyteus/agent_team/bootstrap_steps/agent_team_bootstrapper.py +4 -16
  142. autobyteus/agent_team/bootstrap_steps/base_agent_team_bootstrap_step.py +1 -2
  143. autobyteus/agent_team/bootstrap_steps/coordinator_initialization_step.py +1 -2
  144. autobyteus/agent_team/bootstrap_steps/task_notifier_initialization_step.py +5 -6
  145. autobyteus/agent_team/bootstrap_steps/team_context_initialization_step.py +15 -15
  146. autobyteus/agent_team/context/agent_team_config.py +6 -3
  147. autobyteus/agent_team/context/agent_team_context.py +25 -3
  148. autobyteus/agent_team/context/agent_team_runtime_state.py +11 -8
  149. autobyteus/agent_team/events/__init__.py +11 -0
  150. autobyteus/agent_team/events/agent_team_event_dispatcher.py +22 -9
  151. autobyteus/agent_team/events/agent_team_events.py +16 -0
  152. autobyteus/agent_team/events/event_store.py +57 -0
  153. autobyteus/agent_team/factory/agent_team_factory.py +8 -0
  154. autobyteus/agent_team/handlers/inter_agent_message_request_event_handler.py +18 -2
  155. autobyteus/agent_team/handlers/lifecycle_agent_team_event_handler.py +21 -5
  156. autobyteus/agent_team/handlers/process_user_message_event_handler.py +17 -8
  157. autobyteus/agent_team/handlers/tool_approval_team_event_handler.py +19 -4
  158. autobyteus/agent_team/runtime/agent_team_runtime.py +41 -10
  159. autobyteus/agent_team/runtime/agent_team_worker.py +69 -5
  160. autobyteus/agent_team/status/__init__.py +14 -0
  161. autobyteus/agent_team/status/agent_team_status.py +18 -0
  162. autobyteus/agent_team/status/agent_team_status_manager.py +33 -0
  163. autobyteus/agent_team/status/status_deriver.py +62 -0
  164. autobyteus/agent_team/status/status_update_utils.py +42 -0
  165. autobyteus/agent_team/streaming/__init__.py +2 -2
  166. autobyteus/agent_team/streaming/agent_team_event_notifier.py +10 -10
  167. autobyteus/agent_team/streaming/agent_team_stream_event_payloads.py +7 -7
  168. autobyteus/agent_team/streaming/agent_team_stream_events.py +11 -11
  169. autobyteus/agent_team/system_prompt_processor/__init__.py +6 -0
  170. autobyteus/agent_team/system_prompt_processor/team_manifest_injector_processor.py +76 -0
  171. autobyteus/agent_team/task_notification/activation_policy.py +1 -1
  172. autobyteus/agent_team/task_notification/system_event_driven_agent_task_notifier.py +22 -22
  173. autobyteus/agent_team/task_notification/task_notification_mode.py +20 -1
  174. autobyteus/agent_team/utils/wait_for_idle.py +4 -4
  175. autobyteus/cli/agent_cli.py +18 -10
  176. autobyteus/cli/agent_team_tui/app.py +18 -15
  177. autobyteus/cli/agent_team_tui/state.py +21 -23
  178. autobyteus/cli/agent_team_tui/widgets/agent_list_sidebar.py +15 -15
  179. autobyteus/cli/agent_team_tui/widgets/focus_pane.py +146 -39
  180. autobyteus/cli/agent_team_tui/widgets/renderables.py +1 -1
  181. autobyteus/cli/agent_team_tui/widgets/shared.py +26 -26
  182. autobyteus/cli/agent_team_tui/widgets/{task_board_panel.py → task_plan_panel.py} +5 -5
  183. autobyteus/cli/cli_display.py +193 -44
  184. autobyteus/cli/workflow_tui/app.py +9 -10
  185. autobyteus/cli/workflow_tui/state.py +14 -16
  186. autobyteus/cli/workflow_tui/widgets/agent_list_sidebar.py +15 -15
  187. autobyteus/cli/workflow_tui/widgets/focus_pane.py +137 -35
  188. autobyteus/cli/workflow_tui/widgets/renderables.py +1 -1
  189. autobyteus/cli/workflow_tui/widgets/shared.py +25 -25
  190. autobyteus/clients/autobyteus_client.py +94 -1
  191. autobyteus/events/event_types.py +15 -21
  192. autobyteus/llm/api/autobyteus_llm.py +33 -29
  193. autobyteus/llm/api/claude_llm.py +142 -36
  194. autobyteus/llm/api/gemini_llm.py +163 -59
  195. autobyteus/llm/api/grok_llm.py +1 -1
  196. autobyteus/llm/api/minimax_llm.py +26 -0
  197. autobyteus/llm/api/mistral_llm.py +113 -87
  198. autobyteus/llm/api/ollama_llm.py +9 -42
  199. autobyteus/llm/api/openai_compatible_llm.py +127 -91
  200. autobyteus/llm/api/openai_llm.py +3 -3
  201. autobyteus/llm/api/openai_responses_llm.py +324 -0
  202. autobyteus/llm/api/zhipu_llm.py +21 -2
  203. autobyteus/llm/autobyteus_provider.py +70 -60
  204. autobyteus/llm/base_llm.py +85 -81
  205. autobyteus/llm/converters/__init__.py +14 -0
  206. autobyteus/llm/converters/anthropic_tool_call_converter.py +37 -0
  207. autobyteus/llm/converters/gemini_tool_call_converter.py +57 -0
  208. autobyteus/llm/converters/mistral_tool_call_converter.py +37 -0
  209. autobyteus/llm/converters/openai_tool_call_converter.py +38 -0
  210. autobyteus/llm/extensions/base_extension.py +6 -12
  211. autobyteus/llm/extensions/token_usage_tracking_extension.py +45 -18
  212. autobyteus/llm/llm_factory.py +282 -204
  213. autobyteus/llm/lmstudio_provider.py +60 -49
  214. autobyteus/llm/models.py +35 -2
  215. autobyteus/llm/ollama_provider.py +60 -49
  216. autobyteus/llm/ollama_provider_resolver.py +0 -1
  217. autobyteus/llm/prompt_renderers/__init__.py +19 -0
  218. autobyteus/llm/prompt_renderers/anthropic_prompt_renderer.py +104 -0
  219. autobyteus/llm/prompt_renderers/autobyteus_prompt_renderer.py +19 -0
  220. autobyteus/llm/prompt_renderers/base_prompt_renderer.py +10 -0
  221. autobyteus/llm/prompt_renderers/gemini_prompt_renderer.py +63 -0
  222. autobyteus/llm/prompt_renderers/mistral_prompt_renderer.py +87 -0
  223. autobyteus/llm/prompt_renderers/ollama_prompt_renderer.py +51 -0
  224. autobyteus/llm/prompt_renderers/openai_chat_renderer.py +97 -0
  225. autobyteus/llm/prompt_renderers/openai_responses_renderer.py +101 -0
  226. autobyteus/llm/providers.py +1 -3
  227. autobyteus/llm/token_counter/claude_token_counter.py +56 -25
  228. autobyteus/llm/token_counter/mistral_token_counter.py +12 -8
  229. autobyteus/llm/token_counter/openai_token_counter.py +24 -5
  230. autobyteus/llm/token_counter/token_counter_factory.py +12 -5
  231. autobyteus/llm/utils/llm_config.py +6 -12
  232. autobyteus/llm/utils/media_payload_formatter.py +27 -20
  233. autobyteus/llm/utils/messages.py +55 -3
  234. autobyteus/llm/utils/response_types.py +3 -0
  235. autobyteus/llm/utils/tool_call_delta.py +31 -0
  236. autobyteus/memory/__init__.py +32 -0
  237. autobyteus/memory/active_transcript.py +69 -0
  238. autobyteus/memory/compaction/__init__.py +9 -0
  239. autobyteus/memory/compaction/compaction_result.py +8 -0
  240. autobyteus/memory/compaction/compactor.py +89 -0
  241. autobyteus/memory/compaction/summarizer.py +11 -0
  242. autobyteus/memory/compaction_snapshot_builder.py +84 -0
  243. autobyteus/memory/memory_manager.py +183 -0
  244. autobyteus/memory/models/__init__.py +14 -0
  245. autobyteus/memory/models/episodic_item.py +41 -0
  246. autobyteus/memory/models/memory_types.py +7 -0
  247. autobyteus/memory/models/raw_trace_item.py +79 -0
  248. autobyteus/memory/models/semantic_item.py +41 -0
  249. autobyteus/memory/models/tool_interaction.py +20 -0
  250. autobyteus/memory/policies/__init__.py +5 -0
  251. autobyteus/memory/policies/compaction_policy.py +16 -0
  252. autobyteus/memory/retrieval/__init__.py +7 -0
  253. autobyteus/memory/retrieval/memory_bundle.py +11 -0
  254. autobyteus/memory/retrieval/retriever.py +13 -0
  255. autobyteus/memory/store/__init__.py +7 -0
  256. autobyteus/memory/store/base_store.py +14 -0
  257. autobyteus/memory/store/file_store.py +98 -0
  258. autobyteus/memory/tool_interaction_builder.py +46 -0
  259. autobyteus/memory/turn_tracker.py +9 -0
  260. autobyteus/multimedia/audio/api/__init__.py +3 -2
  261. autobyteus/multimedia/audio/api/autobyteus_audio_client.py +19 -5
  262. autobyteus/multimedia/audio/api/gemini_audio_client.py +108 -16
  263. autobyteus/multimedia/audio/api/openai_audio_client.py +112 -0
  264. autobyteus/multimedia/audio/audio_client_factory.py +84 -9
  265. autobyteus/multimedia/audio/audio_model.py +2 -1
  266. autobyteus/multimedia/image/api/autobyteus_image_client.py +19 -5
  267. autobyteus/multimedia/image/api/gemini_image_client.py +38 -17
  268. autobyteus/multimedia/image/api/openai_image_client.py +125 -43
  269. autobyteus/multimedia/image/autobyteus_image_provider.py +2 -1
  270. autobyteus/multimedia/image/image_client_factory.py +47 -15
  271. autobyteus/multimedia/image/image_model.py +5 -2
  272. autobyteus/multimedia/providers.py +3 -2
  273. autobyteus/skills/loader.py +71 -0
  274. autobyteus/skills/model.py +11 -0
  275. autobyteus/skills/registry.py +70 -0
  276. autobyteus/task_management/__init__.py +43 -20
  277. autobyteus/task_management/{base_task_board.py → base_task_plan.py} +16 -13
  278. autobyteus/task_management/converters/__init__.py +2 -2
  279. autobyteus/task_management/converters/{task_board_converter.py → task_plan_converter.py} +13 -13
  280. autobyteus/task_management/events.py +7 -7
  281. autobyteus/task_management/{in_memory_task_board.py → in_memory_task_plan.py} +34 -22
  282. autobyteus/task_management/schemas/__init__.py +3 -0
  283. autobyteus/task_management/schemas/task_status_report.py +2 -2
  284. autobyteus/task_management/schemas/todo_definition.py +15 -0
  285. autobyteus/task_management/todo.py +29 -0
  286. autobyteus/task_management/todo_list.py +75 -0
  287. autobyteus/task_management/tools/__init__.py +24 -8
  288. autobyteus/task_management/tools/task_tools/__init__.py +19 -0
  289. autobyteus/task_management/tools/{assign_task_to.py → task_tools/assign_task_to.py} +18 -18
  290. autobyteus/task_management/tools/{publish_task.py → task_tools/create_task.py} +16 -18
  291. autobyteus/task_management/tools/{publish_tasks.py → task_tools/create_tasks.py} +19 -19
  292. autobyteus/task_management/tools/{get_my_tasks.py → task_tools/get_my_tasks.py} +15 -15
  293. autobyteus/task_management/tools/{get_task_board_status.py → task_tools/get_task_plan_status.py} +16 -16
  294. autobyteus/task_management/tools/{update_task_status.py → task_tools/update_task_status.py} +16 -16
  295. autobyteus/task_management/tools/todo_tools/__init__.py +18 -0
  296. autobyteus/task_management/tools/todo_tools/add_todo.py +78 -0
  297. autobyteus/task_management/tools/todo_tools/create_todo_list.py +79 -0
  298. autobyteus/task_management/tools/todo_tools/get_todo_list.py +55 -0
  299. autobyteus/task_management/tools/todo_tools/update_todo_status.py +85 -0
  300. autobyteus/tools/__init__.py +43 -52
  301. autobyteus/tools/base_tool.py +7 -0
  302. autobyteus/tools/file/__init__.py +9 -0
  303. autobyteus/tools/file/patch_file.py +149 -0
  304. autobyteus/tools/file/{file_reader.py → read_file.py} +38 -7
  305. autobyteus/tools/file/{file_writer.py → write_file.py} +7 -4
  306. autobyteus/tools/functional_tool.py +53 -14
  307. autobyteus/tools/mcp/__init__.py +2 -0
  308. autobyteus/tools/mcp/config_service.py +5 -1
  309. autobyteus/tools/mcp/server/__init__.py +2 -0
  310. autobyteus/tools/mcp/server/http_managed_mcp_server.py +1 -1
  311. autobyteus/tools/mcp/server/websocket_managed_mcp_server.py +141 -0
  312. autobyteus/tools/mcp/server_instance_manager.py +8 -1
  313. autobyteus/tools/mcp/tool.py +3 -3
  314. autobyteus/tools/mcp/tool_registrar.py +5 -2
  315. autobyteus/tools/mcp/types.py +61 -0
  316. autobyteus/tools/multimedia/__init__.py +2 -1
  317. autobyteus/tools/multimedia/audio_tools.py +72 -19
  318. autobyteus/tools/{download_media_tool.py → multimedia/download_media_tool.py} +21 -7
  319. autobyteus/tools/multimedia/image_tools.py +248 -64
  320. autobyteus/tools/multimedia/media_reader_tool.py +1 -1
  321. autobyteus/tools/operation_executor/journal_manager.py +107 -0
  322. autobyteus/tools/operation_executor/operation_event_buffer.py +57 -0
  323. autobyteus/tools/operation_executor/operation_event_producer.py +29 -0
  324. autobyteus/tools/operation_executor/operation_executor.py +58 -0
  325. autobyteus/tools/registry/tool_definition.py +108 -14
  326. autobyteus/tools/registry/tool_registry.py +29 -0
  327. autobyteus/tools/search/__init__.py +17 -0
  328. autobyteus/tools/search/base_strategy.py +35 -0
  329. autobyteus/tools/search/client.py +24 -0
  330. autobyteus/tools/search/factory.py +81 -0
  331. autobyteus/tools/search/google_cse_strategy.py +68 -0
  332. autobyteus/tools/search/providers.py +10 -0
  333. autobyteus/tools/search/serpapi_strategy.py +65 -0
  334. autobyteus/tools/search/serper_strategy.py +87 -0
  335. autobyteus/tools/search_tool.py +83 -0
  336. autobyteus/tools/skill/load_skill.py +50 -0
  337. autobyteus/tools/terminal/__init__.py +45 -0
  338. autobyteus/tools/terminal/ansi_utils.py +32 -0
  339. autobyteus/tools/terminal/background_process_manager.py +233 -0
  340. autobyteus/tools/terminal/output_buffer.py +105 -0
  341. autobyteus/tools/terminal/prompt_detector.py +63 -0
  342. autobyteus/tools/terminal/pty_session.py +241 -0
  343. autobyteus/tools/terminal/session_factory.py +20 -0
  344. autobyteus/tools/terminal/terminal_session_manager.py +226 -0
  345. autobyteus/tools/terminal/tools/__init__.py +13 -0
  346. autobyteus/tools/terminal/tools/get_process_output.py +81 -0
  347. autobyteus/tools/terminal/tools/run_bash.py +109 -0
  348. autobyteus/tools/terminal/tools/start_background_process.py +104 -0
  349. autobyteus/tools/terminal/tools/stop_background_process.py +67 -0
  350. autobyteus/tools/terminal/types.py +54 -0
  351. autobyteus/tools/terminal/wsl_tmux_session.py +221 -0
  352. autobyteus/tools/terminal/wsl_utils.py +156 -0
  353. autobyteus/tools/tool_meta.py +4 -24
  354. autobyteus/tools/transaction_management/backup_handler.py +48 -0
  355. autobyteus/tools/transaction_management/operation_lifecycle_manager.py +62 -0
  356. autobyteus/tools/usage/__init__.py +1 -2
  357. autobyteus/tools/usage/formatters/__init__.py +17 -1
  358. autobyteus/tools/usage/formatters/base_formatter.py +8 -0
  359. autobyteus/tools/usage/formatters/default_xml_schema_formatter.py +2 -2
  360. autobyteus/tools/usage/formatters/mistral_json_schema_formatter.py +18 -0
  361. autobyteus/tools/usage/formatters/patch_file_xml_example_formatter.py +64 -0
  362. autobyteus/tools/usage/formatters/patch_file_xml_schema_formatter.py +31 -0
  363. autobyteus/tools/usage/formatters/run_bash_xml_example_formatter.py +32 -0
  364. autobyteus/tools/usage/formatters/run_bash_xml_schema_formatter.py +36 -0
  365. autobyteus/tools/usage/formatters/write_file_xml_example_formatter.py +53 -0
  366. autobyteus/tools/usage/formatters/write_file_xml_schema_formatter.py +31 -0
  367. autobyteus/tools/usage/providers/tool_manifest_provider.py +10 -10
  368. autobyteus/tools/usage/registries/__init__.py +1 -3
  369. autobyteus/tools/usage/registries/tool_formatting_registry.py +115 -8
  370. autobyteus/tools/usage/tool_schema_provider.py +51 -0
  371. autobyteus/tools/web/__init__.py +4 -0
  372. autobyteus/tools/web/read_url_tool.py +80 -0
  373. autobyteus/utils/diff_utils.py +271 -0
  374. autobyteus/utils/download_utils.py +109 -0
  375. autobyteus/utils/file_utils.py +57 -2
  376. autobyteus/utils/gemini_helper.py +56 -0
  377. autobyteus/utils/gemini_model_mapping.py +71 -0
  378. autobyteus/utils/llm_output_formatter.py +75 -0
  379. autobyteus/utils/tool_call_format.py +36 -0
  380. autobyteus/workflow/agentic_workflow.py +3 -3
  381. autobyteus/workflow/bootstrap_steps/agent_tool_injection_step.py +2 -2
  382. autobyteus/workflow/bootstrap_steps/base_workflow_bootstrap_step.py +2 -2
  383. autobyteus/workflow/bootstrap_steps/coordinator_initialization_step.py +2 -2
  384. autobyteus/workflow/bootstrap_steps/coordinator_prompt_preparation_step.py +4 -11
  385. autobyteus/workflow/bootstrap_steps/workflow_bootstrapper.py +6 -6
  386. autobyteus/workflow/bootstrap_steps/workflow_runtime_queue_initialization_step.py +2 -2
  387. autobyteus/workflow/context/workflow_context.py +3 -3
  388. autobyteus/workflow/context/workflow_runtime_state.py +5 -5
  389. autobyteus/workflow/events/workflow_event_dispatcher.py +5 -5
  390. autobyteus/workflow/handlers/lifecycle_workflow_event_handler.py +3 -3
  391. autobyteus/workflow/handlers/process_user_message_event_handler.py +5 -5
  392. autobyteus/workflow/handlers/tool_approval_workflow_event_handler.py +2 -2
  393. autobyteus/workflow/runtime/workflow_runtime.py +8 -8
  394. autobyteus/workflow/runtime/workflow_worker.py +3 -3
  395. autobyteus/workflow/status/__init__.py +11 -0
  396. autobyteus/workflow/status/workflow_status.py +19 -0
  397. autobyteus/workflow/status/workflow_status_manager.py +48 -0
  398. autobyteus/workflow/streaming/__init__.py +2 -2
  399. autobyteus/workflow/streaming/workflow_event_notifier.py +7 -7
  400. autobyteus/workflow/streaming/workflow_stream_event_payloads.py +4 -4
  401. autobyteus/workflow/streaming/workflow_stream_events.py +3 -3
  402. autobyteus/workflow/utils/wait_for_idle.py +4 -4
  403. autobyteus-1.2.3.dist-info/METADATA +293 -0
  404. autobyteus-1.2.3.dist-info/RECORD +600 -0
  405. {autobyteus-1.2.0.dist-info → autobyteus-1.2.3.dist-info}/WHEEL +1 -1
  406. {autobyteus-1.2.0.dist-info → autobyteus-1.2.3.dist-info}/top_level.txt +0 -1
  407. autobyteus/agent/bootstrap_steps/agent_runtime_queue_initialization_step.py +0 -57
  408. autobyteus/agent/hooks/__init__.py +0 -16
  409. autobyteus/agent/hooks/base_phase_hook.py +0 -78
  410. autobyteus/agent/hooks/hook_definition.py +0 -36
  411. autobyteus/agent/hooks/hook_meta.py +0 -37
  412. autobyteus/agent/hooks/hook_registry.py +0 -106
  413. autobyteus/agent/llm_response_processor/provider_aware_tool_usage_processor.py +0 -103
  414. autobyteus/agent/phases/__init__.py +0 -18
  415. autobyteus/agent/phases/discover.py +0 -53
  416. autobyteus/agent/phases/manager.py +0 -265
  417. autobyteus/agent/phases/transition_decorator.py +0 -40
  418. autobyteus/agent/phases/transition_info.py +0 -33
  419. autobyteus/agent/remote_agent.py +0 -244
  420. autobyteus/agent/workspace/workspace_definition.py +0 -36
  421. autobyteus/agent/workspace/workspace_meta.py +0 -37
  422. autobyteus/agent/workspace/workspace_registry.py +0 -72
  423. autobyteus/agent_team/bootstrap_steps/agent_team_runtime_queue_initialization_step.py +0 -25
  424. autobyteus/agent_team/bootstrap_steps/coordinator_prompt_preparation_step.py +0 -85
  425. autobyteus/agent_team/phases/__init__.py +0 -11
  426. autobyteus/agent_team/phases/agent_team_operational_phase.py +0 -19
  427. autobyteus/agent_team/phases/agent_team_phase_manager.py +0 -48
  428. autobyteus/llm/api/bedrock_llm.py +0 -92
  429. autobyteus/llm/api/groq_llm.py +0 -94
  430. autobyteus/llm/api/nvidia_llm.py +0 -108
  431. autobyteus/llm/utils/token_pricing_config.py +0 -87
  432. autobyteus/person/examples/sample_persons.py +0 -14
  433. autobyteus/person/examples/sample_roles.py +0 -14
  434. autobyteus/person/person.py +0 -29
  435. autobyteus/person/role.py +0 -14
  436. autobyteus/rpc/__init__.py +0 -73
  437. autobyteus/rpc/client/__init__.py +0 -17
  438. autobyteus/rpc/client/abstract_client_connection.py +0 -124
  439. autobyteus/rpc/client/client_connection_manager.py +0 -153
  440. autobyteus/rpc/client/sse_client_connection.py +0 -306
  441. autobyteus/rpc/client/stdio_client_connection.py +0 -280
  442. autobyteus/rpc/config/__init__.py +0 -13
  443. autobyteus/rpc/config/agent_server_config.py +0 -153
  444. autobyteus/rpc/config/agent_server_registry.py +0 -152
  445. autobyteus/rpc/hosting.py +0 -244
  446. autobyteus/rpc/protocol.py +0 -244
  447. autobyteus/rpc/server/__init__.py +0 -20
  448. autobyteus/rpc/server/agent_server_endpoint.py +0 -181
  449. autobyteus/rpc/server/base_method_handler.py +0 -40
  450. autobyteus/rpc/server/method_handlers.py +0 -259
  451. autobyteus/rpc/server/sse_server_handler.py +0 -182
  452. autobyteus/rpc/server/stdio_server_handler.py +0 -151
  453. autobyteus/rpc/server_main.py +0 -198
  454. autobyteus/rpc/transport_type.py +0 -13
  455. autobyteus/tools/bash/__init__.py +0 -2
  456. autobyteus/tools/bash/bash_executor.py +0 -100
  457. autobyteus/tools/browser/__init__.py +0 -2
  458. autobyteus/tools/browser/session_aware/__init__.py +0 -0
  459. autobyteus/tools/browser/session_aware/browser_session_aware_navigate_to.py +0 -75
  460. autobyteus/tools/browser/session_aware/browser_session_aware_tool.py +0 -30
  461. autobyteus/tools/browser/session_aware/browser_session_aware_web_element_trigger.py +0 -154
  462. autobyteus/tools/browser/session_aware/browser_session_aware_webpage_reader.py +0 -89
  463. autobyteus/tools/browser/session_aware/browser_session_aware_webpage_screenshot_taker.py +0 -107
  464. autobyteus/tools/browser/session_aware/factory/__init__.py +0 -0
  465. autobyteus/tools/browser/session_aware/factory/browser_session_aware_web_element_trigger_factory.py +0 -14
  466. autobyteus/tools/browser/session_aware/factory/browser_session_aware_webpage_reader_factory.py +0 -26
  467. autobyteus/tools/browser/session_aware/factory/browser_session_aware_webpage_screenshot_taker_factory.py +0 -14
  468. autobyteus/tools/browser/session_aware/shared_browser_session.py +0 -11
  469. autobyteus/tools/browser/session_aware/shared_browser_session_manager.py +0 -25
  470. autobyteus/tools/browser/session_aware/web_element_action.py +0 -20
  471. autobyteus/tools/browser/standalone/__init__.py +0 -6
  472. autobyteus/tools/browser/standalone/factory/__init__.py +0 -0
  473. autobyteus/tools/browser/standalone/factory/webpage_reader_factory.py +0 -25
  474. autobyteus/tools/browser/standalone/factory/webpage_screenshot_taker_factory.py +0 -14
  475. autobyteus/tools/browser/standalone/navigate_to.py +0 -80
  476. autobyteus/tools/browser/standalone/web_page_pdf_generator.py +0 -97
  477. autobyteus/tools/browser/standalone/webpage_image_downloader.py +0 -165
  478. autobyteus/tools/browser/standalone/webpage_reader.py +0 -101
  479. autobyteus/tools/browser/standalone/webpage_screenshot_taker.py +0 -101
  480. autobyteus/tools/file/file_editor.py +0 -200
  481. autobyteus/tools/google_search.py +0 -149
  482. autobyteus/tools/timer.py +0 -171
  483. autobyteus/tools/usage/parsers/__init__.py +0 -22
  484. autobyteus/tools/usage/parsers/_json_extractor.py +0 -99
  485. autobyteus/tools/usage/parsers/_string_decoders.py +0 -18
  486. autobyteus/tools/usage/parsers/anthropic_xml_tool_usage_parser.py +0 -10
  487. autobyteus/tools/usage/parsers/base_parser.py +0 -41
  488. autobyteus/tools/usage/parsers/default_json_tool_usage_parser.py +0 -83
  489. autobyteus/tools/usage/parsers/default_xml_tool_usage_parser.py +0 -316
  490. autobyteus/tools/usage/parsers/exceptions.py +0 -13
  491. autobyteus/tools/usage/parsers/gemini_json_tool_usage_parser.py +0 -77
  492. autobyteus/tools/usage/parsers/openai_json_tool_usage_parser.py +0 -149
  493. autobyteus/tools/usage/parsers/provider_aware_tool_usage_parser.py +0 -59
  494. autobyteus/tools/usage/registries/tool_usage_parser_registry.py +0 -62
  495. autobyteus/workflow/phases/__init__.py +0 -11
  496. autobyteus/workflow/phases/workflow_operational_phase.py +0 -19
  497. autobyteus/workflow/phases/workflow_phase_manager.py +0 -48
  498. autobyteus-1.2.0.dist-info/METADATA +0 -205
  499. autobyteus-1.2.0.dist-info/RECORD +0 -496
  500. examples/__init__.py +0 -1
  501. examples/agent_team/__init__.py +0 -1
  502. examples/discover_phase_transitions.py +0 -104
  503. examples/run_browser_agent.py +0 -262
  504. examples/run_google_slides_agent.py +0 -287
  505. examples/run_mcp_browser_client.py +0 -174
  506. examples/run_mcp_google_slides_client.py +0 -270
  507. examples/run_mcp_list_tools.py +0 -189
  508. examples/run_poem_writer.py +0 -284
  509. examples/run_sqlite_agent.py +0 -295
  510. /autobyteus/{person → skills}/__init__.py +0 -0
  511. /autobyteus/{person/examples → tools/skill}/__init__.py +0 -0
  512. {autobyteus-1.2.0.dist-info → autobyteus-1.2.3.dist-info}/licenses/LICENSE +0 -0
@@ -1,129 +1,4 @@
1
- # file: autobyteus/autobyteus/agent/streaming/stream_events.py
2
- import logging
3
- from enum import Enum
4
- from typing import Dict, Any, Optional, Union, Type
5
- from pydantic import BaseModel, Field, AwareDatetime, field_validator, ValidationInfo
6
- import datetime
7
- import uuid
1
+ """Compatibility shim for stream events."""
2
+ from .events.stream_events import *
8
3
 
9
- # Import the payload models
10
- from .stream_event_payloads import (
11
- StreamDataPayload,
12
- AssistantChunkData,
13
- AssistantCompleteResponseData,
14
- ToolInteractionLogEntryData,
15
- AgentOperationalPhaseTransitionData,
16
- ErrorEventData,
17
- ToolInvocationApprovalRequestedData,
18
- ToolInvocationAutoExecutingData,
19
- SystemTaskNotificationData, # NEW
20
- EmptyData
21
- )
22
-
23
- logger = logging.getLogger(__name__)
24
-
25
- class StreamEventType(str, Enum):
26
- """
27
- Defines the types of events that can appear in a unified agent output stream
28
- provided by AgentEventStream.
29
- """
30
- ASSISTANT_CHUNK = "assistant_chunk"
31
- ASSISTANT_COMPLETE_RESPONSE = "assistant_complete_response"
32
- TOOL_INTERACTION_LOG_ENTRY = "tool_interaction_log_entry"
33
- AGENT_OPERATIONAL_PHASE_TRANSITION = "agent_operational_phase_transition"
34
- ERROR_EVENT = "error_event"
35
- TOOL_INVOCATION_APPROVAL_REQUESTED = "tool_invocation_approval_requested"
36
- TOOL_INVOCATION_AUTO_EXECUTING = "tool_invocation_auto_executing"
37
- SYSTEM_TASK_NOTIFICATION = "system_task_notification" # NEW
38
- AGENT_IDLE = "agent_idle"
39
-
40
-
41
- _STREAM_EVENT_TYPE_TO_PAYLOAD_CLASS: Dict[StreamEventType, Type[BaseModel]] = {
42
- StreamEventType.ASSISTANT_CHUNK: AssistantChunkData,
43
- StreamEventType.ASSISTANT_COMPLETE_RESPONSE: AssistantCompleteResponseData,
44
- StreamEventType.TOOL_INTERACTION_LOG_ENTRY: ToolInteractionLogEntryData,
45
- StreamEventType.AGENT_OPERATIONAL_PHASE_TRANSITION: AgentOperationalPhaseTransitionData,
46
- StreamEventType.ERROR_EVENT: ErrorEventData,
47
- StreamEventType.TOOL_INVOCATION_APPROVAL_REQUESTED: ToolInvocationApprovalRequestedData,
48
- StreamEventType.TOOL_INVOCATION_AUTO_EXECUTING: ToolInvocationAutoExecutingData,
49
- StreamEventType.SYSTEM_TASK_NOTIFICATION: SystemTaskNotificationData, # NEW
50
- StreamEventType.AGENT_IDLE: AgentOperationalPhaseTransitionData,
51
- }
52
-
53
-
54
- class StreamEvent(BaseModel):
55
- """
56
- Pydantic model for a unified, typed event in an agent's output stream.
57
- The 'data' field is now a discriminated union of specific payload models
58
- based on 'event_type'.
59
- """
60
- event_id: str = Field(
61
- default_factory=lambda: str(uuid.uuid4()),
62
- description="Unique identifier for the event."
63
- )
64
- timestamp: AwareDatetime = Field(
65
- default_factory=lambda: datetime.datetime.now(datetime.timezone.utc),
66
- description="Timestamp of when the event was created (UTC)."
67
- )
68
- event_type: StreamEventType = Field(
69
- ...,
70
- description="The type of the event. This acts as the discriminator."
71
- )
72
- data: StreamDataPayload = Field(
73
- ...,
74
- description="Payload of the event, specific to the event_type."
75
- )
76
- agent_id: Optional[str] = Field(
77
- default=None,
78
- description="Optional ID of the agent that originated this event."
79
- )
80
-
81
- @field_validator('data', mode='before')
82
- def validate_data_based_on_event_type(cls, v, info: ValidationInfo):
83
- event_type_value = info.data.get('event_type')
84
- if not event_type_value:
85
- return v
86
-
87
- if isinstance(event_type_value, str):
88
- try:
89
- event_type = StreamEventType(event_type_value)
90
- except ValueError: # pragma: no cover
91
- logger.error(f"Invalid event_type string '{event_type_value}' for validation.")
92
- raise ValueError(f"Invalid event_type string '{event_type_value}'")
93
- elif isinstance(event_type_value, StreamEventType):
94
- event_type = event_type_value
95
- else: # pragma: no cover
96
- logger.error(f"event_type is of unexpected type {type(event_type_value)} during validation.")
97
- raise TypeError(f"event_type is of unexpected type {type(event_type_value)}")
98
-
99
-
100
- payload_class = _STREAM_EVENT_TYPE_TO_PAYLOAD_CLASS.get(event_type)
101
-
102
- if payload_class:
103
- if isinstance(v, payload_class):
104
- return v
105
- if isinstance(v, dict):
106
- try:
107
- return payload_class(**v)
108
- except Exception as e:
109
- logger.error(f"Failed to parse dict into {payload_class.__name__} for event_type {event_type.value}: {e}. Dict was: {v}")
110
- raise ValueError(f"Data for event type {event_type.value} does not match expected model {payload_class.__name__}.") from e
111
- logger.error(f"Data for event type {event_type.value} is of unexpected type {type(v)}. Expected dict or {payload_class.__name__}.")
112
- raise ValueError(f"Data for event type {event_type.value} is of unexpected type {type(v)}.")
113
-
114
- logger.warning(f"No specific payload class mapped for event_type: {event_type.value}. Raw data: {v}")
115
- if isinstance(v, dict):
116
- return v
117
- return v
118
-
119
-
120
- class Config:
121
- populate_by_name = True
122
-
123
- def __repr__(self) -> str:
124
- return (f"<StreamEvent event_id='{self.event_id}', agent_id='{self.agent_id}', "
125
- f"type='{self.event_type.value}', timestamp='{self.timestamp.isoformat()}', data_type='{type(self.data).__name__}'>")
126
-
127
- def __str__(self) -> str:
128
- return (f"StreamEvent[{self.event_type.value}] (ID: {self.event_id}, Agent: {self.agent_id or 'N/A'}): "
129
- f"Data: {self.data!r}")
4
+ __all__ = ["StreamEvent", "StreamEventType"]
@@ -0,0 +1,4 @@
1
+ """Compatibility shim for StreamingResponseHandlerFactory."""
2
+ from .handlers.streaming_handler_factory import StreamingResponseHandlerFactory
3
+
4
+ __all__ = ["StreamingResponseHandlerFactory"]
@@ -0,0 +1,4 @@
1
+ """Compatibility shim for StreamingResponseHandler."""
2
+ from .handlers.streaming_response_handler import StreamingResponseHandler
3
+
4
+ __all__ = ["StreamingResponseHandler"]
@@ -0,0 +1,5 @@
1
+ """Stream implementations for agents/teams."""
2
+
3
+ from .agent_event_stream import AgentEventStream
4
+
5
+ __all__ = ["AgentEventStream"]
@@ -0,0 +1,197 @@
1
+ # file: autobyteus/autobyteus/agent/streaming/agent_event_stream.py
2
+ import asyncio
3
+ import logging
4
+ import queue as standard_queue
5
+ from typing import AsyncIterator, Any, TYPE_CHECKING, Optional, Union
6
+ from ..events.stream_events import StreamEvent, StreamEventType
7
+ from ..events.stream_event_payloads import (
8
+ create_assistant_chunk_data,
9
+ create_assistant_complete_response_data,
10
+ create_tool_interaction_log_entry_data,
11
+ create_agent_status_update_data,
12
+ create_error_event_data,
13
+ create_tool_invocation_approval_requested_data,
14
+ create_tool_invocation_auto_executing_data,
15
+ create_segment_event_data,
16
+ create_system_task_notification_data, # NEW
17
+ create_inter_agent_message_data, # NEW
18
+ create_todo_list_update_data,
19
+ create_artifact_persisted_data, # NEW
20
+ create_artifact_updated_data, # NEW
21
+ AssistantChunkData,
22
+ AssistantCompleteResponseData,
23
+ ToolInteractionLogEntryData,
24
+ AgentStatusUpdateData,
25
+ ToolInvocationApprovalRequestedData,
26
+ ToolInvocationAutoExecutingData,
27
+ SegmentEventData,
28
+ ErrorEventData,
29
+ SystemTaskNotificationData, # NEW
30
+ InterAgentMessageData, # NEW
31
+ ToDoListUpdateData,
32
+ ArtifactPersistedData, # NEW
33
+ ArtifactUpdatedData, # NEW
34
+ StreamDataPayload,
35
+ )
36
+ from ..utils.queue_streamer import stream_queue_items
37
+ from autobyteus.events.event_types import EventType
38
+ from autobyteus.events.event_emitter import EventEmitter
39
+
40
+ if TYPE_CHECKING:
41
+ from autobyteus.agent.agent import Agent
42
+ from autobyteus.agent.events.notifiers import AgentExternalEventNotifier
43
+
44
+ logger = logging.getLogger(__name__)
45
+
46
+ _AES_INTERNAL_SENTINEL = object()
47
+
48
+ class AgentEventStream(EventEmitter):
49
+ def __init__(self, agent: 'Agent'):
50
+ super().__init__()
51
+
52
+ from autobyteus.agent.agent import Agent as ConcreteAgent
53
+ if not isinstance(agent, ConcreteAgent):
54
+ raise TypeError(f"AgentEventStream requires an Agent instance, got {type(agent).__name__}.")
55
+
56
+ self.agent_id: str = agent.agent_id
57
+
58
+ self._generic_stream_event_internal_q: standard_queue.Queue[Union[StreamEvent, object]] = standard_queue.Queue()
59
+
60
+ self._notifier: Optional['AgentExternalEventNotifier'] = None
61
+ if agent.context and agent.context.status_manager:
62
+ self._notifier = agent.context.status_manager.notifier
63
+
64
+ if not self._notifier:
65
+ logger.error(f"AgentEventStream for '{self.agent_id}': Notifier not available. No events will be streamed.")
66
+ return
67
+
68
+ self._register_listeners()
69
+
70
+ logger.info(f"AgentEventStream (ID: {self.object_id}) initialized for agent_id '{self.agent_id}'. Subscribed to notifier.")
71
+
72
+ def _register_listeners(self):
73
+ """Subscribes this instance's handler to all relevant events from the notifier."""
74
+ all_agent_event_types = [et for et in EventType if et.name.startswith("AGENT_")]
75
+
76
+ for event_type in all_agent_event_types:
77
+ self.subscribe_from(self._notifier, event_type, self._handle_notifier_event_sync)
78
+
79
+ def _handle_notifier_event_sync(self, event_type: EventType, payload: Optional[Any] = None, object_id: Optional[str] = None, **kwargs):
80
+ event_agent_id = kwargs.get("agent_id", self.agent_id)
81
+
82
+ typed_payload_for_stream_event: Optional[StreamDataPayload] = None
83
+ stream_event_type_for_generic_stream: Optional[StreamEventType] = None
84
+
85
+ try:
86
+ if event_type == EventType.AGENT_STATUS_UPDATED:
87
+ typed_payload_for_stream_event = create_agent_status_update_data(payload)
88
+ stream_event_type_for_generic_stream = StreamEventType.AGENT_STATUS_UPDATED
89
+ elif event_type == EventType.AGENT_DATA_ASSISTANT_CHUNK:
90
+ typed_payload_for_stream_event = create_assistant_chunk_data(payload)
91
+ stream_event_type_for_generic_stream = StreamEventType.ASSISTANT_CHUNK
92
+ elif event_type == EventType.AGENT_DATA_ASSISTANT_COMPLETE_RESPONSE:
93
+ typed_payload_for_stream_event = create_assistant_complete_response_data(payload)
94
+ stream_event_type_for_generic_stream = StreamEventType.ASSISTANT_COMPLETE_RESPONSE
95
+ elif event_type == EventType.AGENT_DATA_TOOL_LOG:
96
+ typed_payload_for_stream_event = create_tool_interaction_log_entry_data(payload)
97
+ stream_event_type_for_generic_stream = StreamEventType.TOOL_INTERACTION_LOG_ENTRY
98
+ elif event_type == EventType.AGENT_REQUEST_TOOL_INVOCATION_APPROVAL:
99
+ typed_payload_for_stream_event = create_tool_invocation_approval_requested_data(payload)
100
+ stream_event_type_for_generic_stream = StreamEventType.TOOL_INVOCATION_APPROVAL_REQUESTED
101
+ elif event_type == EventType.AGENT_TOOL_INVOCATION_AUTO_EXECUTING:
102
+ typed_payload_for_stream_event = create_tool_invocation_auto_executing_data(payload)
103
+ stream_event_type_for_generic_stream = StreamEventType.TOOL_INVOCATION_AUTO_EXECUTING
104
+ elif event_type == EventType.AGENT_DATA_SEGMENT_EVENT:
105
+ typed_payload_for_stream_event = create_segment_event_data(payload)
106
+ stream_event_type_for_generic_stream = StreamEventType.SEGMENT_EVENT
107
+ elif event_type == EventType.AGENT_ERROR_OUTPUT_GENERATION:
108
+ typed_payload_for_stream_event = create_error_event_data(payload)
109
+ stream_event_type_for_generic_stream = StreamEventType.ERROR_EVENT
110
+ # NEW MAPPING
111
+ elif event_type == EventType.AGENT_DATA_SYSTEM_TASK_NOTIFICATION_RECEIVED:
112
+ typed_payload_for_stream_event = create_system_task_notification_data(payload)
113
+ stream_event_type_for_generic_stream = StreamEventType.SYSTEM_TASK_NOTIFICATION
114
+ elif event_type == EventType.AGENT_DATA_INTER_AGENT_MESSAGE_RECEIVED:
115
+ typed_payload_for_stream_event = create_inter_agent_message_data(payload)
116
+ stream_event_type_for_generic_stream = StreamEventType.INTER_AGENT_MESSAGE
117
+ elif event_type == EventType.AGENT_DATA_TODO_LIST_UPDATED:
118
+ typed_payload_for_stream_event = create_todo_list_update_data(payload)
119
+ stream_event_type_for_generic_stream = StreamEventType.AGENT_TODO_LIST_UPDATE
120
+ # NEW MAPPING
121
+ elif event_type == EventType.AGENT_ARTIFACT_PERSISTED:
122
+ typed_payload_for_stream_event = create_artifact_persisted_data(payload)
123
+ stream_event_type_for_generic_stream = StreamEventType.ARTIFACT_PERSISTED
124
+ elif event_type == EventType.AGENT_ARTIFACT_UPDATED:
125
+ typed_payload_for_stream_event = create_artifact_updated_data(payload)
126
+ stream_event_type_for_generic_stream = StreamEventType.ARTIFACT_UPDATED
127
+
128
+ elif event_type == EventType.AGENT_DATA_TOOL_LOG_STREAM_END:
129
+ pass
130
+ else:
131
+ logger.debug(f"AgentEventStream received internal event '{event_type.name}' with no direct stream mapping.")
132
+
133
+ except Exception as e:
134
+ logger.error(f"AgentEventStream error processing payload for event '{event_type.name}': {e}", exc_info=True)
135
+
136
+ if typed_payload_for_stream_event and stream_event_type_for_generic_stream:
137
+ stream_event = StreamEvent(
138
+ agent_id=event_agent_id,
139
+ event_type=stream_event_type_for_generic_stream,
140
+ data=typed_payload_for_stream_event
141
+ )
142
+ self._generic_stream_event_internal_q.put(stream_event)
143
+
144
+ async def close(self):
145
+ logger.info(f"AgentEventStream (ID: {self.object_id}) for '{self.agent_id}': close() called. Unsubscribing all listeners and signaling.")
146
+ self.unsubscribe_all_listeners()
147
+ # Standard queue.put is non-blocking for the unbounded queue we use here.
148
+ self._generic_stream_event_internal_q.put(_AES_INTERNAL_SENTINEL)
149
+
150
+ async def all_events(self) -> AsyncIterator[StreamEvent]:
151
+ """The primary method to consume all structured events from the agent."""
152
+ async for event in stream_queue_items(self._generic_stream_event_internal_q, _AES_INTERNAL_SENTINEL, f"agent_{self.agent_id}_all_events"):
153
+ yield event
154
+
155
+ # --- Convenience Stream Methods ---
156
+
157
+ async def stream_assistant_chunks(self) -> AsyncIterator[AssistantChunkData]:
158
+ """A convenience async generator that yields only assistant content/reasoning chunks."""
159
+ async for event in self.all_events():
160
+ if event.event_type == StreamEventType.ASSISTANT_CHUNK and isinstance(event.data, AssistantChunkData):
161
+ yield event.data
162
+
163
+ async def stream_assistant_final_response(self) -> AsyncIterator[AssistantCompleteResponseData]:
164
+ """A convenience async generator that yields only the final, complete assistant responses."""
165
+ async for event in self.all_events():
166
+ if event.event_type == StreamEventType.ASSISTANT_COMPLETE_RESPONSE and isinstance(event.data, AssistantCompleteResponseData):
167
+ yield event.data
168
+
169
+ async def stream_tool_logs(self) -> AsyncIterator[ToolInteractionLogEntryData]:
170
+ """A convenience async generator that yields only tool interaction log entries."""
171
+ async for event in self.all_events():
172
+ if event.event_type == StreamEventType.TOOL_INTERACTION_LOG_ENTRY and isinstance(event.data, ToolInteractionLogEntryData):
173
+ yield event.data
174
+
175
+ async def stream_status_updates(self) -> AsyncIterator[AgentStatusUpdateData]:
176
+ """A convenience async generator that yields only agent status update data."""
177
+ async for event in self.all_events():
178
+ if event.event_type == StreamEventType.AGENT_STATUS_UPDATED and isinstance(event.data, AgentStatusUpdateData):
179
+ yield event.data
180
+
181
+ async def stream_tool_approval_requests(self) -> AsyncIterator[ToolInvocationApprovalRequestedData]:
182
+ """A convenience async generator that yields only requests for tool invocation approval."""
183
+ async for event in self.all_events():
184
+ if event.event_type == StreamEventType.TOOL_INVOCATION_APPROVAL_REQUESTED and isinstance(event.data, ToolInvocationApprovalRequestedData):
185
+ yield event.data
186
+
187
+ async def stream_tool_auto_executing(self) -> AsyncIterator[ToolInvocationAutoExecutingData]:
188
+ """A convenience async generator that yields only events for tools being auto-executed."""
189
+ async for event in self.all_events():
190
+ if event.event_type == StreamEventType.TOOL_INVOCATION_AUTO_EXECUTING and isinstance(event.data, ToolInvocationAutoExecutingData):
191
+ yield event.data
192
+
193
+ async def stream_errors(self) -> AsyncIterator[ErrorEventData]:
194
+ """A convenience async generator that yields only error events."""
195
+ async for event in self.all_events():
196
+ if event.event_type == StreamEventType.ERROR_EVENT and isinstance(event.data, ErrorEventData):
197
+ yield event.data
@@ -0,0 +1,5 @@
1
+ """Streaming utilities."""
2
+
3
+ from .queue_streamer import stream_queue_items
4
+
5
+ __all__ = ["stream_queue_items"]
@@ -0,0 +1,59 @@
1
+ # file: autobyteus/autobyteus/agent/streaming/queue_streamer.py
2
+ import asyncio
3
+ import logging
4
+ from typing import TypeVar, AsyncIterator, Union, Any
5
+ import queue as standard_queue
6
+
7
+ logger = logging.getLogger(__name__)
8
+
9
+ T = TypeVar('T')
10
+
11
+ async def stream_queue_items(
12
+ queue: standard_queue.Queue[Union[T, object]],
13
+ sentinel: object,
14
+ source_name: str = "unspecified_queue"
15
+ ) -> AsyncIterator[T]:
16
+ """
17
+ Asynchronously iterates over a standard `queue.Queue`, yielding items of type T
18
+ until a specific sentinel object is encountered. This is designed to be used
19
+ from an async context to consume from a queue populated by a synchronous/threaded context.
20
+
21
+ Args:
22
+ queue: The standard `queue.Queue` to stream items from.
23
+ sentinel: The unique object used to signal the end of data in the queue.
24
+ source_name: An optional identifier for the queue source, used in logging.
25
+
26
+ Yields:
27
+ Items of type T from the queue.
28
+
29
+ Raises:
30
+ TypeError: If queue is not a `queue.Queue`.
31
+ ValueError: If sentinel is None.
32
+ asyncio.CancelledError: If the generator is cancelled.
33
+ Exception: Propagates exceptions encountered during queue.get().
34
+ """
35
+ if not isinstance(queue, standard_queue.Queue):
36
+ raise TypeError(f"queue must be an instance of queue.Queue for source '{source_name}'.")
37
+ if sentinel is None:
38
+ raise ValueError(f"sentinel object cannot be None for source '{source_name}'.")
39
+
40
+ logger.debug(f"Starting to stream items from queue '{source_name}'.")
41
+ try:
42
+ while True:
43
+ try:
44
+ item: Any = queue.get_nowait()
45
+ except standard_queue.Empty:
46
+ await asyncio.sleep(0.01)
47
+ continue
48
+ if item is sentinel:
49
+ logger.debug(f"Sentinel {sentinel!r} received from queue '{source_name}'. Ending stream.")
50
+ break
51
+ yield item # type: ignore
52
+ except asyncio.CancelledError:
53
+ logger.info(f"Stream from queue '{source_name}' was cancelled.")
54
+ raise
55
+ except Exception as e:
56
+ logger.error(f"Error streaming from queue '{source_name}': {e}", exc_info=True)
57
+ raise
58
+ finally:
59
+ logger.debug(f"Exiting stream_queue_items for queue '{source_name}'.")
@@ -6,9 +6,11 @@ from .base_processor import BaseSystemPromptProcessor
6
6
 
7
7
  # Import concrete processors here to make them easily accessible for instantiation
8
8
  from .tool_manifest_injector_processor import ToolManifestInjectorProcessor
9
+ from .available_skills_processor import AvailableSkillsProcessor
9
10
 
10
11
 
11
12
  __all__ = [
12
13
  "BaseSystemPromptProcessor",
13
14
  "ToolManifestInjectorProcessor",
15
+ "AvailableSkillsProcessor",
14
16
  ]
@@ -0,0 +1,96 @@
1
+ import logging
2
+ from typing import TYPE_CHECKING, Dict
3
+ from autobyteus.agent.system_prompt_processor.base_processor import BaseSystemPromptProcessor
4
+ from autobyteus.skills.registry import SkillRegistry
5
+
6
+ if TYPE_CHECKING:
7
+ from autobyteus.tools.base_tool import BaseTool
8
+ from autobyteus.agent.context import AgentContext
9
+
10
+ logger = logging.getLogger(__name__)
11
+
12
+ class AvailableSkillsProcessor(BaseSystemPromptProcessor):
13
+ """
14
+ A system prompt processor that injects information about available skills.
15
+ For preloaded skills (defined in config), it injects the full map.
16
+ For other skills, it injects a summary (awareness).
17
+ """
18
+
19
+ @classmethod
20
+ def get_name(cls) -> str:
21
+ return "AvailableSkillsProcessor"
22
+
23
+ @classmethod
24
+ def is_mandatory(cls) -> bool:
25
+ return True
26
+
27
+ def process(self,
28
+ system_prompt: str,
29
+ tool_instances: Dict[str, 'BaseTool'],
30
+ agent_id: str,
31
+ context: 'AgentContext') -> str:
32
+ registry = SkillRegistry()
33
+ all_skills = registry.list_skills()
34
+
35
+ if not all_skills:
36
+ logger.info(f"Agent '{agent_id}': No skills found in registry. Skipping injection.")
37
+ return system_prompt
38
+
39
+ # Preloaded skills from config
40
+ preloaded_skills_names = getattr(context.config, 'skills', [])
41
+
42
+ # Build catalog (table of contents) for all skills
43
+ catalog_entries = []
44
+ detailed_sections = []
45
+
46
+ for skill in all_skills:
47
+ # Every skill goes in the catalog
48
+ catalog_entries.append(f"- **{skill.name}**: {skill.description}")
49
+
50
+ # Preloaded skills also get detailed content
51
+ if skill.name in preloaded_skills_names:
52
+ detailed_sections.append(
53
+ f"""#### {skill.name}
54
+ **Root Path:** `{skill.root_path}`
55
+
56
+ {skill.content}""")
57
+
58
+ # Build the skills block
59
+ skills_block = "\n\n## Agent Skills\n"
60
+
61
+ # Catalog section (like table of contents)
62
+ skills_block += "### Skill Catalog\n"
63
+ skills_block += "\n".join(catalog_entries) + "\n"
64
+ skills_block += "\nTo load a skill not shown in detail below, use the `load_skill` tool.\n"
65
+
66
+ # Critical rules section (applies to ALL skills)
67
+ if detailed_sections:
68
+ skills_block += """
69
+ ### Critical Rules for Using Skills
70
+
71
+ > **Path Resolution Required for Skill Files**
72
+ >
73
+ > Skill instructions use relative paths (e.g., `./scripts/run.sh` or `scripts/run.sh`) to refer to internal files.
74
+ > However, standard tools resolve relative paths against the User's Workspace, not the skill directory.
75
+ >
76
+ > When using ANY file from a skill, you MUST convert its path to ABSOLUTE:
77
+ > `Root Path` + `Relative Path` = `Absolute Path`
78
+ >
79
+ > **Examples:**
80
+ > 1. Root Path: `/path/to/skill`
81
+ > Relative: `./scripts/run.sh`
82
+ > Result: `/path/to/skill/scripts/run.sh`
83
+ >
84
+ > 2. Root Path: `/path/to/skill`
85
+ > Relative: `scripts/run.sh`
86
+ > Result: `/path/to/skill/scripts/run.sh`
87
+
88
+ """
89
+
90
+ # Detailed content section (like reading specific chapters)
91
+ if detailed_sections:
92
+ skills_block += "### Skill Details\n"
93
+ skills_block += "\n".join(detailed_sections) + "\n"
94
+
95
+ logger.info(f"Agent '{agent_id}': Injected {len(catalog_entries)} skills in catalog, {len(detailed_sections)} with details.")
96
+ return system_prompt + skills_block
@@ -61,4 +61,4 @@ class BaseSystemPromptProcessor(ABC, metaclass=SystemPromptProcessorMeta):
61
61
  raise NotImplementedError("Subclasses must implement the 'process' method.")
62
62
 
63
63
  def __repr__(self) -> str:
64
- return f"&lt;{self.__class__.__name__}&gt;"
64
+ return f"<{self.__class__.__name__}>"
@@ -26,12 +26,25 @@ class SystemPromptProcessorMeta(ABCMeta):
26
26
  logger.debug(f"Skipping registration for abstract system prompt processor class: {name}")
27
27
  return
28
28
 
29
+ if "get_name" not in dct:
30
+ logger.error(
31
+ f"System prompt processor class {name} is missing required static/class method 'get_name'. Skipping registration."
32
+ )
33
+ return
34
+
29
35
  try:
30
36
  # Get static/class info from the class being defined
31
- processor_name = cls.get_name()
37
+ try:
38
+ processor_name = cls.get_name()
39
+ except TypeError:
40
+ # Fallback for instance-level get_name overrides
41
+ instance = cls()
42
+ processor_name = instance.get_name()
32
43
 
33
44
  if not processor_name or not isinstance(processor_name, str):
34
- logger.error(f"System prompt processor class {name} must return a valid string from static get_name(). Skipping registration.")
45
+ logger.error(
46
+ f"System prompt processor class {name} must return a valid string from static get_name(). Skipping registration."
47
+ )
35
48
  return
36
49
 
37
50
  # Create definition using name and the class itself