auto-coder 0.1.400__py3-none-any.whl → 2.0.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of auto-coder might be problematic. Click here for more details.
- auto_coder-2.0.0.dist-info/LICENSE +158 -0
- auto_coder-2.0.0.dist-info/METADATA +558 -0
- auto_coder-2.0.0.dist-info/RECORD +795 -0
- {auto_coder-0.1.400.dist-info → auto_coder-2.0.0.dist-info}/WHEEL +1 -1
- {auto_coder-0.1.400.dist-info → auto_coder-2.0.0.dist-info}/entry_points.txt +3 -3
- autocoder/__init__.py +31 -0
- autocoder/agent/auto_filegroup.py +32 -13
- autocoder/agent/auto_learn_from_commit.py +9 -1
- autocoder/agent/base_agentic/__init__.py +3 -0
- autocoder/agent/base_agentic/agent_hub.py +1 -1
- autocoder/agent/base_agentic/base_agent.py +235 -136
- autocoder/agent/base_agentic/default_tools.py +119 -118
- autocoder/agent/base_agentic/test_base_agent.py +1 -1
- autocoder/agent/base_agentic/tool_registry.py +32 -20
- autocoder/agent/base_agentic/tools/read_file_tool_resolver.py +25 -4
- autocoder/agent/base_agentic/tools/write_to_file_tool_resolver.py +24 -11
- autocoder/agent/base_agentic/types.py +42 -0
- autocoder/agent/entry_command_agent/chat.py +73 -59
- autocoder/auto_coder.py +31 -40
- autocoder/auto_coder_rag.py +11 -1084
- autocoder/auto_coder_runner.py +1029 -2310
- autocoder/auto_coder_terminal.py +26 -0
- autocoder/auto_coder_terminal_v3.py +190 -0
- autocoder/chat/conf_command.py +224 -124
- autocoder/chat/models_command.py +361 -299
- autocoder/chat/rules_command.py +79 -31
- autocoder/chat_auto_coder.py +1021 -372
- autocoder/chat_auto_coder_lang.py +23 -732
- autocoder/commands/auto_command.py +26 -9
- autocoder/commands/auto_web.py +1 -1
- autocoder/commands/tools.py +44 -44
- autocoder/common/__init__.py +150 -128
- autocoder/common/ac_style_command_parser/__init__.py +39 -2
- autocoder/common/ac_style_command_parser/config.py +422 -0
- autocoder/common/ac_style_command_parser/parser.py +292 -78
- autocoder/common/ac_style_command_parser/test_parser.py +241 -16
- autocoder/common/ac_style_command_parser/test_typed_parser.py +342 -0
- autocoder/common/ac_style_command_parser/typed_parser.py +653 -0
- autocoder/common/action_yml_file_manager.py +25 -13
- autocoder/common/agent_events/__init__.py +52 -0
- autocoder/common/agent_events/agent_event_emitter.py +193 -0
- autocoder/common/agent_events/event_factory.py +177 -0
- autocoder/common/agent_events/examples.py +307 -0
- autocoder/common/agent_events/types.py +113 -0
- autocoder/common/agent_events/utils.py +68 -0
- autocoder/common/agent_hooks/__init__.py +44 -0
- autocoder/common/agent_hooks/examples.py +582 -0
- autocoder/common/agent_hooks/hook_executor.py +217 -0
- autocoder/common/agent_hooks/hook_manager.py +288 -0
- autocoder/common/agent_hooks/types.py +133 -0
- autocoder/common/agent_hooks/utils.py +99 -0
- autocoder/common/agent_query_queue/queue_executor.py +324 -0
- autocoder/common/agent_query_queue/queue_manager.py +325 -0
- autocoder/common/agents/__init__.py +11 -0
- autocoder/common/agents/agent_manager.py +323 -0
- autocoder/common/agents/agent_parser.py +189 -0
- autocoder/common/agents/example_usage.py +344 -0
- autocoder/common/agents/integration_example.py +330 -0
- autocoder/common/agents/test_agent_parser.py +545 -0
- autocoder/common/async_utils.py +101 -0
- autocoder/common/auto_coder_lang.py +23 -972
- autocoder/common/autocoderargs_parser/__init__.py +14 -0
- autocoder/common/autocoderargs_parser/parser.py +184 -0
- autocoder/common/autocoderargs_parser/tests/__init__.py +1 -0
- autocoder/common/autocoderargs_parser/tests/test_args_parser.py +235 -0
- autocoder/common/autocoderargs_parser/tests/test_token_parser.py +195 -0
- autocoder/common/autocoderargs_parser/token_parser.py +290 -0
- autocoder/common/buildin_tokenizer.py +2 -4
- autocoder/common/code_auto_generate.py +149 -74
- autocoder/common/code_auto_generate_diff.py +163 -70
- autocoder/common/code_auto_generate_editblock.py +179 -89
- autocoder/common/code_auto_generate_strict_diff.py +167 -72
- autocoder/common/code_auto_merge_editblock.py +13 -6
- autocoder/common/code_modification_ranker.py +1 -1
- autocoder/common/command_completer.py +3 -3
- autocoder/common/command_file_manager/manager.py +183 -47
- autocoder/common/command_file_manager/test_command_file_manager.py +507 -0
- autocoder/common/command_templates.py +1 -1
- autocoder/common/conf_utils.py +2 -4
- autocoder/common/conversations/config.py +11 -3
- autocoder/common/conversations/get_conversation_manager.py +100 -2
- autocoder/common/conversations/llm_stats_models.py +264 -0
- autocoder/common/conversations/manager.py +112 -28
- autocoder/common/conversations/models.py +16 -2
- autocoder/common/conversations/storage/index_manager.py +134 -10
- autocoder/common/core_config/__init__.py +63 -0
- autocoder/common/core_config/agentic_mode_manager.py +109 -0
- autocoder/common/core_config/base_manager.py +123 -0
- autocoder/common/core_config/compatibility.py +151 -0
- autocoder/common/core_config/config_manager.py +156 -0
- autocoder/common/core_config/conversation_manager.py +31 -0
- autocoder/common/core_config/exclude_manager.py +72 -0
- autocoder/common/core_config/file_manager.py +177 -0
- autocoder/common/core_config/human_as_model_manager.py +129 -0
- autocoder/common/core_config/lib_manager.py +54 -0
- autocoder/common/core_config/main_manager.py +81 -0
- autocoder/common/core_config/mode_manager.py +126 -0
- autocoder/common/core_config/models.py +70 -0
- autocoder/common/core_config/test_memory_manager.py +1056 -0
- autocoder/common/env_manager.py +282 -0
- autocoder/common/env_manager_usage_example.py +211 -0
- autocoder/common/file_checkpoint/conversation_checkpoint.py +19 -19
- autocoder/common/file_checkpoint/manager.py +264 -48
- autocoder/common/file_checkpoint/test_backup.py +1 -18
- autocoder/common/file_checkpoint/test_manager.py +270 -1
- autocoder/common/file_checkpoint/test_store.py +1 -17
- autocoder/common/file_handler/__init__.py +23 -0
- autocoder/common/file_handler/active_context_handler.py +159 -0
- autocoder/common/file_handler/add_files_handler.py +409 -0
- autocoder/common/file_handler/chat_handler.py +180 -0
- autocoder/common/file_handler/coding_handler.py +401 -0
- autocoder/common/file_handler/commit_handler.py +200 -0
- autocoder/common/file_handler/lib_handler.py +156 -0
- autocoder/common/file_handler/list_files_handler.py +111 -0
- autocoder/common/file_handler/mcp_handler.py +268 -0
- autocoder/common/file_handler/models_handler.py +493 -0
- autocoder/common/file_handler/remove_files_handler.py +172 -0
- autocoder/common/file_monitor/test_file_monitor.py +307 -0
- autocoder/common/git_utils.py +51 -10
- autocoder/common/global_cancel.py +15 -6
- autocoder/common/ignorefiles/test_ignore_file_utils.py +1 -1
- autocoder/common/international/__init__.py +31 -0
- autocoder/common/international/demo_international.py +92 -0
- autocoder/common/international/message_manager.py +157 -0
- autocoder/common/international/messages/__init__.py +56 -0
- autocoder/common/international/messages/async_command_messages.py +507 -0
- autocoder/common/international/messages/auto_coder_messages.py +2208 -0
- autocoder/common/international/messages/chat_auto_coder_messages.py +1547 -0
- autocoder/common/international/messages/command_help_messages.py +986 -0
- autocoder/common/international/messages/conversation_command_messages.py +191 -0
- autocoder/common/international/messages/git_helper_plugin_messages.py +159 -0
- autocoder/common/international/messages/queue_command_messages.py +751 -0
- autocoder/common/international/messages/rules_command_messages.py +77 -0
- autocoder/common/international/messages/sdk_messages.py +1707 -0
- autocoder/common/international/messages/token_helper_plugin_messages.py +361 -0
- autocoder/common/international/messages/tool_display_messages.py +1212 -0
- autocoder/common/international/messages/workflow_exception_messages.py +473 -0
- autocoder/common/international/test_international.py +612 -0
- autocoder/common/linter_core/__init__.py +28 -0
- autocoder/common/linter_core/base_linter.py +61 -0
- autocoder/common/linter_core/config_loader.py +271 -0
- autocoder/common/linter_core/formatters/__init__.py +0 -0
- autocoder/common/linter_core/formatters/base_formatter.py +38 -0
- autocoder/common/linter_core/formatters/raw_formatter.py +17 -0
- autocoder/common/linter_core/linter.py +166 -0
- autocoder/common/linter_core/linter_factory.py +216 -0
- autocoder/common/linter_core/linter_manager.py +333 -0
- autocoder/common/linter_core/linters/__init__.py +9 -0
- autocoder/common/linter_core/linters/java_linter.py +342 -0
- autocoder/common/linter_core/linters/python_linter.py +115 -0
- autocoder/common/linter_core/linters/typescript_linter.py +119 -0
- autocoder/common/linter_core/models/__init__.py +7 -0
- autocoder/common/linter_core/models/lint_result.py +91 -0
- autocoder/common/linter_core/models.py +33 -0
- autocoder/common/linter_core/tests/__init__.py +3 -0
- autocoder/common/linter_core/tests/test_config_loader.py +323 -0
- autocoder/common/linter_core/tests/test_config_loading.py +308 -0
- autocoder/common/linter_core/tests/test_factory_manager.py +234 -0
- autocoder/common/linter_core/tests/test_formatters.py +147 -0
- autocoder/common/linter_core/tests/test_integration.py +317 -0
- autocoder/common/linter_core/tests/test_java_linter.py +496 -0
- autocoder/common/linter_core/tests/test_linters.py +265 -0
- autocoder/common/linter_core/tests/test_models.py +81 -0
- autocoder/common/linter_core/tests/verify_config_loading.py +296 -0
- autocoder/common/linter_core/tests/verify_fixes.py +183 -0
- autocoder/common/llm_friendly_package/__init__.py +31 -0
- autocoder/common/llm_friendly_package/base_manager.py +102 -0
- autocoder/common/llm_friendly_package/docs_manager.py +121 -0
- autocoder/common/llm_friendly_package/library_manager.py +171 -0
- autocoder/common/{llm_friendly_package.py → llm_friendly_package/main_manager.py} +204 -231
- autocoder/common/llm_friendly_package/models.py +40 -0
- autocoder/common/llm_friendly_package/test_llm_friendly_package.py +536 -0
- autocoder/common/llms/__init__.py +15 -0
- autocoder/common/llms/demo_error_handling.py +85 -0
- autocoder/common/llms/factory.py +142 -0
- autocoder/common/llms/manager.py +264 -0
- autocoder/common/llms/pricing.py +121 -0
- autocoder/common/llms/registry.py +288 -0
- autocoder/common/llms/schema.py +77 -0
- autocoder/common/llms/simple_demo.py +45 -0
- autocoder/common/llms/test_quick_model.py +116 -0
- autocoder/common/llms/test_remove_functionality.py +182 -0
- autocoder/common/llms/tests/__init__.py +1 -0
- autocoder/common/llms/tests/test_manager.py +330 -0
- autocoder/common/llms/tests/test_registry.py +364 -0
- autocoder/common/mcp_tools/__init__.py +62 -0
- autocoder/common/{mcp_tools.py → mcp_tools/executor.py} +49 -40
- autocoder/common/{mcp_hub.py → mcp_tools/hub.py} +42 -68
- autocoder/common/{mcp_server_install.py → mcp_tools/installer.py} +16 -28
- autocoder/common/{mcp_server.py → mcp_tools/server.py} +176 -48
- autocoder/common/mcp_tools/test_keyboard_interrupt.py +93 -0
- autocoder/common/mcp_tools/test_mcp_tools.py +391 -0
- autocoder/common/{mcp_server_types.py → mcp_tools/types.py} +121 -48
- autocoder/common/mcp_tools/verify_functionality.py +202 -0
- autocoder/common/model_speed_tester.py +32 -26
- autocoder/common/priority_directory_finder/__init__.py +142 -0
- autocoder/common/priority_directory_finder/examples.py +230 -0
- autocoder/common/priority_directory_finder/finder.py +283 -0
- autocoder/common/priority_directory_finder/models.py +236 -0
- autocoder/common/priority_directory_finder/test_priority_directory_finder.py +431 -0
- autocoder/common/project_scanner/__init__.py +18 -0
- autocoder/common/project_scanner/compat.py +77 -0
- autocoder/common/project_scanner/scanner.py +436 -0
- autocoder/common/project_tracker/__init__.py +27 -0
- autocoder/common/project_tracker/api.py +228 -0
- autocoder/common/project_tracker/demo.py +272 -0
- autocoder/common/project_tracker/tracker.py +487 -0
- autocoder/common/project_tracker/types.py +53 -0
- autocoder/common/pruner/__init__.py +67 -0
- autocoder/common/pruner/agentic_conversation_pruner.py +746 -0
- autocoder/common/{context_pruner.py → pruner/context_pruner.py} +137 -40
- autocoder/common/pruner/conversation_message_ids_api.py +386 -0
- autocoder/common/pruner/conversation_message_ids_manager.py +347 -0
- autocoder/common/pruner/conversation_message_ids_pruner.py +473 -0
- autocoder/common/pruner/conversation_normalizer.py +347 -0
- autocoder/common/{conversation_pruner.py → pruner/conversation_pruner.py} +26 -6
- autocoder/common/pruner/test_agentic_conversation_pruner.py +784 -0
- autocoder/common/pruner/test_context_pruner.py +546 -0
- autocoder/common/pruner/test_conversation_normalizer.py +502 -0
- autocoder/common/pruner/test_tool_content_detector.py +324 -0
- autocoder/common/pruner/tool_content_detector.py +227 -0
- autocoder/common/pruner/tools/__init__.py +18 -0
- autocoder/common/pruner/tools/query_message_ids.py +264 -0
- autocoder/common/pruner/tools/test_agentic_pruning_logic.py +432 -0
- autocoder/common/pruner/tools/test_message_ids_pruning_only.py +192 -0
- autocoder/common/pull_requests/__init__.py +9 -1
- autocoder/common/pull_requests/utils.py +122 -1
- autocoder/common/rag_manager/rag_manager.py +36 -40
- autocoder/common/rulefiles/__init__.py +53 -1
- autocoder/common/rulefiles/api.py +250 -0
- autocoder/common/rulefiles/core/__init__.py +14 -0
- autocoder/common/rulefiles/core/manager.py +241 -0
- autocoder/common/rulefiles/core/selector.py +805 -0
- autocoder/common/rulefiles/models/__init__.py +20 -0
- autocoder/common/rulefiles/models/index.py +16 -0
- autocoder/common/rulefiles/models/init_rule.py +18 -0
- autocoder/common/rulefiles/models/rule_file.py +18 -0
- autocoder/common/rulefiles/models/rule_relevance.py +14 -0
- autocoder/common/rulefiles/models/summary.py +16 -0
- autocoder/common/rulefiles/test_rulefiles.py +776 -0
- autocoder/common/rulefiles/utils/__init__.py +34 -0
- autocoder/common/rulefiles/utils/monitor.py +86 -0
- autocoder/common/rulefiles/utils/parser.py +230 -0
- autocoder/common/save_formatted_log.py +67 -10
- autocoder/common/search_replace.py +8 -1
- autocoder/common/search_replace_patch/__init__.py +24 -0
- autocoder/common/search_replace_patch/base.py +115 -0
- autocoder/common/search_replace_patch/manager.py +248 -0
- autocoder/common/search_replace_patch/patch_replacer.py +304 -0
- autocoder/common/search_replace_patch/similarity_replacer.py +306 -0
- autocoder/common/search_replace_patch/string_replacer.py +181 -0
- autocoder/common/search_replace_patch/tests/__init__.py +3 -0
- autocoder/common/search_replace_patch/tests/run_tests.py +126 -0
- autocoder/common/search_replace_patch/tests/test_base.py +188 -0
- autocoder/common/search_replace_patch/tests/test_empty_line_insert.py +233 -0
- autocoder/common/search_replace_patch/tests/test_integration.py +389 -0
- autocoder/common/search_replace_patch/tests/test_manager.py +351 -0
- autocoder/common/search_replace_patch/tests/test_patch_replacer.py +316 -0
- autocoder/common/search_replace_patch/tests/test_regex_replacer.py +306 -0
- autocoder/common/search_replace_patch/tests/test_similarity_replacer.py +384 -0
- autocoder/common/shell_commands/__init__.py +197 -0
- autocoder/common/shell_commands/background_process_notifier.py +346 -0
- autocoder/common/shell_commands/command_executor.py +1127 -0
- autocoder/common/shell_commands/error_recovery.py +541 -0
- autocoder/common/shell_commands/exceptions.py +120 -0
- autocoder/common/shell_commands/interactive_executor.py +476 -0
- autocoder/common/shell_commands/interactive_pexpect_process.py +623 -0
- autocoder/common/shell_commands/interactive_process.py +744 -0
- autocoder/common/shell_commands/interactive_session_manager.py +1014 -0
- autocoder/common/shell_commands/monitoring.py +529 -0
- autocoder/common/shell_commands/process_cleanup.py +386 -0
- autocoder/common/shell_commands/process_manager.py +606 -0
- autocoder/common/shell_commands/test_interactive_pexpect_process.py +281 -0
- autocoder/common/shell_commands/tests/__init__.py +6 -0
- autocoder/common/shell_commands/tests/conftest.py +118 -0
- autocoder/common/shell_commands/tests/test_background_process_notifier.py +703 -0
- autocoder/common/shell_commands/tests/test_command_executor.py +448 -0
- autocoder/common/shell_commands/tests/test_error_recovery.py +305 -0
- autocoder/common/shell_commands/tests/test_exceptions.py +299 -0
- autocoder/common/shell_commands/tests/test_execute_batch.py +588 -0
- autocoder/common/shell_commands/tests/test_indented_batch_commands.py +244 -0
- autocoder/common/shell_commands/tests/test_integration.py +664 -0
- autocoder/common/shell_commands/tests/test_monitoring.py +546 -0
- autocoder/common/shell_commands/tests/test_performance.py +632 -0
- autocoder/common/shell_commands/tests/test_process_cleanup.py +397 -0
- autocoder/common/shell_commands/tests/test_process_manager.py +606 -0
- autocoder/common/shell_commands/tests/test_timeout_config.py +343 -0
- autocoder/common/shell_commands/tests/test_timeout_manager.py +520 -0
- autocoder/common/shell_commands/timeout_config.py +315 -0
- autocoder/common/shell_commands/timeout_manager.py +352 -0
- autocoder/common/terminal_paste/__init__.py +14 -0
- autocoder/common/terminal_paste/demo.py +145 -0
- autocoder/common/terminal_paste/demo_paste_functionality.py +95 -0
- autocoder/common/terminal_paste/paste_handler.py +200 -0
- autocoder/common/terminal_paste/paste_manager.py +118 -0
- autocoder/common/terminal_paste/tests/__init__.py +1 -0
- autocoder/common/terminal_paste/tests/test_paste_handler.py +182 -0
- autocoder/common/terminal_paste/tests/test_paste_manager.py +126 -0
- autocoder/common/terminal_paste/utils.py +163 -0
- autocoder/common/test_autocoder_args.py +232 -0
- autocoder/common/test_env_manager.py +173 -0
- autocoder/common/test_env_manager_integration.py +159 -0
- autocoder/common/text_similarity/__init__.py +9 -0
- autocoder/common/text_similarity/demo.py +216 -0
- autocoder/common/text_similarity/examples.py +266 -0
- autocoder/common/text_similarity/test_text_similarity.py +306 -0
- autocoder/common/text_similarity/text_similarity.py +194 -0
- autocoder/common/text_similarity/utils.py +125 -0
- autocoder/common/todos/__init__.py +61 -0
- autocoder/common/todos/cache/__init__.py +16 -0
- autocoder/common/todos/cache/base_cache.py +89 -0
- autocoder/common/todos/cache/cache_manager.py +228 -0
- autocoder/common/todos/cache/memory_cache.py +225 -0
- autocoder/common/todos/config.py +155 -0
- autocoder/common/todos/exceptions.py +35 -0
- autocoder/common/todos/get_todo_manager.py +161 -0
- autocoder/common/todos/manager.py +537 -0
- autocoder/common/todos/models.py +239 -0
- autocoder/common/todos/storage/__init__.py +14 -0
- autocoder/common/todos/storage/base_storage.py +76 -0
- autocoder/common/todos/storage/file_storage.py +278 -0
- autocoder/common/tokens/__init__.py +15 -0
- autocoder/common/tokens/counter.py +44 -2
- autocoder/common/tools_manager/__init__.py +17 -0
- autocoder/common/tools_manager/examples.py +162 -0
- autocoder/common/tools_manager/manager.py +385 -0
- autocoder/common/tools_manager/models.py +39 -0
- autocoder/common/tools_manager/test_tools_manager.py +303 -0
- autocoder/common/tools_manager/utils.py +191 -0
- autocoder/common/v2/agent/agentic_callbacks.py +270 -0
- autocoder/common/v2/agent/agentic_edit.py +2729 -2052
- autocoder/common/v2/agent/agentic_edit_change_manager.py +474 -0
- autocoder/common/v2/agent/agentic_edit_tools/__init__.py +43 -2
- autocoder/common/v2/agent/agentic_edit_tools/ac_mod_list_tool_resolver.py +279 -0
- autocoder/common/v2/agent/agentic_edit_tools/ac_mod_read_tool_resolver.py +40 -0
- autocoder/common/v2/agent/agentic_edit_tools/ac_mod_write_tool_resolver.py +52 -0
- autocoder/common/v2/agent/agentic_edit_tools/ask_followup_question_tool_resolver.py +8 -0
- autocoder/common/v2/agent/agentic_edit_tools/background_task_tool_resolver.py +1167 -0
- autocoder/common/v2/agent/agentic_edit_tools/base_tool_resolver.py +2 -2
- autocoder/common/v2/agent/agentic_edit_tools/conversation_message_ids_read_tool_resolver.py +214 -0
- autocoder/common/v2/agent/agentic_edit_tools/conversation_message_ids_write_tool_resolver.py +299 -0
- autocoder/common/v2/agent/agentic_edit_tools/count_tokens_tool_resolver.py +290 -0
- autocoder/common/v2/agent/agentic_edit_tools/execute_command_tool_resolver.py +565 -30
- autocoder/common/v2/agent/agentic_edit_tools/execute_workflow_tool_resolver.py +485 -0
- autocoder/common/v2/agent/agentic_edit_tools/extract_to_text_tool_resolver.py +225 -0
- autocoder/common/v2/agent/agentic_edit_tools/lint_report.py +79 -0
- autocoder/common/v2/agent/agentic_edit_tools/linter_config_models.py +343 -0
- autocoder/common/v2/agent/agentic_edit_tools/linter_enabled_tool_resolver.py +189 -0
- autocoder/common/v2/agent/agentic_edit_tools/list_files_tool_resolver.py +169 -101
- autocoder/common/v2/agent/agentic_edit_tools/load_extra_document_tool_resolver.py +349 -0
- autocoder/common/v2/agent/agentic_edit_tools/read_file_tool_resolver.py +244 -51
- autocoder/common/v2/agent/agentic_edit_tools/replace_in_file_tool_resolver.py +667 -147
- autocoder/common/v2/agent/agentic_edit_tools/run_named_subagents_tool_resolver.py +691 -0
- autocoder/common/v2/agent/agentic_edit_tools/search_files_tool_resolver.py +409 -140
- autocoder/common/v2/agent/agentic_edit_tools/session_interactive_tool_resolver.py +115 -0
- autocoder/common/v2/agent/agentic_edit_tools/session_start_tool_resolver.py +190 -0
- autocoder/common/v2/agent/agentic_edit_tools/session_stop_tool_resolver.py +76 -0
- autocoder/common/v2/agent/agentic_edit_tools/test_write_to_file_tool_resolver.py +209 -194
- autocoder/common/v2/agent/agentic_edit_tools/todo_read_tool_resolver.py +135 -0
- autocoder/common/v2/agent/agentic_edit_tools/todo_write_tool_resolver.py +328 -0
- autocoder/common/v2/agent/agentic_edit_tools/use_mcp_tool_resolver.py +2 -2
- autocoder/common/v2/agent/agentic_edit_tools/web_crawl_tool_resolver.py +557 -0
- autocoder/common/v2/agent/agentic_edit_tools/web_search_tool_resolver.py +600 -0
- autocoder/common/v2/agent/agentic_edit_tools/write_to_file_tool_resolver.py +56 -121
- autocoder/common/v2/agent/agentic_edit_types.py +386 -10
- autocoder/common/v2/agent/runner/__init__.py +31 -0
- autocoder/common/v2/agent/runner/base_runner.py +92 -0
- autocoder/common/v2/agent/runner/file_based_event_runner.py +217 -0
- autocoder/common/v2/agent/runner/sdk_runner.py +182 -0
- autocoder/common/v2/agent/runner/terminal_runner.py +396 -0
- autocoder/common/v2/agent/runner/tool_display.py +589 -0
- autocoder/common/v2/agent/test_agentic_callbacks.py +265 -0
- autocoder/common/v2/agent/test_agentic_edit.py +194 -0
- autocoder/common/v2/agent/tool_caller/__init__.py +24 -0
- autocoder/common/v2/agent/tool_caller/default_tool_resolver_map.py +135 -0
- autocoder/common/v2/agent/tool_caller/integration_test.py +172 -0
- autocoder/common/v2/agent/tool_caller/plugins/__init__.py +14 -0
- autocoder/common/v2/agent/tool_caller/plugins/base_plugin.py +126 -0
- autocoder/common/v2/agent/tool_caller/plugins/examples/__init__.py +13 -0
- autocoder/common/v2/agent/tool_caller/plugins/examples/logging_plugin.py +164 -0
- autocoder/common/v2/agent/tool_caller/plugins/examples/security_filter_plugin.py +198 -0
- autocoder/common/v2/agent/tool_caller/plugins/plugin_interface.py +141 -0
- autocoder/common/v2/agent/tool_caller/test_tool_caller.py +278 -0
- autocoder/common/v2/agent/tool_caller/tool_call_plugin_manager.py +331 -0
- autocoder/common/v2/agent/tool_caller/tool_caller.py +337 -0
- autocoder/common/v2/agent/tool_caller/usage_example.py +193 -0
- autocoder/common/v2/code_agentic_editblock_manager.py +4 -4
- autocoder/common/v2/code_auto_generate.py +136 -78
- autocoder/common/v2/code_auto_generate_diff.py +135 -79
- autocoder/common/v2/code_auto_generate_editblock.py +174 -99
- autocoder/common/v2/code_auto_generate_strict_diff.py +151 -71
- autocoder/common/v2/code_auto_merge.py +1 -1
- autocoder/common/v2/code_auto_merge_editblock.py +13 -1
- autocoder/common/v2/code_diff_manager.py +3 -3
- autocoder/common/v2/code_editblock_manager.py +4 -14
- autocoder/common/v2/code_manager.py +1 -1
- autocoder/common/v2/code_strict_diff_manager.py +2 -2
- autocoder/common/wrap_llm_hint/__init__.py +10 -0
- autocoder/common/wrap_llm_hint/test_wrap_llm_hint.py +1067 -0
- autocoder/common/wrap_llm_hint/utils.py +432 -0
- autocoder/common/wrap_llm_hint/wrap_llm_hint.py +323 -0
- autocoder/completer/__init__.py +8 -0
- autocoder/completer/command_completer_v2.py +1051 -0
- autocoder/default_project/__init__.py +501 -0
- autocoder/dispacher/__init__.py +4 -12
- autocoder/dispacher/actions/action.py +165 -7
- autocoder/dispacher/actions/plugins/action_regex_project.py +2 -2
- autocoder/index/entry.py +117 -125
- autocoder/{agent → index/filter}/agentic_filter.py +323 -334
- autocoder/index/filter/normal_filter.py +5 -11
- autocoder/index/filter/quick_filter.py +1 -1
- autocoder/index/index.py +36 -9
- autocoder/index/tests/__init__.py +1 -0
- autocoder/index/tests/run_tests.py +195 -0
- autocoder/index/tests/test_entry.py +303 -0
- autocoder/index/tests/test_index_manager.py +314 -0
- autocoder/index/tests/test_module_integration.py +300 -0
- autocoder/index/tests/test_symbols_utils.py +183 -0
- autocoder/inner/__init__.py +4 -0
- autocoder/inner/agentic.py +932 -0
- autocoder/inner/async_command_handler.py +992 -0
- autocoder/inner/conversation_command_handlers.py +623 -0
- autocoder/inner/merge_command_handler.py +213 -0
- autocoder/inner/queue_command_handler.py +684 -0
- autocoder/models.py +95 -266
- autocoder/plugins/git_helper_plugin.py +31 -29
- autocoder/plugins/token_helper_plugin.py +156 -37
- autocoder/pyproject/__init__.py +32 -29
- autocoder/rag/agentic_rag.py +215 -75
- autocoder/rag/cache/simple_cache.py +1 -2
- autocoder/rag/loaders/image_loader.py +1 -1
- autocoder/rag/long_context_rag.py +42 -26
- autocoder/rag/qa_conversation_strategy.py +1 -1
- autocoder/rag/terminal/__init__.py +17 -0
- autocoder/rag/terminal/args.py +581 -0
- autocoder/rag/terminal/bootstrap.py +61 -0
- autocoder/rag/terminal/command_handlers.py +653 -0
- autocoder/rag/terminal/formatters/__init__.py +20 -0
- autocoder/rag/terminal/formatters/base.py +70 -0
- autocoder/rag/terminal/formatters/json_format.py +66 -0
- autocoder/rag/terminal/formatters/stream_json.py +95 -0
- autocoder/rag/terminal/formatters/text.py +28 -0
- autocoder/rag/terminal/init.py +120 -0
- autocoder/rag/terminal/utils.py +106 -0
- autocoder/rag/test_agentic_rag.py +389 -0
- autocoder/rag/test_doc_filter.py +3 -3
- autocoder/rag/test_long_context_rag.py +1 -1
- autocoder/rag/test_token_limiter.py +517 -10
- autocoder/rag/token_counter.py +3 -0
- autocoder/rag/token_limiter.py +19 -15
- autocoder/rag/tools/__init__.py +26 -2
- autocoder/rag/tools/bochaai_example.py +343 -0
- autocoder/rag/tools/bochaai_sdk.py +541 -0
- autocoder/rag/tools/metaso_example.py +268 -0
- autocoder/rag/tools/metaso_sdk.py +417 -0
- autocoder/rag/tools/recall_tool.py +28 -7
- autocoder/rag/tools/run_integration_tests.py +204 -0
- autocoder/rag/tools/test_all_providers.py +318 -0
- autocoder/rag/tools/test_bochaai_integration.py +482 -0
- autocoder/rag/tools/test_final_integration.py +215 -0
- autocoder/rag/tools/test_metaso_integration.py +424 -0
- autocoder/rag/tools/test_metaso_real.py +171 -0
- autocoder/rag/tools/test_web_crawl_tool.py +639 -0
- autocoder/rag/tools/test_web_search_tool.py +509 -0
- autocoder/rag/tools/todo_read_tool.py +202 -0
- autocoder/rag/tools/todo_write_tool.py +412 -0
- autocoder/rag/tools/web_crawl_tool.py +634 -0
- autocoder/rag/tools/web_search_tool.py +558 -0
- autocoder/rag/tools/web_tools_example.py +119 -0
- autocoder/rag/types.py +16 -0
- autocoder/rag/variable_holder.py +4 -2
- autocoder/rags.py +86 -79
- autocoder/regexproject/__init__.py +23 -21
- autocoder/run_context.py +9 -0
- autocoder/sdk/__init__.py +50 -161
- autocoder/sdk/api.py +370 -0
- autocoder/sdk/async_runner/__init__.py +26 -0
- autocoder/sdk/async_runner/async_executor.py +650 -0
- autocoder/sdk/async_runner/async_handler.py +356 -0
- autocoder/sdk/async_runner/markdown_processor.py +595 -0
- autocoder/sdk/async_runner/task_metadata.py +284 -0
- autocoder/sdk/async_runner/worktree_manager.py +438 -0
- autocoder/sdk/cli/__init__.py +2 -5
- autocoder/sdk/cli/formatters.py +28 -204
- autocoder/sdk/cli/handlers.py +77 -44
- autocoder/sdk/cli/main.py +158 -170
- autocoder/sdk/cli/options.py +95 -22
- autocoder/sdk/constants.py +139 -51
- autocoder/sdk/core/auto_coder_core.py +484 -267
- autocoder/sdk/core/bridge.py +298 -118
- autocoder/sdk/exceptions.py +18 -12
- autocoder/sdk/formatters/__init__.py +19 -0
- autocoder/sdk/formatters/input.py +64 -0
- autocoder/sdk/formatters/output.py +247 -0
- autocoder/sdk/formatters/stream.py +54 -0
- autocoder/sdk/models/__init__.py +6 -5
- autocoder/sdk/models/options.py +55 -18
- autocoder/sdk/utils/formatters.py +27 -195
- autocoder/suffixproject/__init__.py +28 -25
- autocoder/terminal/__init__.py +14 -0
- autocoder/terminal/app.py +454 -0
- autocoder/terminal/args.py +32 -0
- autocoder/terminal/bootstrap.py +178 -0
- autocoder/terminal/command_processor.py +521 -0
- autocoder/terminal/command_registry.py +57 -0
- autocoder/terminal/help.py +97 -0
- autocoder/terminal/tasks/__init__.py +5 -0
- autocoder/terminal/tasks/background.py +77 -0
- autocoder/terminal/tasks/task_event.py +70 -0
- autocoder/terminal/ui/__init__.py +13 -0
- autocoder/terminal/ui/completer.py +268 -0
- autocoder/terminal/ui/keybindings.py +75 -0
- autocoder/terminal/ui/session.py +41 -0
- autocoder/terminal/ui/toolbar.py +64 -0
- autocoder/terminal/utils/__init__.py +13 -0
- autocoder/terminal/utils/errors.py +18 -0
- autocoder/terminal/utils/paths.py +19 -0
- autocoder/terminal/utils/shell.py +43 -0
- autocoder/terminal_v3/__init__.py +10 -0
- autocoder/terminal_v3/app.py +201 -0
- autocoder/terminal_v3/handlers/__init__.py +5 -0
- autocoder/terminal_v3/handlers/command_handler.py +131 -0
- autocoder/terminal_v3/models/__init__.py +6 -0
- autocoder/terminal_v3/models/conversation_buffer.py +214 -0
- autocoder/terminal_v3/models/message.py +50 -0
- autocoder/terminal_v3/models/tool_display.py +247 -0
- autocoder/terminal_v3/ui/__init__.py +7 -0
- autocoder/terminal_v3/ui/keybindings.py +56 -0
- autocoder/terminal_v3/ui/layout.py +141 -0
- autocoder/terminal_v3/ui/styles.py +43 -0
- autocoder/tsproject/__init__.py +23 -23
- autocoder/utils/auto_coder_utils/chat_stream_out.py +1 -1
- autocoder/utils/llms.py +88 -80
- autocoder/utils/math_utils.py +101 -0
- autocoder/utils/model_provider_selector.py +16 -4
- autocoder/utils/operate_config_api.py +33 -5
- autocoder/utils/thread_utils.py +2 -2
- autocoder/version.py +4 -2
- autocoder/workflow_agents/__init__.py +84 -0
- autocoder/workflow_agents/agent.py +143 -0
- autocoder/workflow_agents/exceptions.py +573 -0
- autocoder/workflow_agents/executor.py +489 -0
- autocoder/workflow_agents/loader.py +737 -0
- autocoder/workflow_agents/runner.py +267 -0
- autocoder/workflow_agents/types.py +172 -0
- autocoder/workflow_agents/utils.py +434 -0
- autocoder/workflow_agents/workflow_manager.py +211 -0
- auto_coder-0.1.400.dist-info/METADATA +0 -396
- auto_coder-0.1.400.dist-info/RECORD +0 -425
- auto_coder-0.1.400.dist-info/licenses/LICENSE +0 -201
- autocoder/auto_coder_server.py +0 -672
- autocoder/benchmark.py +0 -138
- autocoder/common/ac_style_command_parser/example.py +0 -7
- autocoder/common/cleaner.py +0 -31
- autocoder/common/command_completer_v2.py +0 -615
- autocoder/common/directory_cache/__init__.py +0 -1
- autocoder/common/directory_cache/cache.py +0 -192
- autocoder/common/directory_cache/test_cache.py +0 -190
- autocoder/common/file_checkpoint/examples.py +0 -217
- autocoder/common/llm_friendly_package_example.py +0 -138
- autocoder/common/llm_friendly_package_test.py +0 -63
- autocoder/common/pull_requests/test_module.py +0 -1
- autocoder/common/rulefiles/autocoderrules_utils.py +0 -484
- autocoder/common/text.py +0 -30
- autocoder/common/v2/agent/agentic_edit_tools/list_package_info_tool_resolver.py +0 -42
- autocoder/common/v2/agent/agentic_edit_tools/test_execute_command_tool_resolver.py +0 -70
- autocoder/common/v2/agent/agentic_edit_tools/test_search_files_tool_resolver.py +0 -163
- autocoder/common/v2/agent/agentic_tool_display.py +0 -183
- autocoder/plugins/dynamic_completion_example.py +0 -148
- autocoder/plugins/sample_plugin.py +0 -160
- autocoder/sdk/cli/__main__.py +0 -26
- autocoder/sdk/cli/completion_wrapper.py +0 -38
- autocoder/sdk/cli/install_completion.py +0 -301
- autocoder/sdk/models/messages.py +0 -209
- autocoder/sdk/session/__init__.py +0 -32
- autocoder/sdk/session/session.py +0 -106
- autocoder/sdk/session/session_manager.py +0 -56
- {auto_coder-0.1.400.dist-info → auto_coder-2.0.0.dist-info}/top_level.txt +0 -0
- /autocoder/{sdk/example.py → common/agent_query_queue/__init__.py} +0 -0
|
@@ -22,6 +22,7 @@ from .exceptions import (
|
|
|
22
22
|
DataIntegrityError
|
|
23
23
|
)
|
|
24
24
|
from .models import Conversation, ConversationMessage
|
|
25
|
+
from .llm_stats_models import LLMCallMetadata
|
|
25
26
|
from .file_locker import FileLocker
|
|
26
27
|
from .storage import FileStorage, IndexManager
|
|
27
28
|
from .cache import CacheManager
|
|
@@ -133,7 +134,8 @@ class PersistConversationManager:
|
|
|
133
134
|
name: str,
|
|
134
135
|
description: Optional[str] = None,
|
|
135
136
|
initial_messages: Optional[List[Dict[str, Any]]] = None,
|
|
136
|
-
metadata: Optional[Dict[str, Any]] = None
|
|
137
|
+
metadata: Optional[Dict[str, Any]] = None,
|
|
138
|
+
conversation_id: Optional[str] = None
|
|
137
139
|
) -> str:
|
|
138
140
|
"""
|
|
139
141
|
Create a new conversation.
|
|
@@ -143,6 +145,7 @@ class PersistConversationManager:
|
|
|
143
145
|
description: Optional description
|
|
144
146
|
initial_messages: Optional list of initial messages
|
|
145
147
|
metadata: Optional metadata dictionary
|
|
148
|
+
conversation_id: Optional conversation ID. If not provided, will be auto-generated
|
|
146
149
|
|
|
147
150
|
Returns:
|
|
148
151
|
ID of the created conversation
|
|
@@ -152,11 +155,23 @@ class PersistConversationManager:
|
|
|
152
155
|
"""
|
|
153
156
|
try:
|
|
154
157
|
# Create conversation object
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
158
|
+
if conversation_id:
|
|
159
|
+
# Check if conversation ID already exists
|
|
160
|
+
if self.storage.conversation_exists(conversation_id):
|
|
161
|
+
raise ConversationManagerError(f"Conversation with ID {conversation_id} already exists")
|
|
162
|
+
|
|
163
|
+
conversation = Conversation(
|
|
164
|
+
name=name,
|
|
165
|
+
description=description,
|
|
166
|
+
metadata=metadata or {},
|
|
167
|
+
conversation_id=conversation_id
|
|
168
|
+
)
|
|
169
|
+
else:
|
|
170
|
+
conversation = Conversation(
|
|
171
|
+
name=name,
|
|
172
|
+
description=description,
|
|
173
|
+
metadata=metadata or {}
|
|
174
|
+
)
|
|
160
175
|
|
|
161
176
|
# Add initial messages if provided
|
|
162
177
|
if initial_messages:
|
|
@@ -258,6 +273,8 @@ class PersistConversationManager:
|
|
|
258
273
|
if description is not None:
|
|
259
274
|
conversation.description = description
|
|
260
275
|
if metadata is not None:
|
|
276
|
+
if conversation.metadata is None:
|
|
277
|
+
conversation.metadata = {}
|
|
261
278
|
conversation.metadata.update(metadata)
|
|
262
279
|
|
|
263
280
|
conversation.updated_at = time.time()
|
|
@@ -358,7 +375,8 @@ class PersistConversationManager:
|
|
|
358
375
|
conversation_id: str,
|
|
359
376
|
role: str,
|
|
360
377
|
content: Union[str, Dict[str, Any], List[Any]],
|
|
361
|
-
metadata: Optional[Dict[str, Any]] = None
|
|
378
|
+
metadata: Optional[Dict[str, Any]] = None,
|
|
379
|
+
llm_metadata: Optional['LLMCallMetadata'] = None
|
|
362
380
|
) -> str:
|
|
363
381
|
"""
|
|
364
382
|
Append a message to a conversation.
|
|
@@ -368,6 +386,7 @@ class PersistConversationManager:
|
|
|
368
386
|
role: Role of the message sender
|
|
369
387
|
content: Message content
|
|
370
388
|
metadata: Optional message metadata
|
|
389
|
+
llm_metadata: Optional LLM call metadata (tokens, cache info, etc.)
|
|
371
390
|
|
|
372
391
|
Returns:
|
|
373
392
|
ID of the added message
|
|
@@ -380,7 +399,8 @@ class PersistConversationManager:
|
|
|
380
399
|
message = ConversationMessage(
|
|
381
400
|
role=role,
|
|
382
401
|
content=content,
|
|
383
|
-
metadata=metadata or {}
|
|
402
|
+
metadata=metadata or {},
|
|
403
|
+
llm_metadata=llm_metadata
|
|
384
404
|
)
|
|
385
405
|
|
|
386
406
|
with self._conversation_lock(conversation_id):
|
|
@@ -424,7 +444,11 @@ class PersistConversationManager:
|
|
|
424
444
|
|
|
425
445
|
Args:
|
|
426
446
|
conversation_id: ID of the conversation
|
|
427
|
-
messages: List of message data dictionaries
|
|
447
|
+
messages: List of message data dictionaries. Each dictionary can contain:
|
|
448
|
+
- role: Message role (required)
|
|
449
|
+
- content: Message content (required)
|
|
450
|
+
- metadata: Message metadata (optional)
|
|
451
|
+
- llm_metadata: LLM call metadata (optional)
|
|
428
452
|
|
|
429
453
|
Returns:
|
|
430
454
|
List of message IDs
|
|
@@ -436,7 +460,8 @@ class PersistConversationManager:
|
|
|
436
460
|
conversation_id,
|
|
437
461
|
msg_data['role'],
|
|
438
462
|
msg_data['content'],
|
|
439
|
-
msg_data.get('metadata')
|
|
463
|
+
msg_data.get('metadata'),
|
|
464
|
+
msg_data.get('llm_metadata')
|
|
440
465
|
)
|
|
441
466
|
message_ids.append(message_id)
|
|
442
467
|
|
|
@@ -526,7 +551,8 @@ class PersistConversationManager:
|
|
|
526
551
|
conversation_id: str,
|
|
527
552
|
message_id: str,
|
|
528
553
|
content: Optional[Union[str, Dict[str, Any], List[Any]]] = None,
|
|
529
|
-
metadata: Optional[Dict[str, Any]] = None
|
|
554
|
+
metadata: Optional[Dict[str, Any]] = None,
|
|
555
|
+
llm_metadata: Optional["LLMCallMetadata"] = None
|
|
530
556
|
) -> bool:
|
|
531
557
|
"""
|
|
532
558
|
Update a message.
|
|
@@ -536,6 +562,7 @@ class PersistConversationManager:
|
|
|
536
562
|
message_id: ID of the message to update
|
|
537
563
|
content: New content (optional)
|
|
538
564
|
metadata: New metadata (optional)
|
|
565
|
+
llm_metadata: LLM call metadata (optional)
|
|
539
566
|
|
|
540
567
|
Returns:
|
|
541
568
|
True if update was successful
|
|
@@ -557,7 +584,11 @@ class PersistConversationManager:
|
|
|
557
584
|
if content is not None:
|
|
558
585
|
msg.content = content
|
|
559
586
|
if metadata is not None:
|
|
587
|
+
if msg.metadata is None:
|
|
588
|
+
msg.metadata = {}
|
|
560
589
|
msg.metadata.update(metadata)
|
|
590
|
+
if llm_metadata is not None:
|
|
591
|
+
msg.llm_metadata = llm_metadata
|
|
561
592
|
|
|
562
593
|
# Update timestamp
|
|
563
594
|
msg.timestamp = time.time()
|
|
@@ -817,6 +848,9 @@ class PersistConversationManager:
|
|
|
817
848
|
'cache_stats': cache_stats,
|
|
818
849
|
'total_conversations': len(self.index_manager.list_conversations()),
|
|
819
850
|
'current_conversation_id': self.get_current_conversation_id(),
|
|
851
|
+
'all_current_conversations': self.get_all_current_conversations(),
|
|
852
|
+
'namespaces': self.list_namespaces(),
|
|
853
|
+
'default_namespace': self.config.default_namespace,
|
|
820
854
|
'storage_path': self.config.storage_path
|
|
821
855
|
}
|
|
822
856
|
|
|
@@ -894,14 +928,13 @@ class PersistConversationManager:
|
|
|
894
928
|
"""Rebuild the conversation index from storage."""
|
|
895
929
|
try:
|
|
896
930
|
# Clear existing index
|
|
897
|
-
self.index_manager.
|
|
931
|
+
self.index_manager._index_data.clear()
|
|
898
932
|
|
|
899
933
|
# Load all conversations from storage and rebuild index
|
|
900
|
-
|
|
934
|
+
conversations = self.storage.list_conversations()
|
|
901
935
|
|
|
902
|
-
for
|
|
903
|
-
conversation_data
|
|
904
|
-
if conversation_data:
|
|
936
|
+
for conversation_data in conversations:
|
|
937
|
+
if conversation_data and conversation_data.get('conversation_id'):
|
|
905
938
|
self.index_manager.add_conversation(conversation_data)
|
|
906
939
|
|
|
907
940
|
except Exception as e:
|
|
@@ -920,12 +953,13 @@ class PersistConversationManager:
|
|
|
920
953
|
|
|
921
954
|
# Current Conversation Management Methods
|
|
922
955
|
|
|
923
|
-
def set_current_conversation(self, conversation_id: str) -> bool:
|
|
956
|
+
def set_current_conversation(self, conversation_id: str, namespace: Optional[str] = None) -> bool:
|
|
924
957
|
"""
|
|
925
958
|
设置当前对话。
|
|
926
959
|
|
|
927
960
|
Args:
|
|
928
961
|
conversation_id: 要设置为当前对话的ID
|
|
962
|
+
namespace: 命名空间,None表示使用默认命名空间
|
|
929
963
|
|
|
930
964
|
Returns:
|
|
931
965
|
True if setting was successful
|
|
@@ -934,13 +968,17 @@ class PersistConversationManager:
|
|
|
934
968
|
ConversationNotFoundError: 如果对话不存在
|
|
935
969
|
"""
|
|
936
970
|
try:
|
|
971
|
+
# 如果没有指定命名空间,使用配置中的默认命名空间
|
|
972
|
+
if namespace is None:
|
|
973
|
+
namespace = self.config.default_namespace
|
|
974
|
+
|
|
937
975
|
# 验证对话是否存在
|
|
938
976
|
conversation_data = self.get_conversation(conversation_id)
|
|
939
977
|
if not conversation_data:
|
|
940
978
|
raise ConversationNotFoundError(conversation_id)
|
|
941
979
|
|
|
942
980
|
# 设置当前对话
|
|
943
|
-
success = self.index_manager.set_current_conversation(conversation_id)
|
|
981
|
+
success = self.index_manager.set_current_conversation(conversation_id, namespace)
|
|
944
982
|
if not success:
|
|
945
983
|
raise ConversationManagerError(f"Failed to set current conversation: {conversation_id}")
|
|
946
984
|
|
|
@@ -951,27 +989,37 @@ class PersistConversationManager:
|
|
|
951
989
|
except Exception as e:
|
|
952
990
|
raise ConversationManagerError(f"Failed to set current conversation {conversation_id}: {e}")
|
|
953
991
|
|
|
954
|
-
def get_current_conversation_id(self) -> Optional[str]:
|
|
992
|
+
def get_current_conversation_id(self, namespace: Optional[str] = None) -> Optional[str]:
|
|
955
993
|
"""
|
|
956
994
|
获取当前对话ID。
|
|
957
995
|
|
|
996
|
+
Args:
|
|
997
|
+
namespace: 命名空间,None表示使用默认命名空间
|
|
998
|
+
|
|
958
999
|
Returns:
|
|
959
1000
|
当前对话ID,如果未设置返回None
|
|
960
1001
|
"""
|
|
961
1002
|
try:
|
|
962
|
-
|
|
1003
|
+
# 如果没有指定命名空间,使用配置中的默认命名空间
|
|
1004
|
+
if namespace is None:
|
|
1005
|
+
namespace = self.config.default_namespace
|
|
1006
|
+
|
|
1007
|
+
return self.index_manager.get_current_conversation_id(namespace)
|
|
963
1008
|
except Exception as e:
|
|
964
1009
|
raise ConversationManagerError(f"Failed to get current conversation ID: {e}")
|
|
965
1010
|
|
|
966
|
-
def get_current_conversation(self) -> Optional[Dict[str, Any]]:
|
|
1011
|
+
def get_current_conversation(self, namespace: Optional[str] = None) -> Optional[Dict[str, Any]]:
|
|
967
1012
|
"""
|
|
968
1013
|
获取当前对话的完整数据。
|
|
969
1014
|
|
|
1015
|
+
Args:
|
|
1016
|
+
namespace: 命名空间,None表示使用默认命名空间
|
|
1017
|
+
|
|
970
1018
|
Returns:
|
|
971
1019
|
当前对话的数据字典,如果未设置或对话不存在返回None
|
|
972
1020
|
"""
|
|
973
1021
|
try:
|
|
974
|
-
current_id = self.get_current_conversation_id()
|
|
1022
|
+
current_id = self.get_current_conversation_id(namespace)
|
|
975
1023
|
if not current_id:
|
|
976
1024
|
return None
|
|
977
1025
|
|
|
@@ -980,15 +1028,22 @@ class PersistConversationManager:
|
|
|
980
1028
|
except Exception as e:
|
|
981
1029
|
raise ConversationManagerError(f"Failed to get current conversation: {e}")
|
|
982
1030
|
|
|
983
|
-
def clear_current_conversation(self) -> bool:
|
|
1031
|
+
def clear_current_conversation(self, namespace: Optional[str] = None) -> bool:
|
|
984
1032
|
"""
|
|
985
1033
|
清除当前对话设置。
|
|
986
1034
|
|
|
1035
|
+
Args:
|
|
1036
|
+
namespace: 命名空间,None表示使用默认命名空间
|
|
1037
|
+
|
|
987
1038
|
Returns:
|
|
988
1039
|
True if clearing was successful
|
|
989
1040
|
"""
|
|
990
1041
|
try:
|
|
991
|
-
|
|
1042
|
+
# 如果没有指定命名空间,使用配置中的默认命名空间
|
|
1043
|
+
if namespace is None:
|
|
1044
|
+
namespace = self.config.default_namespace
|
|
1045
|
+
|
|
1046
|
+
success = self.index_manager.clear_current_conversation(namespace)
|
|
992
1047
|
if not success:
|
|
993
1048
|
raise ConversationManagerError("Failed to clear current conversation")
|
|
994
1049
|
|
|
@@ -1001,7 +1056,9 @@ class PersistConversationManager:
|
|
|
1001
1056
|
self,
|
|
1002
1057
|
role: str,
|
|
1003
1058
|
content: Union[str, Dict[str, Any], List[Any]],
|
|
1004
|
-
metadata: Optional[Dict[str, Any]] = None
|
|
1059
|
+
metadata: Optional[Dict[str, Any]] = None,
|
|
1060
|
+
llm_metadata: Optional[LLMCallMetadata] = None,
|
|
1061
|
+
namespace: Optional[str] = None
|
|
1005
1062
|
) -> str:
|
|
1006
1063
|
"""
|
|
1007
1064
|
向当前对话添加消息。
|
|
@@ -1010,6 +1067,8 @@ class PersistConversationManager:
|
|
|
1010
1067
|
role: 消息角色
|
|
1011
1068
|
content: 消息内容
|
|
1012
1069
|
metadata: 可选的消息元数据
|
|
1070
|
+
llm_metadata: 可选的 LLM 调用元数据
|
|
1071
|
+
namespace: 命名空间,None表示使用默认命名空间
|
|
1013
1072
|
|
|
1014
1073
|
Returns:
|
|
1015
1074
|
消息ID
|
|
@@ -1018,11 +1077,36 @@ class PersistConversationManager:
|
|
|
1018
1077
|
ConversationManagerError: 如果没有设置当前对话或添加失败
|
|
1019
1078
|
"""
|
|
1020
1079
|
try:
|
|
1021
|
-
current_id = self.get_current_conversation_id()
|
|
1080
|
+
current_id = self.get_current_conversation_id(namespace)
|
|
1022
1081
|
if not current_id:
|
|
1023
|
-
|
|
1082
|
+
ns_desc = f"namespace '{namespace}'" if namespace else "default namespace"
|
|
1083
|
+
raise ConversationManagerError(f"No current conversation set for {ns_desc}")
|
|
1024
1084
|
|
|
1025
|
-
return self.append_message(current_id, role, content, metadata)
|
|
1085
|
+
return self.append_message(current_id, role, content, metadata, llm_metadata)
|
|
1026
1086
|
|
|
1027
1087
|
except Exception as e:
|
|
1028
1088
|
raise ConversationManagerError(f"Failed to append message to current conversation: {e}")
|
|
1089
|
+
|
|
1090
|
+
def list_namespaces(self) -> List[Optional[str]]:
|
|
1091
|
+
"""
|
|
1092
|
+
列出所有已使用的命名空间。
|
|
1093
|
+
|
|
1094
|
+
Returns:
|
|
1095
|
+
命名空间列表,None 表示默认命名空间
|
|
1096
|
+
"""
|
|
1097
|
+
try:
|
|
1098
|
+
return self.index_manager.list_namespaces()
|
|
1099
|
+
except Exception as e:
|
|
1100
|
+
raise ConversationManagerError(f"Failed to list namespaces: {e}")
|
|
1101
|
+
|
|
1102
|
+
def get_all_current_conversations(self) -> Dict[Optional[str], str]:
|
|
1103
|
+
"""
|
|
1104
|
+
获取所有命名空间的当前对话ID。
|
|
1105
|
+
|
|
1106
|
+
Returns:
|
|
1107
|
+
命名空间到对话ID的映射
|
|
1108
|
+
"""
|
|
1109
|
+
try:
|
|
1110
|
+
return self.index_manager.get_all_current_conversations()
|
|
1111
|
+
except Exception as e:
|
|
1112
|
+
raise ConversationManagerError(f"Failed to get all current conversations: {e}")
|
|
@@ -6,6 +6,7 @@ import time
|
|
|
6
6
|
import uuid
|
|
7
7
|
from typing import Union, Dict, List, Optional, Any
|
|
8
8
|
from dataclasses import dataclass, field
|
|
9
|
+
from .llm_stats_models import LLMCallMetadata
|
|
9
10
|
|
|
10
11
|
|
|
11
12
|
@dataclass
|
|
@@ -17,6 +18,7 @@ class ConversationMessage:
|
|
|
17
18
|
timestamp: float = field(default_factory=time.time)
|
|
18
19
|
message_id: str = field(default_factory=lambda: str(uuid.uuid4()))
|
|
19
20
|
metadata: Optional[dict] = None
|
|
21
|
+
llm_metadata: Optional[LLMCallMetadata] = None
|
|
20
22
|
|
|
21
23
|
def __post_init__(self):
|
|
22
24
|
"""数据验证"""
|
|
@@ -43,23 +45,35 @@ class ConversationMessage:
|
|
|
43
45
|
|
|
44
46
|
def to_dict(self) -> dict:
|
|
45
47
|
"""序列化为字典"""
|
|
46
|
-
|
|
48
|
+
result = {
|
|
47
49
|
"role": self.role,
|
|
48
50
|
"content": self.content,
|
|
49
51
|
"timestamp": self.timestamp,
|
|
50
52
|
"message_id": self.message_id,
|
|
51
53
|
"metadata": self.metadata
|
|
52
54
|
}
|
|
55
|
+
|
|
56
|
+
# 序列化 LLM 元数据
|
|
57
|
+
if self.llm_metadata is not None:
|
|
58
|
+
result["llm_metadata"] = self.llm_metadata.to_dict()
|
|
59
|
+
|
|
60
|
+
return result
|
|
53
61
|
|
|
54
62
|
@classmethod
|
|
55
63
|
def from_dict(cls, data: dict) -> "ConversationMessage":
|
|
56
64
|
"""从字典反序列化"""
|
|
65
|
+
# 处理 LLM 元数据
|
|
66
|
+
llm_metadata = None
|
|
67
|
+
if "llm_metadata" in data and data["llm_metadata"] is not None:
|
|
68
|
+
llm_metadata = LLMCallMetadata.from_dict(data["llm_metadata"])
|
|
69
|
+
|
|
57
70
|
return cls(
|
|
58
71
|
role=data["role"],
|
|
59
72
|
content=data["content"],
|
|
60
73
|
timestamp=data["timestamp"],
|
|
61
74
|
message_id=data["message_id"],
|
|
62
|
-
metadata=data.get("metadata")
|
|
75
|
+
metadata=data.get("metadata"),
|
|
76
|
+
llm_metadata=llm_metadata
|
|
63
77
|
)
|
|
64
78
|
|
|
65
79
|
|
|
@@ -10,8 +10,8 @@ import time
|
|
|
10
10
|
from typing import Optional, List, Dict, Any
|
|
11
11
|
from pathlib import Path
|
|
12
12
|
|
|
13
|
-
from
|
|
14
|
-
from
|
|
13
|
+
from typing import Optional, List, Dict, Any
|
|
14
|
+
from pathlib import Path
|
|
15
15
|
|
|
16
16
|
|
|
17
17
|
class IndexManager:
|
|
@@ -60,6 +60,25 @@ class IndexManager:
|
|
|
60
60
|
except (json.JSONDecodeError, OSError, IOError):
|
|
61
61
|
# 如果配置损坏,重建空配置
|
|
62
62
|
self._config_data = {}
|
|
63
|
+
|
|
64
|
+
# 规范化配置:避免在 JSON 中使用 None 作为键(会被序列化为字符串 "null")
|
|
65
|
+
# 将默认命名空间的当前对话仅存储在 legacy 字段 current_conversation_id 中
|
|
66
|
+
namespaced = self._config_data.get('namespaced_current_conversations')
|
|
67
|
+
if isinstance(namespaced, dict):
|
|
68
|
+
# 将可能存在的 "null" 或 None 键迁移到 current_conversation_id,并从映射中移除
|
|
69
|
+
migrated_default = False
|
|
70
|
+
default_keys = []
|
|
71
|
+
for key in list(namespaced.keys()):
|
|
72
|
+
if key is None or key == "null":
|
|
73
|
+
if not migrated_default and namespaced.get(key) is not None:
|
|
74
|
+
# 仅在未设置 legacy 字段时迁移
|
|
75
|
+
if self._config_data.get('current_conversation_id') is None:
|
|
76
|
+
self._config_data['current_conversation_id'] = namespaced.get(key)
|
|
77
|
+
default_keys.append(key)
|
|
78
|
+
for k in default_keys:
|
|
79
|
+
del namespaced[k]
|
|
80
|
+
if default_keys:
|
|
81
|
+
self._config_data['namespaced_current_conversations'] = namespaced
|
|
63
82
|
|
|
64
83
|
def _save_index(self) -> bool:
|
|
65
84
|
"""
|
|
@@ -103,12 +122,13 @@ class IndexManager:
|
|
|
103
122
|
except (OSError, IOError):
|
|
104
123
|
return False
|
|
105
124
|
|
|
106
|
-
def set_current_conversation(self, conversation_id: Optional[str]) -> bool:
|
|
125
|
+
def set_current_conversation(self, conversation_id: Optional[str], namespace: Optional[str] = None) -> bool:
|
|
107
126
|
"""
|
|
108
127
|
设置当前对话ID
|
|
109
128
|
|
|
110
129
|
Args:
|
|
111
130
|
conversation_id: 对话ID,None表示清除当前对话
|
|
131
|
+
namespace: 命名空间,None表示默认命名空间
|
|
112
132
|
|
|
113
133
|
Returns:
|
|
114
134
|
bool: 设置成功返回True
|
|
@@ -117,11 +137,39 @@ class IndexManager:
|
|
|
117
137
|
# 重新加载配置以获取最新数据
|
|
118
138
|
self._load_config()
|
|
119
139
|
|
|
140
|
+
# 确保 namespaced_current_conversations 字段存在
|
|
141
|
+
if 'namespaced_current_conversations' not in self._config_data:
|
|
142
|
+
self._config_data['namespaced_current_conversations'] = {}
|
|
143
|
+
namespaced = self._config_data['namespaced_current_conversations']
|
|
144
|
+
|
|
120
145
|
# 设置或清除当前对话ID
|
|
121
146
|
if conversation_id is None:
|
|
122
|
-
|
|
147
|
+
# 清除
|
|
148
|
+
if namespace is None:
|
|
149
|
+
# 默认命名空间:仅使用向后兼容字段
|
|
150
|
+
self._config_data.pop('current_conversation_id', None)
|
|
151
|
+
# 兼容历史:移除可能存在的 None/"null" 键
|
|
152
|
+
if None in namespaced:
|
|
153
|
+
del namespaced[None]
|
|
154
|
+
if 'null' in namespaced:
|
|
155
|
+
del namespaced['null']
|
|
156
|
+
else:
|
|
157
|
+
# 指定命名空间
|
|
158
|
+
if namespace in namespaced:
|
|
159
|
+
del namespaced[namespace]
|
|
123
160
|
else:
|
|
124
|
-
|
|
161
|
+
# 设置
|
|
162
|
+
if namespace is None:
|
|
163
|
+
# 默认命名空间:仅设置 legacy 字段,避免在 JSON 中出现 "null" 键
|
|
164
|
+
self._config_data['current_conversation_id'] = conversation_id
|
|
165
|
+
# 兼容清理:移除可能存在的 None/"null" 键
|
|
166
|
+
if None in namespaced:
|
|
167
|
+
del namespaced[None]
|
|
168
|
+
if 'null' in namespaced:
|
|
169
|
+
del namespaced['null']
|
|
170
|
+
else:
|
|
171
|
+
# 指定命名空间
|
|
172
|
+
namespaced[namespace] = conversation_id
|
|
125
173
|
|
|
126
174
|
# 更新时间戳
|
|
127
175
|
self._config_data['last_updated'] = time.time()
|
|
@@ -132,10 +180,13 @@ class IndexManager:
|
|
|
132
180
|
except Exception:
|
|
133
181
|
return False
|
|
134
182
|
|
|
135
|
-
def get_current_conversation_id(self) -> Optional[str]:
|
|
183
|
+
def get_current_conversation_id(self, namespace: Optional[str] = None) -> Optional[str]:
|
|
136
184
|
"""
|
|
137
185
|
获取当前对话ID
|
|
138
186
|
|
|
187
|
+
Args:
|
|
188
|
+
namespace: 命名空间,None表示默认命名空间
|
|
189
|
+
|
|
139
190
|
Returns:
|
|
140
191
|
Optional[str]: 当前对话ID,未设置返回None
|
|
141
192
|
"""
|
|
@@ -143,19 +194,30 @@ class IndexManager:
|
|
|
143
194
|
# 重新加载配置以获取最新数据
|
|
144
195
|
self._load_config()
|
|
145
196
|
|
|
146
|
-
|
|
197
|
+
# 默认命名空间:使用向后兼容字段
|
|
198
|
+
if namespace is None:
|
|
199
|
+
return self._config_data.get('current_conversation_id')
|
|
200
|
+
|
|
201
|
+
# 指定命名空间:从 namespaced_current_conversations 中获取
|
|
202
|
+
namespaced_conversations = self._config_data.get('namespaced_current_conversations', {})
|
|
203
|
+
return namespaced_conversations.get(namespace)
|
|
204
|
+
|
|
205
|
+
return None
|
|
147
206
|
|
|
148
207
|
except Exception:
|
|
149
208
|
return None
|
|
150
209
|
|
|
151
|
-
def clear_current_conversation(self) -> bool:
|
|
210
|
+
def clear_current_conversation(self, namespace: Optional[str] = None) -> bool:
|
|
152
211
|
"""
|
|
153
212
|
清除当前对话设置
|
|
154
213
|
|
|
214
|
+
Args:
|
|
215
|
+
namespace: 命名空间,None表示默认命名空间
|
|
216
|
+
|
|
155
217
|
Returns:
|
|
156
218
|
bool: 清除成功返回True
|
|
157
219
|
"""
|
|
158
|
-
return self.set_current_conversation(None)
|
|
220
|
+
return self.set_current_conversation(None, namespace)
|
|
159
221
|
|
|
160
222
|
def add_conversation(self, conversation_metadata: Dict[str, Any]) -> bool:
|
|
161
223
|
"""
|
|
@@ -403,4 +465,66 @@ class IndexManager:
|
|
|
403
465
|
return results
|
|
404
466
|
|
|
405
467
|
except Exception:
|
|
406
|
-
return []
|
|
468
|
+
return []
|
|
469
|
+
|
|
470
|
+
def list_namespaces(self) -> List[Optional[str]]:
|
|
471
|
+
"""
|
|
472
|
+
列出所有已使用的命名空间
|
|
473
|
+
|
|
474
|
+
Returns:
|
|
475
|
+
List[Optional[str]]: 命名空间列表,None 表示默认命名空间
|
|
476
|
+
"""
|
|
477
|
+
try:
|
|
478
|
+
# 重新加载配置以获取最新数据
|
|
479
|
+
self._load_config()
|
|
480
|
+
|
|
481
|
+
namespaces: List[Optional[str]] = []
|
|
482
|
+
namespaced_conversations = self._config_data.get('namespaced_current_conversations', {})
|
|
483
|
+
|
|
484
|
+
# 添加所有已配置的命名空间
|
|
485
|
+
for namespace in namespaced_conversations.keys():
|
|
486
|
+
# 忽略历史遗留的 None/"null" 键
|
|
487
|
+
if namespace is None or namespace == 'null':
|
|
488
|
+
continue
|
|
489
|
+
namespaces.append(namespace)
|
|
490
|
+
|
|
491
|
+
# 如果存在旧的 current_conversation_id,添加默认命名空间
|
|
492
|
+
if (self._config_data.get('current_conversation_id') is not None and
|
|
493
|
+
None not in namespaces):
|
|
494
|
+
namespaces.append(None)
|
|
495
|
+
|
|
496
|
+
return namespaces
|
|
497
|
+
|
|
498
|
+
except Exception:
|
|
499
|
+
return []
|
|
500
|
+
|
|
501
|
+
def get_all_current_conversations(self) -> Dict[Optional[str], str]:
|
|
502
|
+
"""
|
|
503
|
+
获取所有命名空间的当前对话ID
|
|
504
|
+
|
|
505
|
+
Returns:
|
|
506
|
+
Dict[Optional[str], str]: 命名空间到对话ID的映射
|
|
507
|
+
"""
|
|
508
|
+
try:
|
|
509
|
+
# 重新加载配置以获取最新数据
|
|
510
|
+
self._load_config()
|
|
511
|
+
|
|
512
|
+
result: Dict[Optional[str], str] = {}
|
|
513
|
+
namespaced_conversations = self._config_data.get('namespaced_current_conversations', {})
|
|
514
|
+
|
|
515
|
+
# 添加所有已配置的命名空间对话
|
|
516
|
+
for namespace, conversation_id in namespaced_conversations.items():
|
|
517
|
+
# 忽略历史遗留的 None/"null" 键
|
|
518
|
+
if namespace is None or namespace == 'null':
|
|
519
|
+
continue
|
|
520
|
+
if conversation_id is not None:
|
|
521
|
+
result[namespace] = conversation_id
|
|
522
|
+
|
|
523
|
+
# 默认命名空间(向后兼容字段)
|
|
524
|
+
if self._config_data.get('current_conversation_id') is not None:
|
|
525
|
+
result[None] = self._config_data['current_conversation_id']
|
|
526
|
+
|
|
527
|
+
return result
|
|
528
|
+
|
|
529
|
+
except Exception:
|
|
530
|
+
return {}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Core Config Module
|
|
3
|
+
|
|
4
|
+
Provides centralized configuration and memory management for auto-coder.
|
|
5
|
+
|
|
6
|
+
This module has been refactored into multiple specialized modules for better
|
|
7
|
+
maintainability and separation of concerns:
|
|
8
|
+
|
|
9
|
+
- models.py: Core data structures
|
|
10
|
+
- base_manager.py: Base persistence functionality
|
|
11
|
+
- config_manager.py: Configuration management
|
|
12
|
+
- file_manager.py: File and file group management
|
|
13
|
+
- exclude_manager.py: Exclude patterns management
|
|
14
|
+
- lib_manager.py: Library management
|
|
15
|
+
- conversation_manager.py: Conversation management
|
|
16
|
+
- mode_manager.py: Mode management functionality
|
|
17
|
+
- human_as_model_manager.py: Human as model configuration management
|
|
18
|
+
- main_manager.py: Combined MemoryManager class
|
|
19
|
+
- compatibility.py: Backward compatibility functions
|
|
20
|
+
"""
|
|
21
|
+
|
|
22
|
+
# Import core classes and functions
|
|
23
|
+
from .models import CoreMemory
|
|
24
|
+
from .main_manager import MemoryManager, get_memory_manager
|
|
25
|
+
from .compatibility import (
|
|
26
|
+
save_memory,
|
|
27
|
+
save_memory_with_new_memory,
|
|
28
|
+
load_memory,
|
|
29
|
+
get_memory,
|
|
30
|
+
get_mode,
|
|
31
|
+
set_mode,
|
|
32
|
+
cycle_mode,
|
|
33
|
+
get_human_as_model,
|
|
34
|
+
set_human_as_model,
|
|
35
|
+
toggle_human_as_model,
|
|
36
|
+
get_human_as_model_string,
|
|
37
|
+
get_agentic_mode,
|
|
38
|
+
set_agentic_mode,
|
|
39
|
+
toggle_agentic_mode,
|
|
40
|
+
get_agentic_mode_string,
|
|
41
|
+
)
|
|
42
|
+
|
|
43
|
+
# Export all public interfaces
|
|
44
|
+
__all__ = [
|
|
45
|
+
'MemoryManager',
|
|
46
|
+
'CoreMemory',
|
|
47
|
+
'get_memory_manager',
|
|
48
|
+
'save_memory',
|
|
49
|
+
'save_memory_with_new_memory',
|
|
50
|
+
'load_memory',
|
|
51
|
+
'get_memory',
|
|
52
|
+
'get_mode',
|
|
53
|
+
'set_mode',
|
|
54
|
+
'cycle_mode',
|
|
55
|
+
'get_human_as_model',
|
|
56
|
+
'set_human_as_model',
|
|
57
|
+
'toggle_human_as_model',
|
|
58
|
+
'get_human_as_model_string',
|
|
59
|
+
'get_agentic_mode',
|
|
60
|
+
'set_agentic_mode',
|
|
61
|
+
'toggle_agentic_mode',
|
|
62
|
+
'get_agentic_mode_string',
|
|
63
|
+
]
|