auto-coder 0.1.364__tar.gz → 0.1.365__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.365}/PKG-INFO +1 -1
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/auto_coder.egg-info/PKG-INFO +1 -1
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/auto_coder.egg-info/SOURCES.txt +1 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/auto_coder.py +46 -2
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/common/__init__.py +3 -0
- auto_coder-0.1.365/src/autocoder/common/file_checkpoint/conversation_checkpoint.py +182 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/common/file_checkpoint/manager.py +208 -1
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/common/utils_code_auto_generate.py +2 -1
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/common/v2/agent/agentic_edit.py +291 -92
- auto_coder-0.1.365/src/autocoder/common/v2/agent/agentic_edit_tools/list_files_tool_resolver.py +147 -0
- auto_coder-0.1.365/src/autocoder/common/v2/agent/agentic_edit_tools/read_file_tool_resolver.py +141 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/common/v2/agent/agentic_edit_tools/replace_in_file_tool_resolver.py +169 -61
- auto_coder-0.1.365/src/autocoder/common/v2/agent/agentic_edit_tools/search_files_tool_resolver.py +179 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/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.365}/src/autocoder/common/v2/agent/agentic_edit_types.py +4 -0
- auto_coder-0.1.365/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.365}/LICENSE +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/README.md +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/setup.cfg +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/setup.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/auto_coder.egg-info/dependency_links.txt +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/auto_coder.egg-info/entry_points.txt +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/auto_coder.egg-info/requires.txt +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/auto_coder.egg-info/top_level.txt +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/__init__.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/agent/__init__.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/agent/agentic_filter.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/agent/auto_demand_organizer.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/agent/auto_filegroup.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/agent/auto_guess_query.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/agent/auto_learn.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/agent/auto_learn_from_commit.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/agent/auto_review_commit.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/agent/auto_tool.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/agent/base_agentic/__init__.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/agent/base_agentic/agent_hub.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/agent/base_agentic/agentic_lang.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/agent/base_agentic/agentic_tool_display.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/agent/base_agentic/base_agent.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/agent/base_agentic/default_tools.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/agent/base_agentic/test_base_agent.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/agent/base_agentic/tool_registry.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/agent/base_agentic/tools/__init__.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/agent/base_agentic/tools/ask_followup_question_tool_resolver.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/agent/base_agentic/tools/attempt_completion_tool_resolver.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/agent/base_agentic/tools/base_tool_resolver.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/agent/base_agentic/tools/example_tool_resolver.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/agent/base_agentic/tools/execute_command_tool_resolver.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/agent/base_agentic/tools/list_files_tool_resolver.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/agent/base_agentic/tools/plan_mode_respond_tool_resolver.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/agent/base_agentic/tools/read_file_tool_resolver.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/agent/base_agentic/tools/replace_in_file_tool_resolver.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/agent/base_agentic/tools/search_files_tool_resolver.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/agent/base_agentic/tools/talk_to_group_tool_resolver.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/agent/base_agentic/tools/talk_to_tool_resolver.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/agent/base_agentic/tools/use_mcp_tool_resolver.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/agent/base_agentic/tools/write_to_file_tool_resolver.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/agent/base_agentic/types.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/agent/base_agentic/utils.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/agent/coder.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/agent/designer.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/agent/planner.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/agent/project_reader.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/auto_coder_rag.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/auto_coder_runner.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/auto_coder_server.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/benchmark.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/chat/__init__.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/chat/conf_command.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/chat/models_command.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/chat/rules_command.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/chat_auto_coder.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/chat_auto_coder_lang.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/command_args.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/command_parser.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/commands/__init__.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/commands/auto_command.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/commands/auto_web.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/commands/tools.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/common/JupyterClient.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/common/ShellClient.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/common/action_yml_file_manager.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/common/anything2images.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/common/anything2img.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/common/audio.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/common/auto_coder_lang.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/common/auto_configure.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/common/buildin_tokenizer.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/common/chunk_validation.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/common/cleaner.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/common/code_auto_execute.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/common/code_auto_generate.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/common/code_auto_generate_diff.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/common/code_auto_generate_editblock.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/common/code_auto_generate_strict_diff.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/common/code_auto_merge.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/common/code_auto_merge_diff.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/common/code_auto_merge_editblock.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/common/code_auto_merge_strict_diff.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/common/code_modification_ranker.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/common/command_completer.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/common/command_completer_v2.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/common/command_generator.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/common/command_templates.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/common/computer_use.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/common/conf_import_export.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/common/conf_utils.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/common/conf_validator.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/common/const.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/common/context_pruner.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/common/conversation_pruner.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/common/conversations/__init__.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/common/conversations/compatibility.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/common/conversations/conversation_manager.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/common/conversations/example.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/common/directory_cache/__init__.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/common/directory_cache/cache.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/common/directory_cache/test_cache.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/common/file_checkpoint/__init__.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/common/file_checkpoint/backup.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/common/file_checkpoint/examples.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/common/file_checkpoint/models.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/common/file_checkpoint/store.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/common/file_checkpoint/test_backup.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/common/file_checkpoint/test_manager.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/common/file_checkpoint/test_models.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/common/file_checkpoint/test_store.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/common/file_checkpoint/test_utils.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/common/file_checkpoint/utils.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/common/file_monitor/__init__.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/common/file_monitor/monitor.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/common/files.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/common/git_utils.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/common/global_cancel.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/common/ignorefiles/__init__.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/common/ignorefiles/ignore_file_utils.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/common/ignorefiles/test_ignore_file_utils.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/common/image_to_page.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/common/index_import_export.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/common/interpreter.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/common/llm_rerank.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/common/mcp_hub.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/common/mcp_server.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/common/mcp_server_install.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/common/mcp_server_types.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/common/mcp_servers/__init__.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/common/mcp_servers/mcp_server_gpt4o_mini_search.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/common/mcp_servers/mcp_server_perplexity.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/common/mcp_tools.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/common/memory_manager.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/common/model_speed_tester.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/common/openai_content.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/common/printer.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/common/recall_validation.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/common/result_manager.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/common/rulefiles/__init__.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/common/rulefiles/autocoderrules_utils.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/common/run_cmd.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/common/save_formatted_log.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/common/screenshots.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/common/search.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/common/search_replace.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/common/shells.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/common/stats_panel.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/common/stream_out_type.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/common/sys_prompt.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/common/test_run_cmd.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/common/text.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/common/token_cost_caculate.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/common/types.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/common/v2/__init__.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/common/v2/agent/__init__.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/common/v2/agent/agentic_edit_tools/__init__.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/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.365}/src/autocoder/common/v2/agent/agentic_edit_tools/attempt_completion_tool_resolver.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/common/v2/agent/agentic_edit_tools/base_tool_resolver.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/common/v2/agent/agentic_edit_tools/execute_command_tool_resolver.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/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.365}/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.365}/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.365}/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.365}/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.365}/src/autocoder/common/v2/agent/agentic_edit_tools/use_mcp_tool_resolver.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/common/v2/agent/agentic_tool_display.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/common/v2/code_agentic_editblock_manager.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/common/v2/code_auto_generate.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/common/v2/code_auto_generate_diff.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/common/v2/code_auto_generate_editblock.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/common/v2/code_auto_generate_strict_diff.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/common/v2/code_auto_merge.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/common/v2/code_auto_merge_diff.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/common/v2/code_auto_merge_editblock.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/common/v2/code_auto_merge_strict_diff.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/common/v2/code_diff_manager.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/common/v2/code_editblock_manager.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/common/v2/code_manager.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/common/v2/code_strict_diff_manager.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/compilers/__init__.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/compilers/base_compiler.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/compilers/compiler_config_api.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/compilers/compiler_config_manager.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/compilers/compiler_factory.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/compilers/java_compiler.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/compilers/models.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/compilers/normal_compiler.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/compilers/provided_compiler.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/compilers/python_compiler.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/compilers/reactjs_compiler.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/compilers/shadow_compiler.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/compilers/vue_compiler.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/data/byzerllm.md +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/data/tokenizer.json +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/db/__init__.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/db/store.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/dispacher/__init__.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/dispacher/actions/__init__.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/dispacher/actions/action.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/dispacher/actions/copilot.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/dispacher/actions/plugins/__init__.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/dispacher/actions/plugins/action_regex_project.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/events/__init__.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/events/event_content.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/events/event_manager.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/events/event_manager_singleton.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/events/event_store.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/events/event_types.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/helper/__init__.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/helper/project_creator.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/helper/rag_doc_creator.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/index/__init__.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/index/entry.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/index/filter/__init__.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/index/filter/normal_filter.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/index/filter/quick_filter.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/index/for_command.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/index/index.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/index/symbols_utils.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/index/types.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/lang.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/linters/__init__.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/linters/base_linter.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/linters/linter_factory.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/linters/models.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/linters/normal_linter.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/linters/python_linter.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/linters/reactjs_linter.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/linters/shadow_linter.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/linters/vue_linter.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/memory/__init__.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/memory/active_context_manager.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/memory/active_package.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/memory/async_processor.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/memory/directory_mapper.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/models.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/plugins/__init__.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/plugins/dynamic_completion_example.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/plugins/git_helper_plugin.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/plugins/sample_plugin.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/plugins/token_helper_plugin.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/plugins/utils.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/privacy/__init__.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/privacy/model_filter.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/pyproject/__init__.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/rag/__init__.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/rag/api_server.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/rag/cache/__init__.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/rag/cache/base_cache.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/rag/cache/byzer_storage_cache.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/rag/cache/cache_result_merge.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/rag/cache/failed_files_utils.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/rag/cache/file_monitor_cache.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/rag/cache/local_byzer_storage_cache.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/rag/cache/local_duckdb_storage_cache.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/rag/cache/rag_file_meta.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/rag/cache/simple_cache.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/rag/conversation_to_queries.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/rag/doc_filter.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/rag/document_retriever.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/rag/lang.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/rag/llm_wrapper.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/rag/loaders/__init__.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/rag/loaders/docx_loader.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/rag/loaders/excel_loader.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/rag/loaders/filter_utils.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/rag/loaders/image_loader.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/rag/loaders/pdf_loader.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/rag/loaders/ppt_loader.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/rag/long_context_rag.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/rag/qa_conversation_strategy.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/rag/rag_config.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/rag/rag_entry.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/rag/raw_rag.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/rag/relevant_utils.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/rag/searchable.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/rag/simple_directory_reader.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/rag/simple_rag.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/rag/stream_event/__init__.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/rag/stream_event/event_writer.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/rag/stream_event/types.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/rag/test_doc_filter.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/rag/test_long_context_rag.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/rag/test_token_limiter.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/rag/token_checker.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/rag/token_counter.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/rag/token_limiter.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/rag/token_limiter_utils.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/rag/types.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/rag/utils.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/rag/variable_holder.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/regexproject/__init__.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/run_context.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/shadows/__init__.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/shadows/shadow_manager.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/suffixproject/__init__.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/tsproject/__init__.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/utils/__init__.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/utils/_markitdown.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/utils/auto_coder_utils/__init__.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/utils/auto_coder_utils/chat_stream_out.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/utils/auto_project_type.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/utils/chat_auto_coder_utils/__init__.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/utils/conversation_store.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/utils/llm_client_interceptors.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/utils/llms.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/utils/log_capture.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/utils/model_provider_selector.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/utils/multi_turn.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/utils/operate_config_api.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/utils/print_table.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/utils/project_structure.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/utils/queue_communicate.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/utils/request_event_queue.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/utils/request_queue.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/utils/rest.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/utils/stream_thinking.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/utils/tests.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/utils/thread_utils.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/src/autocoder/utils/types.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/tests/test_action_regex_project.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/tests/test_action_yml_file_manager.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/tests/test_chat_auto_coder.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/tests/test_code_auto_merge_editblock.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/tests/test_command_completer.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/tests/test_planner.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/tests/test_plugins.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/tests/test_privacy.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/tests/test_queue_communicate.py +0 -0
- {auto_coder-0.1.364 → auto_coder-0.1.365}/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
|
|
@@ -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)
|
|
@@ -16,6 +16,7 @@ from autocoder.common.file_checkpoint.models import (
|
|
|
16
16
|
)
|
|
17
17
|
from autocoder.common.file_checkpoint.backup import FileBackupManager
|
|
18
18
|
from autocoder.common.file_checkpoint.store import FileChangeStore
|
|
19
|
+
from autocoder.common.file_checkpoint.conversation_checkpoint import ConversationCheckpointStore,ConversationCheckpoint
|
|
19
20
|
|
|
20
21
|
logger = logging.getLogger(__name__)
|
|
21
22
|
|
|
@@ -24,7 +25,8 @@ class FileChangeManager:
|
|
|
24
25
|
"""文件变更管理器,提供高层次的API接口"""
|
|
25
26
|
|
|
26
27
|
def __init__(self, project_dir: str, backup_dir: Optional[str] = None,
|
|
27
|
-
store_dir: Optional[str] = None, max_history: int = 50
|
|
28
|
+
store_dir: Optional[str] = None, max_history: int = 50,
|
|
29
|
+
conversation_store_dir: Optional[str] = None):
|
|
28
30
|
"""
|
|
29
31
|
初始化文件变更管理器
|
|
30
32
|
|
|
@@ -33,10 +35,61 @@ class FileChangeManager:
|
|
|
33
35
|
backup_dir: 备份文件存储目录,默认为用户主目录下的.autocoder/backups
|
|
34
36
|
store_dir: 变更记录存储目录,默认为用户主目录下的.autocoder/changes
|
|
35
37
|
max_history: 最大保存的历史版本数量
|
|
38
|
+
conversation_store_dir: 对话检查点存储目录
|
|
36
39
|
"""
|
|
37
40
|
self.project_dir = os.path.abspath(project_dir)
|
|
38
41
|
self.backup_manager = FileBackupManager(backup_dir)
|
|
39
42
|
self.change_store = FileChangeStore(store_dir, max_history)
|
|
43
|
+
|
|
44
|
+
# 初始化对话检查点存储
|
|
45
|
+
if conversation_store_dir is None and store_dir is not None:
|
|
46
|
+
# 默认在变更记录存储目录的同级目录创建 conversation_checkpoints 目录
|
|
47
|
+
parent_dir = os.path.dirname(store_dir)
|
|
48
|
+
conversation_store_dir = os.path.join(parent_dir, "conversation_checkpoints")
|
|
49
|
+
|
|
50
|
+
try:
|
|
51
|
+
self.conversation_store = ConversationCheckpointStore(conversation_store_dir, max_history)
|
|
52
|
+
logger.info(f"对话检查点存储初始化成功: {conversation_store_dir}")
|
|
53
|
+
except ImportError as e:
|
|
54
|
+
logger.warning(f"对话检查点存储初始化失败: {str(e)}")
|
|
55
|
+
self.conversation_store = None
|
|
56
|
+
|
|
57
|
+
def apply_changes_with_conversation(self, changes: Dict[str, FileChange],
|
|
58
|
+
conversations: List[Dict[str, Any]],
|
|
59
|
+
change_group_id: Optional[str] = None,
|
|
60
|
+
metadata: Optional[Dict[str, Any]] = None) -> ApplyResult:
|
|
61
|
+
"""
|
|
62
|
+
应用文件变更并保存对话状态
|
|
63
|
+
|
|
64
|
+
Args:
|
|
65
|
+
changes: 文件变更字典,格式为 {file_path: FileChange}
|
|
66
|
+
conversations: 当前对话历史
|
|
67
|
+
change_group_id: 变更组ID,用于将相关变更归为一组
|
|
68
|
+
metadata: 元数据,可包含额外信息
|
|
69
|
+
|
|
70
|
+
Returns:
|
|
71
|
+
ApplyResult: 应用结果对象
|
|
72
|
+
"""
|
|
73
|
+
# 应用文件变更
|
|
74
|
+
result = self.apply_changes(changes, change_group_id)
|
|
75
|
+
|
|
76
|
+
if result.success and self.conversation_store is not None:
|
|
77
|
+
try:
|
|
78
|
+
|
|
79
|
+
# 创建并保存对话检查点
|
|
80
|
+
checkpoint_id = change_group_id or result.change_ids[0] if result.change_ids else str(uuid.uuid4())
|
|
81
|
+
checkpoint = ConversationCheckpoint(
|
|
82
|
+
checkpoint_id=checkpoint_id,
|
|
83
|
+
timestamp=time.time(),
|
|
84
|
+
conversations=conversations,
|
|
85
|
+
metadata=metadata
|
|
86
|
+
)
|
|
87
|
+
self.conversation_store.save_checkpoint(checkpoint)
|
|
88
|
+
logger.info(f"已保存对话检查点: {checkpoint_id}")
|
|
89
|
+
except Exception as e:
|
|
90
|
+
logger.error(f"保存对话检查点失败: {str(e)}")
|
|
91
|
+
|
|
92
|
+
return result
|
|
40
93
|
|
|
41
94
|
def apply_changes(self, changes: Dict[str, FileChange], change_group_id: Optional[str] = None) -> ApplyResult:
|
|
42
95
|
"""
|
|
@@ -152,6 +205,27 @@ class FileChangeManager:
|
|
|
152
205
|
|
|
153
206
|
return diff_results
|
|
154
207
|
|
|
208
|
+
def undo_last_change_with_conversation(self) -> Tuple[UndoResult, Optional[ConversationCheckpoint]]:
|
|
209
|
+
"""
|
|
210
|
+
撤销最近的一次变更并恢复对话状态
|
|
211
|
+
|
|
212
|
+
Returns:
|
|
213
|
+
Tuple[UndoResult, Optional[ConversationCheckpoint]]: 撤销结果和恢复的对话检查点
|
|
214
|
+
"""
|
|
215
|
+
# 获取最近的变更记录
|
|
216
|
+
latest_changes = self.change_store.get_latest_changes(limit=1)
|
|
217
|
+
if not latest_changes:
|
|
218
|
+
return UndoResult(success=False, errors={"general": "没有找到最近的变更记录"}), None
|
|
219
|
+
|
|
220
|
+
latest_change = latest_changes[0]
|
|
221
|
+
|
|
222
|
+
# 如果最近的变更属于一个组,撤销整个组
|
|
223
|
+
if latest_change.group_id:
|
|
224
|
+
return self.undo_change_group_with_conversation(latest_change.group_id)
|
|
225
|
+
else:
|
|
226
|
+
# 否则只撤销这一个变更
|
|
227
|
+
return self.undo_change_with_conversation(latest_change.change_id)
|
|
228
|
+
|
|
155
229
|
def undo_last_change(self) -> UndoResult:
|
|
156
230
|
"""
|
|
157
231
|
撤销最近的一次变更
|
|
@@ -173,6 +247,39 @@ class FileChangeManager:
|
|
|
173
247
|
# 否则只撤销这一个变更
|
|
174
248
|
return self.undo_change(latest_change.change_id)
|
|
175
249
|
|
|
250
|
+
def undo_change_with_conversation(self, change_id: str) -> Tuple[UndoResult, Optional[ConversationCheckpoint]]:
|
|
251
|
+
"""
|
|
252
|
+
撤销指定的变更并恢复对话状态
|
|
253
|
+
|
|
254
|
+
Args:
|
|
255
|
+
change_id: 变更记录ID
|
|
256
|
+
|
|
257
|
+
Returns:
|
|
258
|
+
Tuple[UndoResult, Optional[ConversationCheckpoint]]: 撤销结果和恢复的对话检查点
|
|
259
|
+
"""
|
|
260
|
+
# 获取变更记录
|
|
261
|
+
change_record = self.change_store.get_change(change_id)
|
|
262
|
+
if change_record is None:
|
|
263
|
+
return UndoResult(success=False, errors={"general": f"变更记录 {change_id} 不存在"}), None
|
|
264
|
+
|
|
265
|
+
# 获取关联的对话检查点
|
|
266
|
+
checkpoint = None
|
|
267
|
+
checkpoint_id = change_record.group_id or change_id
|
|
268
|
+
if self.conversation_store is not None:
|
|
269
|
+
try:
|
|
270
|
+
checkpoint = self.conversation_store.get_checkpoint(checkpoint_id)
|
|
271
|
+
if checkpoint:
|
|
272
|
+
logger.info(f"找到关联的对话检查点: {checkpoint_id}")
|
|
273
|
+
else:
|
|
274
|
+
logger.info(f"未找到关联的对话检查点: {checkpoint_id}")
|
|
275
|
+
except Exception as e:
|
|
276
|
+
logger.error(f"获取对话检查点失败: {str(e)}")
|
|
277
|
+
|
|
278
|
+
# 撤销文件变更
|
|
279
|
+
undo_result = self.undo_change(change_id)
|
|
280
|
+
|
|
281
|
+
return undo_result, checkpoint
|
|
282
|
+
|
|
176
283
|
def undo_change(self, change_id: str) -> UndoResult:
|
|
177
284
|
"""
|
|
178
285
|
撤销指定的变更
|
|
@@ -234,6 +341,38 @@ class FileChangeManager:
|
|
|
234
341
|
|
|
235
342
|
return result
|
|
236
343
|
|
|
344
|
+
def undo_change_group_with_conversation(self, group_id: str) -> Tuple[UndoResult, Optional[ConversationCheckpoint]]:
|
|
345
|
+
"""
|
|
346
|
+
撤销指定组的所有变更并恢复对话状态
|
|
347
|
+
|
|
348
|
+
Args:
|
|
349
|
+
group_id: 变更组ID
|
|
350
|
+
|
|
351
|
+
Returns:
|
|
352
|
+
Tuple[UndoResult, Optional[ConversationCheckpoint]]: 撤销结果和恢复的对话检查点
|
|
353
|
+
"""
|
|
354
|
+
# 获取组内的所有变更记录
|
|
355
|
+
changes = self.change_store.get_changes_by_group(group_id)
|
|
356
|
+
if not changes:
|
|
357
|
+
return UndoResult(success=False, errors={"general": f"变更组 {group_id} 不存在或为空"}), None
|
|
358
|
+
|
|
359
|
+
# 获取关联的对话检查点
|
|
360
|
+
checkpoint = None
|
|
361
|
+
if self.conversation_store is not None:
|
|
362
|
+
try:
|
|
363
|
+
checkpoint = self.conversation_store.get_checkpoint(group_id)
|
|
364
|
+
if checkpoint:
|
|
365
|
+
logger.info(f"找到关联的对话检查点: {group_id}")
|
|
366
|
+
else:
|
|
367
|
+
logger.info(f"未找到关联的对话检查点: {group_id}")
|
|
368
|
+
except Exception as e:
|
|
369
|
+
logger.error(f"获取对话检查点失败: {str(e)}")
|
|
370
|
+
|
|
371
|
+
# 撤销文件变更
|
|
372
|
+
undo_result = self.undo_change_group(group_id)
|
|
373
|
+
|
|
374
|
+
return undo_result, checkpoint
|
|
375
|
+
|
|
237
376
|
def undo_change_group(self, group_id: str) -> UndoResult:
|
|
238
377
|
"""
|
|
239
378
|
撤销指定组的所有变更
|
|
@@ -265,6 +404,39 @@ class FileChangeManager:
|
|
|
265
404
|
|
|
266
405
|
return result
|
|
267
406
|
|
|
407
|
+
def undo_to_version_with_conversation(self, version_id: str) -> Tuple[UndoResult, Optional[ConversationCheckpoint]]:
|
|
408
|
+
"""
|
|
409
|
+
撤销到指定的历史版本并恢复对话状态
|
|
410
|
+
|
|
411
|
+
Args:
|
|
412
|
+
version_id: 目标版本ID(变更记录ID)
|
|
413
|
+
|
|
414
|
+
Returns:
|
|
415
|
+
Tuple[UndoResult, Optional[ConversationCheckpoint]]: 撤销结果和恢复的对话检查点
|
|
416
|
+
"""
|
|
417
|
+
# 获取目标版本的变更记录
|
|
418
|
+
target_change = self.change_store.get_change(version_id)
|
|
419
|
+
if target_change is None:
|
|
420
|
+
return UndoResult(success=False, errors={"general": f"变更记录 {version_id} 不存在"}), None
|
|
421
|
+
|
|
422
|
+
# 获取关联的对话检查点
|
|
423
|
+
checkpoint = None
|
|
424
|
+
checkpoint_id = target_change.group_id or version_id
|
|
425
|
+
if self.conversation_store is not None:
|
|
426
|
+
try:
|
|
427
|
+
checkpoint = self.conversation_store.get_checkpoint(checkpoint_id)
|
|
428
|
+
if checkpoint:
|
|
429
|
+
logger.info(f"找到关联的对话检查点: {checkpoint_id}")
|
|
430
|
+
else:
|
|
431
|
+
logger.info(f"未找到关联的对话检查点: {checkpoint_id}")
|
|
432
|
+
except Exception as e:
|
|
433
|
+
logger.error(f"获取对话检查点失败: {str(e)}")
|
|
434
|
+
|
|
435
|
+
# 撤销文件变更
|
|
436
|
+
undo_result = self.undo_to_version(version_id)
|
|
437
|
+
|
|
438
|
+
return undo_result, checkpoint
|
|
439
|
+
|
|
268
440
|
def undo_to_version(self, version_id: str) -> UndoResult:
|
|
269
441
|
"""
|
|
270
442
|
撤销到指定的历史版本
|
|
@@ -359,6 +531,41 @@ class FileChangeManager:
|
|
|
359
531
|
"""
|
|
360
532
|
return self.change_store.get_change_groups(limit)
|
|
361
533
|
|
|
534
|
+
def get_available_checkpoints(self, limit: int = 10) -> List[Dict[str, Any]]:
|
|
535
|
+
"""
|
|
536
|
+
获取可用的检查点列表,包含对话状态信息
|
|
537
|
+
|
|
538
|
+
Args:
|
|
539
|
+
limit: 返回的检查点数量限制
|
|
540
|
+
|
|
541
|
+
Returns:
|
|
542
|
+
List[Dict[str, Any]]: 检查点信息列表
|
|
543
|
+
"""
|
|
544
|
+
# 获取变更组列表
|
|
545
|
+
change_groups = self.get_change_groups(limit)
|
|
546
|
+
|
|
547
|
+
# 构建检查点信息
|
|
548
|
+
checkpoints = []
|
|
549
|
+
for group_id, timestamp, count in change_groups:
|
|
550
|
+
has_conversation = False
|
|
551
|
+
|
|
552
|
+
# 检查是否有对话检查点
|
|
553
|
+
if self.conversation_store is not None:
|
|
554
|
+
try:
|
|
555
|
+
checkpoint = self.conversation_store.get_checkpoint(group_id)
|
|
556
|
+
has_conversation = checkpoint is not None
|
|
557
|
+
except Exception as e:
|
|
558
|
+
logger.error(f"获取对话检查点失败: {str(e)}")
|
|
559
|
+
|
|
560
|
+
checkpoints.append({
|
|
561
|
+
"id": group_id,
|
|
562
|
+
"timestamp": timestamp,
|
|
563
|
+
"changes_count": count,
|
|
564
|
+
"has_conversation": has_conversation
|
|
565
|
+
})
|
|
566
|
+
|
|
567
|
+
return checkpoints
|
|
568
|
+
|
|
362
569
|
def get_diff_text(self, old_content: str, new_content: str) -> str:
|
|
363
570
|
"""
|
|
364
571
|
获取两个文本内容的差异文本
|
|
@@ -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
|