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,307 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Examples and demonstrations for the Agent Events module.
|
|
3
|
+
"""
|
|
4
|
+
|
|
5
|
+
import asyncio
|
|
6
|
+
import time
|
|
7
|
+
from autocoder.common.agent_events import (
|
|
8
|
+
create_event_system,
|
|
9
|
+
create_pre_tool_use_event,
|
|
10
|
+
create_post_tool_use_event,
|
|
11
|
+
create_error_occurred_event,
|
|
12
|
+
create_conversation_start_event,
|
|
13
|
+
create_conversation_end_event,
|
|
14
|
+
EventFactory,
|
|
15
|
+
EventContext,
|
|
16
|
+
EventType,
|
|
17
|
+
EventEmitterConfig
|
|
18
|
+
)
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
async def basic_event_system_example():
|
|
22
|
+
"""Basic event system usage example."""
|
|
23
|
+
print("=== Basic Event System Example ===")
|
|
24
|
+
|
|
25
|
+
# Create event system
|
|
26
|
+
config = EventEmitterConfig(enable_logging=True, max_listeners=50)
|
|
27
|
+
emitter, factory = create_event_system(config)
|
|
28
|
+
|
|
29
|
+
# Event handlers
|
|
30
|
+
async def pre_tool_handler(event):
|
|
31
|
+
print(f"⚡ Tool starting: {event.content['tool_name']}")
|
|
32
|
+
|
|
33
|
+
async def post_tool_handler(event):
|
|
34
|
+
status = '✅ success' if event.content['success'] else '❌ failed'
|
|
35
|
+
print(f"🏁 Tool completed: {event.content['tool_name']} - {status}")
|
|
36
|
+
|
|
37
|
+
# Register handlers
|
|
38
|
+
emitter.on(EventType.PRE_TOOL_USE, pre_tool_handler)
|
|
39
|
+
emitter.on(EventType.POST_TOOL_USE, post_tool_handler)
|
|
40
|
+
|
|
41
|
+
# Emit some events
|
|
42
|
+
await emitter.emit(create_pre_tool_use_event('read_file', {'path': 'config.json'}))
|
|
43
|
+
await emitter.emit(create_post_tool_use_event('read_file', {'path': 'config.json'}, 'file content', True, 45))
|
|
44
|
+
|
|
45
|
+
await emitter.emit(create_pre_tool_use_event('write_file', {'path': 'output.txt'}))
|
|
46
|
+
await emitter.emit(create_post_tool_use_event('write_file', {'path': 'output.txt'}, None, False, 12))
|
|
47
|
+
|
|
48
|
+
# Show metrics
|
|
49
|
+
metrics = emitter.get_metrics()
|
|
50
|
+
print(f"📊 Metrics: {metrics.total_events} events, {metrics.average_processing_time:.3f}s avg")
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
def sync_event_system_example():
|
|
54
|
+
"""Synchronous event system usage example."""
|
|
55
|
+
print("\n=== Synchronous Event System Example ===")
|
|
56
|
+
|
|
57
|
+
# Create event system
|
|
58
|
+
config = EventEmitterConfig(enable_logging=False)
|
|
59
|
+
emitter, factory = create_event_system(config)
|
|
60
|
+
|
|
61
|
+
# Sync event handler (note: handlers are still async, but called synchronously)
|
|
62
|
+
async def handler(event):
|
|
63
|
+
print(f"📌 Sync handler: {event.content['tool_name']}")
|
|
64
|
+
|
|
65
|
+
emitter.on(EventType.PRE_TOOL_USE, handler)
|
|
66
|
+
|
|
67
|
+
# Use sync methods (automatically provided by AsyncSyncMixin)
|
|
68
|
+
event1 = create_pre_tool_use_event('sync_tool', {'param': 'value'})
|
|
69
|
+
emitter.emit_sync(event1) # This runs the async emit in a sync context
|
|
70
|
+
|
|
71
|
+
# Wait for event synchronously
|
|
72
|
+
print("⏳ Waiting for event synchronously...")
|
|
73
|
+
|
|
74
|
+
# Create a task that will emit an event after a delay
|
|
75
|
+
def emit_delayed():
|
|
76
|
+
import time
|
|
77
|
+
time.sleep(0.5)
|
|
78
|
+
emitter.emit_sync(create_pre_tool_use_event('delayed_tool', {}))
|
|
79
|
+
|
|
80
|
+
import threading
|
|
81
|
+
thread = threading.Thread(target=emit_delayed)
|
|
82
|
+
thread.start()
|
|
83
|
+
|
|
84
|
+
# Wait for the event (with timeout)
|
|
85
|
+
result = emitter.wait_for_event_sync(EventType.PRE_TOOL_USE, timeout=2.0)
|
|
86
|
+
if result:
|
|
87
|
+
print(f"📨 Received event: {result.content['tool_name']}")
|
|
88
|
+
|
|
89
|
+
thread.join()
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
async def conversation_lifecycle_example():
|
|
93
|
+
"""Conversation lifecycle events example."""
|
|
94
|
+
print("\n=== Conversation Lifecycle Example ===")
|
|
95
|
+
|
|
96
|
+
emitter, factory = create_event_system()
|
|
97
|
+
|
|
98
|
+
# Lifecycle handler
|
|
99
|
+
async def lifecycle_handler(event):
|
|
100
|
+
event_type = event.event_type.value
|
|
101
|
+
if event_type == 'conversation_start':
|
|
102
|
+
print(f"🚀 Conversation started with {event.content['message_count']} messages")
|
|
103
|
+
elif event_type == 'conversation_end':
|
|
104
|
+
completed = '✅' if event.content['did_complete_task'] else '❌'
|
|
105
|
+
print(f"🏁 Conversation ended {completed} after {event.content['iteration_count']} iterations")
|
|
106
|
+
|
|
107
|
+
# Register for lifecycle events
|
|
108
|
+
emitter.on(EventType.CONVERSATION_START, lifecycle_handler)
|
|
109
|
+
emitter.on(EventType.CONVERSATION_END, lifecycle_handler)
|
|
110
|
+
|
|
111
|
+
# Simulate conversation lifecycle
|
|
112
|
+
await emitter.emit(create_conversation_start_event(0, 'conv-123'))
|
|
113
|
+
await asyncio.sleep(0.1) # Simulate work
|
|
114
|
+
await emitter.emit(create_conversation_end_event(True, 5, 'conv-123'))
|
|
115
|
+
|
|
116
|
+
|
|
117
|
+
async def advanced_event_processing_example():
|
|
118
|
+
"""Advanced event processing with filtering and context."""
|
|
119
|
+
print("\n=== Advanced Event Processing Example ===")
|
|
120
|
+
|
|
121
|
+
emitter, factory = create_event_system()
|
|
122
|
+
|
|
123
|
+
# Create factory with context
|
|
124
|
+
context = EventContext(
|
|
125
|
+
agent_id='agent-001',
|
|
126
|
+
conversation_id='conv-456',
|
|
127
|
+
metadata={'version': '1.0.0', 'environment': 'test'}
|
|
128
|
+
)
|
|
129
|
+
contextual_factory = EventFactory.create_with_context(context)
|
|
130
|
+
|
|
131
|
+
# Filtered handlers
|
|
132
|
+
async def success_handler(event):
|
|
133
|
+
print(f"✅ Successful operation: {event.content['tool_name']}")
|
|
134
|
+
|
|
135
|
+
async def failure_handler(event):
|
|
136
|
+
print(f"❌ Failed operation: {event.content['tool_name']}")
|
|
137
|
+
if 'error_message' in event.content:
|
|
138
|
+
print(f" Error: {event.content['error_message']}")
|
|
139
|
+
|
|
140
|
+
async def context_handler(event):
|
|
141
|
+
if event.context:
|
|
142
|
+
print(f"🏷️ Agent: {event.context.agent_id}, Conv: {event.context.conversation_id}")
|
|
143
|
+
|
|
144
|
+
# Add filtered listeners
|
|
145
|
+
def success_filter(event):
|
|
146
|
+
return event.content.get('success', False) == True
|
|
147
|
+
|
|
148
|
+
def failure_filter(event):
|
|
149
|
+
return event.content.get('success', False) == False
|
|
150
|
+
|
|
151
|
+
emitter.add_listener(EventType.POST_TOOL_USE, success_handler, filter=success_filter)
|
|
152
|
+
emitter.add_listener(EventType.POST_TOOL_USE, failure_handler, filter=failure_filter)
|
|
153
|
+
emitter.add_listener(EventType.POST_TOOL_USE, context_handler)
|
|
154
|
+
|
|
155
|
+
# One-time error handler
|
|
156
|
+
async def critical_error_handler(event):
|
|
157
|
+
print(f"🚨 CRITICAL ERROR: {event.content['error_message']}")
|
|
158
|
+
|
|
159
|
+
emitter.add_listener(EventType.ERROR_OCCURRED, critical_error_handler, once=True)
|
|
160
|
+
|
|
161
|
+
# Emit events with context
|
|
162
|
+
success_event = contextual_factory.create_post_tool_use_event(
|
|
163
|
+
'process_data', {'dataset': 'users.csv'}, {'processed': 1000}, True, 2500
|
|
164
|
+
)
|
|
165
|
+
await emitter.emit(success_event)
|
|
166
|
+
|
|
167
|
+
failure_event = contextual_factory.create_post_tool_use_event(
|
|
168
|
+
'validate_data', {'schema': 'user_schema'}, None, False, 100
|
|
169
|
+
)
|
|
170
|
+
await emitter.emit(failure_event)
|
|
171
|
+
|
|
172
|
+
# Emit error (will trigger one-time handler)
|
|
173
|
+
error_event = contextual_factory.create_error_occurred_event(
|
|
174
|
+
'VALIDATION_ERROR', 'Required field missing', 'validate_data'
|
|
175
|
+
)
|
|
176
|
+
await emitter.emit(error_event)
|
|
177
|
+
|
|
178
|
+
# Emit another error (one-time handler won't trigger)
|
|
179
|
+
another_error = contextual_factory.create_error_occurred_event(
|
|
180
|
+
'TIMEOUT_ERROR', 'Operation timed out', 'slow_operation'
|
|
181
|
+
)
|
|
182
|
+
await emitter.emit(another_error)
|
|
183
|
+
|
|
184
|
+
|
|
185
|
+
async def event_waiting_example():
|
|
186
|
+
"""Example of waiting for specific events."""
|
|
187
|
+
print("\n=== Event Waiting Example ===")
|
|
188
|
+
|
|
189
|
+
emitter, factory = create_event_system()
|
|
190
|
+
|
|
191
|
+
# Background task that emits events
|
|
192
|
+
async def background_task():
|
|
193
|
+
await asyncio.sleep(1)
|
|
194
|
+
await emitter.emit(create_pre_tool_use_event('background_task', {}))
|
|
195
|
+
await asyncio.sleep(1)
|
|
196
|
+
await emitter.emit(create_post_tool_use_event('background_task', {}, 'result', True, 500))
|
|
197
|
+
|
|
198
|
+
# Start background task
|
|
199
|
+
asyncio.create_task(background_task())
|
|
200
|
+
|
|
201
|
+
# Wait for specific events
|
|
202
|
+
print("⏳ Waiting for PreToolUse event...")
|
|
203
|
+
pre_event = await emitter.wait_for_event(EventType.PRE_TOOL_USE, timeout=5.0)
|
|
204
|
+
if pre_event:
|
|
205
|
+
print(f"📨 Received PreToolUse: {pre_event.content['tool_name']}")
|
|
206
|
+
|
|
207
|
+
print("⏳ Waiting for PostToolUse event...")
|
|
208
|
+
post_event = await emitter.wait_for_event(EventType.POST_TOOL_USE, timeout=5.0)
|
|
209
|
+
if post_event:
|
|
210
|
+
print(f"📨 Received PostToolUse: {post_event.content['tool_name']}")
|
|
211
|
+
|
|
212
|
+
# Wait for event that won't come (will timeout)
|
|
213
|
+
print("⏳ Waiting for non-existent event (will timeout)...")
|
|
214
|
+
timeout_event = await emitter.wait_for_event(EventType.ERROR_OCCURRED, timeout=1.0)
|
|
215
|
+
if timeout_event is None:
|
|
216
|
+
print("⏰ Event wait timed out as expected")
|
|
217
|
+
|
|
218
|
+
|
|
219
|
+
async def performance_test_example():
|
|
220
|
+
"""Performance testing example."""
|
|
221
|
+
print("\n=== Performance Test Example ===")
|
|
222
|
+
|
|
223
|
+
emitter, factory = create_event_system()
|
|
224
|
+
|
|
225
|
+
# Simple handler
|
|
226
|
+
async def fast_handler(event):
|
|
227
|
+
pass # Do nothing for performance test
|
|
228
|
+
|
|
229
|
+
emitter.on(EventType.PRE_TOOL_USE, fast_handler)
|
|
230
|
+
|
|
231
|
+
# Performance test
|
|
232
|
+
num_events = 1000
|
|
233
|
+
start_time = time.time()
|
|
234
|
+
|
|
235
|
+
tasks = []
|
|
236
|
+
for i in range(num_events):
|
|
237
|
+
event = create_pre_tool_use_event(f'tool_{i}', {'index': i})
|
|
238
|
+
tasks.append(emitter.emit(event))
|
|
239
|
+
|
|
240
|
+
await asyncio.gather(*tasks)
|
|
241
|
+
|
|
242
|
+
end_time = time.time()
|
|
243
|
+
total_time = end_time - start_time
|
|
244
|
+
|
|
245
|
+
metrics = emitter.get_metrics()
|
|
246
|
+
print(f"🚀 Performance Results:")
|
|
247
|
+
print(f" Events processed: {metrics.total_events}")
|
|
248
|
+
print(f" Total time: {total_time:.3f}s")
|
|
249
|
+
print(f" Events/second: {num_events / total_time:.1f}")
|
|
250
|
+
print(f" Average processing time: {metrics.average_processing_time * 1000:.2f}ms")
|
|
251
|
+
|
|
252
|
+
|
|
253
|
+
def mixed_sync_async_example():
|
|
254
|
+
"""Example mixing sync and async usage."""
|
|
255
|
+
print("\n=== Mixed Sync/Async Example ===")
|
|
256
|
+
|
|
257
|
+
# Create event system
|
|
258
|
+
emitter, factory = create_event_system()
|
|
259
|
+
|
|
260
|
+
# Handler
|
|
261
|
+
async def handler(event):
|
|
262
|
+
print(f"🔄 Mixed handler: {event.event_type.value} - {event.content.get('tool_name', 'N/A')}")
|
|
263
|
+
|
|
264
|
+
emitter.on(EventType.PRE_TOOL_USE, handler)
|
|
265
|
+
emitter.on(EventType.POST_TOOL_USE, handler)
|
|
266
|
+
|
|
267
|
+
# Use sync method from non-async context
|
|
268
|
+
print("Using sync methods:")
|
|
269
|
+
emitter.emit_sync(create_pre_tool_use_event('sync_tool', {}))
|
|
270
|
+
|
|
271
|
+
# Get metrics synchronously
|
|
272
|
+
metrics = emitter.get_metrics()
|
|
273
|
+
print(f"Events so far: {metrics.total_events}")
|
|
274
|
+
|
|
275
|
+
# Now switch to async context
|
|
276
|
+
async def async_part():
|
|
277
|
+
print("\nUsing async methods:")
|
|
278
|
+
await emitter.emit(create_post_tool_use_event('async_tool', {}, 'result', True))
|
|
279
|
+
|
|
280
|
+
# Can still use sync methods from async context if needed
|
|
281
|
+
emitter.emit_sync(create_pre_tool_use_event('another_sync_tool', {}))
|
|
282
|
+
|
|
283
|
+
# Run the async part
|
|
284
|
+
asyncio.run(async_part())
|
|
285
|
+
|
|
286
|
+
# Back to sync
|
|
287
|
+
final_metrics = emitter.get_metrics()
|
|
288
|
+
print(f"\nTotal events processed: {final_metrics.total_events}")
|
|
289
|
+
|
|
290
|
+
|
|
291
|
+
async def run_all_examples():
|
|
292
|
+
"""Run all examples."""
|
|
293
|
+
print("🎭 Agent Events Module Examples\n")
|
|
294
|
+
|
|
295
|
+
await basic_event_system_example()
|
|
296
|
+
sync_event_system_example()
|
|
297
|
+
await conversation_lifecycle_example()
|
|
298
|
+
await advanced_event_processing_example()
|
|
299
|
+
await event_waiting_example()
|
|
300
|
+
await performance_test_example()
|
|
301
|
+
mixed_sync_async_example()
|
|
302
|
+
|
|
303
|
+
print("\n✨ All examples completed!")
|
|
304
|
+
|
|
305
|
+
|
|
306
|
+
if __name__ == "__main__":
|
|
307
|
+
asyncio.run(run_all_examples())
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Type definitions for the Agent Events system.
|
|
3
|
+
"""
|
|
4
|
+
|
|
5
|
+
import time
|
|
6
|
+
from typing import Dict, Any, Optional, Callable, Awaitable, List, Union
|
|
7
|
+
from enum import Enum
|
|
8
|
+
from dataclasses import dataclass, field
|
|
9
|
+
import uuid
|
|
10
|
+
|
|
11
|
+
# Event types supported by the system
|
|
12
|
+
class EventType(str, Enum):
|
|
13
|
+
"""Event types that can be emitted and handled."""
|
|
14
|
+
PRE_TOOL_USE = "PreToolUse"
|
|
15
|
+
POST_TOOL_USE = "PostToolUse"
|
|
16
|
+
TOOL_EXECUTION = "tool_execution"
|
|
17
|
+
TOOL_REQUEST_APPROVAL = "tool_request_approval"
|
|
18
|
+
CONVERSATION_START = "conversation_start"
|
|
19
|
+
CONVERSATION_END = "conversation_end"
|
|
20
|
+
MODE_CHANGE = "mode_change"
|
|
21
|
+
ERROR_OCCURRED = "error_occurred"
|
|
22
|
+
TOKEN_COUNT_INFO = "token_count_info"
|
|
23
|
+
REQUEST_API = "request_api"
|
|
24
|
+
REQUEST_API_COMPLETED = "request_api_completed"
|
|
25
|
+
REQUEST_API_ABORT = "request_api_abort"
|
|
26
|
+
CUSTOM_EVENT = "custom_event"
|
|
27
|
+
|
|
28
|
+
@dataclass
|
|
29
|
+
class EventContext:
|
|
30
|
+
"""Context information that can be attached to events."""
|
|
31
|
+
agent_id: Optional[str] = None
|
|
32
|
+
conversation_id: Optional[str] = None
|
|
33
|
+
metadata: Optional[Dict[str, Any]] = None
|
|
34
|
+
|
|
35
|
+
@dataclass
|
|
36
|
+
class EventMessage:
|
|
37
|
+
"""Enhanced event message with context and timing information."""
|
|
38
|
+
event_id: str = field(default_factory=lambda: str(uuid.uuid4()))
|
|
39
|
+
event_type: EventType = EventType.CUSTOM_EVENT
|
|
40
|
+
timestamp: float = field(default_factory=time.time)
|
|
41
|
+
content: Dict[str, Any] = field(default_factory=dict)
|
|
42
|
+
context: Optional[EventContext] = None
|
|
43
|
+
|
|
44
|
+
def to_dict(self) -> Dict[str, Any]:
|
|
45
|
+
"""Convert event message to dictionary."""
|
|
46
|
+
result = {
|
|
47
|
+
'event_id': self.event_id,
|
|
48
|
+
'event_type': self.event_type.value,
|
|
49
|
+
'timestamp': self.timestamp,
|
|
50
|
+
'content': self.content
|
|
51
|
+
}
|
|
52
|
+
if self.context:
|
|
53
|
+
result['context'] = {
|
|
54
|
+
'agent_id': self.context.agent_id,
|
|
55
|
+
'conversation_id': self.context.conversation_id,
|
|
56
|
+
'metadata': self.context.metadata or {}
|
|
57
|
+
}
|
|
58
|
+
return result
|
|
59
|
+
|
|
60
|
+
@classmethod
|
|
61
|
+
def from_dict(cls, data: Dict[str, Any]) -> 'EventMessage':
|
|
62
|
+
"""Create event message from dictionary."""
|
|
63
|
+
context = None
|
|
64
|
+
if 'context' in data:
|
|
65
|
+
ctx_data = data['context']
|
|
66
|
+
context = EventContext(
|
|
67
|
+
agent_id=ctx_data.get('agent_id'),
|
|
68
|
+
conversation_id=ctx_data.get('conversation_id'),
|
|
69
|
+
metadata=ctx_data.get('metadata', {})
|
|
70
|
+
)
|
|
71
|
+
|
|
72
|
+
return cls(
|
|
73
|
+
event_id=data.get('event_id', str(uuid.uuid4())),
|
|
74
|
+
event_type=EventType(data.get('event_type', EventType.CUSTOM_EVENT.value)),
|
|
75
|
+
timestamp=data.get('timestamp', time.time()),
|
|
76
|
+
content=data.get('content', {}),
|
|
77
|
+
context=context
|
|
78
|
+
)
|
|
79
|
+
|
|
80
|
+
# Type aliases for event handlers
|
|
81
|
+
EventHandler = Callable[[EventMessage], Awaitable[None]]
|
|
82
|
+
EventFilter = Callable[[EventMessage], bool]
|
|
83
|
+
|
|
84
|
+
@dataclass
|
|
85
|
+
class EventListener:
|
|
86
|
+
"""Configuration for an event listener."""
|
|
87
|
+
handler: EventHandler
|
|
88
|
+
filter: Optional[EventFilter] = None
|
|
89
|
+
once: bool = False
|
|
90
|
+
|
|
91
|
+
@dataclass
|
|
92
|
+
class EventMetrics:
|
|
93
|
+
"""Metrics for event processing."""
|
|
94
|
+
total_events: int = 0
|
|
95
|
+
total_handlers: int = 0
|
|
96
|
+
total_processing_time: float = 0.0
|
|
97
|
+
error_count: int = 0
|
|
98
|
+
handler_counts: Dict[str, int] = field(default_factory=dict)
|
|
99
|
+
|
|
100
|
+
@property
|
|
101
|
+
def average_processing_time(self) -> float:
|
|
102
|
+
"""Calculate average processing time per event."""
|
|
103
|
+
if self.total_events == 0:
|
|
104
|
+
return 0.0
|
|
105
|
+
return self.total_processing_time / self.total_events
|
|
106
|
+
|
|
107
|
+
@dataclass
|
|
108
|
+
class EventEmitterConfig:
|
|
109
|
+
"""Configuration for the AgentEventEmitter."""
|
|
110
|
+
enable_logging: bool = False
|
|
111
|
+
max_listeners: int = 100
|
|
112
|
+
error_handler: Optional[Callable[[Exception, EventType], None]] = None
|
|
113
|
+
hook_manager: Optional[Any] = None # Import cycle avoidance
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Utility functions for the Agent Events system.
|
|
3
|
+
"""
|
|
4
|
+
|
|
5
|
+
from typing import Dict, Any, Optional, Tuple
|
|
6
|
+
from .types import EventMessage, EventType, EventContext, EventEmitterConfig
|
|
7
|
+
from .event_factory import EventFactory
|
|
8
|
+
from .agent_event_emitter import AgentEventEmitter
|
|
9
|
+
|
|
10
|
+
def create_event_system(config: Optional[EventEmitterConfig] = None) -> Tuple[AgentEventEmitter, EventFactory]:
|
|
11
|
+
"""
|
|
12
|
+
Create a complete event system with emitter and factory.
|
|
13
|
+
|
|
14
|
+
Returns:
|
|
15
|
+
Tuple of (emitter, factory) ready to use
|
|
16
|
+
"""
|
|
17
|
+
emitter = AgentEventEmitter(config)
|
|
18
|
+
factory = EventFactory()
|
|
19
|
+
return emitter, factory
|
|
20
|
+
|
|
21
|
+
def create_pre_tool_use_event(tool_name: str, tool_input: Dict[str, Any],
|
|
22
|
+
context: Optional[EventContext] = None) -> EventMessage:
|
|
23
|
+
"""Convenience function to create a PreToolUse event."""
|
|
24
|
+
factory = EventFactory()
|
|
25
|
+
return factory.create_pre_tool_use_event(tool_name, tool_input, context)
|
|
26
|
+
|
|
27
|
+
def create_post_tool_use_event(tool_name: str, tool_input: Dict[str, Any],
|
|
28
|
+
tool_output: Any, success: bool,
|
|
29
|
+
execution_time_ms: Optional[float] = None,
|
|
30
|
+
context: Optional[EventContext] = None) -> EventMessage:
|
|
31
|
+
"""Convenience function to create a PostToolUse event."""
|
|
32
|
+
factory = EventFactory()
|
|
33
|
+
return factory.create_post_tool_use_event(
|
|
34
|
+
tool_name, tool_input, tool_output, success, execution_time_ms, context
|
|
35
|
+
)
|
|
36
|
+
|
|
37
|
+
def create_error_occurred_event(error_type: str, error_message: str,
|
|
38
|
+
tool_name: Optional[str] = None,
|
|
39
|
+
stack_trace: Optional[str] = None,
|
|
40
|
+
context: Optional[EventContext] = None) -> EventMessage:
|
|
41
|
+
"""Convenience function to create an ErrorOccurred event."""
|
|
42
|
+
factory = EventFactory()
|
|
43
|
+
return factory.create_error_occurred_event(
|
|
44
|
+
error_type, error_message, tool_name, stack_trace, context
|
|
45
|
+
)
|
|
46
|
+
|
|
47
|
+
def create_conversation_start_event(message_count: int = 0,
|
|
48
|
+
conversation_id: Optional[str] = None,
|
|
49
|
+
context: Optional[EventContext] = None) -> EventMessage:
|
|
50
|
+
"""Convenience function to create a ConversationStart event."""
|
|
51
|
+
factory = EventFactory()
|
|
52
|
+
return factory.create_conversation_start_event(message_count, conversation_id, context)
|
|
53
|
+
|
|
54
|
+
def create_conversation_end_event(did_complete_task: bool,
|
|
55
|
+
iteration_count: int = 0,
|
|
56
|
+
conversation_id: Optional[str] = None,
|
|
57
|
+
context: Optional[EventContext] = None) -> EventMessage:
|
|
58
|
+
"""Convenience function to create a ConversationEnd event."""
|
|
59
|
+
factory = EventFactory()
|
|
60
|
+
return factory.create_conversation_end_event(
|
|
61
|
+
did_complete_task, iteration_count, conversation_id, context
|
|
62
|
+
)
|
|
63
|
+
|
|
64
|
+
def create_custom_event(event_name: str, data: Dict[str, Any],
|
|
65
|
+
context: Optional[EventContext] = None) -> EventMessage:
|
|
66
|
+
"""Convenience function to create a custom event."""
|
|
67
|
+
factory = EventFactory()
|
|
68
|
+
return factory.create_custom_event(event_name, data, context)
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Agent Hooks Module
|
|
3
|
+
|
|
4
|
+
An event-driven command execution system that processes EventMessage types and
|
|
5
|
+
executes corresponding commands based on configuration.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from .types import (
|
|
9
|
+
HooksConfig,
|
|
10
|
+
HookMatcher,
|
|
11
|
+
Hook,
|
|
12
|
+
HookExecutionResult,
|
|
13
|
+
HookProcessingResult,
|
|
14
|
+
HookType
|
|
15
|
+
)
|
|
16
|
+
|
|
17
|
+
from .hook_manager import HookManager
|
|
18
|
+
from .hook_executor import HookExecutor
|
|
19
|
+
from .utils import (
|
|
20
|
+
process_event,
|
|
21
|
+
create_hook_executor,
|
|
22
|
+
create_hook_manager,
|
|
23
|
+
config_exists
|
|
24
|
+
)
|
|
25
|
+
|
|
26
|
+
__all__ = [
|
|
27
|
+
# Types
|
|
28
|
+
'HooksConfig',
|
|
29
|
+
'HookMatcher',
|
|
30
|
+
'Hook',
|
|
31
|
+
'HookExecutionResult',
|
|
32
|
+
'HookProcessingResult',
|
|
33
|
+
'HookType',
|
|
34
|
+
|
|
35
|
+
# Core classes
|
|
36
|
+
'HookManager',
|
|
37
|
+
'HookExecutor',
|
|
38
|
+
|
|
39
|
+
# Utility functions
|
|
40
|
+
'process_event',
|
|
41
|
+
'create_hook_executor',
|
|
42
|
+
'create_hook_manager',
|
|
43
|
+
'config_exists'
|
|
44
|
+
]
|