jarvis-ai-assistant 0.3.21__tar.gz → 0.3.23__tar.gz

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.
Files changed (136) hide show
  1. {jarvis_ai_assistant-0.3.21/src/jarvis_ai_assistant.egg-info → jarvis_ai_assistant-0.3.23}/PKG-INFO +1 -1
  2. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.23}/pyproject.toml +1 -1
  3. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.23}/setup.py +1 -1
  4. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.23}/src/jarvis/__init__.py +1 -1
  5. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.23}/src/jarvis/jarvis_code_agent/code_agent.py +2 -2
  6. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.23}/src/jarvis/jarvis_rag/rag_pipeline.py +40 -0
  7. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.23}/src/jarvis/jarvis_rag/retriever.py +99 -0
  8. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.23}/src/jarvis/jarvis_tools/edit_file.py +15 -89
  9. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.23}/src/jarvis/jarvis_tools/registry.py +18 -6
  10. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.23}/src/jarvis/jarvis_utils/utils.py +3 -0
  11. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.23/src/jarvis_ai_assistant.egg-info}/PKG-INFO +1 -1
  12. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.23}/LICENSE +0 -0
  13. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.23}/MANIFEST.in +0 -0
  14. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.23}/README.md +0 -0
  15. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.23}/setup.cfg +0 -0
  16. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.23}/src/jarvis/jarvis_agent/__init__.py +0 -0
  17. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.23}/src/jarvis/jarvis_agent/agent_manager.py +0 -0
  18. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.23}/src/jarvis/jarvis_agent/builtin_input_handler.py +0 -0
  19. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.23}/src/jarvis/jarvis_agent/config_editor.py +0 -0
  20. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.23}/src/jarvis/jarvis_agent/edit_file_handler.py +0 -0
  21. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.23}/src/jarvis/jarvis_agent/file_methodology_manager.py +0 -0
  22. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.23}/src/jarvis/jarvis_agent/jarvis.py +0 -0
  23. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.23}/src/jarvis/jarvis_agent/main.py +0 -0
  24. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.23}/src/jarvis/jarvis_agent/memory_manager.py +0 -0
  25. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.23}/src/jarvis/jarvis_agent/methodology_share_manager.py +0 -0
  26. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.23}/src/jarvis/jarvis_agent/output_handler.py +0 -0
  27. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.23}/src/jarvis/jarvis_agent/prompt_builder.py +0 -0
  28. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.23}/src/jarvis/jarvis_agent/prompts.py +0 -0
  29. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.23}/src/jarvis/jarvis_agent/protocols.py +0 -0
  30. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.23}/src/jarvis/jarvis_agent/session_manager.py +0 -0
  31. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.23}/src/jarvis/jarvis_agent/share_manager.py +0 -0
  32. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.23}/src/jarvis/jarvis_agent/shell_input_handler.py +0 -0
  33. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.23}/src/jarvis/jarvis_agent/task_analyzer.py +0 -0
  34. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.23}/src/jarvis/jarvis_agent/task_manager.py +0 -0
  35. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.23}/src/jarvis/jarvis_agent/tool_executor.py +0 -0
  36. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.23}/src/jarvis/jarvis_agent/tool_share_manager.py +0 -0
  37. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.23}/src/jarvis/jarvis_code_agent/__init__.py +0 -0
  38. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.23}/src/jarvis/jarvis_code_agent/lint.py +0 -0
  39. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.23}/src/jarvis/jarvis_code_analysis/checklists/__init__.py +0 -0
  40. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.23}/src/jarvis/jarvis_code_analysis/checklists/c_cpp.py +0 -0
  41. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.23}/src/jarvis/jarvis_code_analysis/checklists/csharp.py +0 -0
  42. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.23}/src/jarvis/jarvis_code_analysis/checklists/data_format.py +0 -0
  43. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.23}/src/jarvis/jarvis_code_analysis/checklists/devops.py +0 -0
  44. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.23}/src/jarvis/jarvis_code_analysis/checklists/docs.py +0 -0
  45. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.23}/src/jarvis/jarvis_code_analysis/checklists/go.py +0 -0
  46. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.23}/src/jarvis/jarvis_code_analysis/checklists/infrastructure.py +0 -0
  47. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.23}/src/jarvis/jarvis_code_analysis/checklists/java.py +0 -0
  48. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.23}/src/jarvis/jarvis_code_analysis/checklists/javascript.py +0 -0
  49. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.23}/src/jarvis/jarvis_code_analysis/checklists/kotlin.py +0 -0
  50. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.23}/src/jarvis/jarvis_code_analysis/checklists/loader.py +0 -0
  51. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.23}/src/jarvis/jarvis_code_analysis/checklists/php.py +0 -0
  52. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.23}/src/jarvis/jarvis_code_analysis/checklists/python.py +0 -0
  53. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.23}/src/jarvis/jarvis_code_analysis/checklists/ruby.py +0 -0
  54. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.23}/src/jarvis/jarvis_code_analysis/checklists/rust.py +0 -0
  55. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.23}/src/jarvis/jarvis_code_analysis/checklists/shell.py +0 -0
  56. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.23}/src/jarvis/jarvis_code_analysis/checklists/sql.py +0 -0
  57. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.23}/src/jarvis/jarvis_code_analysis/checklists/swift.py +0 -0
  58. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.23}/src/jarvis/jarvis_code_analysis/checklists/web.py +0 -0
  59. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.23}/src/jarvis/jarvis_code_analysis/code_review.py +0 -0
  60. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.23}/src/jarvis/jarvis_data/config_schema.json +0 -0
  61. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.23}/src/jarvis/jarvis_data/tiktoken/9b5ad71b2ce5302211f9c61530b329a4922fc6a4 +0 -0
  62. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.23}/src/jarvis/jarvis_git_squash/__init__.py +0 -0
  63. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.23}/src/jarvis/jarvis_git_squash/main.py +0 -0
  64. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.23}/src/jarvis/jarvis_git_utils/git_commiter.py +0 -0
  65. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.23}/src/jarvis/jarvis_mcp/__init__.py +0 -0
  66. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.23}/src/jarvis/jarvis_mcp/sse_mcp_client.py +0 -0
  67. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.23}/src/jarvis/jarvis_mcp/stdio_mcp_client.py +0 -0
  68. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.23}/src/jarvis/jarvis_mcp/streamable_mcp_client.py +0 -0
  69. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.23}/src/jarvis/jarvis_memory_organizer/__init__.py +0 -0
  70. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.23}/src/jarvis/jarvis_memory_organizer/memory_organizer.py +0 -0
  71. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.23}/src/jarvis/jarvis_methodology/main.py +0 -0
  72. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.23}/src/jarvis/jarvis_multi_agent/__init__.py +0 -0
  73. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.23}/src/jarvis/jarvis_multi_agent/main.py +0 -0
  74. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.23}/src/jarvis/jarvis_platform/__init__.py +0 -0
  75. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.23}/src/jarvis/jarvis_platform/ai8.py +0 -0
  76. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.23}/src/jarvis/jarvis_platform/base.py +0 -0
  77. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.23}/src/jarvis/jarvis_platform/human.py +0 -0
  78. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.23}/src/jarvis/jarvis_platform/kimi.py +0 -0
  79. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.23}/src/jarvis/jarvis_platform/openai.py +0 -0
  80. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.23}/src/jarvis/jarvis_platform/registry.py +0 -0
  81. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.23}/src/jarvis/jarvis_platform/tongyi.py +0 -0
  82. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.23}/src/jarvis/jarvis_platform/yuanbao.py +0 -0
  83. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.23}/src/jarvis/jarvis_platform_manager/__init__.py +0 -0
  84. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.23}/src/jarvis/jarvis_platform_manager/main.py +0 -0
  85. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.23}/src/jarvis/jarvis_platform_manager/service.py +0 -0
  86. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.23}/src/jarvis/jarvis_rag/__init__.py +0 -0
  87. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.23}/src/jarvis/jarvis_rag/cache.py +0 -0
  88. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.23}/src/jarvis/jarvis_rag/cli.py +0 -0
  89. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.23}/src/jarvis/jarvis_rag/embedding_manager.py +0 -0
  90. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.23}/src/jarvis/jarvis_rag/llm_interface.py +0 -0
  91. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.23}/src/jarvis/jarvis_rag/query_rewriter.py +0 -0
  92. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.23}/src/jarvis/jarvis_rag/reranker.py +0 -0
  93. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.23}/src/jarvis/jarvis_smart_shell/__init__.py +0 -0
  94. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.23}/src/jarvis/jarvis_smart_shell/main.py +0 -0
  95. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.23}/src/jarvis/jarvis_stats/__init__.py +0 -0
  96. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.23}/src/jarvis/jarvis_stats/cli.py +0 -0
  97. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.23}/src/jarvis/jarvis_stats/stats.py +0 -0
  98. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.23}/src/jarvis/jarvis_stats/storage.py +0 -0
  99. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.23}/src/jarvis/jarvis_stats/visualizer.py +0 -0
  100. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.23}/src/jarvis/jarvis_tools/__init__.py +0 -0
  101. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.23}/src/jarvis/jarvis_tools/ask_user.py +0 -0
  102. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.23}/src/jarvis/jarvis_tools/base.py +0 -0
  103. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.23}/src/jarvis/jarvis_tools/clear_memory.py +0 -0
  104. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.23}/src/jarvis/jarvis_tools/cli/__init__.py +0 -0
  105. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.23}/src/jarvis/jarvis_tools/cli/main.py +0 -0
  106. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.23}/src/jarvis/jarvis_tools/execute_script.py +0 -0
  107. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.23}/src/jarvis/jarvis_tools/file_analyzer.py +0 -0
  108. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.23}/src/jarvis/jarvis_tools/generate_new_tool.py +0 -0
  109. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.23}/src/jarvis/jarvis_tools/methodology.py +0 -0
  110. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.23}/src/jarvis/jarvis_tools/read_code.py +0 -0
  111. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.23}/src/jarvis/jarvis_tools/read_webpage.py +0 -0
  112. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.23}/src/jarvis/jarvis_tools/retrieve_memory.py +0 -0
  113. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.23}/src/jarvis/jarvis_tools/rewrite_file.py +0 -0
  114. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.23}/src/jarvis/jarvis_tools/save_memory.py +0 -0
  115. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.23}/src/jarvis/jarvis_tools/search_web.py +0 -0
  116. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.23}/src/jarvis/jarvis_tools/sub_agent.py +0 -0
  117. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.23}/src/jarvis/jarvis_tools/sub_code_agent.py +0 -0
  118. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.23}/src/jarvis/jarvis_tools/virtual_tty.py +0 -0
  119. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.23}/src/jarvis/jarvis_utils/__init__.py +0 -0
  120. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.23}/src/jarvis/jarvis_utils/builtin_replace_map.py +0 -0
  121. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.23}/src/jarvis/jarvis_utils/clipboard.py +0 -0
  122. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.23}/src/jarvis/jarvis_utils/config.py +0 -0
  123. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.23}/src/jarvis/jarvis_utils/embedding.py +0 -0
  124. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.23}/src/jarvis/jarvis_utils/file_processors.py +0 -0
  125. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.23}/src/jarvis/jarvis_utils/git_utils.py +0 -0
  126. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.23}/src/jarvis/jarvis_utils/globals.py +0 -0
  127. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.23}/src/jarvis/jarvis_utils/http.py +0 -0
  128. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.23}/src/jarvis/jarvis_utils/input.py +0 -0
  129. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.23}/src/jarvis/jarvis_utils/methodology.py +0 -0
  130. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.23}/src/jarvis/jarvis_utils/output.py +0 -0
  131. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.23}/src/jarvis/jarvis_utils/tag.py +0 -0
  132. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.23}/src/jarvis_ai_assistant.egg-info/SOURCES.txt +0 -0
  133. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.23}/src/jarvis_ai_assistant.egg-info/dependency_links.txt +0 -0
  134. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.23}/src/jarvis_ai_assistant.egg-info/entry_points.txt +0 -0
  135. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.23}/src/jarvis_ai_assistant.egg-info/requires.txt +0 -0
  136. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.23}/src/jarvis_ai_assistant.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: jarvis-ai-assistant
3
- Version: 0.3.21
3
+ Version: 0.3.23
4
4
  Summary: Jarvis: An AI assistant that uses tools to interact with the system
5
5
  Home-page: https://github.com/skyfireitdiy/Jarvis
6
6
  Author: skyfire
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "jarvis-ai-assistant"
7
- version = "0.3.21"
7
+ version = "0.3.23"
8
8
  description = "Jarvis: An AI assistant that uses tools to interact with the system"
9
9
  readme = "README.md"
10
10
  authors = [{ name = "skyfire", email = "skyfireitdiy@hotmail.com" }]
@@ -3,7 +3,7 @@ from setuptools import setup, find_packages # type: ignore
3
3
 
4
4
  setup(
5
5
  name="jarvis-ai-assistant",
6
- version="0.3.21",
6
+ version="0.3.23",
7
7
  author="skyfire",
8
8
  author_email="skyfireitdiy@hotmail.com",
9
9
  description="An AI assistant that uses various tools to interact with the system",
@@ -1,4 +1,4 @@
1
1
  # -*- coding: utf-8 -*-
2
2
  """Jarvis AI Assistant"""
3
3
 
4
- __version__ = "0.3.21"
4
+ __version__ = "0.3.23"
@@ -135,7 +135,7 @@ class CodeAgent:
135
135
  - 仅在命令行工具不足时使用专用工具
136
136
 
137
137
  ## 文件编辑工具使用规范
138
- - 对于部分文件内容修改,使用PATCH
138
+ - 对于部分文件内容修改,使用edit_file工具
139
139
  - 对于需要重写整个文件内容,使用rewrite_file工具
140
140
  - 对于简单的修改,可以使用execute_script工具执行shell命令完成
141
141
 
@@ -639,7 +639,7 @@ class CodeAgent:
639
639
  if lint_tools_info and is_enable_static_analysis():
640
640
  addon_prompt = f"""
641
641
  请对以下修改的文件进行静态扫描:
642
- {file_list}
642
+ {file_list}
643
643
  {tool_info}
644
644
  如果本次修改引入了警告和错误,请根据警告和错误信息修复代码
645
645
  注意:如果要进行静态检查,需要在所有的修改都完成之后进行集中检查,如果文件有多个检查工具,尽量一次全部调用,不要分多次调用
@@ -15,6 +15,7 @@ from jarvis.jarvis_utils.config import (
15
15
  get_rag_vector_db_path,
16
16
  get_rag_embedding_cache_path,
17
17
  )
18
+ from jarvis.jarvis_utils.utils import get_yes_no
18
19
 
19
20
 
20
21
  class JarvisRAGPipeline:
@@ -145,6 +146,41 @@ class JarvisRAGPipeline:
145
146
  self._query_rewriter = QueryRewriter(JarvisPlatform_LLM())
146
147
  return self._query_rewriter
147
148
 
149
+ def _pre_search_update_index_if_needed(self) -> None:
150
+ """
151
+ 在重写query之前执行:
152
+ - 检测索引变更(变更/删除)
153
+ - 询问用户是否立即更新索引
154
+ - 如确认,则执行增量更新并重建BM25
155
+ """
156
+ try:
157
+ retriever = self._get_retriever()
158
+ result = retriever.detect_index_changes()
159
+ changed = result.get("changed", [])
160
+ deleted = result.get("deleted", [])
161
+ if not changed and not deleted:
162
+ return
163
+ # 打印摘要
164
+ PrettyOutput.print(
165
+ f"检测到索引可能不一致:变更 {len(changed)} 个,删除 {len(deleted)} 个。",
166
+ OutputType.WARNING,
167
+ )
168
+ for p in changed[:3] if changed else []:
169
+ PrettyOutput.print(f" 变更: {p}", OutputType.WARNING)
170
+ for p in deleted[:3] if deleted else []:
171
+ PrettyOutput.print(f" 删除: {p}", OutputType.WARNING)
172
+ # 询问用户
173
+ if get_yes_no(
174
+ "检测到索引变更,是否现在更新索引后再开始检索?", default=True
175
+ ):
176
+ retriever.update_index_for_changes(changed, deleted)
177
+ else:
178
+ PrettyOutput.print(
179
+ "已跳过索引更新,将直接使用当前索引进行检索。", OutputType.INFO
180
+ )
181
+ except Exception as e:
182
+ PrettyOutput.print(f"检索前索引检查失败:{e}", OutputType.WARNING)
183
+
148
184
  def add_documents(self, documents: List[Document]):
149
185
  """
150
186
  将文档添加到向量知识库。
@@ -190,6 +226,8 @@ class JarvisRAGPipeline:
190
226
  返回:
191
227
  由LLM生成的答案。
192
228
  """
229
+ # 0. 检测索引变更并可选更新(在重写query之前)
230
+ self._pre_search_update_index_if_needed()
193
231
  # 1. 将原始查询重写为多个查询
194
232
  rewritten_queries = self._get_query_rewriter().rewrite(query_text)
195
233
 
@@ -259,6 +297,8 @@ class JarvisRAGPipeline:
259
297
  返回:
260
298
  检索到的文档列表。
261
299
  """
300
+ # 0. 检测索引变更并可选更新(在重写query之前)
301
+ self._pre_search_update_index_if_needed()
262
302
  # 1. 重写查询
263
303
  rewritten_queries = self._get_query_rewriter().rewrite(query_text)
264
304
 
@@ -211,6 +211,105 @@ class ChromaRetriever:
211
211
  OutputType.INFO,
212
212
  )
213
213
 
214
+ def detect_index_changes(self) -> Dict[str, List[str]]:
215
+ """
216
+ 公共方法:检测索引变更(变更与删除)。
217
+ 返回:
218
+ {'changed': List[str], 'deleted': List[str]}
219
+ """
220
+ return self._detect_changed_or_deleted()
221
+
222
+ def _remove_sources_from_manifest(self, sources: List[str]) -> None:
223
+ """从manifest中移除指定源文件记录并保存。"""
224
+ if not sources:
225
+ return
226
+ manifest = self._load_manifest()
227
+ removed = 0
228
+ for src in set(sources):
229
+ if src in manifest:
230
+ manifest.pop(src, None)
231
+ removed += 1
232
+ if removed > 0:
233
+ self._save_manifest(manifest)
234
+ PrettyOutput.print(
235
+ f"已从索引清单中移除 {removed} 个已删除的源文件记录。", OutputType.INFO
236
+ )
237
+
238
+ def update_index_for_changes(self, changed: List[str], deleted: List[str]) -> None:
239
+ """
240
+ 公共方法:根据变更与删除列表更新索引。
241
+ - 对 deleted: 从向量库按 metadata.source 删除
242
+ - 对 changed: 先删除旧条目,再从源文件重建并添加
243
+ - 最后:从集合重建BM25索引,更新manifest
244
+ """
245
+ changed = list(
246
+ dict.fromkeys([p for p in (changed or []) if isinstance(p, str)])
247
+ )
248
+ deleted = list(
249
+ dict.fromkeys([p for p in (deleted or []) if isinstance(p, str)])
250
+ )
251
+
252
+ if not changed and not deleted:
253
+ return
254
+
255
+ # 先处理删除
256
+ for src in deleted:
257
+ try:
258
+ self.collection.delete(where={"source": src}) # type: ignore[arg-type]
259
+ except Exception as e:
260
+ PrettyOutput.print(f"删除源 '{src}' 时出错: {e}", OutputType.WARNING)
261
+
262
+ # 再处理变更(重建)
263
+ docs_to_add: List[Document] = []
264
+ for src in changed:
265
+ try:
266
+ # 删除旧条目
267
+ try:
268
+ self.collection.delete(where={"source": src}) # type: ignore[arg-type]
269
+ except Exception:
270
+ pass
271
+ # 读取源文件内容(作为单文档载入,由 add_documents 进行拆分与嵌入)
272
+ with open(src, "r", encoding="utf-8", errors="ignore") as f:
273
+ content = f.read()
274
+ docs_to_add.append(
275
+ Document(page_content=content, metadata={"source": src})
276
+ )
277
+ except Exception as e:
278
+ PrettyOutput.print(
279
+ f"重建源 '{src}' 内容时出错: {e}", OutputType.WARNING
280
+ )
281
+
282
+ if docs_to_add:
283
+ try:
284
+ # 复用现有拆分与嵌入逻辑
285
+ self.add_documents(docs_to_add)
286
+ except Exception as e:
287
+ PrettyOutput.print(f"添加变更文档到索引时出错: {e}", OutputType.ERROR)
288
+
289
+ # 重建BM25索引,确保删除后的语料被清理
290
+ try:
291
+ all_docs_in_collection = self.collection.get()
292
+ all_documents = all_docs_in_collection.get("documents") or []
293
+ self.bm25_corpus = [str(text).split() for text in all_documents if text]
294
+ self.bm25_index = BM25Okapi(self.bm25_corpus) if self.bm25_corpus else None
295
+ self._save_bm25_index()
296
+ except Exception as e:
297
+ PrettyOutput.print(f"重建BM25索引失败: {e}", OutputType.WARNING)
298
+
299
+ # 更新manifest:变更文件更新状态;删除文件从清单中移除
300
+ try:
301
+ if changed:
302
+ self._update_manifest_with_sources(changed)
303
+ if deleted:
304
+ self._remove_sources_from_manifest(deleted)
305
+ except Exception as e:
306
+ PrettyOutput.print(f"更新索引清单时出错: {e}", OutputType.WARNING)
307
+
308
+ PrettyOutput.print(
309
+ f"索引已更新:变更 {len(changed)} 个,删除 {len(deleted)} 个。",
310
+ OutputType.SUCCESS,
311
+ )
312
+
214
313
  def add_documents(
215
314
  self, documents: List[Document], chunk_size=1000, chunk_overlap=100
216
315
  ):
@@ -31,7 +31,6 @@ class FileSearchReplaceTool:
31
31
  - reason: 修改原因描述
32
32
  - SEARCH: 需要查找的原始代码(必须包含足够上下文)
33
33
  - REPLACE: 替换后的新代码
34
- 3. 工具会自动选择最适合的编辑模式
35
34
 
36
35
  ## 核心原则
37
36
  1. **精准修改**: 只修改必要的代码部分,保持其他部分不变
@@ -132,106 +131,33 @@ class FileSearchReplaceTool:
132
131
  file_path = os.path.abspath(file_info["path"])
133
132
  changes = file_info["changes"]
134
133
 
135
- # 创建已处理文件变量,用于失败时回滚
136
- original_content = None
137
- processed = False
138
- file_success = True
139
-
140
134
  try:
141
- file_exists = os.path.exists(file_path)
142
- content = ""
143
-
144
- try:
145
- # 如果文件存在,则读取内容
146
- if file_exists:
147
- with open(file_path, "r", encoding="utf-8") as f:
148
- content = f.read()
149
- original_content = content
150
-
151
- success, temp_content = EditFileHandler._fast_edit(
152
- file_path, changes
135
+ success, result = EditFileHandler._fast_edit(file_path, changes)
136
+ if success:
137
+ stdout_message = f"文件 {file_path} 修改完成"
138
+ stdout_messages.append(stdout_message)
139
+ overall_success = True
140
+ file_results.append(
141
+ {
142
+ "file": file_path,
143
+ "success": True,
144
+ "stdout": stdout_message,
145
+ "stderr": "",
146
+ }
153
147
  )
154
- if not success:
155
- PrettyOutput.print(
156
- f"文件 {file_path} 处理失败", OutputType.ERROR
157
- )
158
- file_results.append(
159
- {
160
- "file": file_path,
161
- "success": False,
162
- "stdout": "",
163
- "stderr": temp_content,
164
- }
165
- )
166
- continue
167
-
168
- # 只有当所有替换操作都成功时,才写回文件
169
- if success and (
170
- temp_content != original_content or not file_exists
171
- ):
172
- # 确保目录存在
173
- os.makedirs(
174
- os.path.dirname(os.path.abspath(file_path)), exist_ok=True
175
- )
176
-
177
- with open(file_path, "w", encoding="utf-8") as f:
178
- f.write(temp_content)
179
-
180
- processed = True
181
-
182
- action = "创建并写入" if not file_exists else "成功修改"
183
- stdout_message = f"文件 {file_path} {action} 完成"
184
- stdout_messages.append(stdout_message)
185
-
186
- overall_success = True
187
-
188
- file_results.append(
189
- {
190
- "file": file_path,
191
- "success": True,
192
- "stdout": stdout_message,
193
- "stderr": "",
194
- }
195
- )
196
-
197
- except Exception as e:
198
- stderr_message = f"处理文件 {file_path} 时出错: {str(e)}"
199
- stderr_messages.append(stderr_message)
200
- PrettyOutput.print(stderr_message, OutputType.WARNING)
201
- file_success = False
148
+ else:
149
+ PrettyOutput.print(f"文件 {file_path} 处理失败", OutputType.ERROR)
202
150
  file_results.append(
203
151
  {
204
152
  "file": file_path,
205
153
  "success": False,
206
154
  "stdout": "",
207
- "stderr": stderr_message,
155
+ "stderr": result,
208
156
  }
209
157
  )
210
-
211
158
  except Exception as e:
212
159
  error_msg = f"文件搜索替换操作失败: {str(e)}"
213
160
  PrettyOutput.print(error_msg, OutputType.WARNING)
214
-
215
- # 如果有已修改的文件,尝试回滚
216
- if processed:
217
- rollback_message = "操作失败,正在回滚修改..."
218
- stderr_messages.append(rollback_message)
219
- PrettyOutput.print(rollback_message, OutputType.WARNING)
220
-
221
- try:
222
- if original_content is None:
223
- # 如果是新创建的文件,则删除
224
- if os.path.exists(file_path):
225
- os.remove(file_path)
226
- stderr_messages.append(f"已删除新创建的文件: {file_path}")
227
- else:
228
- # 如果是修改的文件,则恢复原内容
229
- with open(file_path, "w", encoding="utf-8") as f:
230
- f.write(original_content)
231
- stderr_messages.append(f"已回滚文件: {file_path}")
232
- except:
233
- stderr_messages.append(f"回滚文件失败: {file_path}")
234
-
235
161
  file_results.append(
236
162
  {
237
163
  "file": file_path,
@@ -172,10 +172,14 @@ class ToolRegistry(OutputHandlerProtocol):
172
172
 
173
173
  def handle(self, response: str, agent_: Any) -> Tuple[bool, Any]:
174
174
  try:
175
- tool_call, err_msg = self._extract_tool_calls(response)
175
+ tool_call, err_msg, auto_completed = self._extract_tool_calls(response)
176
176
  if err_msg:
177
177
  return False, err_msg
178
- return False, self.handle_tool_calls(tool_call, agent_)
178
+ result = self.handle_tool_calls(tool_call, agent_)
179
+ if auto_completed:
180
+ # 如果自动补全了结束标签,在结果中添加说明信息
181
+ result = f"检测到工具调用缺少结束标签,已自动补全{ct('TOOL_CALL')}。请确保后续工具调用包含完整的开始和结束标签。\n\n{result}"
182
+ return False, result
179
183
  except Exception as e:
180
184
  PrettyOutput.print(f"工具调用处理失败: {str(e)}", OutputType.ERROR)
181
185
  from jarvis.jarvis_agent import Agent
@@ -609,16 +613,19 @@ class ToolRegistry(OutputHandlerProtocol):
609
613
  )
610
614
 
611
615
  @staticmethod
612
- def _extract_tool_calls(content: str) -> Tuple[Dict[str, Dict[str, Any]], str]:
616
+ def _extract_tool_calls(
617
+ content: str,
618
+ ) -> Tuple[Dict[str, Dict[str, Any]], str, bool]:
613
619
  """从内容中提取工具调用。
614
620
 
615
621
  参数:
616
622
  content: 包含工具调用的内容
617
623
 
618
624
  返回:
619
- Tuple[Dict[str, Dict[str, Any]], str]:
625
+ Tuple[Dict[str, Dict[str, Any]], str, bool]:
620
626
  - 第一个元素是提取的工具调用字典
621
627
  - 第二个元素是错误消息字符串(成功时为"")
628
+ - 第三个元素是是否自动补全了结束标签
622
629
 
623
630
  异常:
624
631
  Exception: 如果工具调用缺少必要字段
@@ -627,6 +634,7 @@ class ToolRegistry(OutputHandlerProtocol):
627
634
  data = re.findall(
628
635
  ot("TOOL_CALL") + r"(.*?)" + ct("TOOL_CALL"), content, re.DOTALL
629
636
  )
637
+ auto_completed = False
630
638
  if not data:
631
639
  # can_handle 确保 ot("TOOL_CALL") 在内容中。
632
640
  # 如果数据为空,则表示 ct("TOOL_CALL") 可能丢失。
@@ -648,6 +656,7 @@ class ToolRegistry(OutputHandlerProtocol):
648
656
  # Ask user for confirmation
649
657
 
650
658
  data = temp_data
659
+ auto_completed = True
651
660
  except (yaml.YAMLError, EOFError, KeyboardInterrupt):
652
661
  # Even after fixing, it's not valid YAML, or user cancelled.
653
662
  # Fall through to the original error.
@@ -657,6 +666,7 @@ class ToolRegistry(OutputHandlerProtocol):
657
666
  return (
658
667
  {},
659
668
  f"只有{ot('TOOL_CALL')}标签,未找到{ct('TOOL_CALL')}标签,调用格式错误,请检查工具调用格式。\n{tool_call_help}",
669
+ False,
660
670
  )
661
671
  ret = []
662
672
  for item in data:
@@ -669,6 +679,7 @@ class ToolRegistry(OutputHandlerProtocol):
669
679
  {e}
670
680
 
671
681
  {tool_call_help}""",
682
+ False,
672
683
  )
673
684
 
674
685
  if "name" in msg and "arguments" in msg and "want" in msg:
@@ -679,10 +690,11 @@ class ToolRegistry(OutputHandlerProtocol):
679
690
  f"""工具调用格式错误,请检查工具调用格式(缺少name、arguments、want字段)。
680
691
 
681
692
  {tool_call_help}""",
693
+ False,
682
694
  )
683
695
  if len(ret) > 1:
684
- return {}, "检测到多个工具调用,请一次只处理一个工具调用。"
685
- return ret[0] if ret else {}, ""
696
+ return {}, "检测到多个工具调用,请一次只处理一个工具调用。", False
697
+ return ret[0] if ret else {}, "", auto_completed
686
698
 
687
699
  def register_tool(
688
700
  self,
@@ -29,6 +29,9 @@ from jarvis.jarvis_utils.globals import get_in_chat, get_interrupt, set_interrup
29
29
  from jarvis.jarvis_utils.input import user_confirm
30
30
  from jarvis.jarvis_utils.output import OutputType, PrettyOutput
31
31
 
32
+ # 向后兼容:导出 get_yes_no 供外部模块引用
33
+ get_yes_no = user_confirm
34
+
32
35
  g_config_file = None
33
36
 
34
37
  COMMAND_MAPPING = {
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: jarvis-ai-assistant
3
- Version: 0.3.21
3
+ Version: 0.3.23
4
4
  Summary: Jarvis: An AI assistant that uses tools to interact with the system
5
5
  Home-page: https://github.com/skyfireitdiy/Jarvis
6
6
  Author: skyfire