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.
- {auto_coder-0.1.364 → auto_coder-0.1.366}/PKG-INFO +1 -1
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/auto_coder.egg-info/PKG-INFO +1 -1
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/auto_coder.egg-info/SOURCES.txt +1 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/agent/base_agentic/base_agent.py +23 -8
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/auto_coder.py +46 -2
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/__init__.py +3 -0
- auto_coder-0.1.366/src/autocoder/common/file_checkpoint/conversation_checkpoint.py +182 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/file_checkpoint/manager.py +209 -1
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/utils_code_auto_generate.py +3 -2
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/v2/agent/agentic_edit.py +321 -104
- auto_coder-0.1.366/src/autocoder/common/v2/agent/agentic_edit_tools/list_files_tool_resolver.py +147 -0
- auto_coder-0.1.366/src/autocoder/common/v2/agent/agentic_edit_tools/read_file_tool_resolver.py +141 -0
- {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
- auto_coder-0.1.366/src/autocoder/common/v2/agent/agentic_edit_tools/search_files_tool_resolver.py +179 -0
- {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
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/v2/agent/agentic_edit_types.py +4 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/events/event_manager_singleton.py +1 -2
- auto_coder-0.1.366/src/autocoder/version.py +1 -0
- auto_coder-0.1.364/src/autocoder/common/v2/agent/agentic_edit_tools/list_files_tool_resolver.py +0 -107
- auto_coder-0.1.364/src/autocoder/common/v2/agent/agentic_edit_tools/read_file_tool_resolver.py +0 -54
- auto_coder-0.1.364/src/autocoder/common/v2/agent/agentic_edit_tools/search_files_tool_resolver.py +0 -134
- auto_coder-0.1.364/src/autocoder/version.py +0 -1
- {auto_coder-0.1.364 → auto_coder-0.1.366}/LICENSE +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/README.md +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/setup.cfg +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/setup.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/auto_coder.egg-info/dependency_links.txt +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/auto_coder.egg-info/entry_points.txt +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/auto_coder.egg-info/requires.txt +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/auto_coder.egg-info/top_level.txt +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/__init__.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/agent/__init__.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/agent/agentic_filter.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/agent/auto_demand_organizer.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/agent/auto_filegroup.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/agent/auto_guess_query.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/agent/auto_learn.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/agent/auto_learn_from_commit.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/agent/auto_review_commit.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/agent/auto_tool.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/agent/base_agentic/__init__.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/agent/base_agentic/agent_hub.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/agent/base_agentic/agentic_lang.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/agent/base_agentic/agentic_tool_display.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/agent/base_agentic/default_tools.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/agent/base_agentic/test_base_agent.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/agent/base_agentic/tool_registry.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/agent/base_agentic/tools/__init__.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/agent/base_agentic/tools/ask_followup_question_tool_resolver.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/agent/base_agentic/tools/attempt_completion_tool_resolver.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/agent/base_agentic/tools/base_tool_resolver.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/agent/base_agentic/tools/example_tool_resolver.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/agent/base_agentic/tools/execute_command_tool_resolver.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/agent/base_agentic/tools/list_files_tool_resolver.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/agent/base_agentic/tools/plan_mode_respond_tool_resolver.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/agent/base_agentic/tools/read_file_tool_resolver.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/agent/base_agentic/tools/replace_in_file_tool_resolver.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/agent/base_agentic/tools/search_files_tool_resolver.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/agent/base_agentic/tools/talk_to_group_tool_resolver.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/agent/base_agentic/tools/talk_to_tool_resolver.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/agent/base_agentic/tools/use_mcp_tool_resolver.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/agent/base_agentic/tools/write_to_file_tool_resolver.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/agent/base_agentic/types.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/agent/base_agentic/utils.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/agent/coder.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/agent/designer.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/agent/planner.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/agent/project_reader.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/auto_coder_rag.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/auto_coder_runner.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/auto_coder_server.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/benchmark.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/chat/__init__.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/chat/conf_command.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/chat/models_command.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/chat/rules_command.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/chat_auto_coder.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/chat_auto_coder_lang.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/command_args.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/command_parser.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/commands/__init__.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/commands/auto_command.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/commands/auto_web.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/commands/tools.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/JupyterClient.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/ShellClient.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/action_yml_file_manager.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/anything2images.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/anything2img.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/audio.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/auto_coder_lang.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/auto_configure.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/buildin_tokenizer.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/chunk_validation.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/cleaner.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/code_auto_execute.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/code_auto_generate.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/code_auto_generate_diff.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/code_auto_generate_editblock.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/code_auto_generate_strict_diff.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/code_auto_merge.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/code_auto_merge_diff.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/code_auto_merge_editblock.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/code_auto_merge_strict_diff.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/code_modification_ranker.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/command_completer.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/command_completer_v2.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/command_generator.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/command_templates.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/computer_use.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/conf_import_export.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/conf_utils.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/conf_validator.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/const.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/context_pruner.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/conversation_pruner.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/conversations/__init__.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/conversations/compatibility.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/conversations/conversation_manager.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/conversations/example.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/directory_cache/__init__.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/directory_cache/cache.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/directory_cache/test_cache.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/file_checkpoint/__init__.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/file_checkpoint/backup.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/file_checkpoint/examples.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/file_checkpoint/models.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/file_checkpoint/store.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/file_checkpoint/test_backup.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/file_checkpoint/test_manager.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/file_checkpoint/test_models.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/file_checkpoint/test_store.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/file_checkpoint/test_utils.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/file_checkpoint/utils.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/file_monitor/__init__.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/file_monitor/monitor.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/files.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/git_utils.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/global_cancel.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/ignorefiles/__init__.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/ignorefiles/ignore_file_utils.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/ignorefiles/test_ignore_file_utils.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/image_to_page.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/index_import_export.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/interpreter.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/llm_rerank.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/mcp_hub.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/mcp_server.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/mcp_server_install.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/mcp_server_types.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/mcp_servers/__init__.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/mcp_servers/mcp_server_gpt4o_mini_search.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/mcp_servers/mcp_server_perplexity.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/mcp_tools.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/memory_manager.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/model_speed_tester.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/openai_content.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/printer.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/recall_validation.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/result_manager.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/rulefiles/__init__.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/rulefiles/autocoderrules_utils.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/run_cmd.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/save_formatted_log.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/screenshots.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/search.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/search_replace.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/shells.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/stats_panel.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/stream_out_type.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/sys_prompt.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/test_run_cmd.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/text.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/token_cost_caculate.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/types.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/v2/__init__.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/v2/agent/__init__.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/v2/agent/agentic_edit_tools/__init__.py +0 -0
- {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
- {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
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/v2/agent/agentic_edit_tools/base_tool_resolver.py +0 -0
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/v2/agent/agentic_tool_display.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/v2/code_agentic_editblock_manager.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/v2/code_auto_generate.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/v2/code_auto_generate_diff.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/v2/code_auto_generate_editblock.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/v2/code_auto_generate_strict_diff.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/v2/code_auto_merge.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/v2/code_auto_merge_diff.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/v2/code_auto_merge_editblock.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/v2/code_auto_merge_strict_diff.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/v2/code_diff_manager.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/v2/code_editblock_manager.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/v2/code_manager.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/common/v2/code_strict_diff_manager.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/compilers/__init__.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/compilers/base_compiler.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/compilers/compiler_config_api.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/compilers/compiler_config_manager.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/compilers/compiler_factory.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/compilers/java_compiler.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/compilers/models.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/compilers/normal_compiler.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/compilers/provided_compiler.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/compilers/python_compiler.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/compilers/reactjs_compiler.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/compilers/shadow_compiler.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/compilers/vue_compiler.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/data/byzerllm.md +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/data/tokenizer.json +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/db/__init__.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/db/store.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/dispacher/__init__.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/dispacher/actions/__init__.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/dispacher/actions/action.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/dispacher/actions/copilot.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/dispacher/actions/plugins/__init__.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/dispacher/actions/plugins/action_regex_project.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/events/__init__.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/events/event_content.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/events/event_manager.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/events/event_store.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/events/event_types.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/helper/__init__.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/helper/project_creator.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/helper/rag_doc_creator.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/index/__init__.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/index/entry.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/index/filter/__init__.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/index/filter/normal_filter.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/index/filter/quick_filter.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/index/for_command.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/index/index.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/index/symbols_utils.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/index/types.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/lang.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/linters/__init__.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/linters/base_linter.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/linters/linter_factory.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/linters/models.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/linters/normal_linter.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/linters/python_linter.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/linters/reactjs_linter.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/linters/shadow_linter.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/linters/vue_linter.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/memory/__init__.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/memory/active_context_manager.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/memory/active_package.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/memory/async_processor.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/memory/directory_mapper.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/models.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/plugins/__init__.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/plugins/dynamic_completion_example.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/plugins/git_helper_plugin.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/plugins/sample_plugin.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/plugins/token_helper_plugin.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/plugins/utils.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/privacy/__init__.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/privacy/model_filter.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/pyproject/__init__.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/rag/__init__.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/rag/api_server.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/rag/cache/__init__.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/rag/cache/base_cache.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/rag/cache/byzer_storage_cache.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/rag/cache/cache_result_merge.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/rag/cache/failed_files_utils.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/rag/cache/file_monitor_cache.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/rag/cache/local_byzer_storage_cache.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/rag/cache/local_duckdb_storage_cache.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/rag/cache/rag_file_meta.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/rag/cache/simple_cache.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/rag/conversation_to_queries.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/rag/doc_filter.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/rag/document_retriever.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/rag/lang.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/rag/llm_wrapper.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/rag/loaders/__init__.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/rag/loaders/docx_loader.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/rag/loaders/excel_loader.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/rag/loaders/filter_utils.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/rag/loaders/image_loader.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/rag/loaders/pdf_loader.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/rag/loaders/ppt_loader.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/rag/long_context_rag.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/rag/qa_conversation_strategy.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/rag/rag_config.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/rag/rag_entry.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/rag/raw_rag.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/rag/relevant_utils.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/rag/searchable.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/rag/simple_directory_reader.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/rag/simple_rag.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/rag/stream_event/__init__.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/rag/stream_event/event_writer.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/rag/stream_event/types.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/rag/test_doc_filter.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/rag/test_long_context_rag.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/rag/test_token_limiter.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/rag/token_checker.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/rag/token_counter.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/rag/token_limiter.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/rag/token_limiter_utils.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/rag/types.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/rag/utils.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/rag/variable_holder.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/regexproject/__init__.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/run_context.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/shadows/__init__.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/shadows/shadow_manager.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/suffixproject/__init__.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/tsproject/__init__.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/utils/__init__.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/utils/_markitdown.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/utils/auto_coder_utils/__init__.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/utils/auto_coder_utils/chat_stream_out.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/utils/auto_project_type.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/utils/chat_auto_coder_utils/__init__.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/utils/conversation_store.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/utils/llm_client_interceptors.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/utils/llms.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/utils/log_capture.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/utils/model_provider_selector.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/utils/multi_turn.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/utils/operate_config_api.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/utils/print_table.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/utils/project_structure.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/utils/queue_communicate.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/utils/request_event_queue.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/utils/request_queue.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/utils/rest.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/utils/stream_thinking.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/utils/tests.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/utils/thread_utils.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/src/autocoder/utils/types.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/tests/test_action_regex_project.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/tests/test_action_yml_file_manager.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/tests/test_chat_auto_coder.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/tests/test_code_auto_merge_editblock.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/tests/test_command_completer.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/tests/test_planner.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/tests/test_plugins.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/tests/test_privacy.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/tests/test_queue_communicate.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.366}/tests/test_symbols_utils.py +0 -0
|
@@ -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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
380
|
-
|
|
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
|