auto-coder 0.1.400__py3-none-any.whl → 2.0.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of auto-coder might be problematic. Click here for more details.

Files changed (579) hide show
  1. auto_coder-2.0.0.dist-info/LICENSE +158 -0
  2. auto_coder-2.0.0.dist-info/METADATA +558 -0
  3. auto_coder-2.0.0.dist-info/RECORD +795 -0
  4. {auto_coder-0.1.400.dist-info → auto_coder-2.0.0.dist-info}/WHEEL +1 -1
  5. {auto_coder-0.1.400.dist-info → auto_coder-2.0.0.dist-info}/entry_points.txt +3 -3
  6. autocoder/__init__.py +31 -0
  7. autocoder/agent/auto_filegroup.py +32 -13
  8. autocoder/agent/auto_learn_from_commit.py +9 -1
  9. autocoder/agent/base_agentic/__init__.py +3 -0
  10. autocoder/agent/base_agentic/agent_hub.py +1 -1
  11. autocoder/agent/base_agentic/base_agent.py +235 -136
  12. autocoder/agent/base_agentic/default_tools.py +119 -118
  13. autocoder/agent/base_agentic/test_base_agent.py +1 -1
  14. autocoder/agent/base_agentic/tool_registry.py +32 -20
  15. autocoder/agent/base_agentic/tools/read_file_tool_resolver.py +25 -4
  16. autocoder/agent/base_agentic/tools/write_to_file_tool_resolver.py +24 -11
  17. autocoder/agent/base_agentic/types.py +42 -0
  18. autocoder/agent/entry_command_agent/chat.py +73 -59
  19. autocoder/auto_coder.py +31 -40
  20. autocoder/auto_coder_rag.py +11 -1084
  21. autocoder/auto_coder_runner.py +1029 -2310
  22. autocoder/auto_coder_terminal.py +26 -0
  23. autocoder/auto_coder_terminal_v3.py +190 -0
  24. autocoder/chat/conf_command.py +224 -124
  25. autocoder/chat/models_command.py +361 -299
  26. autocoder/chat/rules_command.py +79 -31
  27. autocoder/chat_auto_coder.py +1021 -372
  28. autocoder/chat_auto_coder_lang.py +23 -732
  29. autocoder/commands/auto_command.py +26 -9
  30. autocoder/commands/auto_web.py +1 -1
  31. autocoder/commands/tools.py +44 -44
  32. autocoder/common/__init__.py +150 -128
  33. autocoder/common/ac_style_command_parser/__init__.py +39 -2
  34. autocoder/common/ac_style_command_parser/config.py +422 -0
  35. autocoder/common/ac_style_command_parser/parser.py +292 -78
  36. autocoder/common/ac_style_command_parser/test_parser.py +241 -16
  37. autocoder/common/ac_style_command_parser/test_typed_parser.py +342 -0
  38. autocoder/common/ac_style_command_parser/typed_parser.py +653 -0
  39. autocoder/common/action_yml_file_manager.py +25 -13
  40. autocoder/common/agent_events/__init__.py +52 -0
  41. autocoder/common/agent_events/agent_event_emitter.py +193 -0
  42. autocoder/common/agent_events/event_factory.py +177 -0
  43. autocoder/common/agent_events/examples.py +307 -0
  44. autocoder/common/agent_events/types.py +113 -0
  45. autocoder/common/agent_events/utils.py +68 -0
  46. autocoder/common/agent_hooks/__init__.py +44 -0
  47. autocoder/common/agent_hooks/examples.py +582 -0
  48. autocoder/common/agent_hooks/hook_executor.py +217 -0
  49. autocoder/common/agent_hooks/hook_manager.py +288 -0
  50. autocoder/common/agent_hooks/types.py +133 -0
  51. autocoder/common/agent_hooks/utils.py +99 -0
  52. autocoder/common/agent_query_queue/queue_executor.py +324 -0
  53. autocoder/common/agent_query_queue/queue_manager.py +325 -0
  54. autocoder/common/agents/__init__.py +11 -0
  55. autocoder/common/agents/agent_manager.py +323 -0
  56. autocoder/common/agents/agent_parser.py +189 -0
  57. autocoder/common/agents/example_usage.py +344 -0
  58. autocoder/common/agents/integration_example.py +330 -0
  59. autocoder/common/agents/test_agent_parser.py +545 -0
  60. autocoder/common/async_utils.py +101 -0
  61. autocoder/common/auto_coder_lang.py +23 -972
  62. autocoder/common/autocoderargs_parser/__init__.py +14 -0
  63. autocoder/common/autocoderargs_parser/parser.py +184 -0
  64. autocoder/common/autocoderargs_parser/tests/__init__.py +1 -0
  65. autocoder/common/autocoderargs_parser/tests/test_args_parser.py +235 -0
  66. autocoder/common/autocoderargs_parser/tests/test_token_parser.py +195 -0
  67. autocoder/common/autocoderargs_parser/token_parser.py +290 -0
  68. autocoder/common/buildin_tokenizer.py +2 -4
  69. autocoder/common/code_auto_generate.py +149 -74
  70. autocoder/common/code_auto_generate_diff.py +163 -70
  71. autocoder/common/code_auto_generate_editblock.py +179 -89
  72. autocoder/common/code_auto_generate_strict_diff.py +167 -72
  73. autocoder/common/code_auto_merge_editblock.py +13 -6
  74. autocoder/common/code_modification_ranker.py +1 -1
  75. autocoder/common/command_completer.py +3 -3
  76. autocoder/common/command_file_manager/manager.py +183 -47
  77. autocoder/common/command_file_manager/test_command_file_manager.py +507 -0
  78. autocoder/common/command_templates.py +1 -1
  79. autocoder/common/conf_utils.py +2 -4
  80. autocoder/common/conversations/config.py +11 -3
  81. autocoder/common/conversations/get_conversation_manager.py +100 -2
  82. autocoder/common/conversations/llm_stats_models.py +264 -0
  83. autocoder/common/conversations/manager.py +112 -28
  84. autocoder/common/conversations/models.py +16 -2
  85. autocoder/common/conversations/storage/index_manager.py +134 -10
  86. autocoder/common/core_config/__init__.py +63 -0
  87. autocoder/common/core_config/agentic_mode_manager.py +109 -0
  88. autocoder/common/core_config/base_manager.py +123 -0
  89. autocoder/common/core_config/compatibility.py +151 -0
  90. autocoder/common/core_config/config_manager.py +156 -0
  91. autocoder/common/core_config/conversation_manager.py +31 -0
  92. autocoder/common/core_config/exclude_manager.py +72 -0
  93. autocoder/common/core_config/file_manager.py +177 -0
  94. autocoder/common/core_config/human_as_model_manager.py +129 -0
  95. autocoder/common/core_config/lib_manager.py +54 -0
  96. autocoder/common/core_config/main_manager.py +81 -0
  97. autocoder/common/core_config/mode_manager.py +126 -0
  98. autocoder/common/core_config/models.py +70 -0
  99. autocoder/common/core_config/test_memory_manager.py +1056 -0
  100. autocoder/common/env_manager.py +282 -0
  101. autocoder/common/env_manager_usage_example.py +211 -0
  102. autocoder/common/file_checkpoint/conversation_checkpoint.py +19 -19
  103. autocoder/common/file_checkpoint/manager.py +264 -48
  104. autocoder/common/file_checkpoint/test_backup.py +1 -18
  105. autocoder/common/file_checkpoint/test_manager.py +270 -1
  106. autocoder/common/file_checkpoint/test_store.py +1 -17
  107. autocoder/common/file_handler/__init__.py +23 -0
  108. autocoder/common/file_handler/active_context_handler.py +159 -0
  109. autocoder/common/file_handler/add_files_handler.py +409 -0
  110. autocoder/common/file_handler/chat_handler.py +180 -0
  111. autocoder/common/file_handler/coding_handler.py +401 -0
  112. autocoder/common/file_handler/commit_handler.py +200 -0
  113. autocoder/common/file_handler/lib_handler.py +156 -0
  114. autocoder/common/file_handler/list_files_handler.py +111 -0
  115. autocoder/common/file_handler/mcp_handler.py +268 -0
  116. autocoder/common/file_handler/models_handler.py +493 -0
  117. autocoder/common/file_handler/remove_files_handler.py +172 -0
  118. autocoder/common/file_monitor/test_file_monitor.py +307 -0
  119. autocoder/common/git_utils.py +51 -10
  120. autocoder/common/global_cancel.py +15 -6
  121. autocoder/common/ignorefiles/test_ignore_file_utils.py +1 -1
  122. autocoder/common/international/__init__.py +31 -0
  123. autocoder/common/international/demo_international.py +92 -0
  124. autocoder/common/international/message_manager.py +157 -0
  125. autocoder/common/international/messages/__init__.py +56 -0
  126. autocoder/common/international/messages/async_command_messages.py +507 -0
  127. autocoder/common/international/messages/auto_coder_messages.py +2208 -0
  128. autocoder/common/international/messages/chat_auto_coder_messages.py +1547 -0
  129. autocoder/common/international/messages/command_help_messages.py +986 -0
  130. autocoder/common/international/messages/conversation_command_messages.py +191 -0
  131. autocoder/common/international/messages/git_helper_plugin_messages.py +159 -0
  132. autocoder/common/international/messages/queue_command_messages.py +751 -0
  133. autocoder/common/international/messages/rules_command_messages.py +77 -0
  134. autocoder/common/international/messages/sdk_messages.py +1707 -0
  135. autocoder/common/international/messages/token_helper_plugin_messages.py +361 -0
  136. autocoder/common/international/messages/tool_display_messages.py +1212 -0
  137. autocoder/common/international/messages/workflow_exception_messages.py +473 -0
  138. autocoder/common/international/test_international.py +612 -0
  139. autocoder/common/linter_core/__init__.py +28 -0
  140. autocoder/common/linter_core/base_linter.py +61 -0
  141. autocoder/common/linter_core/config_loader.py +271 -0
  142. autocoder/common/linter_core/formatters/__init__.py +0 -0
  143. autocoder/common/linter_core/formatters/base_formatter.py +38 -0
  144. autocoder/common/linter_core/formatters/raw_formatter.py +17 -0
  145. autocoder/common/linter_core/linter.py +166 -0
  146. autocoder/common/linter_core/linter_factory.py +216 -0
  147. autocoder/common/linter_core/linter_manager.py +333 -0
  148. autocoder/common/linter_core/linters/__init__.py +9 -0
  149. autocoder/common/linter_core/linters/java_linter.py +342 -0
  150. autocoder/common/linter_core/linters/python_linter.py +115 -0
  151. autocoder/common/linter_core/linters/typescript_linter.py +119 -0
  152. autocoder/common/linter_core/models/__init__.py +7 -0
  153. autocoder/common/linter_core/models/lint_result.py +91 -0
  154. autocoder/common/linter_core/models.py +33 -0
  155. autocoder/common/linter_core/tests/__init__.py +3 -0
  156. autocoder/common/linter_core/tests/test_config_loader.py +323 -0
  157. autocoder/common/linter_core/tests/test_config_loading.py +308 -0
  158. autocoder/common/linter_core/tests/test_factory_manager.py +234 -0
  159. autocoder/common/linter_core/tests/test_formatters.py +147 -0
  160. autocoder/common/linter_core/tests/test_integration.py +317 -0
  161. autocoder/common/linter_core/tests/test_java_linter.py +496 -0
  162. autocoder/common/linter_core/tests/test_linters.py +265 -0
  163. autocoder/common/linter_core/tests/test_models.py +81 -0
  164. autocoder/common/linter_core/tests/verify_config_loading.py +296 -0
  165. autocoder/common/linter_core/tests/verify_fixes.py +183 -0
  166. autocoder/common/llm_friendly_package/__init__.py +31 -0
  167. autocoder/common/llm_friendly_package/base_manager.py +102 -0
  168. autocoder/common/llm_friendly_package/docs_manager.py +121 -0
  169. autocoder/common/llm_friendly_package/library_manager.py +171 -0
  170. autocoder/common/{llm_friendly_package.py → llm_friendly_package/main_manager.py} +204 -231
  171. autocoder/common/llm_friendly_package/models.py +40 -0
  172. autocoder/common/llm_friendly_package/test_llm_friendly_package.py +536 -0
  173. autocoder/common/llms/__init__.py +15 -0
  174. autocoder/common/llms/demo_error_handling.py +85 -0
  175. autocoder/common/llms/factory.py +142 -0
  176. autocoder/common/llms/manager.py +264 -0
  177. autocoder/common/llms/pricing.py +121 -0
  178. autocoder/common/llms/registry.py +288 -0
  179. autocoder/common/llms/schema.py +77 -0
  180. autocoder/common/llms/simple_demo.py +45 -0
  181. autocoder/common/llms/test_quick_model.py +116 -0
  182. autocoder/common/llms/test_remove_functionality.py +182 -0
  183. autocoder/common/llms/tests/__init__.py +1 -0
  184. autocoder/common/llms/tests/test_manager.py +330 -0
  185. autocoder/common/llms/tests/test_registry.py +364 -0
  186. autocoder/common/mcp_tools/__init__.py +62 -0
  187. autocoder/common/{mcp_tools.py → mcp_tools/executor.py} +49 -40
  188. autocoder/common/{mcp_hub.py → mcp_tools/hub.py} +42 -68
  189. autocoder/common/{mcp_server_install.py → mcp_tools/installer.py} +16 -28
  190. autocoder/common/{mcp_server.py → mcp_tools/server.py} +176 -48
  191. autocoder/common/mcp_tools/test_keyboard_interrupt.py +93 -0
  192. autocoder/common/mcp_tools/test_mcp_tools.py +391 -0
  193. autocoder/common/{mcp_server_types.py → mcp_tools/types.py} +121 -48
  194. autocoder/common/mcp_tools/verify_functionality.py +202 -0
  195. autocoder/common/model_speed_tester.py +32 -26
  196. autocoder/common/priority_directory_finder/__init__.py +142 -0
  197. autocoder/common/priority_directory_finder/examples.py +230 -0
  198. autocoder/common/priority_directory_finder/finder.py +283 -0
  199. autocoder/common/priority_directory_finder/models.py +236 -0
  200. autocoder/common/priority_directory_finder/test_priority_directory_finder.py +431 -0
  201. autocoder/common/project_scanner/__init__.py +18 -0
  202. autocoder/common/project_scanner/compat.py +77 -0
  203. autocoder/common/project_scanner/scanner.py +436 -0
  204. autocoder/common/project_tracker/__init__.py +27 -0
  205. autocoder/common/project_tracker/api.py +228 -0
  206. autocoder/common/project_tracker/demo.py +272 -0
  207. autocoder/common/project_tracker/tracker.py +487 -0
  208. autocoder/common/project_tracker/types.py +53 -0
  209. autocoder/common/pruner/__init__.py +67 -0
  210. autocoder/common/pruner/agentic_conversation_pruner.py +746 -0
  211. autocoder/common/{context_pruner.py → pruner/context_pruner.py} +137 -40
  212. autocoder/common/pruner/conversation_message_ids_api.py +386 -0
  213. autocoder/common/pruner/conversation_message_ids_manager.py +347 -0
  214. autocoder/common/pruner/conversation_message_ids_pruner.py +473 -0
  215. autocoder/common/pruner/conversation_normalizer.py +347 -0
  216. autocoder/common/{conversation_pruner.py → pruner/conversation_pruner.py} +26 -6
  217. autocoder/common/pruner/test_agentic_conversation_pruner.py +784 -0
  218. autocoder/common/pruner/test_context_pruner.py +546 -0
  219. autocoder/common/pruner/test_conversation_normalizer.py +502 -0
  220. autocoder/common/pruner/test_tool_content_detector.py +324 -0
  221. autocoder/common/pruner/tool_content_detector.py +227 -0
  222. autocoder/common/pruner/tools/__init__.py +18 -0
  223. autocoder/common/pruner/tools/query_message_ids.py +264 -0
  224. autocoder/common/pruner/tools/test_agentic_pruning_logic.py +432 -0
  225. autocoder/common/pruner/tools/test_message_ids_pruning_only.py +192 -0
  226. autocoder/common/pull_requests/__init__.py +9 -1
  227. autocoder/common/pull_requests/utils.py +122 -1
  228. autocoder/common/rag_manager/rag_manager.py +36 -40
  229. autocoder/common/rulefiles/__init__.py +53 -1
  230. autocoder/common/rulefiles/api.py +250 -0
  231. autocoder/common/rulefiles/core/__init__.py +14 -0
  232. autocoder/common/rulefiles/core/manager.py +241 -0
  233. autocoder/common/rulefiles/core/selector.py +805 -0
  234. autocoder/common/rulefiles/models/__init__.py +20 -0
  235. autocoder/common/rulefiles/models/index.py +16 -0
  236. autocoder/common/rulefiles/models/init_rule.py +18 -0
  237. autocoder/common/rulefiles/models/rule_file.py +18 -0
  238. autocoder/common/rulefiles/models/rule_relevance.py +14 -0
  239. autocoder/common/rulefiles/models/summary.py +16 -0
  240. autocoder/common/rulefiles/test_rulefiles.py +776 -0
  241. autocoder/common/rulefiles/utils/__init__.py +34 -0
  242. autocoder/common/rulefiles/utils/monitor.py +86 -0
  243. autocoder/common/rulefiles/utils/parser.py +230 -0
  244. autocoder/common/save_formatted_log.py +67 -10
  245. autocoder/common/search_replace.py +8 -1
  246. autocoder/common/search_replace_patch/__init__.py +24 -0
  247. autocoder/common/search_replace_patch/base.py +115 -0
  248. autocoder/common/search_replace_patch/manager.py +248 -0
  249. autocoder/common/search_replace_patch/patch_replacer.py +304 -0
  250. autocoder/common/search_replace_patch/similarity_replacer.py +306 -0
  251. autocoder/common/search_replace_patch/string_replacer.py +181 -0
  252. autocoder/common/search_replace_patch/tests/__init__.py +3 -0
  253. autocoder/common/search_replace_patch/tests/run_tests.py +126 -0
  254. autocoder/common/search_replace_patch/tests/test_base.py +188 -0
  255. autocoder/common/search_replace_patch/tests/test_empty_line_insert.py +233 -0
  256. autocoder/common/search_replace_patch/tests/test_integration.py +389 -0
  257. autocoder/common/search_replace_patch/tests/test_manager.py +351 -0
  258. autocoder/common/search_replace_patch/tests/test_patch_replacer.py +316 -0
  259. autocoder/common/search_replace_patch/tests/test_regex_replacer.py +306 -0
  260. autocoder/common/search_replace_patch/tests/test_similarity_replacer.py +384 -0
  261. autocoder/common/shell_commands/__init__.py +197 -0
  262. autocoder/common/shell_commands/background_process_notifier.py +346 -0
  263. autocoder/common/shell_commands/command_executor.py +1127 -0
  264. autocoder/common/shell_commands/error_recovery.py +541 -0
  265. autocoder/common/shell_commands/exceptions.py +120 -0
  266. autocoder/common/shell_commands/interactive_executor.py +476 -0
  267. autocoder/common/shell_commands/interactive_pexpect_process.py +623 -0
  268. autocoder/common/shell_commands/interactive_process.py +744 -0
  269. autocoder/common/shell_commands/interactive_session_manager.py +1014 -0
  270. autocoder/common/shell_commands/monitoring.py +529 -0
  271. autocoder/common/shell_commands/process_cleanup.py +386 -0
  272. autocoder/common/shell_commands/process_manager.py +606 -0
  273. autocoder/common/shell_commands/test_interactive_pexpect_process.py +281 -0
  274. autocoder/common/shell_commands/tests/__init__.py +6 -0
  275. autocoder/common/shell_commands/tests/conftest.py +118 -0
  276. autocoder/common/shell_commands/tests/test_background_process_notifier.py +703 -0
  277. autocoder/common/shell_commands/tests/test_command_executor.py +448 -0
  278. autocoder/common/shell_commands/tests/test_error_recovery.py +305 -0
  279. autocoder/common/shell_commands/tests/test_exceptions.py +299 -0
  280. autocoder/common/shell_commands/tests/test_execute_batch.py +588 -0
  281. autocoder/common/shell_commands/tests/test_indented_batch_commands.py +244 -0
  282. autocoder/common/shell_commands/tests/test_integration.py +664 -0
  283. autocoder/common/shell_commands/tests/test_monitoring.py +546 -0
  284. autocoder/common/shell_commands/tests/test_performance.py +632 -0
  285. autocoder/common/shell_commands/tests/test_process_cleanup.py +397 -0
  286. autocoder/common/shell_commands/tests/test_process_manager.py +606 -0
  287. autocoder/common/shell_commands/tests/test_timeout_config.py +343 -0
  288. autocoder/common/shell_commands/tests/test_timeout_manager.py +520 -0
  289. autocoder/common/shell_commands/timeout_config.py +315 -0
  290. autocoder/common/shell_commands/timeout_manager.py +352 -0
  291. autocoder/common/terminal_paste/__init__.py +14 -0
  292. autocoder/common/terminal_paste/demo.py +145 -0
  293. autocoder/common/terminal_paste/demo_paste_functionality.py +95 -0
  294. autocoder/common/terminal_paste/paste_handler.py +200 -0
  295. autocoder/common/terminal_paste/paste_manager.py +118 -0
  296. autocoder/common/terminal_paste/tests/__init__.py +1 -0
  297. autocoder/common/terminal_paste/tests/test_paste_handler.py +182 -0
  298. autocoder/common/terminal_paste/tests/test_paste_manager.py +126 -0
  299. autocoder/common/terminal_paste/utils.py +163 -0
  300. autocoder/common/test_autocoder_args.py +232 -0
  301. autocoder/common/test_env_manager.py +173 -0
  302. autocoder/common/test_env_manager_integration.py +159 -0
  303. autocoder/common/text_similarity/__init__.py +9 -0
  304. autocoder/common/text_similarity/demo.py +216 -0
  305. autocoder/common/text_similarity/examples.py +266 -0
  306. autocoder/common/text_similarity/test_text_similarity.py +306 -0
  307. autocoder/common/text_similarity/text_similarity.py +194 -0
  308. autocoder/common/text_similarity/utils.py +125 -0
  309. autocoder/common/todos/__init__.py +61 -0
  310. autocoder/common/todos/cache/__init__.py +16 -0
  311. autocoder/common/todos/cache/base_cache.py +89 -0
  312. autocoder/common/todos/cache/cache_manager.py +228 -0
  313. autocoder/common/todos/cache/memory_cache.py +225 -0
  314. autocoder/common/todos/config.py +155 -0
  315. autocoder/common/todos/exceptions.py +35 -0
  316. autocoder/common/todos/get_todo_manager.py +161 -0
  317. autocoder/common/todos/manager.py +537 -0
  318. autocoder/common/todos/models.py +239 -0
  319. autocoder/common/todos/storage/__init__.py +14 -0
  320. autocoder/common/todos/storage/base_storage.py +76 -0
  321. autocoder/common/todos/storage/file_storage.py +278 -0
  322. autocoder/common/tokens/__init__.py +15 -0
  323. autocoder/common/tokens/counter.py +44 -2
  324. autocoder/common/tools_manager/__init__.py +17 -0
  325. autocoder/common/tools_manager/examples.py +162 -0
  326. autocoder/common/tools_manager/manager.py +385 -0
  327. autocoder/common/tools_manager/models.py +39 -0
  328. autocoder/common/tools_manager/test_tools_manager.py +303 -0
  329. autocoder/common/tools_manager/utils.py +191 -0
  330. autocoder/common/v2/agent/agentic_callbacks.py +270 -0
  331. autocoder/common/v2/agent/agentic_edit.py +2729 -2052
  332. autocoder/common/v2/agent/agentic_edit_change_manager.py +474 -0
  333. autocoder/common/v2/agent/agentic_edit_tools/__init__.py +43 -2
  334. autocoder/common/v2/agent/agentic_edit_tools/ac_mod_list_tool_resolver.py +279 -0
  335. autocoder/common/v2/agent/agentic_edit_tools/ac_mod_read_tool_resolver.py +40 -0
  336. autocoder/common/v2/agent/agentic_edit_tools/ac_mod_write_tool_resolver.py +52 -0
  337. autocoder/common/v2/agent/agentic_edit_tools/ask_followup_question_tool_resolver.py +8 -0
  338. autocoder/common/v2/agent/agentic_edit_tools/background_task_tool_resolver.py +1167 -0
  339. autocoder/common/v2/agent/agentic_edit_tools/base_tool_resolver.py +2 -2
  340. autocoder/common/v2/agent/agentic_edit_tools/conversation_message_ids_read_tool_resolver.py +214 -0
  341. autocoder/common/v2/agent/agentic_edit_tools/conversation_message_ids_write_tool_resolver.py +299 -0
  342. autocoder/common/v2/agent/agentic_edit_tools/count_tokens_tool_resolver.py +290 -0
  343. autocoder/common/v2/agent/agentic_edit_tools/execute_command_tool_resolver.py +565 -30
  344. autocoder/common/v2/agent/agentic_edit_tools/execute_workflow_tool_resolver.py +485 -0
  345. autocoder/common/v2/agent/agentic_edit_tools/extract_to_text_tool_resolver.py +225 -0
  346. autocoder/common/v2/agent/agentic_edit_tools/lint_report.py +79 -0
  347. autocoder/common/v2/agent/agentic_edit_tools/linter_config_models.py +343 -0
  348. autocoder/common/v2/agent/agentic_edit_tools/linter_enabled_tool_resolver.py +189 -0
  349. autocoder/common/v2/agent/agentic_edit_tools/list_files_tool_resolver.py +169 -101
  350. autocoder/common/v2/agent/agentic_edit_tools/load_extra_document_tool_resolver.py +349 -0
  351. autocoder/common/v2/agent/agentic_edit_tools/read_file_tool_resolver.py +244 -51
  352. autocoder/common/v2/agent/agentic_edit_tools/replace_in_file_tool_resolver.py +667 -147
  353. autocoder/common/v2/agent/agentic_edit_tools/run_named_subagents_tool_resolver.py +691 -0
  354. autocoder/common/v2/agent/agentic_edit_tools/search_files_tool_resolver.py +409 -140
  355. autocoder/common/v2/agent/agentic_edit_tools/session_interactive_tool_resolver.py +115 -0
  356. autocoder/common/v2/agent/agentic_edit_tools/session_start_tool_resolver.py +190 -0
  357. autocoder/common/v2/agent/agentic_edit_tools/session_stop_tool_resolver.py +76 -0
  358. autocoder/common/v2/agent/agentic_edit_tools/test_write_to_file_tool_resolver.py +209 -194
  359. autocoder/common/v2/agent/agentic_edit_tools/todo_read_tool_resolver.py +135 -0
  360. autocoder/common/v2/agent/agentic_edit_tools/todo_write_tool_resolver.py +328 -0
  361. autocoder/common/v2/agent/agentic_edit_tools/use_mcp_tool_resolver.py +2 -2
  362. autocoder/common/v2/agent/agentic_edit_tools/web_crawl_tool_resolver.py +557 -0
  363. autocoder/common/v2/agent/agentic_edit_tools/web_search_tool_resolver.py +600 -0
  364. autocoder/common/v2/agent/agentic_edit_tools/write_to_file_tool_resolver.py +56 -121
  365. autocoder/common/v2/agent/agentic_edit_types.py +386 -10
  366. autocoder/common/v2/agent/runner/__init__.py +31 -0
  367. autocoder/common/v2/agent/runner/base_runner.py +92 -0
  368. autocoder/common/v2/agent/runner/file_based_event_runner.py +217 -0
  369. autocoder/common/v2/agent/runner/sdk_runner.py +182 -0
  370. autocoder/common/v2/agent/runner/terminal_runner.py +396 -0
  371. autocoder/common/v2/agent/runner/tool_display.py +589 -0
  372. autocoder/common/v2/agent/test_agentic_callbacks.py +265 -0
  373. autocoder/common/v2/agent/test_agentic_edit.py +194 -0
  374. autocoder/common/v2/agent/tool_caller/__init__.py +24 -0
  375. autocoder/common/v2/agent/tool_caller/default_tool_resolver_map.py +135 -0
  376. autocoder/common/v2/agent/tool_caller/integration_test.py +172 -0
  377. autocoder/common/v2/agent/tool_caller/plugins/__init__.py +14 -0
  378. autocoder/common/v2/agent/tool_caller/plugins/base_plugin.py +126 -0
  379. autocoder/common/v2/agent/tool_caller/plugins/examples/__init__.py +13 -0
  380. autocoder/common/v2/agent/tool_caller/plugins/examples/logging_plugin.py +164 -0
  381. autocoder/common/v2/agent/tool_caller/plugins/examples/security_filter_plugin.py +198 -0
  382. autocoder/common/v2/agent/tool_caller/plugins/plugin_interface.py +141 -0
  383. autocoder/common/v2/agent/tool_caller/test_tool_caller.py +278 -0
  384. autocoder/common/v2/agent/tool_caller/tool_call_plugin_manager.py +331 -0
  385. autocoder/common/v2/agent/tool_caller/tool_caller.py +337 -0
  386. autocoder/common/v2/agent/tool_caller/usage_example.py +193 -0
  387. autocoder/common/v2/code_agentic_editblock_manager.py +4 -4
  388. autocoder/common/v2/code_auto_generate.py +136 -78
  389. autocoder/common/v2/code_auto_generate_diff.py +135 -79
  390. autocoder/common/v2/code_auto_generate_editblock.py +174 -99
  391. autocoder/common/v2/code_auto_generate_strict_diff.py +151 -71
  392. autocoder/common/v2/code_auto_merge.py +1 -1
  393. autocoder/common/v2/code_auto_merge_editblock.py +13 -1
  394. autocoder/common/v2/code_diff_manager.py +3 -3
  395. autocoder/common/v2/code_editblock_manager.py +4 -14
  396. autocoder/common/v2/code_manager.py +1 -1
  397. autocoder/common/v2/code_strict_diff_manager.py +2 -2
  398. autocoder/common/wrap_llm_hint/__init__.py +10 -0
  399. autocoder/common/wrap_llm_hint/test_wrap_llm_hint.py +1067 -0
  400. autocoder/common/wrap_llm_hint/utils.py +432 -0
  401. autocoder/common/wrap_llm_hint/wrap_llm_hint.py +323 -0
  402. autocoder/completer/__init__.py +8 -0
  403. autocoder/completer/command_completer_v2.py +1051 -0
  404. autocoder/default_project/__init__.py +501 -0
  405. autocoder/dispacher/__init__.py +4 -12
  406. autocoder/dispacher/actions/action.py +165 -7
  407. autocoder/dispacher/actions/plugins/action_regex_project.py +2 -2
  408. autocoder/index/entry.py +117 -125
  409. autocoder/{agent → index/filter}/agentic_filter.py +323 -334
  410. autocoder/index/filter/normal_filter.py +5 -11
  411. autocoder/index/filter/quick_filter.py +1 -1
  412. autocoder/index/index.py +36 -9
  413. autocoder/index/tests/__init__.py +1 -0
  414. autocoder/index/tests/run_tests.py +195 -0
  415. autocoder/index/tests/test_entry.py +303 -0
  416. autocoder/index/tests/test_index_manager.py +314 -0
  417. autocoder/index/tests/test_module_integration.py +300 -0
  418. autocoder/index/tests/test_symbols_utils.py +183 -0
  419. autocoder/inner/__init__.py +4 -0
  420. autocoder/inner/agentic.py +932 -0
  421. autocoder/inner/async_command_handler.py +992 -0
  422. autocoder/inner/conversation_command_handlers.py +623 -0
  423. autocoder/inner/merge_command_handler.py +213 -0
  424. autocoder/inner/queue_command_handler.py +684 -0
  425. autocoder/models.py +95 -266
  426. autocoder/plugins/git_helper_plugin.py +31 -29
  427. autocoder/plugins/token_helper_plugin.py +156 -37
  428. autocoder/pyproject/__init__.py +32 -29
  429. autocoder/rag/agentic_rag.py +215 -75
  430. autocoder/rag/cache/simple_cache.py +1 -2
  431. autocoder/rag/loaders/image_loader.py +1 -1
  432. autocoder/rag/long_context_rag.py +42 -26
  433. autocoder/rag/qa_conversation_strategy.py +1 -1
  434. autocoder/rag/terminal/__init__.py +17 -0
  435. autocoder/rag/terminal/args.py +581 -0
  436. autocoder/rag/terminal/bootstrap.py +61 -0
  437. autocoder/rag/terminal/command_handlers.py +653 -0
  438. autocoder/rag/terminal/formatters/__init__.py +20 -0
  439. autocoder/rag/terminal/formatters/base.py +70 -0
  440. autocoder/rag/terminal/formatters/json_format.py +66 -0
  441. autocoder/rag/terminal/formatters/stream_json.py +95 -0
  442. autocoder/rag/terminal/formatters/text.py +28 -0
  443. autocoder/rag/terminal/init.py +120 -0
  444. autocoder/rag/terminal/utils.py +106 -0
  445. autocoder/rag/test_agentic_rag.py +389 -0
  446. autocoder/rag/test_doc_filter.py +3 -3
  447. autocoder/rag/test_long_context_rag.py +1 -1
  448. autocoder/rag/test_token_limiter.py +517 -10
  449. autocoder/rag/token_counter.py +3 -0
  450. autocoder/rag/token_limiter.py +19 -15
  451. autocoder/rag/tools/__init__.py +26 -2
  452. autocoder/rag/tools/bochaai_example.py +343 -0
  453. autocoder/rag/tools/bochaai_sdk.py +541 -0
  454. autocoder/rag/tools/metaso_example.py +268 -0
  455. autocoder/rag/tools/metaso_sdk.py +417 -0
  456. autocoder/rag/tools/recall_tool.py +28 -7
  457. autocoder/rag/tools/run_integration_tests.py +204 -0
  458. autocoder/rag/tools/test_all_providers.py +318 -0
  459. autocoder/rag/tools/test_bochaai_integration.py +482 -0
  460. autocoder/rag/tools/test_final_integration.py +215 -0
  461. autocoder/rag/tools/test_metaso_integration.py +424 -0
  462. autocoder/rag/tools/test_metaso_real.py +171 -0
  463. autocoder/rag/tools/test_web_crawl_tool.py +639 -0
  464. autocoder/rag/tools/test_web_search_tool.py +509 -0
  465. autocoder/rag/tools/todo_read_tool.py +202 -0
  466. autocoder/rag/tools/todo_write_tool.py +412 -0
  467. autocoder/rag/tools/web_crawl_tool.py +634 -0
  468. autocoder/rag/tools/web_search_tool.py +558 -0
  469. autocoder/rag/tools/web_tools_example.py +119 -0
  470. autocoder/rag/types.py +16 -0
  471. autocoder/rag/variable_holder.py +4 -2
  472. autocoder/rags.py +86 -79
  473. autocoder/regexproject/__init__.py +23 -21
  474. autocoder/run_context.py +9 -0
  475. autocoder/sdk/__init__.py +50 -161
  476. autocoder/sdk/api.py +370 -0
  477. autocoder/sdk/async_runner/__init__.py +26 -0
  478. autocoder/sdk/async_runner/async_executor.py +650 -0
  479. autocoder/sdk/async_runner/async_handler.py +356 -0
  480. autocoder/sdk/async_runner/markdown_processor.py +595 -0
  481. autocoder/sdk/async_runner/task_metadata.py +284 -0
  482. autocoder/sdk/async_runner/worktree_manager.py +438 -0
  483. autocoder/sdk/cli/__init__.py +2 -5
  484. autocoder/sdk/cli/formatters.py +28 -204
  485. autocoder/sdk/cli/handlers.py +77 -44
  486. autocoder/sdk/cli/main.py +158 -170
  487. autocoder/sdk/cli/options.py +95 -22
  488. autocoder/sdk/constants.py +139 -51
  489. autocoder/sdk/core/auto_coder_core.py +484 -267
  490. autocoder/sdk/core/bridge.py +298 -118
  491. autocoder/sdk/exceptions.py +18 -12
  492. autocoder/sdk/formatters/__init__.py +19 -0
  493. autocoder/sdk/formatters/input.py +64 -0
  494. autocoder/sdk/formatters/output.py +247 -0
  495. autocoder/sdk/formatters/stream.py +54 -0
  496. autocoder/sdk/models/__init__.py +6 -5
  497. autocoder/sdk/models/options.py +55 -18
  498. autocoder/sdk/utils/formatters.py +27 -195
  499. autocoder/suffixproject/__init__.py +28 -25
  500. autocoder/terminal/__init__.py +14 -0
  501. autocoder/terminal/app.py +454 -0
  502. autocoder/terminal/args.py +32 -0
  503. autocoder/terminal/bootstrap.py +178 -0
  504. autocoder/terminal/command_processor.py +521 -0
  505. autocoder/terminal/command_registry.py +57 -0
  506. autocoder/terminal/help.py +97 -0
  507. autocoder/terminal/tasks/__init__.py +5 -0
  508. autocoder/terminal/tasks/background.py +77 -0
  509. autocoder/terminal/tasks/task_event.py +70 -0
  510. autocoder/terminal/ui/__init__.py +13 -0
  511. autocoder/terminal/ui/completer.py +268 -0
  512. autocoder/terminal/ui/keybindings.py +75 -0
  513. autocoder/terminal/ui/session.py +41 -0
  514. autocoder/terminal/ui/toolbar.py +64 -0
  515. autocoder/terminal/utils/__init__.py +13 -0
  516. autocoder/terminal/utils/errors.py +18 -0
  517. autocoder/terminal/utils/paths.py +19 -0
  518. autocoder/terminal/utils/shell.py +43 -0
  519. autocoder/terminal_v3/__init__.py +10 -0
  520. autocoder/terminal_v3/app.py +201 -0
  521. autocoder/terminal_v3/handlers/__init__.py +5 -0
  522. autocoder/terminal_v3/handlers/command_handler.py +131 -0
  523. autocoder/terminal_v3/models/__init__.py +6 -0
  524. autocoder/terminal_v3/models/conversation_buffer.py +214 -0
  525. autocoder/terminal_v3/models/message.py +50 -0
  526. autocoder/terminal_v3/models/tool_display.py +247 -0
  527. autocoder/terminal_v3/ui/__init__.py +7 -0
  528. autocoder/terminal_v3/ui/keybindings.py +56 -0
  529. autocoder/terminal_v3/ui/layout.py +141 -0
  530. autocoder/terminal_v3/ui/styles.py +43 -0
  531. autocoder/tsproject/__init__.py +23 -23
  532. autocoder/utils/auto_coder_utils/chat_stream_out.py +1 -1
  533. autocoder/utils/llms.py +88 -80
  534. autocoder/utils/math_utils.py +101 -0
  535. autocoder/utils/model_provider_selector.py +16 -4
  536. autocoder/utils/operate_config_api.py +33 -5
  537. autocoder/utils/thread_utils.py +2 -2
  538. autocoder/version.py +4 -2
  539. autocoder/workflow_agents/__init__.py +84 -0
  540. autocoder/workflow_agents/agent.py +143 -0
  541. autocoder/workflow_agents/exceptions.py +573 -0
  542. autocoder/workflow_agents/executor.py +489 -0
  543. autocoder/workflow_agents/loader.py +737 -0
  544. autocoder/workflow_agents/runner.py +267 -0
  545. autocoder/workflow_agents/types.py +172 -0
  546. autocoder/workflow_agents/utils.py +434 -0
  547. autocoder/workflow_agents/workflow_manager.py +211 -0
  548. auto_coder-0.1.400.dist-info/METADATA +0 -396
  549. auto_coder-0.1.400.dist-info/RECORD +0 -425
  550. auto_coder-0.1.400.dist-info/licenses/LICENSE +0 -201
  551. autocoder/auto_coder_server.py +0 -672
  552. autocoder/benchmark.py +0 -138
  553. autocoder/common/ac_style_command_parser/example.py +0 -7
  554. autocoder/common/cleaner.py +0 -31
  555. autocoder/common/command_completer_v2.py +0 -615
  556. autocoder/common/directory_cache/__init__.py +0 -1
  557. autocoder/common/directory_cache/cache.py +0 -192
  558. autocoder/common/directory_cache/test_cache.py +0 -190
  559. autocoder/common/file_checkpoint/examples.py +0 -217
  560. autocoder/common/llm_friendly_package_example.py +0 -138
  561. autocoder/common/llm_friendly_package_test.py +0 -63
  562. autocoder/common/pull_requests/test_module.py +0 -1
  563. autocoder/common/rulefiles/autocoderrules_utils.py +0 -484
  564. autocoder/common/text.py +0 -30
  565. autocoder/common/v2/agent/agentic_edit_tools/list_package_info_tool_resolver.py +0 -42
  566. autocoder/common/v2/agent/agentic_edit_tools/test_execute_command_tool_resolver.py +0 -70
  567. autocoder/common/v2/agent/agentic_edit_tools/test_search_files_tool_resolver.py +0 -163
  568. autocoder/common/v2/agent/agentic_tool_display.py +0 -183
  569. autocoder/plugins/dynamic_completion_example.py +0 -148
  570. autocoder/plugins/sample_plugin.py +0 -160
  571. autocoder/sdk/cli/__main__.py +0 -26
  572. autocoder/sdk/cli/completion_wrapper.py +0 -38
  573. autocoder/sdk/cli/install_completion.py +0 -301
  574. autocoder/sdk/models/messages.py +0 -209
  575. autocoder/sdk/session/__init__.py +0 -32
  576. autocoder/sdk/session/session.py +0 -106
  577. autocoder/sdk/session/session_manager.py +0 -56
  578. {auto_coder-0.1.400.dist-info → auto_coder-2.0.0.dist-info}/top_level.txt +0 -0
  579. /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
+ ]