auto-coder 0.1.364__tar.gz → 0.1.366__tar.gz

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.

Potentially problematic release.


This version of auto-coder might be problematic. Click here for more details.

Files changed (352) hide show
  1. {auto_coder-0.1.364 → auto_coder-0.1.366}/PKG-INFO +1 -1
  2. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/auto_coder.egg-info/PKG-INFO +1 -1
  3. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/auto_coder.egg-info/SOURCES.txt +1 -0
  4. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/agent/base_agentic/base_agent.py +23 -8
  5. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/auto_coder.py +46 -2
  6. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/__init__.py +3 -0
  7. auto_coder-0.1.366/src/autocoder/common/file_checkpoint/conversation_checkpoint.py +182 -0
  8. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/file_checkpoint/manager.py +209 -1
  9. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/utils_code_auto_generate.py +3 -2
  10. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/v2/agent/agentic_edit.py +321 -104
  11. auto_coder-0.1.366/src/autocoder/common/v2/agent/agentic_edit_tools/list_files_tool_resolver.py +147 -0
  12. auto_coder-0.1.366/src/autocoder/common/v2/agent/agentic_edit_tools/read_file_tool_resolver.py +141 -0
  13. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/v2/agent/agentic_edit_tools/replace_in_file_tool_resolver.py +169 -61
  14. auto_coder-0.1.366/src/autocoder/common/v2/agent/agentic_edit_tools/search_files_tool_resolver.py +179 -0
  15. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/v2/agent/agentic_edit_tools/write_to_file_tool_resolver.py +95 -76
  16. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/v2/agent/agentic_edit_types.py +4 -0
  17. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/events/event_manager_singleton.py +1 -2
  18. auto_coder-0.1.366/src/autocoder/version.py +1 -0
  19. auto_coder-0.1.364/src/autocoder/common/v2/agent/agentic_edit_tools/list_files_tool_resolver.py +0 -107
  20. auto_coder-0.1.364/src/autocoder/common/v2/agent/agentic_edit_tools/read_file_tool_resolver.py +0 -54
  21. auto_coder-0.1.364/src/autocoder/common/v2/agent/agentic_edit_tools/search_files_tool_resolver.py +0 -134
  22. auto_coder-0.1.364/src/autocoder/version.py +0 -1
  23. {auto_coder-0.1.364 → auto_coder-0.1.366}/LICENSE +0 -0
  24. {auto_coder-0.1.364 → auto_coder-0.1.366}/README.md +0 -0
  25. {auto_coder-0.1.364 → auto_coder-0.1.366}/setup.cfg +0 -0
  26. {auto_coder-0.1.364 → auto_coder-0.1.366}/setup.py +0 -0
  27. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/auto_coder.egg-info/dependency_links.txt +0 -0
  28. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/auto_coder.egg-info/entry_points.txt +0 -0
  29. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/auto_coder.egg-info/requires.txt +0 -0
  30. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/auto_coder.egg-info/top_level.txt +0 -0
  31. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/__init__.py +0 -0
  32. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/agent/__init__.py +0 -0
  33. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/agent/agentic_filter.py +0 -0
  34. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/agent/auto_demand_organizer.py +0 -0
  35. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/agent/auto_filegroup.py +0 -0
  36. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/agent/auto_guess_query.py +0 -0
  37. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/agent/auto_learn.py +0 -0
  38. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/agent/auto_learn_from_commit.py +0 -0
  39. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/agent/auto_review_commit.py +0 -0
  40. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/agent/auto_tool.py +0 -0
  41. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/agent/base_agentic/__init__.py +0 -0
  42. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/agent/base_agentic/agent_hub.py +0 -0
  43. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/agent/base_agentic/agentic_lang.py +0 -0
  44. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/agent/base_agentic/agentic_tool_display.py +0 -0
  45. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/agent/base_agentic/default_tools.py +0 -0
  46. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/agent/base_agentic/test_base_agent.py +0 -0
  47. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/agent/base_agentic/tool_registry.py +0 -0
  48. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/agent/base_agentic/tools/__init__.py +0 -0
  49. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/agent/base_agentic/tools/ask_followup_question_tool_resolver.py +0 -0
  50. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/agent/base_agentic/tools/attempt_completion_tool_resolver.py +0 -0
  51. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/agent/base_agentic/tools/base_tool_resolver.py +0 -0
  52. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/agent/base_agentic/tools/example_tool_resolver.py +0 -0
  53. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/agent/base_agentic/tools/execute_command_tool_resolver.py +0 -0
  54. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/agent/base_agentic/tools/list_files_tool_resolver.py +0 -0
  55. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/agent/base_agentic/tools/plan_mode_respond_tool_resolver.py +0 -0
  56. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/agent/base_agentic/tools/read_file_tool_resolver.py +0 -0
  57. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/agent/base_agentic/tools/replace_in_file_tool_resolver.py +0 -0
  58. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/agent/base_agentic/tools/search_files_tool_resolver.py +0 -0
  59. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/agent/base_agentic/tools/talk_to_group_tool_resolver.py +0 -0
  60. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/agent/base_agentic/tools/talk_to_tool_resolver.py +0 -0
  61. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/agent/base_agentic/tools/use_mcp_tool_resolver.py +0 -0
  62. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/agent/base_agentic/tools/write_to_file_tool_resolver.py +0 -0
  63. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/agent/base_agentic/types.py +0 -0
  64. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/agent/base_agentic/utils.py +0 -0
  65. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/agent/coder.py +0 -0
  66. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/agent/designer.py +0 -0
  67. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/agent/planner.py +0 -0
  68. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/agent/project_reader.py +0 -0
  69. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/auto_coder_rag.py +0 -0
  70. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/auto_coder_runner.py +0 -0
  71. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/auto_coder_server.py +0 -0
  72. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/benchmark.py +0 -0
  73. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/chat/__init__.py +0 -0
  74. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/chat/conf_command.py +0 -0
  75. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/chat/models_command.py +0 -0
  76. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/chat/rules_command.py +0 -0
  77. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/chat_auto_coder.py +0 -0
  78. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/chat_auto_coder_lang.py +0 -0
  79. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/command_args.py +0 -0
  80. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/command_parser.py +0 -0
  81. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/commands/__init__.py +0 -0
  82. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/commands/auto_command.py +0 -0
  83. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/commands/auto_web.py +0 -0
  84. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/commands/tools.py +0 -0
  85. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/JupyterClient.py +0 -0
  86. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/ShellClient.py +0 -0
  87. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/action_yml_file_manager.py +0 -0
  88. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/anything2images.py +0 -0
  89. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/anything2img.py +0 -0
  90. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/audio.py +0 -0
  91. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/auto_coder_lang.py +0 -0
  92. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/auto_configure.py +0 -0
  93. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/buildin_tokenizer.py +0 -0
  94. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/chunk_validation.py +0 -0
  95. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/cleaner.py +0 -0
  96. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/code_auto_execute.py +0 -0
  97. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/code_auto_generate.py +0 -0
  98. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/code_auto_generate_diff.py +0 -0
  99. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/code_auto_generate_editblock.py +0 -0
  100. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/code_auto_generate_strict_diff.py +0 -0
  101. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/code_auto_merge.py +0 -0
  102. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/code_auto_merge_diff.py +0 -0
  103. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/code_auto_merge_editblock.py +0 -0
  104. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/code_auto_merge_strict_diff.py +0 -0
  105. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/code_modification_ranker.py +0 -0
  106. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/command_completer.py +0 -0
  107. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/command_completer_v2.py +0 -0
  108. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/command_generator.py +0 -0
  109. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/command_templates.py +0 -0
  110. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/computer_use.py +0 -0
  111. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/conf_import_export.py +0 -0
  112. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/conf_utils.py +0 -0
  113. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/conf_validator.py +0 -0
  114. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/const.py +0 -0
  115. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/context_pruner.py +0 -0
  116. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/conversation_pruner.py +0 -0
  117. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/conversations/__init__.py +0 -0
  118. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/conversations/compatibility.py +0 -0
  119. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/conversations/conversation_manager.py +0 -0
  120. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/conversations/example.py +0 -0
  121. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/directory_cache/__init__.py +0 -0
  122. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/directory_cache/cache.py +0 -0
  123. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/directory_cache/test_cache.py +0 -0
  124. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/file_checkpoint/__init__.py +0 -0
  125. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/file_checkpoint/backup.py +0 -0
  126. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/file_checkpoint/examples.py +0 -0
  127. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/file_checkpoint/models.py +0 -0
  128. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/file_checkpoint/store.py +0 -0
  129. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/file_checkpoint/test_backup.py +0 -0
  130. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/file_checkpoint/test_manager.py +0 -0
  131. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/file_checkpoint/test_models.py +0 -0
  132. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/file_checkpoint/test_store.py +0 -0
  133. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/file_checkpoint/test_utils.py +0 -0
  134. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/file_checkpoint/utils.py +0 -0
  135. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/file_monitor/__init__.py +0 -0
  136. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/file_monitor/monitor.py +0 -0
  137. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/files.py +0 -0
  138. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/git_utils.py +0 -0
  139. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/global_cancel.py +0 -0
  140. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/ignorefiles/__init__.py +0 -0
  141. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/ignorefiles/ignore_file_utils.py +0 -0
  142. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/ignorefiles/test_ignore_file_utils.py +0 -0
  143. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/image_to_page.py +0 -0
  144. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/index_import_export.py +0 -0
  145. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/interpreter.py +0 -0
  146. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/llm_rerank.py +0 -0
  147. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/mcp_hub.py +0 -0
  148. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/mcp_server.py +0 -0
  149. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/mcp_server_install.py +0 -0
  150. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/mcp_server_types.py +0 -0
  151. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/mcp_servers/__init__.py +0 -0
  152. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/mcp_servers/mcp_server_gpt4o_mini_search.py +0 -0
  153. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/mcp_servers/mcp_server_perplexity.py +0 -0
  154. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/mcp_tools.py +0 -0
  155. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/memory_manager.py +0 -0
  156. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/model_speed_tester.py +0 -0
  157. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/openai_content.py +0 -0
  158. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/printer.py +0 -0
  159. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/recall_validation.py +0 -0
  160. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/result_manager.py +0 -0
  161. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/rulefiles/__init__.py +0 -0
  162. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/rulefiles/autocoderrules_utils.py +0 -0
  163. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/run_cmd.py +0 -0
  164. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/save_formatted_log.py +0 -0
  165. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/screenshots.py +0 -0
  166. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/search.py +0 -0
  167. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/search_replace.py +0 -0
  168. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/shells.py +0 -0
  169. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/stats_panel.py +0 -0
  170. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/stream_out_type.py +0 -0
  171. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/sys_prompt.py +0 -0
  172. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/test_run_cmd.py +0 -0
  173. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/text.py +0 -0
  174. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/token_cost_caculate.py +0 -0
  175. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/types.py +0 -0
  176. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/v2/__init__.py +0 -0
  177. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/v2/agent/__init__.py +0 -0
  178. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/v2/agent/agentic_edit_tools/__init__.py +0 -0
  179. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/v2/agent/agentic_edit_tools/ask_followup_question_tool_resolver.py +0 -0
  180. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/v2/agent/agentic_edit_tools/attempt_completion_tool_resolver.py +0 -0
  181. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/v2/agent/agentic_edit_tools/base_tool_resolver.py +0 -0
  182. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/v2/agent/agentic_edit_tools/execute_command_tool_resolver.py +0 -0
  183. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/v2/agent/agentic_edit_tools/list_code_definition_names_tool_resolver.py +0 -0
  184. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/v2/agent/agentic_edit_tools/list_package_info_tool_resolver.py +0 -0
  185. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/v2/agent/agentic_edit_tools/plan_mode_respond_tool_resolver.py +0 -0
  186. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/v2/agent/agentic_edit_tools/test_search_files_tool_resolver.py +0 -0
  187. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/v2/agent/agentic_edit_tools/test_write_to_file_tool_resolver.py +0 -0
  188. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/v2/agent/agentic_edit_tools/use_mcp_tool_resolver.py +0 -0
  189. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/v2/agent/agentic_tool_display.py +0 -0
  190. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/v2/code_agentic_editblock_manager.py +0 -0
  191. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/v2/code_auto_generate.py +0 -0
  192. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/v2/code_auto_generate_diff.py +0 -0
  193. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/v2/code_auto_generate_editblock.py +0 -0
  194. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/v2/code_auto_generate_strict_diff.py +0 -0
  195. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/v2/code_auto_merge.py +0 -0
  196. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/v2/code_auto_merge_diff.py +0 -0
  197. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/v2/code_auto_merge_editblock.py +0 -0
  198. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/v2/code_auto_merge_strict_diff.py +0 -0
  199. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/v2/code_diff_manager.py +0 -0
  200. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/v2/code_editblock_manager.py +0 -0
  201. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/v2/code_manager.py +0 -0
  202. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/v2/code_strict_diff_manager.py +0 -0
  203. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/compilers/__init__.py +0 -0
  204. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/compilers/base_compiler.py +0 -0
  205. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/compilers/compiler_config_api.py +0 -0
  206. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/compilers/compiler_config_manager.py +0 -0
  207. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/compilers/compiler_factory.py +0 -0
  208. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/compilers/java_compiler.py +0 -0
  209. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/compilers/models.py +0 -0
  210. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/compilers/normal_compiler.py +0 -0
  211. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/compilers/provided_compiler.py +0 -0
  212. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/compilers/python_compiler.py +0 -0
  213. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/compilers/reactjs_compiler.py +0 -0
  214. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/compilers/shadow_compiler.py +0 -0
  215. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/compilers/vue_compiler.py +0 -0
  216. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/data/byzerllm.md +0 -0
  217. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/data/tokenizer.json +0 -0
  218. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/db/__init__.py +0 -0
  219. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/db/store.py +0 -0
  220. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/dispacher/__init__.py +0 -0
  221. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/dispacher/actions/__init__.py +0 -0
  222. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/dispacher/actions/action.py +0 -0
  223. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/dispacher/actions/copilot.py +0 -0
  224. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/dispacher/actions/plugins/__init__.py +0 -0
  225. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/dispacher/actions/plugins/action_regex_project.py +0 -0
  226. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/events/__init__.py +0 -0
  227. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/events/event_content.py +0 -0
  228. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/events/event_manager.py +0 -0
  229. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/events/event_store.py +0 -0
  230. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/events/event_types.py +0 -0
  231. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/helper/__init__.py +0 -0
  232. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/helper/project_creator.py +0 -0
  233. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/helper/rag_doc_creator.py +0 -0
  234. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/index/__init__.py +0 -0
  235. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/index/entry.py +0 -0
  236. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/index/filter/__init__.py +0 -0
  237. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/index/filter/normal_filter.py +0 -0
  238. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/index/filter/quick_filter.py +0 -0
  239. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/index/for_command.py +0 -0
  240. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/index/index.py +0 -0
  241. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/index/symbols_utils.py +0 -0
  242. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/index/types.py +0 -0
  243. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/lang.py +0 -0
  244. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/linters/__init__.py +0 -0
  245. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/linters/base_linter.py +0 -0
  246. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/linters/linter_factory.py +0 -0
  247. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/linters/models.py +0 -0
  248. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/linters/normal_linter.py +0 -0
  249. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/linters/python_linter.py +0 -0
  250. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/linters/reactjs_linter.py +0 -0
  251. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/linters/shadow_linter.py +0 -0
  252. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/linters/vue_linter.py +0 -0
  253. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/memory/__init__.py +0 -0
  254. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/memory/active_context_manager.py +0 -0
  255. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/memory/active_package.py +0 -0
  256. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/memory/async_processor.py +0 -0
  257. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/memory/directory_mapper.py +0 -0
  258. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/models.py +0 -0
  259. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/plugins/__init__.py +0 -0
  260. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/plugins/dynamic_completion_example.py +0 -0
  261. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/plugins/git_helper_plugin.py +0 -0
  262. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/plugins/sample_plugin.py +0 -0
  263. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/plugins/token_helper_plugin.py +0 -0
  264. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/plugins/utils.py +0 -0
  265. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/privacy/__init__.py +0 -0
  266. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/privacy/model_filter.py +0 -0
  267. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/pyproject/__init__.py +0 -0
  268. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/rag/__init__.py +0 -0
  269. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/rag/api_server.py +0 -0
  270. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/rag/cache/__init__.py +0 -0
  271. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/rag/cache/base_cache.py +0 -0
  272. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/rag/cache/byzer_storage_cache.py +0 -0
  273. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/rag/cache/cache_result_merge.py +0 -0
  274. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/rag/cache/failed_files_utils.py +0 -0
  275. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/rag/cache/file_monitor_cache.py +0 -0
  276. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/rag/cache/local_byzer_storage_cache.py +0 -0
  277. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/rag/cache/local_duckdb_storage_cache.py +0 -0
  278. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/rag/cache/rag_file_meta.py +0 -0
  279. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/rag/cache/simple_cache.py +0 -0
  280. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/rag/conversation_to_queries.py +0 -0
  281. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/rag/doc_filter.py +0 -0
  282. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/rag/document_retriever.py +0 -0
  283. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/rag/lang.py +0 -0
  284. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/rag/llm_wrapper.py +0 -0
  285. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/rag/loaders/__init__.py +0 -0
  286. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/rag/loaders/docx_loader.py +0 -0
  287. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/rag/loaders/excel_loader.py +0 -0
  288. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/rag/loaders/filter_utils.py +0 -0
  289. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/rag/loaders/image_loader.py +0 -0
  290. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/rag/loaders/pdf_loader.py +0 -0
  291. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/rag/loaders/ppt_loader.py +0 -0
  292. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/rag/long_context_rag.py +0 -0
  293. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/rag/qa_conversation_strategy.py +0 -0
  294. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/rag/rag_config.py +0 -0
  295. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/rag/rag_entry.py +0 -0
  296. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/rag/raw_rag.py +0 -0
  297. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/rag/relevant_utils.py +0 -0
  298. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/rag/searchable.py +0 -0
  299. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/rag/simple_directory_reader.py +0 -0
  300. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/rag/simple_rag.py +0 -0
  301. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/rag/stream_event/__init__.py +0 -0
  302. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/rag/stream_event/event_writer.py +0 -0
  303. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/rag/stream_event/types.py +0 -0
  304. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/rag/test_doc_filter.py +0 -0
  305. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/rag/test_long_context_rag.py +0 -0
  306. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/rag/test_token_limiter.py +0 -0
  307. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/rag/token_checker.py +0 -0
  308. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/rag/token_counter.py +0 -0
  309. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/rag/token_limiter.py +0 -0
  310. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/rag/token_limiter_utils.py +0 -0
  311. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/rag/types.py +0 -0
  312. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/rag/utils.py +0 -0
  313. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/rag/variable_holder.py +0 -0
  314. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/regexproject/__init__.py +0 -0
  315. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/run_context.py +0 -0
  316. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/shadows/__init__.py +0 -0
  317. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/shadows/shadow_manager.py +0 -0
  318. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/suffixproject/__init__.py +0 -0
  319. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/tsproject/__init__.py +0 -0
  320. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/utils/__init__.py +0 -0
  321. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/utils/_markitdown.py +0 -0
  322. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/utils/auto_coder_utils/__init__.py +0 -0
  323. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/utils/auto_coder_utils/chat_stream_out.py +0 -0
  324. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/utils/auto_project_type.py +0 -0
  325. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/utils/chat_auto_coder_utils/__init__.py +0 -0
  326. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/utils/conversation_store.py +0 -0
  327. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/utils/llm_client_interceptors.py +0 -0
  328. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/utils/llms.py +0 -0
  329. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/utils/log_capture.py +0 -0
  330. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/utils/model_provider_selector.py +0 -0
  331. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/utils/multi_turn.py +0 -0
  332. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/utils/operate_config_api.py +0 -0
  333. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/utils/print_table.py +0 -0
  334. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/utils/project_structure.py +0 -0
  335. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/utils/queue_communicate.py +0 -0
  336. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/utils/request_event_queue.py +0 -0
  337. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/utils/request_queue.py +0 -0
  338. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/utils/rest.py +0 -0
  339. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/utils/stream_thinking.py +0 -0
  340. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/utils/tests.py +0 -0
  341. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/utils/thread_utils.py +0 -0
  342. {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/utils/types.py +0 -0
  343. {auto_coder-0.1.364 → auto_coder-0.1.366}/tests/test_action_regex_project.py +0 -0
  344. {auto_coder-0.1.364 → auto_coder-0.1.366}/tests/test_action_yml_file_manager.py +0 -0
  345. {auto_coder-0.1.364 → auto_coder-0.1.366}/tests/test_chat_auto_coder.py +0 -0
  346. {auto_coder-0.1.364 → auto_coder-0.1.366}/tests/test_code_auto_merge_editblock.py +0 -0
  347. {auto_coder-0.1.364 → auto_coder-0.1.366}/tests/test_command_completer.py +0 -0
  348. {auto_coder-0.1.364 → auto_coder-0.1.366}/tests/test_planner.py +0 -0
  349. {auto_coder-0.1.364 → auto_coder-0.1.366}/tests/test_plugins.py +0 -0
  350. {auto_coder-0.1.364 → auto_coder-0.1.366}/tests/test_privacy.py +0 -0
  351. {auto_coder-0.1.364 → auto_coder-0.1.366}/tests/test_queue_communicate.py +0 -0
  352. {auto_coder-0.1.364 → auto_coder-0.1.366}/tests/test_symbols_utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: auto-coder
3
- Version: 0.1.364
3
+ Version: 0.1.366
4
4
  Summary: AutoCoder: AutoCoder
5
5
  Author: allwefantasy
6
6
  Classifier: Programming Language :: Python :: 3.10
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: auto-coder
3
- Version: 0.1.364
3
+ Version: 0.1.366
4
4
  Summary: AutoCoder: AutoCoder
5
5
  Author: allwefantasy
6
6
  Classifier: Programming Language :: Python :: 3.10
@@ -141,6 +141,7 @@ src/autocoder/common/directory_cache/cache.py
141
141
  src/autocoder/common/directory_cache/test_cache.py
142
142
  src/autocoder/common/file_checkpoint/__init__.py
143
143
  src/autocoder/common/file_checkpoint/backup.py
144
+ src/autocoder/common/file_checkpoint/conversation_checkpoint.py
144
145
  src/autocoder/common/file_checkpoint/examples.py
145
146
  src/autocoder/common/file_checkpoint/manager.py
146
147
  src/autocoder/common/file_checkpoint/models.py
@@ -794,10 +794,18 @@ class BaseAgent(ABC):
794
794
  llm_response_gen)
795
795
 
796
796
  event_count = 0
797
+ mark_event_should_finish = False
797
798
  for event in parsed_events:
798
799
  event_count += 1
799
800
  logger.info(f"Processing event #{event_count}: {type(event).__name__}")
800
801
  global_cancel.check_and_raise(token=self.args.event_file)
802
+
803
+ if mark_event_should_finish:
804
+ if isinstance(event, TokenUsageEvent):
805
+ logger.info("Yielding token usage event")
806
+ yield event
807
+ continue
808
+
801
809
  if isinstance(event, (LLMOutputEvent, LLMThinkingEvent)):
802
810
  assistant_buffer += event.text
803
811
  logger.debug(f"Accumulated {len(assistant_buffer)} chars in assistant buffer")
@@ -903,7 +911,11 @@ class BaseAgent(ABC):
903
911
  logger.info(
904
912
  f"Added tool result to conversations for tool {type(tool_obj).__name__}")
905
913
  logger.info(f"Breaking LLM cycle after executing tool: {tool_name}")
906
- break # After tool execution and result, break to start a new LLM cycle
914
+
915
+ # 一次交互只能有一次工具,剩下的其实就没有用了,但是如果不让流式处理完,我们就无法获取服务端
916
+ # 返回的token消耗和计费,所以通过此标记来完成进入空转,直到流式走完,获取到最后的token消耗和计费
917
+ mark_event_should_finish = True
918
+ # break # After tool execution and result, break to start a new LLM cycle
907
919
 
908
920
  elif isinstance(event, ErrorEvent):
909
921
  logger.error(f"Error event occurred: {event.message}")
@@ -1022,13 +1034,15 @@ class BaseAgent(ABC):
1022
1034
  f"Failed to parse tool XML for <{tool_tag}>: {e}\nXML:\n{tool_xml}")
1023
1035
  return None
1024
1036
 
1025
- meta_holder = byzerllm.MetaHolder()
1037
+ last_metadata = None
1026
1038
  for content_chunk, metadata in generator:
1027
- global_cancel.check_and_raise(token=self.args.event_file)
1028
- meta_holder.meta = metadata
1039
+ global_cancel.check_and_raise(token=self.args.event_file)
1029
1040
  if not content_chunk:
1041
+ last_metadata = metadata
1030
1042
  continue
1031
- buffer += content_chunk
1043
+
1044
+ last_metadata = metadata
1045
+ buffer += content_chunk
1032
1046
 
1033
1047
  while True:
1034
1048
  # Check for transitions: thinking -> text, tool -> text, text -> thinking, text -> tool
@@ -1138,9 +1152,7 @@ class BaseAgent(ABC):
1138
1152
 
1139
1153
  # If no event was processed in this iteration, break inner loop
1140
1154
  if not found_event:
1141
- break
1142
-
1143
- yield TokenUsageEvent(usage=meta_holder.meta)
1155
+ break
1144
1156
 
1145
1157
  # After generator exhausted, yield any remaining content
1146
1158
  if in_thinking_block:
@@ -1157,6 +1169,9 @@ class BaseAgent(ABC):
1157
1169
  elif buffer:
1158
1170
  # Yield remaining plain text
1159
1171
  yield LLMOutputEvent(text=buffer)
1172
+
1173
+ # 这个要放在最后,防止其他关联的多个事件的信息中断
1174
+ yield TokenUsageEvent(usage=last_metadata)
1160
1175
 
1161
1176
  def run_with_events(self, request: AgentRequest):
1162
1177
  """
@@ -376,8 +376,8 @@ def main(input_args: Optional[List[str]] = None):
376
376
  llm.setup_sub_client("inference_model", inference_model)
377
377
 
378
378
  if args.index_filter_model:
379
- model_info = models_module.get_model_by_name(args.index_filter_model)
380
- model_name = args.index_filter_model
379
+ model_name = args.index_filter_model.strip()
380
+ model_info = models_module.get_model_by_name(model_name)
381
381
  index_filter_model = byzerllm.SimpleByzerLLM(default_model_name=model_name)
382
382
  index_filter_model.deploy(
383
383
  model_path="",
@@ -393,6 +393,41 @@ def main(input_args: Optional[List[str]] = None):
393
393
  )
394
394
  llm.setup_sub_client("index_filter_model", index_filter_model)
395
395
 
396
+ if args.context_prune_model:
397
+ model_name = args.context_prune_model.strip()
398
+ model_info = models_module.get_model_by_name(model_name)
399
+ context_prune_model = byzerllm.SimpleByzerLLM(default_model_name=model_name)
400
+ context_prune_model.deploy(
401
+ model_path="",
402
+ pretrained_model_type=model_info["model_type"],
403
+ udf_name=model_name,
404
+ infer_params={
405
+ "saas.base_url": model_info["base_url"],
406
+ "saas.api_key": model_info["api_key"],
407
+ "saas.model": model_info["model_name"],
408
+ "saas.is_reasoning": model_info["is_reasoning"],
409
+ "saas.max_output_tokens": model_info.get("max_output_tokens", 8096)
410
+ }
411
+ )
412
+ llm.setup_sub_client("context_prune_model", context_prune_model)
413
+
414
+ if args.conversation_prune_model:
415
+ model_name = args.conversation_prune_model.strip()
416
+ model_info = models_module.get_model_by_name(model_name)
417
+ conversation_prune_model = byzerllm.SimpleByzerLLM(default_model_name=model_name)
418
+ conversation_prune_model.deploy(
419
+ model_path="",
420
+ pretrained_model_type=model_info["model_type"],
421
+ udf_name=model_name,
422
+ infer_params={
423
+ "saas.base_url": model_info["base_url"],
424
+ "saas.api_key": model_info["api_key"],
425
+ "saas.model": model_info["model_name"],
426
+ "saas.is_reasoning": model_info["is_reasoning"],
427
+ "saas.max_output_tokens": model_info.get("max_output_tokens", 8096)
428
+ }
429
+ )
430
+ llm.setup_sub_client("conversation_prune_model", conversation_prune_model)
396
431
 
397
432
  if args.product_mode == "pro":
398
433
  if args.code_model:
@@ -437,6 +472,15 @@ def main(input_args: Optional[List[str]] = None):
437
472
  index_filter_model.setup_default_model_name(args.index_filter_model)
438
473
  llm.setup_sub_client("index_filter_model", index_filter_model)
439
474
 
475
+ if args.context_prune_model:
476
+ context_prune_model = byzerllm.ByzerLLM()
477
+ context_prune_model.setup_default_model_name(args.context_prune_model)
478
+ llm.setup_sub_client("context_prune_model", context_prune_model)
479
+
480
+ if args.conversation_prune_model:
481
+ conversation_prune_model = byzerllm.ByzerLLM()
482
+ conversation_prune_model.setup_default_model_name(args.conversation_prune_model)
483
+ llm.setup_sub_client("conversation_prune_model", conversation_prune_model)
440
484
 
441
485
  if get_run_context().mode != RunMode.WEB and args.human_as_model:
442
486
 
@@ -254,6 +254,8 @@ class AutoCoderArgs(pydantic.BaseModel):
254
254
  emb_model: Optional[str] = ""
255
255
  code_model: Optional[str] = ""
256
256
  generate_rerank_model: Optional[str] = ""
257
+ context_prune_model: Optional[str] = ""
258
+ conversation_prune_model: Optional[str] = ""
257
259
  inference_model: Optional[str] = ""
258
260
  system_prompt: Optional[str] = ""
259
261
  planner_model: Optional[str] = ""
@@ -399,6 +401,7 @@ class AutoCoderArgs(pydantic.BaseModel):
399
401
 
400
402
  context_prune_strategy: Optional[str] = "extract"
401
403
  context_prune: Optional[bool] = True
404
+ context_prune_safe_zone_tokens: Optional[int] = 32*1024
402
405
  context_prune_sliding_window_size: Optional[int] = 1000
403
406
  context_prune_sliding_window_overlap: Optional[int] = 100
404
407
 
@@ -0,0 +1,182 @@
1
+ import os
2
+ import json
3
+ import time
4
+ import uuid
5
+ from typing import List, Dict, Any, Optional
6
+ from pydantic import BaseModel
7
+ from loguru import logger
8
+
9
+
10
+ class ConversationCheckpoint(BaseModel):
11
+ """对话检查点,用于保存特定时刻的对话状态"""
12
+
13
+ checkpoint_id: str # 检查点ID,与变更组ID对应
14
+ timestamp: float # 创建时间戳
15
+ conversations: List[Dict[str, Any]] # 对话历史
16
+ metadata: Optional[Dict[str, Any]] = None # 元数据,可包含额外信息
17
+
18
+
19
+ class ConversationCheckpointStore:
20
+ """对话检查点存储管理器"""
21
+
22
+ def __init__(self, store_dir: Optional[str] = None, max_history: int = 50):
23
+ """
24
+ 初始化对话检查点存储
25
+
26
+ Args:
27
+ store_dir: 存储目录,默认为用户主目录下的.autocoder/conversation_checkpoints
28
+ max_history: 最大保存的历史版本数量
29
+ """
30
+ if store_dir is None:
31
+ home_dir = os.path.expanduser("~")
32
+ store_dir = os.path.join(home_dir, ".autocoder", "conversation_checkpoints")
33
+
34
+ self.store_dir = os.path.abspath(store_dir)
35
+ self.max_history = max_history
36
+
37
+ # 确保存储目录存在
38
+ os.makedirs(self.store_dir, exist_ok=True)
39
+ logger.info(f"对话检查点存储目录: {self.store_dir}")
40
+
41
+ def save_checkpoint(self, checkpoint: ConversationCheckpoint) -> str:
42
+ """
43
+ 保存对话检查点
44
+
45
+ Args:
46
+ checkpoint: 对话检查点对象
47
+
48
+ Returns:
49
+ str: 检查点ID
50
+ """
51
+ # 确保检查点有ID
52
+ if not checkpoint.checkpoint_id:
53
+ checkpoint.checkpoint_id = str(uuid.uuid4())
54
+
55
+ # 确保时间戳存在
56
+ if not checkpoint.timestamp:
57
+ checkpoint.timestamp = time.time()
58
+
59
+ # 构建文件路径
60
+ file_path = os.path.join(self.store_dir, f"{checkpoint.checkpoint_id}.json")
61
+
62
+ # 保存为JSON文件
63
+ try:
64
+ with open(file_path, 'w', encoding='utf-8') as f:
65
+ f.write(checkpoint.json(ensure_ascii=False, indent=2))
66
+
67
+ logger.info(f"已保存对话检查点: {checkpoint.checkpoint_id}")
68
+
69
+ # 检查并清理过期的检查点
70
+ self._cleanup_old_checkpoints()
71
+
72
+ return checkpoint.checkpoint_id
73
+ except Exception as e:
74
+ logger.error(f"保存对话检查点失败: {str(e)}")
75
+ return ""
76
+
77
+ def get_checkpoint(self, checkpoint_id: str) -> Optional[ConversationCheckpoint]:
78
+ """
79
+ 获取指定ID的对话检查点
80
+
81
+ Args:
82
+ checkpoint_id: 检查点ID
83
+
84
+ Returns:
85
+ Optional[ConversationCheckpoint]: 对话检查点对象,如果不存在则返回None
86
+ """
87
+ file_path = os.path.join(self.store_dir, f"{checkpoint_id}.json")
88
+
89
+ if not os.path.exists(file_path):
90
+ logger.warning(f"对话检查点不存在: {checkpoint_id}")
91
+ return None
92
+
93
+ try:
94
+ with open(file_path, 'r', encoding='utf-8') as f:
95
+ data = json.load(f)
96
+
97
+ return ConversationCheckpoint(**data)
98
+ except Exception as e:
99
+ logger.error(f"读取对话检查点失败: {str(e)}")
100
+ return None
101
+
102
+ def get_latest_checkpoint(self) -> Optional[ConversationCheckpoint]:
103
+ """
104
+ 获取最新的对话检查点
105
+
106
+ Returns:
107
+ Optional[ConversationCheckpoint]: 最新的对话检查点对象,如果不存在则返回None
108
+ """
109
+ checkpoints = self._get_all_checkpoints()
110
+
111
+ if not checkpoints:
112
+ return None
113
+
114
+ # 按时间戳降序排序
115
+ checkpoints.sort(key=lambda x: x.timestamp, reverse=True)
116
+
117
+ return checkpoints[0] if checkpoints else None
118
+
119
+ def delete_checkpoint(self, checkpoint_id: str) -> bool:
120
+ """
121
+ 删除指定的对话检查点
122
+
123
+ Args:
124
+ checkpoint_id: 检查点ID
125
+
126
+ Returns:
127
+ bool: 是否成功删除
128
+ """
129
+ file_path = os.path.join(self.store_dir, f"{checkpoint_id}.json")
130
+
131
+ if not os.path.exists(file_path):
132
+ logger.warning(f"要删除的对话检查点不存在: {checkpoint_id}")
133
+ return False
134
+
135
+ try:
136
+ os.remove(file_path)
137
+ logger.info(f"已删除对话检查点: {checkpoint_id}")
138
+ return True
139
+ except Exception as e:
140
+ logger.error(f"删除对话检查点失败: {str(e)}")
141
+ return False
142
+
143
+ def _get_all_checkpoints(self) -> List[ConversationCheckpoint]:
144
+ """
145
+ 获取所有对话检查点
146
+
147
+ Returns:
148
+ List[ConversationCheckpoint]: 对话检查点列表
149
+ """
150
+ checkpoints = []
151
+
152
+ try:
153
+ for filename in os.listdir(self.store_dir):
154
+ if filename.endswith('.json'):
155
+ file_path = os.path.join(self.store_dir, filename)
156
+
157
+ try:
158
+ with open(file_path, 'r', encoding='utf-8') as f:
159
+ data = json.load(f)
160
+
161
+ checkpoint = ConversationCheckpoint(**data)
162
+ checkpoints.append(checkpoint)
163
+ except Exception as e:
164
+ logger.error(f"读取对话检查点文件失败 {filename}: {str(e)}")
165
+ except Exception as e:
166
+ logger.error(f"获取所有对话检查点失败: {str(e)}")
167
+
168
+ return checkpoints
169
+
170
+ def _cleanup_old_checkpoints(self):
171
+ """清理过期的检查点,保持历史记录数量在限制范围内"""
172
+ checkpoints = self._get_all_checkpoints()
173
+
174
+ if len(checkpoints) <= self.max_history:
175
+ return
176
+
177
+ # 按时间戳降序排序
178
+ checkpoints.sort(key=lambda x: x.timestamp, reverse=True)
179
+
180
+ # 删除超出限制的旧检查点
181
+ for checkpoint in checkpoints[self.max_history:]:
182
+ self.delete_checkpoint(checkpoint.checkpoint_id)
@@ -8,6 +8,7 @@ import os
8
8
  import uuid
9
9
  import logging
10
10
  import difflib
11
+ import time
11
12
  from typing import Dict, List, Optional, Tuple, Any
12
13
  from datetime import datetime
13
14
 
@@ -16,6 +17,7 @@ from autocoder.common.file_checkpoint.models import (
16
17
  )
17
18
  from autocoder.common.file_checkpoint.backup import FileBackupManager
18
19
  from autocoder.common.file_checkpoint.store import FileChangeStore
20
+ from autocoder.common.file_checkpoint.conversation_checkpoint import ConversationCheckpointStore,ConversationCheckpoint
19
21
 
20
22
  logger = logging.getLogger(__name__)
21
23
 
@@ -24,7 +26,8 @@ class FileChangeManager:
24
26
  """文件变更管理器,提供高层次的API接口"""
25
27
 
26
28
  def __init__(self, project_dir: str, backup_dir: Optional[str] = None,
27
- store_dir: Optional[str] = None, max_history: int = 50):
29
+ store_dir: Optional[str] = None, max_history: int = 50,
30
+ conversation_store_dir: Optional[str] = None):
28
31
  """
29
32
  初始化文件变更管理器
30
33
 
@@ -33,10 +36,61 @@ class FileChangeManager:
33
36
  backup_dir: 备份文件存储目录,默认为用户主目录下的.autocoder/backups
34
37
  store_dir: 变更记录存储目录,默认为用户主目录下的.autocoder/changes
35
38
  max_history: 最大保存的历史版本数量
39
+ conversation_store_dir: 对话检查点存储目录
36
40
  """
37
41
  self.project_dir = os.path.abspath(project_dir)
38
42
  self.backup_manager = FileBackupManager(backup_dir)
39
43
  self.change_store = FileChangeStore(store_dir, max_history)
44
+
45
+ # 初始化对话检查点存储
46
+ if conversation_store_dir is None and store_dir is not None:
47
+ # 默认在变更记录存储目录的同级目录创建 conversation_checkpoints 目录
48
+ parent_dir = os.path.dirname(store_dir)
49
+ conversation_store_dir = os.path.join(parent_dir, "conversation_checkpoints")
50
+
51
+ try:
52
+ self.conversation_store = ConversationCheckpointStore(conversation_store_dir, max_history)
53
+ logger.info(f"对话检查点存储初始化成功: {conversation_store_dir}")
54
+ except ImportError as e:
55
+ logger.warning(f"对话检查点存储初始化失败: {str(e)}")
56
+ self.conversation_store = None
57
+
58
+ def apply_changes_with_conversation(self, changes: Dict[str, FileChange],
59
+ conversations: List[Dict[str, Any]],
60
+ change_group_id: Optional[str] = None,
61
+ metadata: Optional[Dict[str, Any]] = None) -> ApplyResult:
62
+ """
63
+ 应用文件变更并保存对话状态
64
+
65
+ Args:
66
+ changes: 文件变更字典,格式为 {file_path: FileChange}
67
+ conversations: 当前对话历史
68
+ change_group_id: 变更组ID,用于将相关变更归为一组
69
+ metadata: 元数据,可包含额外信息
70
+
71
+ Returns:
72
+ ApplyResult: 应用结果对象
73
+ """
74
+ # 应用文件变更
75
+ result = self.apply_changes(changes, change_group_id)
76
+
77
+ if result.success and self.conversation_store is not None:
78
+ try:
79
+
80
+ # 创建并保存对话检查点
81
+ checkpoint_id = change_group_id or result.change_ids[0] if result.change_ids else str(uuid.uuid4())
82
+ checkpoint = ConversationCheckpoint(
83
+ checkpoint_id=checkpoint_id,
84
+ timestamp=time.time(),
85
+ conversations=conversations,
86
+ metadata=metadata
87
+ )
88
+ self.conversation_store.save_checkpoint(checkpoint)
89
+ logger.info(f"已保存对话检查点: {checkpoint_id}")
90
+ except Exception as e:
91
+ logger.error(f"保存对话检查点失败: {str(e)}")
92
+
93
+ return result
40
94
 
41
95
  def apply_changes(self, changes: Dict[str, FileChange], change_group_id: Optional[str] = None) -> ApplyResult:
42
96
  """
@@ -152,6 +206,27 @@ class FileChangeManager:
152
206
 
153
207
  return diff_results
154
208
 
209
+ def undo_last_change_with_conversation(self) -> Tuple[UndoResult, Optional[ConversationCheckpoint]]:
210
+ """
211
+ 撤销最近的一次变更并恢复对话状态
212
+
213
+ Returns:
214
+ Tuple[UndoResult, Optional[ConversationCheckpoint]]: 撤销结果和恢复的对话检查点
215
+ """
216
+ # 获取最近的变更记录
217
+ latest_changes = self.change_store.get_latest_changes(limit=1)
218
+ if not latest_changes:
219
+ return UndoResult(success=False, errors={"general": "没有找到最近的变更记录"}), None
220
+
221
+ latest_change = latest_changes[0]
222
+
223
+ # 如果最近的变更属于一个组,撤销整个组
224
+ if latest_change.group_id:
225
+ return self.undo_change_group_with_conversation(latest_change.group_id)
226
+ else:
227
+ # 否则只撤销这一个变更
228
+ return self.undo_change_with_conversation(latest_change.change_id)
229
+
155
230
  def undo_last_change(self) -> UndoResult:
156
231
  """
157
232
  撤销最近的一次变更
@@ -173,6 +248,39 @@ class FileChangeManager:
173
248
  # 否则只撤销这一个变更
174
249
  return self.undo_change(latest_change.change_id)
175
250
 
251
+ def undo_change_with_conversation(self, change_id: str) -> Tuple[UndoResult, Optional[ConversationCheckpoint]]:
252
+ """
253
+ 撤销指定的变更并恢复对话状态
254
+
255
+ Args:
256
+ change_id: 变更记录ID
257
+
258
+ Returns:
259
+ Tuple[UndoResult, Optional[ConversationCheckpoint]]: 撤销结果和恢复的对话检查点
260
+ """
261
+ # 获取变更记录
262
+ change_record = self.change_store.get_change(change_id)
263
+ if change_record is None:
264
+ return UndoResult(success=False, errors={"general": f"变更记录 {change_id} 不存在"}), None
265
+
266
+ # 获取关联的对话检查点
267
+ checkpoint = None
268
+ checkpoint_id = change_record.group_id or change_id
269
+ if self.conversation_store is not None:
270
+ try:
271
+ checkpoint = self.conversation_store.get_checkpoint(checkpoint_id)
272
+ if checkpoint:
273
+ logger.info(f"找到关联的对话检查点: {checkpoint_id}")
274
+ else:
275
+ logger.info(f"未找到关联的对话检查点: {checkpoint_id}")
276
+ except Exception as e:
277
+ logger.error(f"获取对话检查点失败: {str(e)}")
278
+
279
+ # 撤销文件变更
280
+ undo_result = self.undo_change(change_id)
281
+
282
+ return undo_result, checkpoint
283
+
176
284
  def undo_change(self, change_id: str) -> UndoResult:
177
285
  """
178
286
  撤销指定的变更
@@ -234,6 +342,38 @@ class FileChangeManager:
234
342
 
235
343
  return result
236
344
 
345
+ def undo_change_group_with_conversation(self, group_id: str) -> Tuple[UndoResult, Optional[ConversationCheckpoint]]:
346
+ """
347
+ 撤销指定组的所有变更并恢复对话状态
348
+
349
+ Args:
350
+ group_id: 变更组ID
351
+
352
+ Returns:
353
+ Tuple[UndoResult, Optional[ConversationCheckpoint]]: 撤销结果和恢复的对话检查点
354
+ """
355
+ # 获取组内的所有变更记录
356
+ changes = self.change_store.get_changes_by_group(group_id)
357
+ if not changes:
358
+ return UndoResult(success=False, errors={"general": f"变更组 {group_id} 不存在或为空"}), None
359
+
360
+ # 获取关联的对话检查点
361
+ checkpoint = None
362
+ if self.conversation_store is not None:
363
+ try:
364
+ checkpoint = self.conversation_store.get_checkpoint(group_id)
365
+ if checkpoint:
366
+ logger.info(f"找到关联的对话检查点: {group_id}")
367
+ else:
368
+ logger.info(f"未找到关联的对话检查点: {group_id}")
369
+ except Exception as e:
370
+ logger.error(f"获取对话检查点失败: {str(e)}")
371
+
372
+ # 撤销文件变更
373
+ undo_result = self.undo_change_group(group_id)
374
+
375
+ return undo_result, checkpoint
376
+
237
377
  def undo_change_group(self, group_id: str) -> UndoResult:
238
378
  """
239
379
  撤销指定组的所有变更
@@ -265,6 +405,39 @@ class FileChangeManager:
265
405
 
266
406
  return result
267
407
 
408
+ def undo_to_version_with_conversation(self, version_id: str) -> Tuple[UndoResult, Optional[ConversationCheckpoint]]:
409
+ """
410
+ 撤销到指定的历史版本并恢复对话状态
411
+
412
+ Args:
413
+ version_id: 目标版本ID(变更记录ID)
414
+
415
+ Returns:
416
+ Tuple[UndoResult, Optional[ConversationCheckpoint]]: 撤销结果和恢复的对话检查点
417
+ """
418
+ # 获取目标版本的变更记录
419
+ target_change = self.change_store.get_change(version_id)
420
+ if target_change is None:
421
+ return UndoResult(success=False, errors={"general": f"变更记录 {version_id} 不存在"}), None
422
+
423
+ # 获取关联的对话检查点
424
+ checkpoint = None
425
+ checkpoint_id = target_change.group_id or version_id
426
+ if self.conversation_store is not None:
427
+ try:
428
+ checkpoint = self.conversation_store.get_checkpoint(checkpoint_id)
429
+ if checkpoint:
430
+ logger.info(f"找到关联的对话检查点: {checkpoint_id}")
431
+ else:
432
+ logger.info(f"未找到关联的对话检查点: {checkpoint_id}")
433
+ except Exception as e:
434
+ logger.error(f"获取对话检查点失败: {str(e)}")
435
+
436
+ # 撤销文件变更
437
+ undo_result = self.undo_to_version(version_id)
438
+
439
+ return undo_result, checkpoint
440
+
268
441
  def undo_to_version(self, version_id: str) -> UndoResult:
269
442
  """
270
443
  撤销到指定的历史版本
@@ -359,6 +532,41 @@ class FileChangeManager:
359
532
  """
360
533
  return self.change_store.get_change_groups(limit)
361
534
 
535
+ def get_available_checkpoints(self, limit: int = 10) -> List[Dict[str, Any]]:
536
+ """
537
+ 获取可用的检查点列表,包含对话状态信息
538
+
539
+ Args:
540
+ limit: 返回的检查点数量限制
541
+
542
+ Returns:
543
+ List[Dict[str, Any]]: 检查点信息列表
544
+ """
545
+ # 获取变更组列表
546
+ change_groups = self.get_change_groups(limit)
547
+
548
+ # 构建检查点信息
549
+ checkpoints = []
550
+ for group_id, timestamp, count in change_groups:
551
+ has_conversation = False
552
+
553
+ # 检查是否有对话检查点
554
+ if self.conversation_store is not None:
555
+ try:
556
+ checkpoint = self.conversation_store.get_checkpoint(group_id)
557
+ has_conversation = checkpoint is not None
558
+ except Exception as e:
559
+ logger.error(f"获取对话检查点失败: {str(e)}")
560
+
561
+ checkpoints.append({
562
+ "id": group_id,
563
+ "timestamp": timestamp,
564
+ "changes_count": count,
565
+ "has_conversation": has_conversation
566
+ })
567
+
568
+ return checkpoints
569
+
362
570
  def get_diff_text(self, old_content: str, new_content: str) -> str:
363
571
  """
364
572
  获取两个文本内容的差异文本
@@ -72,7 +72,7 @@ def stream_chat_with_continue(
72
72
  """
73
73
 
74
74
  count = 0
75
- temp_conversations = conversations
75
+ temp_conversations = [] + conversations
76
76
  current_metadata = None
77
77
  metadatas = {}
78
78
  while True:
@@ -89,7 +89,8 @@ def stream_chat_with_continue(
89
89
  content = res[0]
90
90
  current_content += content
91
91
  if current_metadata is None:
92
- current_metadata = res[1]
92
+ current_metadata = res[1]
93
+ metadatas[count] = res[1]
93
94
  else:
94
95
  metadatas[count] = res[1]
95
96
  current_metadata.finish_reason = res[1].finish_reason