auto-coder 1.0.0__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-1.0.0.dist-info → auto_coder-2.0.0.dist-info}/WHEEL +1 -1
- {auto_coder-1.0.0.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 +24 -3
- 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 +970 -2345
- 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 +988 -398
- autocoder/chat_auto_coder_lang.py +23 -732
- autocoder/commands/auto_command.py +25 -8
- 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/git_utils.py +44 -8
- 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 +651 -102
- 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/pruner/conversation_pruner.py +26 -6
- autocoder/common/pruner/test_agentic_conversation_pruner.py +554 -112
- 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/counter.py +24 -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 +2699 -1856
- autocoder/common/v2/agent/agentic_edit_change_manager.py +474 -0
- autocoder/common/v2/agent/agentic_edit_tools/__init__.py +35 -1
- autocoder/common/v2/agent/agentic_edit_tools/ac_mod_list_tool_resolver.py +279 -0
- autocoder/common/v2/agent/agentic_edit_tools/ac_mod_write_tool_resolver.py +10 -1
- 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 +564 -29
- 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 +243 -50
- 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 +410 -86
- 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 +207 -192
- autocoder/common/v2/agent/agentic_edit_tools/todo_read_tool_resolver.py +80 -63
- autocoder/common/v2/agent/agentic_edit_tools/todo_write_tool_resolver.py +237 -233
- 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 +343 -9
- autocoder/common/v2/agent/runner/__init__.py +3 -3
- autocoder/common/v2/agent/runner/base_runner.py +12 -26
- autocoder/common/v2/agent/runner/{event_runner.py → file_based_event_runner.py} +3 -2
- autocoder/common/v2/agent/runner/sdk_runner.py +150 -8
- autocoder/common/v2/agent/runner/terminal_runner.py +170 -57
- autocoder/common/v2/agent/runner/tool_display.py +557 -159
- 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 +116 -124
- autocoder/{agent → index/filter}/agentic_filter.py +322 -333
- 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 +65 -46
- 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/sdk/__init__.py +46 -190
- 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 +154 -171
- autocoder/sdk/cli/options.py +95 -22
- autocoder/sdk/constants.py +139 -51
- autocoder/sdk/core/auto_coder_core.py +484 -109
- autocoder/sdk/core/bridge.py +297 -115
- 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-1.0.0.dist-info/METADATA +0 -396
- auto_coder-1.0.0.dist-info/RECORD +0 -442
- auto_coder-1.0.0.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/context_pruner.py +0 -477
- autocoder/common/conversation_pruner.py +0 -132
- 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-1.0.0.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
|
@@ -0,0 +1,537 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Main todo manager that integrates with conversations.
|
|
3
|
+
|
|
4
|
+
This module provides the TodoManager class, which serves as
|
|
5
|
+
the primary interface for todo and task management, integrating
|
|
6
|
+
with the conversations module to get current conversation context.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
import time
|
|
10
|
+
from typing import List, Dict, Any, Optional, Union
|
|
11
|
+
from pathlib import Path
|
|
12
|
+
from loguru import logger
|
|
13
|
+
|
|
14
|
+
from .config import TodoManagerConfig
|
|
15
|
+
from .exceptions import (
|
|
16
|
+
TodoManagerError,
|
|
17
|
+
TodoNotFoundError,
|
|
18
|
+
TodoListNotFoundError
|
|
19
|
+
)
|
|
20
|
+
from .models import Todo, TodoList
|
|
21
|
+
from .storage import FileStorage
|
|
22
|
+
from .cache import CacheManager
|
|
23
|
+
|
|
24
|
+
# Import conversations module to get current conversation
|
|
25
|
+
try:
|
|
26
|
+
from autocoder.common.conversations.get_conversation_manager import get_conversation_manager
|
|
27
|
+
except ImportError:
|
|
28
|
+
logger.warning("Conversations module not available, todo manager will work without conversation integration")
|
|
29
|
+
get_conversation_manager = None
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
class TodoManager:
|
|
33
|
+
"""
|
|
34
|
+
Main todo manager integrating with conversations.
|
|
35
|
+
|
|
36
|
+
This class provides a unified interface for todo and task management,
|
|
37
|
+
with integrated storage, caching, and conversation context.
|
|
38
|
+
"""
|
|
39
|
+
|
|
40
|
+
def __init__(self, config: Optional[TodoManagerConfig] = None):
|
|
41
|
+
"""
|
|
42
|
+
Initialize the todo manager.
|
|
43
|
+
|
|
44
|
+
Args:
|
|
45
|
+
config: Configuration object for the manager
|
|
46
|
+
"""
|
|
47
|
+
self.config = config or TodoManagerConfig()
|
|
48
|
+
|
|
49
|
+
# Initialize components
|
|
50
|
+
self._init_storage()
|
|
51
|
+
self._init_cache()
|
|
52
|
+
|
|
53
|
+
# Statistics tracking
|
|
54
|
+
self._stats = {
|
|
55
|
+
'todo_lists_created': 0,
|
|
56
|
+
'todo_lists_loaded': 0,
|
|
57
|
+
'todos_added': 0,
|
|
58
|
+
'cache_hits': 0,
|
|
59
|
+
'cache_misses': 0
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
def _init_storage(self):
|
|
63
|
+
"""Initialize storage components."""
|
|
64
|
+
# Ensure storage directory exists
|
|
65
|
+
storage_path = Path(self.config.storage_path)
|
|
66
|
+
storage_path.mkdir(parents=True, exist_ok=True)
|
|
67
|
+
|
|
68
|
+
# Initialize storage backend
|
|
69
|
+
self.storage = FileStorage(str(storage_path))
|
|
70
|
+
|
|
71
|
+
def _init_cache(self):
|
|
72
|
+
"""Initialize cache system."""
|
|
73
|
+
from .cache import MemoryCache
|
|
74
|
+
|
|
75
|
+
# Initialize cache manager
|
|
76
|
+
todo_cache = MemoryCache(
|
|
77
|
+
max_size=self.config.max_cache_size,
|
|
78
|
+
default_ttl=self.config.cache_ttl
|
|
79
|
+
)
|
|
80
|
+
self.cache_manager = CacheManager(todo_cache=todo_cache)
|
|
81
|
+
|
|
82
|
+
def _get_current_conversation_id(self) -> Optional[str]:
|
|
83
|
+
"""
|
|
84
|
+
Get current conversation ID from conversation manager.
|
|
85
|
+
|
|
86
|
+
Returns:
|
|
87
|
+
Current conversation ID or None if not available
|
|
88
|
+
"""
|
|
89
|
+
if get_conversation_manager is None:
|
|
90
|
+
logger.debug("Conversation manager not available")
|
|
91
|
+
return None
|
|
92
|
+
|
|
93
|
+
try:
|
|
94
|
+
conversation_manager = get_conversation_manager()
|
|
95
|
+
current_id = conversation_manager.get_current_conversation_id()
|
|
96
|
+
logger.debug(f"Current conversation ID: {current_id}")
|
|
97
|
+
return current_id
|
|
98
|
+
except Exception as e:
|
|
99
|
+
logger.error(f"Failed to get current conversation ID: {e}")
|
|
100
|
+
return None
|
|
101
|
+
|
|
102
|
+
def _get_or_create_todo_list(self, conversation_id: str) -> TodoList:
|
|
103
|
+
"""
|
|
104
|
+
Get or create a todo list for a conversation.
|
|
105
|
+
|
|
106
|
+
Args:
|
|
107
|
+
conversation_id: The conversation ID
|
|
108
|
+
|
|
109
|
+
Returns:
|
|
110
|
+
TodoList object
|
|
111
|
+
"""
|
|
112
|
+
# Try cache first
|
|
113
|
+
cached_data = self.cache_manager.get_todo_list(conversation_id)
|
|
114
|
+
if cached_data:
|
|
115
|
+
self._stats['cache_hits'] += 1
|
|
116
|
+
return TodoList.from_dict(cached_data)
|
|
117
|
+
|
|
118
|
+
self._stats['cache_misses'] += 1
|
|
119
|
+
|
|
120
|
+
# Try storage
|
|
121
|
+
stored_data = self.storage.load_todo_list(conversation_id)
|
|
122
|
+
if stored_data:
|
|
123
|
+
todo_list = TodoList.from_dict(stored_data)
|
|
124
|
+
# Cache it
|
|
125
|
+
self.cache_manager.cache_todo_list(stored_data)
|
|
126
|
+
self._stats['todo_lists_loaded'] += 1
|
|
127
|
+
return todo_list
|
|
128
|
+
|
|
129
|
+
# Create new todo list
|
|
130
|
+
todo_list = TodoList(conversation_id=conversation_id)
|
|
131
|
+
self._stats['todo_lists_created'] += 1
|
|
132
|
+
return todo_list
|
|
133
|
+
|
|
134
|
+
def _save_todo_list(self, todo_list: TodoList) -> bool:
|
|
135
|
+
"""
|
|
136
|
+
Save a todo list to storage and cache.
|
|
137
|
+
|
|
138
|
+
Args:
|
|
139
|
+
todo_list: TodoList to save
|
|
140
|
+
|
|
141
|
+
Returns:
|
|
142
|
+
True if save was successful
|
|
143
|
+
"""
|
|
144
|
+
try:
|
|
145
|
+
# Convert to dict
|
|
146
|
+
todo_list_data = todo_list.to_dict()
|
|
147
|
+
|
|
148
|
+
# Save to storage
|
|
149
|
+
if not self.storage.save_todo_list(todo_list.conversation_id, todo_list_data):
|
|
150
|
+
return False
|
|
151
|
+
|
|
152
|
+
# Update cache
|
|
153
|
+
self.cache_manager.cache_todo_list(todo_list_data)
|
|
154
|
+
|
|
155
|
+
return True
|
|
156
|
+
|
|
157
|
+
except Exception as e:
|
|
158
|
+
logger.error(f"Failed to save todo list for conversation {todo_list.conversation_id}: {e}")
|
|
159
|
+
return False
|
|
160
|
+
|
|
161
|
+
# Todo Management Methods
|
|
162
|
+
|
|
163
|
+
def create_todos(
|
|
164
|
+
self,
|
|
165
|
+
content: str,
|
|
166
|
+
conversation_id: Optional[str] = None,
|
|
167
|
+
priority: str = "medium",
|
|
168
|
+
notes: Optional[str] = None
|
|
169
|
+
) -> List[str]:
|
|
170
|
+
"""
|
|
171
|
+
Create multiple todos from content.
|
|
172
|
+
|
|
173
|
+
Args:
|
|
174
|
+
content: Content to parse into todos
|
|
175
|
+
conversation_id: Conversation ID (uses current if None)
|
|
176
|
+
priority: Priority level
|
|
177
|
+
notes: Optional notes
|
|
178
|
+
|
|
179
|
+
Returns:
|
|
180
|
+
List of created todo IDs
|
|
181
|
+
|
|
182
|
+
Raises:
|
|
183
|
+
TodoManagerError: If creation fails
|
|
184
|
+
"""
|
|
185
|
+
try:
|
|
186
|
+
# Get conversation ID
|
|
187
|
+
if conversation_id is None:
|
|
188
|
+
conversation_id = self._get_current_conversation_id()
|
|
189
|
+
if conversation_id is None:
|
|
190
|
+
raise TodoManagerError("No current conversation available and no conversation_id provided")
|
|
191
|
+
|
|
192
|
+
# Parse content into todos
|
|
193
|
+
todo_contents = self._parse_content_to_todos(content)
|
|
194
|
+
|
|
195
|
+
if not todo_contents:
|
|
196
|
+
raise TodoManagerError("No valid todos found in content")
|
|
197
|
+
|
|
198
|
+
# Get or create todo list
|
|
199
|
+
todo_list = self._get_or_create_todo_list(conversation_id)
|
|
200
|
+
|
|
201
|
+
# Create todos
|
|
202
|
+
created_ids = []
|
|
203
|
+
for todo_content in todo_contents:
|
|
204
|
+
todo = Todo(
|
|
205
|
+
content=todo_content,
|
|
206
|
+
priority=priority,
|
|
207
|
+
notes=notes
|
|
208
|
+
)
|
|
209
|
+
todo_list.add_todo(todo)
|
|
210
|
+
created_ids.append(todo.todo_id)
|
|
211
|
+
self._stats['todos_added'] += 1
|
|
212
|
+
|
|
213
|
+
# Save todo list
|
|
214
|
+
if not self._save_todo_list(todo_list):
|
|
215
|
+
raise TodoManagerError("Failed to save todo list")
|
|
216
|
+
|
|
217
|
+
logger.info(f"Created {len(created_ids)} todos for conversation {conversation_id}")
|
|
218
|
+
return created_ids
|
|
219
|
+
|
|
220
|
+
except TodoManagerError:
|
|
221
|
+
raise
|
|
222
|
+
except Exception as e:
|
|
223
|
+
raise TodoManagerError(f"Failed to create todos: {e}")
|
|
224
|
+
|
|
225
|
+
def add_todo(
|
|
226
|
+
self,
|
|
227
|
+
content: str,
|
|
228
|
+
conversation_id: Optional[str] = None,
|
|
229
|
+
status: str = "pending",
|
|
230
|
+
priority: str = "medium",
|
|
231
|
+
notes: Optional[str] = None
|
|
232
|
+
) -> str:
|
|
233
|
+
"""
|
|
234
|
+
Add a single todo.
|
|
235
|
+
|
|
236
|
+
Args:
|
|
237
|
+
content: Todo content
|
|
238
|
+
conversation_id: Conversation ID (uses current if None)
|
|
239
|
+
status: Todo status
|
|
240
|
+
priority: Priority level
|
|
241
|
+
notes: Optional notes
|
|
242
|
+
|
|
243
|
+
Returns:
|
|
244
|
+
Created todo ID
|
|
245
|
+
|
|
246
|
+
Raises:
|
|
247
|
+
TodoManagerError: If creation fails
|
|
248
|
+
"""
|
|
249
|
+
try:
|
|
250
|
+
# Get conversation ID
|
|
251
|
+
if conversation_id is None:
|
|
252
|
+
conversation_id = self._get_current_conversation_id()
|
|
253
|
+
if conversation_id is None:
|
|
254
|
+
raise TodoManagerError("No current conversation available and no conversation_id provided")
|
|
255
|
+
|
|
256
|
+
# Get or create todo list
|
|
257
|
+
todo_list = self._get_or_create_todo_list(conversation_id)
|
|
258
|
+
|
|
259
|
+
# Create todo
|
|
260
|
+
todo = Todo(
|
|
261
|
+
content=content,
|
|
262
|
+
status=status,
|
|
263
|
+
priority=priority,
|
|
264
|
+
notes=notes
|
|
265
|
+
)
|
|
266
|
+
todo_list.add_todo(todo)
|
|
267
|
+
self._stats['todos_added'] += 1
|
|
268
|
+
|
|
269
|
+
# Save todo list
|
|
270
|
+
if not self._save_todo_list(todo_list):
|
|
271
|
+
raise TodoManagerError("Failed to save todo list")
|
|
272
|
+
|
|
273
|
+
logger.info(f"Added todo {todo.todo_id} to conversation {conversation_id}")
|
|
274
|
+
return todo.todo_id
|
|
275
|
+
|
|
276
|
+
except TodoManagerError:
|
|
277
|
+
raise
|
|
278
|
+
except Exception as e:
|
|
279
|
+
raise TodoManagerError(f"Failed to add todo: {e}")
|
|
280
|
+
|
|
281
|
+
def get_todos(
|
|
282
|
+
self,
|
|
283
|
+
conversation_id: Optional[str] = None,
|
|
284
|
+
status: Optional[str] = None,
|
|
285
|
+
priority: Optional[str] = None
|
|
286
|
+
) -> List[Dict[str, Any]]:
|
|
287
|
+
"""
|
|
288
|
+
Get todos for a conversation.
|
|
289
|
+
|
|
290
|
+
Args:
|
|
291
|
+
conversation_id: Conversation ID (uses current if None)
|
|
292
|
+
status: Filter by status
|
|
293
|
+
priority: Filter by priority
|
|
294
|
+
|
|
295
|
+
Returns:
|
|
296
|
+
List of todo data
|
|
297
|
+
|
|
298
|
+
Raises:
|
|
299
|
+
TodoListNotFoundError: If todo list doesn't exist
|
|
300
|
+
"""
|
|
301
|
+
try:
|
|
302
|
+
# Get conversation ID
|
|
303
|
+
if conversation_id is None:
|
|
304
|
+
conversation_id = self._get_current_conversation_id()
|
|
305
|
+
if conversation_id is None:
|
|
306
|
+
raise TodoManagerError("No current conversation available and no conversation_id provided")
|
|
307
|
+
|
|
308
|
+
# Check if todo list exists
|
|
309
|
+
if not self.storage.todo_list_exists(conversation_id):
|
|
310
|
+
return [] # Return empty list instead of raising error
|
|
311
|
+
|
|
312
|
+
# Get todo list
|
|
313
|
+
todo_list = self._get_or_create_todo_list(conversation_id)
|
|
314
|
+
|
|
315
|
+
# Get all todos
|
|
316
|
+
todos = todo_list.todos
|
|
317
|
+
|
|
318
|
+
# Apply filters
|
|
319
|
+
if status:
|
|
320
|
+
todos = [t for t in todos if t.get('status') == status]
|
|
321
|
+
|
|
322
|
+
if priority:
|
|
323
|
+
todos = [t for t in todos if t.get('priority') == priority]
|
|
324
|
+
|
|
325
|
+
return todos
|
|
326
|
+
|
|
327
|
+
except TodoManagerError:
|
|
328
|
+
raise
|
|
329
|
+
except Exception as e:
|
|
330
|
+
raise TodoManagerError(f"Failed to get todos: {e}")
|
|
331
|
+
|
|
332
|
+
def update_todo(
|
|
333
|
+
self,
|
|
334
|
+
todo_id: str,
|
|
335
|
+
conversation_id: Optional[str] = None,
|
|
336
|
+
content: Optional[str] = None,
|
|
337
|
+
status: Optional[str] = None,
|
|
338
|
+
priority: Optional[str] = None,
|
|
339
|
+
notes: Optional[str] = None
|
|
340
|
+
) -> bool:
|
|
341
|
+
"""
|
|
342
|
+
Update a todo.
|
|
343
|
+
|
|
344
|
+
Args:
|
|
345
|
+
todo_id: Todo ID
|
|
346
|
+
conversation_id: Conversation ID (uses current if None)
|
|
347
|
+
content: New content
|
|
348
|
+
status: New status
|
|
349
|
+
priority: New priority
|
|
350
|
+
notes: New notes
|
|
351
|
+
|
|
352
|
+
Returns:
|
|
353
|
+
True if update was successful
|
|
354
|
+
|
|
355
|
+
Raises:
|
|
356
|
+
TodoNotFoundError: If todo doesn't exist
|
|
357
|
+
"""
|
|
358
|
+
try:
|
|
359
|
+
# Get conversation ID
|
|
360
|
+
if conversation_id is None:
|
|
361
|
+
conversation_id = self._get_current_conversation_id()
|
|
362
|
+
if conversation_id is None:
|
|
363
|
+
raise TodoManagerError("No current conversation available and no conversation_id provided")
|
|
364
|
+
|
|
365
|
+
# Get todo list
|
|
366
|
+
todo_list = self._get_or_create_todo_list(conversation_id)
|
|
367
|
+
|
|
368
|
+
# Find todo
|
|
369
|
+
todo_data = todo_list.get_todo(todo_id)
|
|
370
|
+
if not todo_data:
|
|
371
|
+
raise TodoNotFoundError(todo_id)
|
|
372
|
+
|
|
373
|
+
# Update fields
|
|
374
|
+
update_kwargs = {}
|
|
375
|
+
if content is not None:
|
|
376
|
+
update_kwargs['content'] = content
|
|
377
|
+
if status is not None:
|
|
378
|
+
update_kwargs['status'] = status
|
|
379
|
+
if priority is not None:
|
|
380
|
+
update_kwargs['priority'] = priority
|
|
381
|
+
if notes is not None:
|
|
382
|
+
update_kwargs['notes'] = notes
|
|
383
|
+
|
|
384
|
+
# Update todo
|
|
385
|
+
success = todo_list.update_todo(todo_id, **update_kwargs)
|
|
386
|
+
if not success:
|
|
387
|
+
raise TodoNotFoundError(todo_id)
|
|
388
|
+
|
|
389
|
+
# Save todo list
|
|
390
|
+
if not self._save_todo_list(todo_list):
|
|
391
|
+
raise TodoManagerError("Failed to save todo list")
|
|
392
|
+
|
|
393
|
+
logger.info(f"Updated todo {todo_id} in conversation {conversation_id}")
|
|
394
|
+
return True
|
|
395
|
+
|
|
396
|
+
except (TodoNotFoundError, TodoManagerError):
|
|
397
|
+
raise
|
|
398
|
+
except Exception as e:
|
|
399
|
+
raise TodoManagerError(f"Failed to update todo: {e}")
|
|
400
|
+
|
|
401
|
+
def delete_todo(
|
|
402
|
+
self,
|
|
403
|
+
todo_id: str,
|
|
404
|
+
conversation_id: Optional[str] = None
|
|
405
|
+
) -> bool:
|
|
406
|
+
"""
|
|
407
|
+
Delete a todo.
|
|
408
|
+
|
|
409
|
+
Args:
|
|
410
|
+
todo_id: Todo ID
|
|
411
|
+
conversation_id: Conversation ID (uses current if None)
|
|
412
|
+
|
|
413
|
+
Returns:
|
|
414
|
+
True if deletion was successful
|
|
415
|
+
|
|
416
|
+
Raises:
|
|
417
|
+
TodoNotFoundError: If todo doesn't exist
|
|
418
|
+
"""
|
|
419
|
+
try:
|
|
420
|
+
# Get conversation ID
|
|
421
|
+
if conversation_id is None:
|
|
422
|
+
conversation_id = self._get_current_conversation_id()
|
|
423
|
+
if conversation_id is None:
|
|
424
|
+
raise TodoManagerError("No current conversation available and no conversation_id provided")
|
|
425
|
+
|
|
426
|
+
# Get todo list
|
|
427
|
+
todo_list = self._get_or_create_todo_list(conversation_id)
|
|
428
|
+
|
|
429
|
+
# Remove todo
|
|
430
|
+
success = todo_list.remove_todo(todo_id)
|
|
431
|
+
if not success:
|
|
432
|
+
raise TodoNotFoundError(todo_id)
|
|
433
|
+
|
|
434
|
+
# Save todo list
|
|
435
|
+
if not self._save_todo_list(todo_list):
|
|
436
|
+
raise TodoManagerError("Failed to save todo list")
|
|
437
|
+
|
|
438
|
+
logger.info(f"Deleted todo {todo_id} from conversation {conversation_id}")
|
|
439
|
+
return True
|
|
440
|
+
|
|
441
|
+
except (TodoNotFoundError, TodoManagerError):
|
|
442
|
+
raise
|
|
443
|
+
except Exception as e:
|
|
444
|
+
raise TodoManagerError(f"Failed to delete todo: {e}")
|
|
445
|
+
|
|
446
|
+
def get_statistics(self, conversation_id: Optional[str] = None) -> Dict[str, Any]:
|
|
447
|
+
"""
|
|
448
|
+
Get todo statistics.
|
|
449
|
+
|
|
450
|
+
Args:
|
|
451
|
+
conversation_id: Conversation ID (uses current if None)
|
|
452
|
+
|
|
453
|
+
Returns:
|
|
454
|
+
Dictionary with statistics
|
|
455
|
+
"""
|
|
456
|
+
try:
|
|
457
|
+
# Get conversation ID
|
|
458
|
+
if conversation_id is None:
|
|
459
|
+
conversation_id = self._get_current_conversation_id()
|
|
460
|
+
if conversation_id is None:
|
|
461
|
+
return {"error": "No current conversation available"}
|
|
462
|
+
|
|
463
|
+
# Get todo list
|
|
464
|
+
if not self.storage.todo_list_exists(conversation_id):
|
|
465
|
+
return {
|
|
466
|
+
"conversation_id": conversation_id,
|
|
467
|
+
"total": 0,
|
|
468
|
+
"pending": 0,
|
|
469
|
+
"in_progress": 0,
|
|
470
|
+
"completed": 0,
|
|
471
|
+
"cancelled": 0
|
|
472
|
+
}
|
|
473
|
+
|
|
474
|
+
todo_list = self._get_or_create_todo_list(conversation_id)
|
|
475
|
+
stats = todo_list.get_statistics()
|
|
476
|
+
|
|
477
|
+
# Create a new dictionary to avoid type issues
|
|
478
|
+
result_stats: Dict[str, Any] = dict(stats)
|
|
479
|
+
result_stats["conversation_id"] = conversation_id
|
|
480
|
+
result_stats["manager_stats"] = self._stats
|
|
481
|
+
result_stats["cache_stats"] = self.cache_manager.get_cache_statistics()
|
|
482
|
+
|
|
483
|
+
return result_stats
|
|
484
|
+
|
|
485
|
+
except Exception as e:
|
|
486
|
+
logger.error(f"Failed to get statistics: {e}")
|
|
487
|
+
return {"error": str(e)}
|
|
488
|
+
|
|
489
|
+
def _parse_content_to_todos(self, content: str) -> List[str]:
|
|
490
|
+
"""
|
|
491
|
+
Parse content into individual todo items.
|
|
492
|
+
|
|
493
|
+
Args:
|
|
494
|
+
content: Content to parse
|
|
495
|
+
|
|
496
|
+
Returns:
|
|
497
|
+
List of todo content strings
|
|
498
|
+
"""
|
|
499
|
+
import re
|
|
500
|
+
|
|
501
|
+
todos = []
|
|
502
|
+
|
|
503
|
+
# First, try to parse <task> tags
|
|
504
|
+
task_pattern = r'<task>(.*?)</task>'
|
|
505
|
+
task_matches = re.findall(task_pattern, content, re.DOTALL)
|
|
506
|
+
|
|
507
|
+
if task_matches:
|
|
508
|
+
# Found <task> tags, use them
|
|
509
|
+
for task_content in task_matches:
|
|
510
|
+
task_content = task_content.strip()
|
|
511
|
+
if task_content:
|
|
512
|
+
todos.append(task_content)
|
|
513
|
+
else:
|
|
514
|
+
# Fallback to line-by-line parsing
|
|
515
|
+
lines = content.strip().split('\n')
|
|
516
|
+
|
|
517
|
+
for line in lines:
|
|
518
|
+
line = line.strip()
|
|
519
|
+
if not line:
|
|
520
|
+
continue
|
|
521
|
+
|
|
522
|
+
# Remove common prefixes like "1.", "- ", "* ", etc.
|
|
523
|
+
line = line.lstrip('0123456789.- *\t')
|
|
524
|
+
|
|
525
|
+
if line:
|
|
526
|
+
todos.append(line)
|
|
527
|
+
|
|
528
|
+
return todos
|
|
529
|
+
|
|
530
|
+
def clear_cache(self):
|
|
531
|
+
"""Clear all caches."""
|
|
532
|
+
self.cache_manager.clear_all_caches()
|
|
533
|
+
|
|
534
|
+
def close(self):
|
|
535
|
+
"""Clean up resources."""
|
|
536
|
+
# Clear caches
|
|
537
|
+
self.clear_cache()
|