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

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