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