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,10 +1,35 @@
1
- from typing import Dict, Union, List, Optional
1
+ from dataclasses import dataclass
2
+ from typing import Dict, Union, List, Optional, Any
2
3
  from enum import Enum
3
4
 
4
5
  class MessageRole(Enum):
5
6
  SYSTEM = "system"
6
7
  USER = "user"
7
8
  ASSISTANT = "assistant"
9
+ TOOL = "tool"
10
+
11
+ @dataclass
12
+ class ToolCallSpec:
13
+ id: str
14
+ name: str
15
+ arguments: Dict[str, Any]
16
+
17
+
18
+ @dataclass
19
+ class ToolCallPayload:
20
+ tool_calls: List[ToolCallSpec]
21
+
22
+
23
+ @dataclass
24
+ class ToolResultPayload:
25
+ tool_call_id: str
26
+ tool_name: str
27
+ tool_result: Any
28
+ tool_error: Optional[str] = None
29
+
30
+
31
+ ToolPayload = Union[ToolCallPayload, ToolResultPayload]
32
+
8
33
 
9
34
  class Message:
10
35
  def __init__(self,
@@ -13,7 +38,8 @@ class Message:
13
38
  reasoning_content: Optional[str] = None,
14
39
  image_urls: Optional[List[str]] = None,
15
40
  audio_urls: Optional[List[str]] = None,
16
- video_urls: Optional[List[str]] = None):
41
+ video_urls: Optional[List[str]] = None,
42
+ tool_payload: Optional[ToolPayload] = None):
17
43
  """
18
44
  Initializes a rich Message object for conversation history.
19
45
 
@@ -24,6 +50,7 @@ class Message:
24
50
  image_urls: Optional list of image URIs.
25
51
  audio_urls: Optional list of audio URIs.
26
52
  video_urls: Optional list of video URIs.
53
+ tool_payload: Optional tool payload (tool calls or tool result).
27
54
  """
28
55
  self.role = role
29
56
  self.content = content
@@ -31,8 +58,32 @@ class Message:
31
58
  self.image_urls = image_urls or []
32
59
  self.audio_urls = audio_urls or []
33
60
  self.video_urls = video_urls or []
61
+ self.tool_payload = tool_payload
62
+
63
+ def _serialize_tool_payload(self) -> Optional[Dict[str, Any]]:
64
+ if self.tool_payload is None:
65
+ return None
66
+ if isinstance(self.tool_payload, ToolCallPayload):
67
+ return {
68
+ "tool_calls": [
69
+ {
70
+ "id": call.id,
71
+ "name": call.name,
72
+ "arguments": call.arguments,
73
+ }
74
+ for call in self.tool_payload.tool_calls
75
+ ]
76
+ }
77
+ if isinstance(self.tool_payload, ToolResultPayload):
78
+ return {
79
+ "tool_call_id": self.tool_payload.tool_call_id,
80
+ "tool_name": self.tool_payload.tool_name,
81
+ "tool_result": self.tool_payload.tool_result,
82
+ "tool_error": self.tool_payload.tool_error,
83
+ }
84
+ return None
34
85
 
35
- def to_dict(self) -> Dict[str, Union[str, List[str], None]]:
86
+ def to_dict(self) -> Dict[str, Any]:
36
87
  """
37
88
  Returns a simple dictionary representation of the Message object.
38
89
  This is for internal use and does not format for any specific API.
@@ -44,4 +95,5 @@ class Message:
44
95
  "image_urls": self.image_urls,
45
96
  "audio_urls": self.audio_urls,
46
97
  "video_urls": self.video_urls,
98
+ "tool_payload": self._serialize_tool_payload(),
47
99
  }
@@ -1,6 +1,7 @@
1
1
  from dataclasses import dataclass, field
2
2
  from typing import Optional, List
3
3
  from autobyteus.llm.utils.token_usage import TokenUsage
4
+ from autobyteus.llm.utils.tool_call_delta import ToolCallDelta
4
5
 
5
6
  @dataclass
6
7
  class CompleteResponse:
@@ -24,3 +25,5 @@ class ChunkResponse:
24
25
  image_urls: List[str] = field(default_factory=list)
25
26
  audio_urls: List[str] = field(default_factory=list)
26
27
  video_urls: List[str] = field(default_factory=list)
28
+ tool_calls: Optional[List[ToolCallDelta]] = None # API-provided tool call deltas
29
+
@@ -0,0 +1,31 @@
1
+ # file: autobyteus/autobyteus/llm/utils/tool_call_delta.py
2
+ """
3
+ Provider-agnostic representation of streaming tool call updates.
4
+
5
+ This dataclass normalizes tool call deltas from different LLM providers
6
+ (OpenAI, Anthropic, Gemini) into a common format for the streaming architecture.
7
+ """
8
+
9
+ from dataclasses import dataclass
10
+ from typing import Optional
11
+
12
+
13
+ @dataclass
14
+ class ToolCallDelta:
15
+ """
16
+ A normalized, provider-agnostic representation of a tool call update
17
+ received during streaming.
18
+
19
+ Attributes:
20
+ index: Position in parallel tool calls (0-based). Used to track
21
+ multiple concurrent tool calls in the same response.
22
+ call_id: Unique ID for this tool call. Present only in the first
23
+ chunk for this index.
24
+ name: Tool/function name. Present only in the first chunk for this index.
25
+ arguments_delta: Partial JSON string of arguments. Accumulated across
26
+ multiple chunks to form complete arguments.
27
+ """
28
+ index: int
29
+ call_id: Optional[str] = None
30
+ name: Optional[str] = None
31
+ arguments_delta: Optional[str] = None
@@ -0,0 +1,32 @@
1
+ from autobyteus.memory.models.memory_types import MemoryType
2
+ from autobyteus.memory.models.raw_trace_item import RawTraceItem
3
+ from autobyteus.memory.models.episodic_item import EpisodicItem
4
+ from autobyteus.memory.models.semantic_item import SemanticItem
5
+ from autobyteus.memory.models.tool_interaction import ToolInteraction, ToolInteractionStatus
6
+ from autobyteus.memory.store.file_store import FileMemoryStore
7
+ from autobyteus.memory.turn_tracker import TurnTracker
8
+ from autobyteus.memory.memory_manager import MemoryManager
9
+ from autobyteus.memory.policies.compaction_policy import CompactionPolicy
10
+ from autobyteus.memory.compaction.compactor import Compactor
11
+ from autobyteus.memory.compaction.compaction_result import CompactionResult
12
+ from autobyteus.memory.compaction.summarizer import Summarizer
13
+ from autobyteus.memory.retrieval.memory_bundle import MemoryBundle
14
+ from autobyteus.memory.retrieval.retriever import Retriever
15
+
16
+ __all__ = [
17
+ "MemoryType",
18
+ "RawTraceItem",
19
+ "EpisodicItem",
20
+ "SemanticItem",
21
+ "ToolInteraction",
22
+ "ToolInteractionStatus",
23
+ "FileMemoryStore",
24
+ "TurnTracker",
25
+ "MemoryManager",
26
+ "CompactionPolicy",
27
+ "Compactor",
28
+ "CompactionResult",
29
+ "Summarizer",
30
+ "MemoryBundle",
31
+ "Retriever",
32
+ ]
@@ -0,0 +1,69 @@
1
+ import time
2
+ from typing import List, Optional, Iterable, Any
3
+
4
+ from autobyteus.llm.utils.messages import (
5
+ Message,
6
+ MessageRole,
7
+ ToolCallPayload,
8
+ ToolCallSpec,
9
+ ToolResultPayload,
10
+ )
11
+
12
+
13
+ class ActiveTranscript:
14
+ def __init__(self, initial_messages: Optional[Iterable[Message]] = None):
15
+ self._messages: List[Message] = list(initial_messages) if initial_messages else []
16
+ self.epoch_id: int = 1
17
+ self.last_compaction_ts: Optional[float] = None
18
+
19
+ def append_message(self, message: Message) -> None:
20
+ self._messages.append(message)
21
+
22
+ def append_user(self, content: str) -> None:
23
+ self._messages.append(Message(role=MessageRole.USER, content=content))
24
+
25
+ def append_assistant(self, content: Optional[str], reasoning: Optional[str] = None) -> None:
26
+ self._messages.append(
27
+ Message(
28
+ role=MessageRole.ASSISTANT,
29
+ content=content,
30
+ reasoning_content=reasoning,
31
+ )
32
+ )
33
+
34
+ def append_tool_calls(self, tool_calls: List[ToolCallSpec]) -> None:
35
+ self._messages.append(
36
+ Message(
37
+ role=MessageRole.ASSISTANT,
38
+ content=None,
39
+ tool_payload=ToolCallPayload(tool_calls=tool_calls),
40
+ )
41
+ )
42
+
43
+ def append_tool_result(
44
+ self,
45
+ tool_call_id: str,
46
+ tool_name: str,
47
+ tool_result: Any,
48
+ tool_error: Optional[str] = None,
49
+ ) -> None:
50
+ self._messages.append(
51
+ Message(
52
+ role=MessageRole.TOOL,
53
+ content=None,
54
+ tool_payload=ToolResultPayload(
55
+ tool_call_id=tool_call_id,
56
+ tool_name=tool_name,
57
+ tool_result=tool_result,
58
+ tool_error=tool_error,
59
+ ),
60
+ )
61
+ )
62
+
63
+ def build_messages(self) -> List[Message]:
64
+ return list(self._messages)
65
+
66
+ def reset(self, snapshot_messages: Iterable[Message], last_compaction_ts: Optional[float] = None) -> None:
67
+ self._messages = list(snapshot_messages)
68
+ self.epoch_id += 1
69
+ self.last_compaction_ts = last_compaction_ts if last_compaction_ts is not None else time.time()
@@ -0,0 +1,9 @@
1
+ from autobyteus.memory.compaction.compactor import Compactor
2
+ from autobyteus.memory.compaction.compaction_result import CompactionResult
3
+ from autobyteus.memory.compaction.summarizer import Summarizer
4
+
5
+ __all__ = [
6
+ "Compactor",
7
+ "CompactionResult",
8
+ "Summarizer",
9
+ ]
@@ -0,0 +1,8 @@
1
+ from dataclasses import dataclass, field
2
+ from typing import Any, Dict, List
3
+
4
+
5
+ @dataclass
6
+ class CompactionResult:
7
+ episodic_summary: str
8
+ semantic_facts: List[Dict[str, Any]] = field(default_factory=list)
@@ -0,0 +1,89 @@
1
+ import time
2
+ from typing import List, Optional
3
+
4
+ from autobyteus.memory.models.memory_types import MemoryType
5
+ from autobyteus.memory.models.raw_trace_item import RawTraceItem
6
+ from autobyteus.memory.models.episodic_item import EpisodicItem
7
+ from autobyteus.memory.models.semantic_item import SemanticItem
8
+ from autobyteus.memory.compaction.compaction_result import CompactionResult
9
+ from autobyteus.memory.compaction.summarizer import Summarizer
10
+ from autobyteus.memory.policies.compaction_policy import CompactionPolicy
11
+ from autobyteus.memory.store.base_store import MemoryStore
12
+
13
+
14
+ class Compactor:
15
+ def __init__(self, store: MemoryStore, policy: CompactionPolicy, summarizer: Summarizer):
16
+ self.store = store
17
+ self.policy = policy
18
+ self.summarizer = summarizer
19
+ self.memory_types = MemoryType
20
+
21
+ def select_compaction_window(self) -> List[str]:
22
+ raw_items = self.store.list(MemoryType.RAW_TRACE)
23
+ turn_ids: List[str] = []
24
+ seen = set()
25
+ for item in raw_items:
26
+ if not isinstance(item, RawTraceItem):
27
+ continue
28
+ if item.turn_id not in seen:
29
+ seen.add(item.turn_id)
30
+ turn_ids.append(item.turn_id)
31
+
32
+ if self.policy.raw_tail_turns <= 0:
33
+ return turn_ids
34
+ if len(turn_ids) <= self.policy.raw_tail_turns:
35
+ return []
36
+ return turn_ids[:-self.policy.raw_tail_turns]
37
+
38
+ def get_traces_for_turns(self, turn_ids: List[str]) -> List[RawTraceItem]:
39
+ raw_items = self.store.list(MemoryType.RAW_TRACE)
40
+ turn_set = set(turn_ids)
41
+ return [
42
+ item
43
+ for item in raw_items
44
+ if isinstance(item, RawTraceItem) and item.turn_id in turn_set
45
+ ]
46
+
47
+ def compact(self, turn_ids: List[str]) -> Optional[CompactionResult]:
48
+ if not turn_ids:
49
+ return None
50
+
51
+ traces = self.get_traces_for_turns(turn_ids)
52
+ result = self.summarizer.summarize(traces)
53
+
54
+ episodic_item = EpisodicItem(
55
+ id=f"ep_{int(time.time() * 1000)}",
56
+ ts=time.time(),
57
+ turn_ids=turn_ids,
58
+ summary=result.episodic_summary,
59
+ tags=[],
60
+ salience=0.0,
61
+ )
62
+
63
+ semantic_items = []
64
+ for idx, fact_data in enumerate(result.semantic_facts, start=1):
65
+ semantic_items.append(
66
+ SemanticItem(
67
+ id=f"sem_{int(time.time() * 1000)}_{idx}",
68
+ ts=time.time(),
69
+ fact=fact_data.get("fact", ""),
70
+ tags=fact_data.get("tags", []),
71
+ confidence=fact_data.get("confidence", 0.0),
72
+ salience=0.0,
73
+ )
74
+ )
75
+
76
+ self.store.add([episodic_item, *semantic_items])
77
+ self._prune_raw_traces(turn_ids)
78
+ return result
79
+
80
+ def _prune_raw_traces(self, compacted_turn_ids: List[str]) -> None:
81
+ raw_items = self.store.list(MemoryType.RAW_TRACE)
82
+ remaining_turns = {
83
+ item.turn_id
84
+ for item in raw_items
85
+ if isinstance(item, RawTraceItem) and item.turn_id not in compacted_turn_ids
86
+ }
87
+ prune = getattr(self.store, "prune_raw_traces", None)
88
+ if callable(prune):
89
+ prune(keep_turn_ids=remaining_turns, archive=True)
@@ -0,0 +1,11 @@
1
+ from abc import ABC, abstractmethod
2
+ from typing import List
3
+
4
+ from autobyteus.memory.models.raw_trace_item import RawTraceItem
5
+ from autobyteus.memory.compaction.compaction_result import CompactionResult
6
+
7
+
8
+ class Summarizer(ABC):
9
+ @abstractmethod
10
+ def summarize(self, traces: List[RawTraceItem]) -> CompactionResult:
11
+ raise NotImplementedError
@@ -0,0 +1,84 @@
1
+ from typing import List, Dict
2
+
3
+ from autobyteus.llm.utils.messages import Message, MessageRole
4
+ from autobyteus.memory.models.raw_trace_item import RawTraceItem
5
+ from autobyteus.memory.retrieval.memory_bundle import MemoryBundle
6
+ from autobyteus.memory.tool_interaction_builder import build_tool_interactions
7
+ from autobyteus.memory.models.tool_interaction import ToolInteractionStatus
8
+
9
+
10
+ class CompactionSnapshotBuilder:
11
+ def build(self, system_prompt: str, bundle: MemoryBundle, raw_tail: List[RawTraceItem]) -> List[Message]:
12
+ parts: List[str] = []
13
+
14
+ if bundle.episodic:
15
+ parts.append("[MEMORY:EPISODIC]")
16
+ for idx, item in enumerate(bundle.episodic, start=1):
17
+ parts.append(f"{idx}) {item.summary}")
18
+ parts.append("")
19
+
20
+ if bundle.semantic:
21
+ parts.append("[MEMORY:SEMANTIC]")
22
+ for item in bundle.semantic:
23
+ parts.append(f"- {item.fact}")
24
+ parts.append("")
25
+
26
+ if raw_tail:
27
+ parts.append("[RECENT TURNS]")
28
+ parts.extend(self._format_recent_turns(raw_tail))
29
+ parts.append("")
30
+
31
+ summary_text = "\n".join(parts).strip()
32
+
33
+ messages = [Message(role=MessageRole.SYSTEM, content=system_prompt)]
34
+ if summary_text:
35
+ messages.append(Message(role=MessageRole.USER, content=summary_text))
36
+ return messages
37
+
38
+ def _format_recent_turns(self, raw_tail: List[RawTraceItem]) -> List[str]:
39
+ lines: List[str] = []
40
+ interactions = build_tool_interactions(raw_tail)
41
+ interaction_ids = {interaction.tool_call_id for interaction in interactions}
42
+
43
+ first_trace_by_call_id: Dict[str, RawTraceItem] = {}
44
+ for item in raw_tail:
45
+ if item.tool_call_id and item.tool_call_id not in first_trace_by_call_id:
46
+ first_trace_by_call_id[item.tool_call_id] = item
47
+
48
+ def sort_key(interaction):
49
+ trace = first_trace_by_call_id.get(interaction.tool_call_id)
50
+ return trace.seq if trace else 0
51
+
52
+ for interaction in sorted(interactions, key=sort_key):
53
+ trace = first_trace_by_call_id.get(interaction.tool_call_id)
54
+ if trace:
55
+ prefix = f"({trace.turn_id}:{trace.seq}) TOOL:"
56
+ else:
57
+ prefix = "(unknown) TOOL:"
58
+
59
+ if interaction.status == ToolInteractionStatus.PENDING:
60
+ result_text = "pending"
61
+ elif interaction.status == ToolInteractionStatus.ERROR:
62
+ result_text = interaction.error or "error"
63
+ else:
64
+ result_text = interaction.result
65
+
66
+ lines.append(
67
+ f"{prefix} {interaction.tool_name} {interaction.arguments} -> {result_text}"
68
+ )
69
+
70
+ for item in raw_tail:
71
+ if item.trace_type in {"tool_call", "tool_result"} and item.tool_call_id in interaction_ids:
72
+ continue
73
+ lines.append(self._format_raw_trace(item))
74
+
75
+ return lines
76
+
77
+ def _format_raw_trace(self, item: RawTraceItem) -> str:
78
+ prefix = f"({item.turn_id}:{item.seq}) {item.trace_type.upper()}:"
79
+ if item.trace_type == "tool_call":
80
+ return f"{prefix} {item.tool_name} {item.tool_args}"
81
+ if item.trace_type == "tool_result":
82
+ result = item.tool_error if item.tool_error else item.tool_result
83
+ return f"{prefix} {item.tool_name} {result}"
84
+ return f"{prefix} {item.content}"
@@ -0,0 +1,183 @@
1
+ import time
2
+ from typing import Optional, List
3
+
4
+ from autobyteus.agent.events.agent_events import ToolResultEvent
5
+ from autobyteus.agent.tool_invocation import ToolInvocation
6
+ from autobyteus.llm.user_message import LLMUserMessage
7
+ from autobyteus.llm.utils.messages import ToolCallSpec
8
+ from autobyteus.llm.utils.response_types import CompleteResponse
9
+ from autobyteus.memory.models.raw_trace_item import RawTraceItem
10
+ from autobyteus.memory.models.memory_types import MemoryType
11
+ from autobyteus.memory.policies.compaction_policy import CompactionPolicy
12
+ from autobyteus.memory.compaction.compactor import Compactor
13
+ from autobyteus.memory.retrieval.retriever import Retriever
14
+ from autobyteus.memory.store.base_store import MemoryStore
15
+ from autobyteus.memory.turn_tracker import TurnTracker
16
+ from autobyteus.memory.active_transcript import ActiveTranscript
17
+ from autobyteus.memory.tool_interaction_builder import build_tool_interactions
18
+
19
+
20
+ class MemoryManager:
21
+ def __init__(
22
+ self,
23
+ store: MemoryStore,
24
+ turn_tracker: Optional[TurnTracker] = None,
25
+ compaction_policy: Optional[CompactionPolicy] = None,
26
+ compactor: Optional[Compactor] = None,
27
+ retriever: Optional[Retriever] = None,
28
+ active_transcript: Optional[ActiveTranscript] = None,
29
+ ):
30
+ self.store = store
31
+ self.turn_tracker = turn_tracker or TurnTracker()
32
+ self.compaction_policy = compaction_policy or CompactionPolicy()
33
+ self.compactor = compactor
34
+ self.retriever = retriever or Retriever(store=store)
35
+ self.memory_types = MemoryType
36
+ self._seq_by_turn: dict[str, int] = {}
37
+ self.active_transcript = active_transcript or ActiveTranscript()
38
+ self.compaction_required: bool = False
39
+
40
+ def start_turn(self) -> str:
41
+ return self.turn_tracker.next_turn_id()
42
+
43
+ def request_compaction(self) -> None:
44
+ self.compaction_required = True
45
+
46
+ def clear_compaction_request(self) -> None:
47
+ self.compaction_required = False
48
+
49
+ def _next_seq(self, turn_id: str) -> int:
50
+ current = self._seq_by_turn.get(turn_id, 0) + 1
51
+ self._seq_by_turn[turn_id] = current
52
+ return current
53
+
54
+ def ingest_user_message(self, llm_user_message: LLMUserMessage, turn_id: str, source_event: str) -> None:
55
+ trace = RawTraceItem(
56
+ id=f"rt_{int(time.time() * 1000)}",
57
+ ts=time.time(),
58
+ turn_id=turn_id,
59
+ seq=self._next_seq(turn_id),
60
+ trace_type="user",
61
+ content=llm_user_message.content,
62
+ source_event=source_event,
63
+ media={
64
+ "images": llm_user_message.image_urls or [],
65
+ "audio": llm_user_message.audio_urls or [],
66
+ "video": llm_user_message.video_urls or [],
67
+ },
68
+ tags=["processed"],
69
+ )
70
+ self.store.add([trace])
71
+
72
+ def ingest_tool_intent(self, tool_invocation: ToolInvocation, turn_id: Optional[str] = None) -> None:
73
+ effective_turn_id = tool_invocation.turn_id or turn_id
74
+ if not effective_turn_id:
75
+ raise ValueError("turn_id is required to ingest tool intent")
76
+ trace = RawTraceItem(
77
+ id=f"rt_{int(time.time() * 1000)}",
78
+ ts=time.time(),
79
+ turn_id=effective_turn_id,
80
+ seq=self._next_seq(effective_turn_id),
81
+ trace_type="tool_call",
82
+ content="",
83
+ source_event="PendingToolInvocationEvent",
84
+ tool_name=tool_invocation.name,
85
+ tool_call_id=tool_invocation.id,
86
+ tool_args=tool_invocation.arguments,
87
+ )
88
+ self.store.add([trace])
89
+ self.active_transcript.append_tool_calls(
90
+ [ToolCallSpec(id=tool_invocation.id, name=tool_invocation.name, arguments=tool_invocation.arguments)]
91
+ )
92
+
93
+ def ingest_tool_result(self, event: ToolResultEvent, turn_id: Optional[str] = None) -> None:
94
+ effective_turn_id = event.turn_id or turn_id
95
+ if not effective_turn_id:
96
+ raise ValueError("turn_id is required to ingest tool result")
97
+ trace = RawTraceItem(
98
+ id=f"rt_{int(time.time() * 1000)}",
99
+ ts=time.time(),
100
+ turn_id=effective_turn_id,
101
+ seq=self._next_seq(effective_turn_id),
102
+ trace_type="tool_result",
103
+ content="",
104
+ source_event="ToolResultEvent",
105
+ tool_name=event.tool_name,
106
+ tool_call_id=event.tool_invocation_id,
107
+ tool_args=event.tool_args,
108
+ tool_result=event.result,
109
+ tool_error=event.error,
110
+ )
111
+ self.store.add([trace])
112
+ self.active_transcript.append_tool_result(
113
+ tool_call_id=event.tool_invocation_id or "",
114
+ tool_name=event.tool_name,
115
+ tool_result=event.result,
116
+ tool_error=event.error,
117
+ )
118
+
119
+ def ingest_assistant_response(self, response: CompleteResponse, turn_id: str, source_event: str) -> None:
120
+ trace = RawTraceItem(
121
+ id=f"rt_{int(time.time() * 1000)}",
122
+ ts=time.time(),
123
+ turn_id=turn_id,
124
+ seq=self._next_seq(turn_id),
125
+ trace_type="assistant",
126
+ content=response.content or "",
127
+ source_event=source_event,
128
+ tags=["final"],
129
+ )
130
+ self.store.add([trace])
131
+ if response.content or response.reasoning:
132
+ self.active_transcript.append_assistant(
133
+ content=response.content,
134
+ reasoning=response.reasoning,
135
+ )
136
+
137
+ def _get_raw_tail(self, tail_turns: int, exclude_turn_id: Optional[str] = None) -> List[RawTraceItem]:
138
+ raw_items = self.store.list(MemoryType.RAW_TRACE)
139
+ if tail_turns <= 0:
140
+ return []
141
+
142
+ ordered_turns = []
143
+ seen = set()
144
+ for item in raw_items:
145
+ if not isinstance(item, RawTraceItem):
146
+ continue
147
+ if exclude_turn_id and item.turn_id == exclude_turn_id:
148
+ continue
149
+ if item.turn_id not in seen:
150
+ seen.add(item.turn_id)
151
+ ordered_turns.append(item.turn_id)
152
+
153
+ if not ordered_turns:
154
+ return []
155
+
156
+ keep_turns = set(ordered_turns[-tail_turns:])
157
+ tail_items = [
158
+ item
159
+ for item in raw_items
160
+ if isinstance(item, RawTraceItem) and item.turn_id in keep_turns
161
+ ]
162
+
163
+ order_index = {turn_id: idx for idx, turn_id in enumerate(ordered_turns)}
164
+ tail_items.sort(key=lambda item: (order_index.get(item.turn_id, 0), item.seq))
165
+ return tail_items
166
+
167
+ def get_raw_tail(self, tail_turns: int, exclude_turn_id: Optional[str] = None) -> List[RawTraceItem]:
168
+ return self._get_raw_tail(tail_turns, exclude_turn_id=exclude_turn_id)
169
+
170
+ def get_transcript_messages(self):
171
+ return self.active_transcript.build_messages()
172
+
173
+ def reset_transcript(self, snapshot_messages):
174
+ self.active_transcript.reset(snapshot_messages)
175
+
176
+ def get_tool_interactions(self, turn_id: Optional[str] = None):
177
+ raw_items = self.store.list(MemoryType.RAW_TRACE)
178
+ if turn_id:
179
+ raw_items = [
180
+ item for item in raw_items
181
+ if isinstance(item, RawTraceItem) and item.turn_id == turn_id
182
+ ]
183
+ return build_tool_interactions([item for item in raw_items if isinstance(item, RawTraceItem)])
@@ -0,0 +1,14 @@
1
+ from autobyteus.memory.models.memory_types import MemoryType
2
+ from autobyteus.memory.models.raw_trace_item import RawTraceItem
3
+ from autobyteus.memory.models.episodic_item import EpisodicItem
4
+ from autobyteus.memory.models.semantic_item import SemanticItem
5
+ from autobyteus.memory.models.tool_interaction import ToolInteraction, ToolInteractionStatus
6
+
7
+ __all__ = [
8
+ "MemoryType",
9
+ "RawTraceItem",
10
+ "EpisodicItem",
11
+ "SemanticItem",
12
+ "ToolInteraction",
13
+ "ToolInteractionStatus",
14
+ ]
@@ -0,0 +1,41 @@
1
+ from dataclasses import dataclass, field
2
+ from typing import Any, Dict, List
3
+
4
+ from .memory_types import MemoryType
5
+
6
+
7
+ @dataclass
8
+ class EpisodicItem:
9
+ id: str
10
+ ts: float
11
+ turn_ids: List[str]
12
+ summary: str
13
+ tags: List[str] = field(default_factory=list)
14
+ salience: float = 0.0
15
+
16
+ @property
17
+ def memory_type(self) -> MemoryType:
18
+ return MemoryType.EPISODIC
19
+
20
+ def to_dict(self) -> Dict[str, Any]:
21
+ data: Dict[str, Any] = {
22
+ "id": self.id,
23
+ "ts": self.ts,
24
+ "turn_ids": self.turn_ids,
25
+ "summary": self.summary,
26
+ "salience": self.salience,
27
+ }
28
+ if self.tags:
29
+ data["tags"] = self.tags
30
+ return data
31
+
32
+ @classmethod
33
+ def from_dict(cls, data: Dict[str, Any]) -> "EpisodicItem":
34
+ return cls(
35
+ id=data["id"],
36
+ ts=data["ts"],
37
+ turn_ids=data.get("turn_ids", []),
38
+ summary=data.get("summary", ""),
39
+ tags=data.get("tags", []),
40
+ salience=data.get("salience", 0.0),
41
+ )