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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (472) hide show
  1. autobyteus/agent/agent.py +15 -5
  2. autobyteus/agent/bootstrap_steps/__init__.py +3 -3
  3. autobyteus/agent/bootstrap_steps/agent_bootstrapper.py +5 -59
  4. autobyteus/agent/bootstrap_steps/base_bootstrap_step.py +1 -4
  5. autobyteus/agent/bootstrap_steps/mcp_server_prewarming_step.py +1 -3
  6. autobyteus/agent/bootstrap_steps/system_prompt_processing_step.py +16 -13
  7. autobyteus/agent/bootstrap_steps/working_context_snapshot_restore_step.py +38 -0
  8. autobyteus/agent/bootstrap_steps/workspace_context_initialization_step.py +2 -4
  9. autobyteus/agent/context/agent_config.py +47 -20
  10. autobyteus/agent/context/agent_context.py +23 -18
  11. autobyteus/agent/context/agent_runtime_state.py +21 -19
  12. autobyteus/agent/events/__init__.py +16 -1
  13. autobyteus/agent/events/agent_events.py +43 -3
  14. autobyteus/agent/events/agent_input_event_queue_manager.py +79 -26
  15. autobyteus/agent/events/event_store.py +57 -0
  16. autobyteus/agent/events/notifiers.py +69 -59
  17. autobyteus/agent/events/worker_event_dispatcher.py +21 -64
  18. autobyteus/agent/factory/agent_factory.py +83 -6
  19. autobyteus/agent/handlers/__init__.py +2 -0
  20. autobyteus/agent/handlers/approved_tool_invocation_event_handler.py +51 -34
  21. autobyteus/agent/handlers/bootstrap_event_handler.py +155 -0
  22. autobyteus/agent/handlers/inter_agent_message_event_handler.py +10 -0
  23. autobyteus/agent/handlers/lifecycle_event_logger.py +19 -11
  24. autobyteus/agent/handlers/llm_complete_response_received_event_handler.py +10 -15
  25. autobyteus/agent/handlers/llm_user_message_ready_event_handler.py +188 -48
  26. autobyteus/agent/handlers/tool_execution_approval_event_handler.py +0 -10
  27. autobyteus/agent/handlers/tool_invocation_request_event_handler.py +53 -48
  28. autobyteus/agent/handlers/tool_result_event_handler.py +7 -8
  29. autobyteus/agent/handlers/user_input_message_event_handler.py +10 -3
  30. autobyteus/agent/input_processor/memory_ingest_input_processor.py +44 -0
  31. autobyteus/agent/lifecycle/__init__.py +12 -0
  32. autobyteus/agent/lifecycle/base_processor.py +109 -0
  33. autobyteus/agent/lifecycle/events.py +35 -0
  34. autobyteus/agent/lifecycle/processor_definition.py +36 -0
  35. autobyteus/agent/lifecycle/processor_registry.py +106 -0
  36. autobyteus/agent/llm_request_assembler.py +98 -0
  37. autobyteus/agent/llm_response_processor/__init__.py +1 -8
  38. autobyteus/agent/message/context_file_type.py +1 -1
  39. autobyteus/agent/runtime/agent_runtime.py +29 -21
  40. autobyteus/agent/runtime/agent_worker.py +98 -19
  41. autobyteus/agent/shutdown_steps/__init__.py +2 -0
  42. autobyteus/agent/shutdown_steps/agent_shutdown_orchestrator.py +2 -0
  43. autobyteus/agent/shutdown_steps/tool_cleanup_step.py +58 -0
  44. autobyteus/agent/status/__init__.py +14 -0
  45. autobyteus/agent/status/manager.py +93 -0
  46. autobyteus/agent/status/status_deriver.py +96 -0
  47. autobyteus/agent/{phases/phase_enum.py → status/status_enum.py} +16 -16
  48. autobyteus/agent/status/status_update_utils.py +73 -0
  49. autobyteus/agent/streaming/__init__.py +52 -5
  50. autobyteus/agent/streaming/adapters/__init__.py +18 -0
  51. autobyteus/agent/streaming/adapters/invocation_adapter.py +184 -0
  52. autobyteus/agent/streaming/adapters/tool_call_parsing.py +163 -0
  53. autobyteus/agent/streaming/adapters/tool_syntax_registry.py +67 -0
  54. autobyteus/agent/streaming/agent_event_stream.py +3 -183
  55. autobyteus/agent/streaming/api_tool_call/__init__.py +16 -0
  56. autobyteus/agent/streaming/api_tool_call/file_content_streamer.py +56 -0
  57. autobyteus/agent/streaming/api_tool_call/json_string_field_extractor.py +175 -0
  58. autobyteus/agent/streaming/api_tool_call_streaming_response_handler.py +4 -0
  59. autobyteus/agent/streaming/events/__init__.py +6 -0
  60. autobyteus/agent/streaming/events/stream_event_payloads.py +284 -0
  61. autobyteus/agent/streaming/events/stream_events.py +141 -0
  62. autobyteus/agent/streaming/handlers/__init__.py +15 -0
  63. autobyteus/agent/streaming/handlers/api_tool_call_streaming_response_handler.py +303 -0
  64. autobyteus/agent/streaming/handlers/parsing_streaming_response_handler.py +107 -0
  65. autobyteus/agent/streaming/handlers/pass_through_streaming_response_handler.py +107 -0
  66. autobyteus/agent/streaming/handlers/streaming_handler_factory.py +177 -0
  67. autobyteus/agent/streaming/handlers/streaming_response_handler.py +58 -0
  68. autobyteus/agent/streaming/parser/__init__.py +61 -0
  69. autobyteus/agent/streaming/parser/event_emitter.py +181 -0
  70. autobyteus/agent/streaming/parser/events.py +4 -0
  71. autobyteus/agent/streaming/parser/invocation_adapter.py +4 -0
  72. autobyteus/agent/streaming/parser/json_parsing_strategies/__init__.py +19 -0
  73. autobyteus/agent/streaming/parser/json_parsing_strategies/base.py +32 -0
  74. autobyteus/agent/streaming/parser/json_parsing_strategies/default.py +34 -0
  75. autobyteus/agent/streaming/parser/json_parsing_strategies/gemini.py +31 -0
  76. autobyteus/agent/streaming/parser/json_parsing_strategies/openai.py +64 -0
  77. autobyteus/agent/streaming/parser/json_parsing_strategies/registry.py +75 -0
  78. autobyteus/agent/streaming/parser/parser_context.py +227 -0
  79. autobyteus/agent/streaming/parser/parser_factory.py +132 -0
  80. autobyteus/agent/streaming/parser/sentinel_format.py +7 -0
  81. autobyteus/agent/streaming/parser/state_factory.py +62 -0
  82. autobyteus/agent/streaming/parser/states/__init__.py +1 -0
  83. autobyteus/agent/streaming/parser/states/base_state.py +60 -0
  84. autobyteus/agent/streaming/parser/states/custom_xml_tag_run_bash_parsing_state.py +38 -0
  85. autobyteus/agent/streaming/parser/states/custom_xml_tag_write_file_parsing_state.py +55 -0
  86. autobyteus/agent/streaming/parser/states/delimited_content_state.py +146 -0
  87. autobyteus/agent/streaming/parser/states/json_initialization_state.py +144 -0
  88. autobyteus/agent/streaming/parser/states/json_tool_parsing_state.py +137 -0
  89. autobyteus/agent/streaming/parser/states/sentinel_content_state.py +30 -0
  90. autobyteus/agent/streaming/parser/states/sentinel_initialization_state.py +117 -0
  91. autobyteus/agent/streaming/parser/states/text_state.py +78 -0
  92. autobyteus/agent/streaming/parser/states/xml_patch_file_tool_parsing_state.py +328 -0
  93. autobyteus/agent/streaming/parser/states/xml_run_bash_tool_parsing_state.py +129 -0
  94. autobyteus/agent/streaming/parser/states/xml_tag_initialization_state.py +151 -0
  95. autobyteus/agent/streaming/parser/states/xml_tool_parsing_state.py +63 -0
  96. autobyteus/agent/streaming/parser/states/xml_write_file_tool_parsing_state.py +343 -0
  97. autobyteus/agent/streaming/parser/strategies/__init__.py +17 -0
  98. autobyteus/agent/streaming/parser/strategies/base.py +24 -0
  99. autobyteus/agent/streaming/parser/strategies/json_tool_strategy.py +26 -0
  100. autobyteus/agent/streaming/parser/strategies/registry.py +28 -0
  101. autobyteus/agent/streaming/parser/strategies/sentinel_strategy.py +23 -0
  102. autobyteus/agent/streaming/parser/strategies/xml_tag_strategy.py +21 -0
  103. autobyteus/agent/streaming/parser/stream_scanner.py +167 -0
  104. autobyteus/agent/streaming/parser/streaming_parser.py +212 -0
  105. autobyteus/agent/streaming/parser/tool_call_parsing.py +4 -0
  106. autobyteus/agent/streaming/parser/tool_constants.py +7 -0
  107. autobyteus/agent/streaming/parser/tool_syntax_registry.py +4 -0
  108. autobyteus/agent/streaming/parser/xml_tool_parsing_state_registry.py +55 -0
  109. autobyteus/agent/streaming/parsing_streaming_response_handler.py +4 -0
  110. autobyteus/agent/streaming/pass_through_streaming_response_handler.py +4 -0
  111. autobyteus/agent/streaming/queue_streamer.py +3 -57
  112. autobyteus/agent/streaming/segments/__init__.py +5 -0
  113. autobyteus/agent/streaming/segments/segment_events.py +82 -0
  114. autobyteus/agent/streaming/stream_event_payloads.py +2 -223
  115. autobyteus/agent/streaming/stream_events.py +3 -140
  116. autobyteus/agent/streaming/streaming_handler_factory.py +4 -0
  117. autobyteus/agent/streaming/streaming_response_handler.py +4 -0
  118. autobyteus/agent/streaming/streams/__init__.py +5 -0
  119. autobyteus/agent/streaming/streams/agent_event_stream.py +197 -0
  120. autobyteus/agent/streaming/utils/__init__.py +5 -0
  121. autobyteus/agent/streaming/utils/queue_streamer.py +59 -0
  122. autobyteus/agent/system_prompt_processor/__init__.py +2 -0
  123. autobyteus/agent/system_prompt_processor/available_skills_processor.py +96 -0
  124. autobyteus/agent/system_prompt_processor/base_processor.py +1 -1
  125. autobyteus/agent/system_prompt_processor/processor_meta.py +15 -2
  126. autobyteus/agent/system_prompt_processor/tool_manifest_injector_processor.py +39 -58
  127. autobyteus/agent/token_budget.py +56 -0
  128. autobyteus/agent/tool_execution_result_processor/memory_ingest_tool_result_processor.py +29 -0
  129. autobyteus/agent/tool_invocation.py +16 -40
  130. autobyteus/agent/tool_invocation_preprocessor/__init__.py +9 -0
  131. autobyteus/agent/tool_invocation_preprocessor/base_preprocessor.py +45 -0
  132. autobyteus/agent/tool_invocation_preprocessor/processor_definition.py +15 -0
  133. autobyteus/agent/tool_invocation_preprocessor/processor_meta.py +33 -0
  134. autobyteus/agent/tool_invocation_preprocessor/processor_registry.py +60 -0
  135. autobyteus/agent/utils/wait_for_idle.py +12 -14
  136. autobyteus/agent/workspace/base_workspace.py +6 -27
  137. autobyteus/agent_team/agent_team.py +3 -3
  138. autobyteus/agent_team/agent_team_builder.py +1 -41
  139. autobyteus/agent_team/bootstrap_steps/__init__.py +0 -4
  140. autobyteus/agent_team/bootstrap_steps/agent_configuration_preparation_step.py +8 -18
  141. autobyteus/agent_team/bootstrap_steps/agent_team_bootstrapper.py +4 -16
  142. autobyteus/agent_team/bootstrap_steps/base_agent_team_bootstrap_step.py +1 -2
  143. autobyteus/agent_team/bootstrap_steps/coordinator_initialization_step.py +1 -2
  144. autobyteus/agent_team/bootstrap_steps/task_notifier_initialization_step.py +1 -2
  145. autobyteus/agent_team/bootstrap_steps/team_context_initialization_step.py +4 -4
  146. autobyteus/agent_team/context/agent_team_config.py +6 -3
  147. autobyteus/agent_team/context/agent_team_context.py +25 -3
  148. autobyteus/agent_team/context/agent_team_runtime_state.py +9 -6
  149. autobyteus/agent_team/events/__init__.py +11 -0
  150. autobyteus/agent_team/events/agent_team_event_dispatcher.py +22 -9
  151. autobyteus/agent_team/events/agent_team_events.py +16 -0
  152. autobyteus/agent_team/events/event_store.py +57 -0
  153. autobyteus/agent_team/factory/agent_team_factory.py +8 -0
  154. autobyteus/agent_team/handlers/inter_agent_message_request_event_handler.py +18 -2
  155. autobyteus/agent_team/handlers/lifecycle_agent_team_event_handler.py +21 -5
  156. autobyteus/agent_team/handlers/process_user_message_event_handler.py +17 -8
  157. autobyteus/agent_team/handlers/tool_approval_team_event_handler.py +19 -4
  158. autobyteus/agent_team/runtime/agent_team_runtime.py +41 -10
  159. autobyteus/agent_team/runtime/agent_team_worker.py +69 -5
  160. autobyteus/agent_team/status/__init__.py +14 -0
  161. autobyteus/agent_team/status/agent_team_status.py +18 -0
  162. autobyteus/agent_team/status/agent_team_status_manager.py +33 -0
  163. autobyteus/agent_team/status/status_deriver.py +62 -0
  164. autobyteus/agent_team/status/status_update_utils.py +42 -0
  165. autobyteus/agent_team/streaming/__init__.py +2 -2
  166. autobyteus/agent_team/streaming/agent_team_event_notifier.py +6 -6
  167. autobyteus/agent_team/streaming/agent_team_stream_event_payloads.py +4 -4
  168. autobyteus/agent_team/streaming/agent_team_stream_events.py +3 -3
  169. autobyteus/agent_team/system_prompt_processor/__init__.py +6 -0
  170. autobyteus/agent_team/system_prompt_processor/team_manifest_injector_processor.py +76 -0
  171. autobyteus/agent_team/task_notification/task_notification_mode.py +19 -0
  172. autobyteus/agent_team/utils/wait_for_idle.py +4 -4
  173. autobyteus/cli/agent_cli.py +18 -10
  174. autobyteus/cli/agent_team_tui/app.py +14 -11
  175. autobyteus/cli/agent_team_tui/state.py +13 -15
  176. autobyteus/cli/agent_team_tui/widgets/agent_list_sidebar.py +15 -15
  177. autobyteus/cli/agent_team_tui/widgets/focus_pane.py +143 -36
  178. autobyteus/cli/agent_team_tui/widgets/renderables.py +1 -1
  179. autobyteus/cli/agent_team_tui/widgets/shared.py +25 -25
  180. autobyteus/cli/cli_display.py +193 -44
  181. autobyteus/cli/workflow_tui/app.py +9 -10
  182. autobyteus/cli/workflow_tui/state.py +14 -16
  183. autobyteus/cli/workflow_tui/widgets/agent_list_sidebar.py +15 -15
  184. autobyteus/cli/workflow_tui/widgets/focus_pane.py +137 -35
  185. autobyteus/cli/workflow_tui/widgets/renderables.py +1 -1
  186. autobyteus/cli/workflow_tui/widgets/shared.py +25 -25
  187. autobyteus/clients/autobyteus_client.py +94 -1
  188. autobyteus/events/event_types.py +11 -18
  189. autobyteus/llm/api/autobyteus_llm.py +33 -29
  190. autobyteus/llm/api/claude_llm.py +142 -36
  191. autobyteus/llm/api/gemini_llm.py +163 -59
  192. autobyteus/llm/api/grok_llm.py +1 -1
  193. autobyteus/llm/api/minimax_llm.py +26 -0
  194. autobyteus/llm/api/mistral_llm.py +113 -87
  195. autobyteus/llm/api/ollama_llm.py +9 -42
  196. autobyteus/llm/api/openai_compatible_llm.py +127 -91
  197. autobyteus/llm/api/openai_llm.py +3 -3
  198. autobyteus/llm/api/openai_responses_llm.py +324 -0
  199. autobyteus/llm/api/zhipu_llm.py +21 -2
  200. autobyteus/llm/autobyteus_provider.py +70 -60
  201. autobyteus/llm/base_llm.py +85 -81
  202. autobyteus/llm/converters/__init__.py +14 -0
  203. autobyteus/llm/converters/anthropic_tool_call_converter.py +37 -0
  204. autobyteus/llm/converters/gemini_tool_call_converter.py +57 -0
  205. autobyteus/llm/converters/mistral_tool_call_converter.py +37 -0
  206. autobyteus/llm/converters/openai_tool_call_converter.py +38 -0
  207. autobyteus/llm/extensions/base_extension.py +6 -12
  208. autobyteus/llm/extensions/token_usage_tracking_extension.py +45 -18
  209. autobyteus/llm/llm_factory.py +282 -204
  210. autobyteus/llm/lmstudio_provider.py +60 -49
  211. autobyteus/llm/models.py +35 -2
  212. autobyteus/llm/ollama_provider.py +60 -49
  213. autobyteus/llm/ollama_provider_resolver.py +0 -1
  214. autobyteus/llm/prompt_renderers/__init__.py +19 -0
  215. autobyteus/llm/prompt_renderers/anthropic_prompt_renderer.py +104 -0
  216. autobyteus/llm/prompt_renderers/autobyteus_prompt_renderer.py +19 -0
  217. autobyteus/llm/prompt_renderers/base_prompt_renderer.py +10 -0
  218. autobyteus/llm/prompt_renderers/gemini_prompt_renderer.py +63 -0
  219. autobyteus/llm/prompt_renderers/mistral_prompt_renderer.py +87 -0
  220. autobyteus/llm/prompt_renderers/ollama_prompt_renderer.py +51 -0
  221. autobyteus/llm/prompt_renderers/openai_chat_renderer.py +97 -0
  222. autobyteus/llm/prompt_renderers/openai_responses_renderer.py +101 -0
  223. autobyteus/llm/providers.py +1 -3
  224. autobyteus/llm/token_counter/claude_token_counter.py +56 -25
  225. autobyteus/llm/token_counter/mistral_token_counter.py +12 -8
  226. autobyteus/llm/token_counter/openai_token_counter.py +24 -5
  227. autobyteus/llm/token_counter/token_counter_factory.py +12 -5
  228. autobyteus/llm/utils/llm_config.py +6 -12
  229. autobyteus/llm/utils/media_payload_formatter.py +27 -20
  230. autobyteus/llm/utils/messages.py +55 -3
  231. autobyteus/llm/utils/response_types.py +3 -0
  232. autobyteus/llm/utils/tool_call_delta.py +31 -0
  233. autobyteus/memory/__init__.py +35 -0
  234. autobyteus/memory/compaction/__init__.py +9 -0
  235. autobyteus/memory/compaction/compaction_result.py +8 -0
  236. autobyteus/memory/compaction/compactor.py +89 -0
  237. autobyteus/memory/compaction/summarizer.py +11 -0
  238. autobyteus/memory/compaction_snapshot_builder.py +84 -0
  239. autobyteus/memory/memory_manager.py +205 -0
  240. autobyteus/memory/models/__init__.py +14 -0
  241. autobyteus/memory/models/episodic_item.py +41 -0
  242. autobyteus/memory/models/memory_types.py +7 -0
  243. autobyteus/memory/models/raw_trace_item.py +79 -0
  244. autobyteus/memory/models/semantic_item.py +41 -0
  245. autobyteus/memory/models/tool_interaction.py +20 -0
  246. autobyteus/memory/path_resolver.py +27 -0
  247. autobyteus/memory/policies/__init__.py +5 -0
  248. autobyteus/memory/policies/compaction_policy.py +16 -0
  249. autobyteus/memory/restore/__init__.py +1 -0
  250. autobyteus/memory/restore/working_context_snapshot_bootstrapper.py +61 -0
  251. autobyteus/memory/retrieval/__init__.py +7 -0
  252. autobyteus/memory/retrieval/memory_bundle.py +11 -0
  253. autobyteus/memory/retrieval/retriever.py +13 -0
  254. autobyteus/memory/store/__init__.py +9 -0
  255. autobyteus/memory/store/base_store.py +14 -0
  256. autobyteus/memory/store/file_store.py +98 -0
  257. autobyteus/memory/store/working_context_snapshot_store.py +28 -0
  258. autobyteus/memory/tool_interaction_builder.py +46 -0
  259. autobyteus/memory/turn_tracker.py +9 -0
  260. autobyteus/memory/working_context_snapshot.py +69 -0
  261. autobyteus/memory/working_context_snapshot_serializer.py +135 -0
  262. autobyteus/multimedia/audio/api/autobyteus_audio_client.py +19 -5
  263. autobyteus/multimedia/audio/api/gemini_audio_client.py +109 -16
  264. autobyteus/multimedia/audio/audio_client_factory.py +47 -9
  265. autobyteus/multimedia/audio/audio_model.py +2 -1
  266. autobyteus/multimedia/image/api/autobyteus_image_client.py +19 -5
  267. autobyteus/multimedia/image/api/gemini_image_client.py +39 -17
  268. autobyteus/multimedia/image/api/openai_image_client.py +125 -43
  269. autobyteus/multimedia/image/autobyteus_image_provider.py +2 -1
  270. autobyteus/multimedia/image/image_client_factory.py +47 -15
  271. autobyteus/multimedia/image/image_model.py +5 -2
  272. autobyteus/multimedia/providers.py +3 -2
  273. autobyteus/skills/loader.py +71 -0
  274. autobyteus/skills/model.py +11 -0
  275. autobyteus/skills/registry.py +70 -0
  276. autobyteus/task_management/tools/todo_tools/add_todo.py +2 -2
  277. autobyteus/task_management/tools/todo_tools/create_todo_list.py +2 -2
  278. autobyteus/task_management/tools/todo_tools/update_todo_status.py +2 -2
  279. autobyteus/tools/__init__.py +34 -47
  280. autobyteus/tools/base_tool.py +7 -0
  281. autobyteus/tools/file/__init__.py +2 -6
  282. autobyteus/tools/file/patch_file.py +149 -0
  283. autobyteus/tools/file/read_file.py +36 -5
  284. autobyteus/tools/file/write_file.py +4 -1
  285. autobyteus/tools/functional_tool.py +43 -6
  286. autobyteus/tools/mcp/__init__.py +2 -0
  287. autobyteus/tools/mcp/config_service.py +5 -1
  288. autobyteus/tools/mcp/server/__init__.py +2 -0
  289. autobyteus/tools/mcp/server/http_managed_mcp_server.py +1 -1
  290. autobyteus/tools/mcp/server/websocket_managed_mcp_server.py +141 -0
  291. autobyteus/tools/mcp/server_instance_manager.py +8 -1
  292. autobyteus/tools/mcp/types.py +61 -0
  293. autobyteus/tools/multimedia/audio_tools.py +70 -17
  294. autobyteus/tools/multimedia/download_media_tool.py +18 -4
  295. autobyteus/tools/multimedia/image_tools.py +246 -62
  296. autobyteus/tools/operation_executor/journal_manager.py +107 -0
  297. autobyteus/tools/operation_executor/operation_event_buffer.py +57 -0
  298. autobyteus/tools/operation_executor/operation_event_producer.py +29 -0
  299. autobyteus/tools/operation_executor/operation_executor.py +58 -0
  300. autobyteus/tools/registry/tool_definition.py +43 -2
  301. autobyteus/tools/skill/load_skill.py +50 -0
  302. autobyteus/tools/terminal/__init__.py +45 -0
  303. autobyteus/tools/terminal/ansi_utils.py +32 -0
  304. autobyteus/tools/terminal/background_process_manager.py +233 -0
  305. autobyteus/tools/terminal/output_buffer.py +105 -0
  306. autobyteus/tools/terminal/prompt_detector.py +63 -0
  307. autobyteus/tools/terminal/pty_session.py +241 -0
  308. autobyteus/tools/terminal/session_factory.py +20 -0
  309. autobyteus/tools/terminal/terminal_session_manager.py +226 -0
  310. autobyteus/tools/terminal/tools/__init__.py +13 -0
  311. autobyteus/tools/terminal/tools/get_process_output.py +81 -0
  312. autobyteus/tools/terminal/tools/run_bash.py +109 -0
  313. autobyteus/tools/terminal/tools/start_background_process.py +104 -0
  314. autobyteus/tools/terminal/tools/stop_background_process.py +67 -0
  315. autobyteus/tools/terminal/types.py +54 -0
  316. autobyteus/tools/terminal/wsl_tmux_session.py +221 -0
  317. autobyteus/tools/terminal/wsl_utils.py +156 -0
  318. autobyteus/tools/transaction_management/backup_handler.py +48 -0
  319. autobyteus/tools/transaction_management/operation_lifecycle_manager.py +62 -0
  320. autobyteus/tools/usage/__init__.py +1 -2
  321. autobyteus/tools/usage/formatters/__init__.py +17 -1
  322. autobyteus/tools/usage/formatters/base_formatter.py +8 -0
  323. autobyteus/tools/usage/formatters/default_xml_schema_formatter.py +2 -2
  324. autobyteus/tools/usage/formatters/mistral_json_schema_formatter.py +18 -0
  325. autobyteus/tools/usage/formatters/patch_file_xml_example_formatter.py +64 -0
  326. autobyteus/tools/usage/formatters/patch_file_xml_schema_formatter.py +31 -0
  327. autobyteus/tools/usage/formatters/run_bash_xml_example_formatter.py +32 -0
  328. autobyteus/tools/usage/formatters/run_bash_xml_schema_formatter.py +36 -0
  329. autobyteus/tools/usage/formatters/write_file_xml_example_formatter.py +53 -0
  330. autobyteus/tools/usage/formatters/write_file_xml_schema_formatter.py +31 -0
  331. autobyteus/tools/usage/providers/tool_manifest_provider.py +10 -10
  332. autobyteus/tools/usage/registries/__init__.py +1 -3
  333. autobyteus/tools/usage/registries/tool_formatting_registry.py +115 -8
  334. autobyteus/tools/usage/tool_schema_provider.py +51 -0
  335. autobyteus/tools/web/__init__.py +4 -0
  336. autobyteus/tools/web/read_url_tool.py +80 -0
  337. autobyteus/utils/diff_utils.py +271 -0
  338. autobyteus/utils/download_utils.py +109 -0
  339. autobyteus/utils/file_utils.py +57 -2
  340. autobyteus/utils/gemini_helper.py +64 -0
  341. autobyteus/utils/gemini_model_mapping.py +71 -0
  342. autobyteus/utils/llm_output_formatter.py +75 -0
  343. autobyteus/utils/tool_call_format.py +36 -0
  344. autobyteus/workflow/agentic_workflow.py +3 -3
  345. autobyteus/workflow/bootstrap_steps/agent_tool_injection_step.py +2 -2
  346. autobyteus/workflow/bootstrap_steps/base_workflow_bootstrap_step.py +2 -2
  347. autobyteus/workflow/bootstrap_steps/coordinator_initialization_step.py +2 -2
  348. autobyteus/workflow/bootstrap_steps/coordinator_prompt_preparation_step.py +3 -9
  349. autobyteus/workflow/bootstrap_steps/workflow_bootstrapper.py +6 -6
  350. autobyteus/workflow/bootstrap_steps/workflow_runtime_queue_initialization_step.py +2 -2
  351. autobyteus/workflow/context/workflow_context.py +3 -3
  352. autobyteus/workflow/context/workflow_runtime_state.py +5 -5
  353. autobyteus/workflow/events/workflow_event_dispatcher.py +5 -5
  354. autobyteus/workflow/handlers/lifecycle_workflow_event_handler.py +3 -3
  355. autobyteus/workflow/handlers/process_user_message_event_handler.py +5 -5
  356. autobyteus/workflow/handlers/tool_approval_workflow_event_handler.py +2 -2
  357. autobyteus/workflow/runtime/workflow_runtime.py +8 -8
  358. autobyteus/workflow/runtime/workflow_worker.py +3 -3
  359. autobyteus/workflow/status/__init__.py +11 -0
  360. autobyteus/workflow/status/workflow_status.py +19 -0
  361. autobyteus/workflow/status/workflow_status_manager.py +48 -0
  362. autobyteus/workflow/streaming/__init__.py +2 -2
  363. autobyteus/workflow/streaming/workflow_event_notifier.py +7 -7
  364. autobyteus/workflow/streaming/workflow_stream_event_payloads.py +4 -4
  365. autobyteus/workflow/streaming/workflow_stream_events.py +3 -3
  366. autobyteus/workflow/utils/wait_for_idle.py +4 -4
  367. autobyteus-1.3.0.dist-info/METADATA +293 -0
  368. autobyteus-1.3.0.dist-info/RECORD +606 -0
  369. {autobyteus-1.2.1.dist-info → autobyteus-1.3.0.dist-info}/WHEEL +1 -1
  370. {autobyteus-1.2.1.dist-info → autobyteus-1.3.0.dist-info}/top_level.txt +0 -1
  371. autobyteus/agent/bootstrap_steps/agent_runtime_queue_initialization_step.py +0 -57
  372. autobyteus/agent/hooks/__init__.py +0 -16
  373. autobyteus/agent/hooks/base_phase_hook.py +0 -78
  374. autobyteus/agent/hooks/hook_definition.py +0 -36
  375. autobyteus/agent/hooks/hook_meta.py +0 -37
  376. autobyteus/agent/hooks/hook_registry.py +0 -106
  377. autobyteus/agent/llm_response_processor/provider_aware_tool_usage_processor.py +0 -103
  378. autobyteus/agent/phases/__init__.py +0 -18
  379. autobyteus/agent/phases/discover.py +0 -53
  380. autobyteus/agent/phases/manager.py +0 -265
  381. autobyteus/agent/phases/transition_decorator.py +0 -40
  382. autobyteus/agent/phases/transition_info.py +0 -33
  383. autobyteus/agent/remote_agent.py +0 -244
  384. autobyteus/agent/workspace/workspace_definition.py +0 -36
  385. autobyteus/agent/workspace/workspace_meta.py +0 -37
  386. autobyteus/agent/workspace/workspace_registry.py +0 -72
  387. autobyteus/agent_team/bootstrap_steps/agent_team_runtime_queue_initialization_step.py +0 -25
  388. autobyteus/agent_team/bootstrap_steps/coordinator_prompt_preparation_step.py +0 -85
  389. autobyteus/agent_team/phases/__init__.py +0 -11
  390. autobyteus/agent_team/phases/agent_team_operational_phase.py +0 -19
  391. autobyteus/agent_team/phases/agent_team_phase_manager.py +0 -48
  392. autobyteus/llm/api/bedrock_llm.py +0 -92
  393. autobyteus/llm/api/groq_llm.py +0 -94
  394. autobyteus/llm/api/nvidia_llm.py +0 -108
  395. autobyteus/llm/utils/token_pricing_config.py +0 -87
  396. autobyteus/rpc/__init__.py +0 -73
  397. autobyteus/rpc/client/__init__.py +0 -17
  398. autobyteus/rpc/client/abstract_client_connection.py +0 -124
  399. autobyteus/rpc/client/client_connection_manager.py +0 -153
  400. autobyteus/rpc/client/sse_client_connection.py +0 -306
  401. autobyteus/rpc/client/stdio_client_connection.py +0 -280
  402. autobyteus/rpc/config/__init__.py +0 -13
  403. autobyteus/rpc/config/agent_server_config.py +0 -153
  404. autobyteus/rpc/config/agent_server_registry.py +0 -152
  405. autobyteus/rpc/hosting.py +0 -244
  406. autobyteus/rpc/protocol.py +0 -244
  407. autobyteus/rpc/server/__init__.py +0 -20
  408. autobyteus/rpc/server/agent_server_endpoint.py +0 -181
  409. autobyteus/rpc/server/base_method_handler.py +0 -40
  410. autobyteus/rpc/server/method_handlers.py +0 -259
  411. autobyteus/rpc/server/sse_server_handler.py +0 -182
  412. autobyteus/rpc/server/stdio_server_handler.py +0 -151
  413. autobyteus/rpc/server_main.py +0 -198
  414. autobyteus/rpc/transport_type.py +0 -13
  415. autobyteus/tools/bash/__init__.py +0 -2
  416. autobyteus/tools/bash/bash_executor.py +0 -100
  417. autobyteus/tools/browser/__init__.py +0 -2
  418. autobyteus/tools/browser/session_aware/browser_session_aware_navigate_to.py +0 -75
  419. autobyteus/tools/browser/session_aware/browser_session_aware_tool.py +0 -30
  420. autobyteus/tools/browser/session_aware/browser_session_aware_web_element_trigger.py +0 -154
  421. autobyteus/tools/browser/session_aware/browser_session_aware_webpage_reader.py +0 -89
  422. autobyteus/tools/browser/session_aware/browser_session_aware_webpage_screenshot_taker.py +0 -107
  423. autobyteus/tools/browser/session_aware/factory/browser_session_aware_web_element_trigger_factory.py +0 -14
  424. autobyteus/tools/browser/session_aware/factory/browser_session_aware_webpage_reader_factory.py +0 -26
  425. autobyteus/tools/browser/session_aware/factory/browser_session_aware_webpage_screenshot_taker_factory.py +0 -14
  426. autobyteus/tools/browser/session_aware/shared_browser_session.py +0 -11
  427. autobyteus/tools/browser/session_aware/shared_browser_session_manager.py +0 -25
  428. autobyteus/tools/browser/session_aware/web_element_action.py +0 -20
  429. autobyteus/tools/browser/standalone/__init__.py +0 -6
  430. autobyteus/tools/browser/standalone/factory/__init__.py +0 -0
  431. autobyteus/tools/browser/standalone/factory/webpage_reader_factory.py +0 -25
  432. autobyteus/tools/browser/standalone/factory/webpage_screenshot_taker_factory.py +0 -14
  433. autobyteus/tools/browser/standalone/navigate_to.py +0 -84
  434. autobyteus/tools/browser/standalone/web_page_pdf_generator.py +0 -101
  435. autobyteus/tools/browser/standalone/webpage_image_downloader.py +0 -169
  436. autobyteus/tools/browser/standalone/webpage_reader.py +0 -105
  437. autobyteus/tools/browser/standalone/webpage_screenshot_taker.py +0 -105
  438. autobyteus/tools/file/edit_file.py +0 -200
  439. autobyteus/tools/file/list_directory.py +0 -168
  440. autobyteus/tools/file/search_files.py +0 -188
  441. autobyteus/tools/timer.py +0 -175
  442. autobyteus/tools/usage/parsers/__init__.py +0 -22
  443. autobyteus/tools/usage/parsers/_json_extractor.py +0 -99
  444. autobyteus/tools/usage/parsers/_string_decoders.py +0 -18
  445. autobyteus/tools/usage/parsers/anthropic_xml_tool_usage_parser.py +0 -10
  446. autobyteus/tools/usage/parsers/base_parser.py +0 -41
  447. autobyteus/tools/usage/parsers/default_json_tool_usage_parser.py +0 -83
  448. autobyteus/tools/usage/parsers/default_xml_tool_usage_parser.py +0 -316
  449. autobyteus/tools/usage/parsers/exceptions.py +0 -13
  450. autobyteus/tools/usage/parsers/gemini_json_tool_usage_parser.py +0 -77
  451. autobyteus/tools/usage/parsers/openai_json_tool_usage_parser.py +0 -149
  452. autobyteus/tools/usage/parsers/provider_aware_tool_usage_parser.py +0 -59
  453. autobyteus/tools/usage/registries/tool_usage_parser_registry.py +0 -62
  454. autobyteus/workflow/phases/__init__.py +0 -11
  455. autobyteus/workflow/phases/workflow_operational_phase.py +0 -19
  456. autobyteus/workflow/phases/workflow_phase_manager.py +0 -48
  457. autobyteus-1.2.1.dist-info/METADATA +0 -205
  458. autobyteus-1.2.1.dist-info/RECORD +0 -511
  459. examples/__init__.py +0 -1
  460. examples/agent_team/__init__.py +0 -1
  461. examples/discover_phase_transitions.py +0 -104
  462. examples/run_agentic_software_engineer.py +0 -239
  463. examples/run_browser_agent.py +0 -262
  464. examples/run_google_slides_agent.py +0 -287
  465. examples/run_mcp_browser_client.py +0 -174
  466. examples/run_mcp_google_slides_client.py +0 -270
  467. examples/run_mcp_list_tools.py +0 -189
  468. examples/run_poem_writer.py +0 -284
  469. examples/run_sqlite_agent.py +0 -295
  470. /autobyteus/{tools/browser/session_aware → skills}/__init__.py +0 -0
  471. /autobyteus/tools/{browser/session_aware/factory → skill}/__init__.py +0 -0
  472. {autobyteus-1.2.1.dist-info → autobyteus-1.3.0.dist-info}/licenses/LICENSE +0 -0
@@ -1,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,35 @@
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
+ from autobyteus.memory.path_resolver import resolve_memory_base_dir, resolve_agent_memory_dir
16
+
17
+ __all__ = [
18
+ "MemoryType",
19
+ "RawTraceItem",
20
+ "EpisodicItem",
21
+ "SemanticItem",
22
+ "ToolInteraction",
23
+ "ToolInteractionStatus",
24
+ "FileMemoryStore",
25
+ "TurnTracker",
26
+ "MemoryManager",
27
+ "CompactionPolicy",
28
+ "Compactor",
29
+ "CompactionResult",
30
+ "Summarizer",
31
+ "MemoryBundle",
32
+ "Retriever",
33
+ "resolve_memory_base_dir",
34
+ "resolve_agent_memory_dir",
35
+ ]
@@ -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,205 @@
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.working_context_snapshot import WorkingContextSnapshot
17
+ from autobyteus.memory.tool_interaction_builder import build_tool_interactions
18
+ from autobyteus.memory.working_context_snapshot_serializer import WorkingContextSnapshotSerializer
19
+ from autobyteus.memory.store.working_context_snapshot_store import WorkingContextSnapshotStore
20
+
21
+
22
+ class MemoryManager:
23
+ def __init__(
24
+ self,
25
+ store: MemoryStore,
26
+ turn_tracker: Optional[TurnTracker] = None,
27
+ compaction_policy: Optional[CompactionPolicy] = None,
28
+ compactor: Optional[Compactor] = None,
29
+ retriever: Optional[Retriever] = None,
30
+ working_context_snapshot: Optional[WorkingContextSnapshot] = None,
31
+ working_context_snapshot_store: Optional[WorkingContextSnapshotStore] = None,
32
+ ):
33
+ self.store = store
34
+ self.turn_tracker = turn_tracker or TurnTracker()
35
+ self.compaction_policy = compaction_policy or CompactionPolicy()
36
+ self.compactor = compactor
37
+ self.retriever = retriever or Retriever(store=store)
38
+ self.memory_types = MemoryType
39
+ self._seq_by_turn: dict[str, int] = {}
40
+ self.working_context_snapshot = working_context_snapshot or WorkingContextSnapshot()
41
+ self.compaction_required: bool = False
42
+ self.working_context_snapshot_store = working_context_snapshot_store
43
+
44
+ def start_turn(self) -> str:
45
+ return self.turn_tracker.next_turn_id()
46
+
47
+ def request_compaction(self) -> None:
48
+ self.compaction_required = True
49
+
50
+ def clear_compaction_request(self) -> None:
51
+ self.compaction_required = False
52
+
53
+ def _next_seq(self, turn_id: str) -> int:
54
+ current = self._seq_by_turn.get(turn_id, 0) + 1
55
+ self._seq_by_turn[turn_id] = current
56
+ return current
57
+
58
+ def ingest_user_message(self, llm_user_message: LLMUserMessage, turn_id: str, source_event: str) -> None:
59
+ trace = RawTraceItem(
60
+ id=f"rt_{int(time.time() * 1000)}",
61
+ ts=time.time(),
62
+ turn_id=turn_id,
63
+ seq=self._next_seq(turn_id),
64
+ trace_type="user",
65
+ content=llm_user_message.content,
66
+ source_event=source_event,
67
+ media={
68
+ "images": llm_user_message.image_urls or [],
69
+ "audio": llm_user_message.audio_urls or [],
70
+ "video": llm_user_message.video_urls or [],
71
+ },
72
+ tags=["processed"],
73
+ )
74
+ self.store.add([trace])
75
+
76
+ def ingest_tool_intent(self, tool_invocation: ToolInvocation, turn_id: Optional[str] = None) -> None:
77
+ effective_turn_id = tool_invocation.turn_id or turn_id
78
+ if not effective_turn_id:
79
+ raise ValueError("turn_id is required to ingest tool intent")
80
+ trace = RawTraceItem(
81
+ id=f"rt_{int(time.time() * 1000)}",
82
+ ts=time.time(),
83
+ turn_id=effective_turn_id,
84
+ seq=self._next_seq(effective_turn_id),
85
+ trace_type="tool_call",
86
+ content="",
87
+ source_event="PendingToolInvocationEvent",
88
+ tool_name=tool_invocation.name,
89
+ tool_call_id=tool_invocation.id,
90
+ tool_args=tool_invocation.arguments,
91
+ )
92
+ self.store.add([trace])
93
+ self.working_context_snapshot.append_tool_calls(
94
+ [ToolCallSpec(id=tool_invocation.id, name=tool_invocation.name, arguments=tool_invocation.arguments)]
95
+ )
96
+
97
+ def ingest_tool_result(self, event: ToolResultEvent, turn_id: Optional[str] = None) -> None:
98
+ effective_turn_id = event.turn_id or turn_id
99
+ if not effective_turn_id:
100
+ raise ValueError("turn_id is required to ingest tool result")
101
+ trace = RawTraceItem(
102
+ id=f"rt_{int(time.time() * 1000)}",
103
+ ts=time.time(),
104
+ turn_id=effective_turn_id,
105
+ seq=self._next_seq(effective_turn_id),
106
+ trace_type="tool_result",
107
+ content="",
108
+ source_event="ToolResultEvent",
109
+ tool_name=event.tool_name,
110
+ tool_call_id=event.tool_invocation_id,
111
+ tool_args=event.tool_args,
112
+ tool_result=event.result,
113
+ tool_error=event.error,
114
+ )
115
+ self.store.add([trace])
116
+ self.working_context_snapshot.append_tool_result(
117
+ tool_call_id=event.tool_invocation_id or "",
118
+ tool_name=event.tool_name,
119
+ tool_result=event.result,
120
+ tool_error=event.error,
121
+ )
122
+
123
+ def ingest_assistant_response(self, response: CompleteResponse, turn_id: str, source_event: str) -> None:
124
+ trace = RawTraceItem(
125
+ id=f"rt_{int(time.time() * 1000)}",
126
+ ts=time.time(),
127
+ turn_id=turn_id,
128
+ seq=self._next_seq(turn_id),
129
+ trace_type="assistant",
130
+ content=response.content or "",
131
+ source_event=source_event,
132
+ tags=["final"],
133
+ )
134
+ self.store.add([trace])
135
+ if response.content or response.reasoning:
136
+ self.working_context_snapshot.append_assistant(
137
+ content=response.content,
138
+ reasoning=response.reasoning,
139
+ )
140
+ self.persist_working_context_snapshot()
141
+
142
+ def _get_raw_tail(self, tail_turns: int, exclude_turn_id: Optional[str] = None) -> List[RawTraceItem]:
143
+ raw_items = self.store.list(MemoryType.RAW_TRACE)
144
+ if tail_turns <= 0:
145
+ return []
146
+
147
+ ordered_turns = []
148
+ seen = set()
149
+ for item in raw_items:
150
+ if not isinstance(item, RawTraceItem):
151
+ continue
152
+ if exclude_turn_id and item.turn_id == exclude_turn_id:
153
+ continue
154
+ if item.turn_id not in seen:
155
+ seen.add(item.turn_id)
156
+ ordered_turns.append(item.turn_id)
157
+
158
+ if not ordered_turns:
159
+ return []
160
+
161
+ keep_turns = set(ordered_turns[-tail_turns:])
162
+ tail_items = [
163
+ item
164
+ for item in raw_items
165
+ if isinstance(item, RawTraceItem) and item.turn_id in keep_turns
166
+ ]
167
+
168
+ order_index = {turn_id: idx for idx, turn_id in enumerate(ordered_turns)}
169
+ tail_items.sort(key=lambda item: (order_index.get(item.turn_id, 0), item.seq))
170
+ return tail_items
171
+
172
+ def get_raw_tail(self, tail_turns: int, exclude_turn_id: Optional[str] = None) -> List[RawTraceItem]:
173
+ return self._get_raw_tail(tail_turns, exclude_turn_id=exclude_turn_id)
174
+
175
+ def get_working_context_messages(self):
176
+ return self.working_context_snapshot.build_messages()
177
+
178
+ def reset_working_context_snapshot(self, snapshot_messages):
179
+ self.working_context_snapshot.reset(snapshot_messages)
180
+ self.persist_working_context_snapshot()
181
+
182
+ def persist_working_context_snapshot(self) -> None:
183
+ if not self.working_context_snapshot_store:
184
+ return
185
+ agent_id = getattr(self.working_context_snapshot_store, "agent_id", None) or getattr(self.store, "agent_id", None)
186
+ if not agent_id:
187
+ return
188
+ metadata = {
189
+ "schema_version": 1,
190
+ "agent_id": agent_id,
191
+ "epoch_id": self.working_context_snapshot.epoch_id,
192
+ "last_compaction_ts": self.working_context_snapshot.last_compaction_ts,
193
+ }
194
+ payload = WorkingContextSnapshotSerializer.serialize(self.working_context_snapshot, metadata)
195
+ self.working_context_snapshot_store.write(agent_id, payload)
196
+
197
+
198
+ def get_tool_interactions(self, turn_id: Optional[str] = None):
199
+ raw_items = self.store.list(MemoryType.RAW_TRACE)
200
+ if turn_id:
201
+ raw_items = [
202
+ item for item in raw_items
203
+ if isinstance(item, RawTraceItem) and item.turn_id == turn_id
204
+ ]
205
+ 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
+ )
@@ -0,0 +1,7 @@
1
+ from enum import Enum
2
+
3
+
4
+ class MemoryType(str, Enum):
5
+ RAW_TRACE = "raw_trace"
6
+ EPISODIC = "episodic"
7
+ SEMANTIC = "semantic"