jarvis-ai-assistant 0.3.21__tar.gz → 0.3.22__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.22}/PKG-INFO +1 -1
  2. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.22}/pyproject.toml +1 -1
  3. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.22}/setup.py +1 -1
  4. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.22}/src/jarvis/__init__.py +1 -1
  5. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.22}/src/jarvis/jarvis_code_agent/code_agent.py +3 -2
  6. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.22}/src/jarvis/jarvis_rag/rag_pipeline.py +36 -0
  7. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.22}/src/jarvis/jarvis_rag/retriever.py +89 -0
  8. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.22}/src/jarvis/jarvis_tools/edit_file.py +17 -89
  9. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.22}/src/jarvis/jarvis_tools/registry.py +16 -6
  10. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.22}/src/jarvis/jarvis_utils/utils.py +3 -0
  11. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.22/src/jarvis_ai_assistant.egg-info}/PKG-INFO +1 -1
  12. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.22}/LICENSE +0 -0
  13. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.22}/MANIFEST.in +0 -0
  14. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.22}/README.md +0 -0
  15. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.22}/setup.cfg +0 -0
  16. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.22}/src/jarvis/jarvis_agent/__init__.py +0 -0
  17. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.22}/src/jarvis/jarvis_agent/agent_manager.py +0 -0
  18. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.22}/src/jarvis/jarvis_agent/builtin_input_handler.py +0 -0
  19. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.22}/src/jarvis/jarvis_agent/config_editor.py +0 -0
  20. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.22}/src/jarvis/jarvis_agent/edit_file_handler.py +0 -0
  21. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.22}/src/jarvis/jarvis_agent/file_methodology_manager.py +0 -0
  22. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.22}/src/jarvis/jarvis_agent/jarvis.py +0 -0
  23. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.22}/src/jarvis/jarvis_agent/main.py +0 -0
  24. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.22}/src/jarvis/jarvis_agent/memory_manager.py +0 -0
  25. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.22}/src/jarvis/jarvis_agent/methodology_share_manager.py +0 -0
  26. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.22}/src/jarvis/jarvis_agent/output_handler.py +0 -0
  27. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.22}/src/jarvis/jarvis_agent/prompt_builder.py +0 -0
  28. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.22}/src/jarvis/jarvis_agent/prompts.py +0 -0
  29. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.22}/src/jarvis/jarvis_agent/protocols.py +0 -0
  30. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.22}/src/jarvis/jarvis_agent/session_manager.py +0 -0
  31. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.22}/src/jarvis/jarvis_agent/share_manager.py +0 -0
  32. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.22}/src/jarvis/jarvis_agent/shell_input_handler.py +0 -0
  33. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.22}/src/jarvis/jarvis_agent/task_analyzer.py +0 -0
  34. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.22}/src/jarvis/jarvis_agent/task_manager.py +0 -0
  35. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.22}/src/jarvis/jarvis_agent/tool_executor.py +0 -0
  36. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.22}/src/jarvis/jarvis_agent/tool_share_manager.py +0 -0
  37. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.22}/src/jarvis/jarvis_code_agent/__init__.py +0 -0
  38. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.22}/src/jarvis/jarvis_code_agent/lint.py +0 -0
  39. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.22}/src/jarvis/jarvis_code_analysis/checklists/__init__.py +0 -0
  40. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.22}/src/jarvis/jarvis_code_analysis/checklists/c_cpp.py +0 -0
  41. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.22}/src/jarvis/jarvis_code_analysis/checklists/csharp.py +0 -0
  42. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.22}/src/jarvis/jarvis_code_analysis/checklists/data_format.py +0 -0
  43. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.22}/src/jarvis/jarvis_code_analysis/checklists/devops.py +0 -0
  44. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.22}/src/jarvis/jarvis_code_analysis/checklists/docs.py +0 -0
  45. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.22}/src/jarvis/jarvis_code_analysis/checklists/go.py +0 -0
  46. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.22}/src/jarvis/jarvis_code_analysis/checklists/infrastructure.py +0 -0
  47. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.22}/src/jarvis/jarvis_code_analysis/checklists/java.py +0 -0
  48. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.22}/src/jarvis/jarvis_code_analysis/checklists/javascript.py +0 -0
  49. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.22}/src/jarvis/jarvis_code_analysis/checklists/kotlin.py +0 -0
  50. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.22}/src/jarvis/jarvis_code_analysis/checklists/loader.py +0 -0
  51. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.22}/src/jarvis/jarvis_code_analysis/checklists/php.py +0 -0
  52. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.22}/src/jarvis/jarvis_code_analysis/checklists/python.py +0 -0
  53. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.22}/src/jarvis/jarvis_code_analysis/checklists/ruby.py +0 -0
  54. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.22}/src/jarvis/jarvis_code_analysis/checklists/rust.py +0 -0
  55. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.22}/src/jarvis/jarvis_code_analysis/checklists/shell.py +0 -0
  56. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.22}/src/jarvis/jarvis_code_analysis/checklists/sql.py +0 -0
  57. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.22}/src/jarvis/jarvis_code_analysis/checklists/swift.py +0 -0
  58. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.22}/src/jarvis/jarvis_code_analysis/checklists/web.py +0 -0
  59. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.22}/src/jarvis/jarvis_code_analysis/code_review.py +0 -0
  60. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.22}/src/jarvis/jarvis_data/config_schema.json +0 -0
  61. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.22}/src/jarvis/jarvis_data/tiktoken/9b5ad71b2ce5302211f9c61530b329a4922fc6a4 +0 -0
  62. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.22}/src/jarvis/jarvis_git_squash/__init__.py +0 -0
  63. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.22}/src/jarvis/jarvis_git_squash/main.py +0 -0
  64. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.22}/src/jarvis/jarvis_git_utils/git_commiter.py +0 -0
  65. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.22}/src/jarvis/jarvis_mcp/__init__.py +0 -0
  66. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.22}/src/jarvis/jarvis_mcp/sse_mcp_client.py +0 -0
  67. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.22}/src/jarvis/jarvis_mcp/stdio_mcp_client.py +0 -0
  68. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.22}/src/jarvis/jarvis_mcp/streamable_mcp_client.py +0 -0
  69. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.22}/src/jarvis/jarvis_memory_organizer/__init__.py +0 -0
  70. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.22}/src/jarvis/jarvis_memory_organizer/memory_organizer.py +0 -0
  71. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.22}/src/jarvis/jarvis_methodology/main.py +0 -0
  72. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.22}/src/jarvis/jarvis_multi_agent/__init__.py +0 -0
  73. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.22}/src/jarvis/jarvis_multi_agent/main.py +0 -0
  74. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.22}/src/jarvis/jarvis_platform/__init__.py +0 -0
  75. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.22}/src/jarvis/jarvis_platform/ai8.py +0 -0
  76. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.22}/src/jarvis/jarvis_platform/base.py +0 -0
  77. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.22}/src/jarvis/jarvis_platform/human.py +0 -0
  78. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.22}/src/jarvis/jarvis_platform/kimi.py +0 -0
  79. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.22}/src/jarvis/jarvis_platform/openai.py +0 -0
  80. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.22}/src/jarvis/jarvis_platform/registry.py +0 -0
  81. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.22}/src/jarvis/jarvis_platform/tongyi.py +0 -0
  82. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.22}/src/jarvis/jarvis_platform/yuanbao.py +0 -0
  83. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.22}/src/jarvis/jarvis_platform_manager/__init__.py +0 -0
  84. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.22}/src/jarvis/jarvis_platform_manager/main.py +0 -0
  85. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.22}/src/jarvis/jarvis_platform_manager/service.py +0 -0
  86. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.22}/src/jarvis/jarvis_rag/__init__.py +0 -0
  87. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.22}/src/jarvis/jarvis_rag/cache.py +0 -0
  88. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.22}/src/jarvis/jarvis_rag/cli.py +0 -0
  89. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.22}/src/jarvis/jarvis_rag/embedding_manager.py +0 -0
  90. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.22}/src/jarvis/jarvis_rag/llm_interface.py +0 -0
  91. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.22}/src/jarvis/jarvis_rag/query_rewriter.py +0 -0
  92. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.22}/src/jarvis/jarvis_rag/reranker.py +0 -0
  93. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.22}/src/jarvis/jarvis_smart_shell/__init__.py +0 -0
  94. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.22}/src/jarvis/jarvis_smart_shell/main.py +0 -0
  95. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.22}/src/jarvis/jarvis_stats/__init__.py +0 -0
  96. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.22}/src/jarvis/jarvis_stats/cli.py +0 -0
  97. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.22}/src/jarvis/jarvis_stats/stats.py +0 -0
  98. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.22}/src/jarvis/jarvis_stats/storage.py +0 -0
  99. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.22}/src/jarvis/jarvis_stats/visualizer.py +0 -0
  100. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.22}/src/jarvis/jarvis_tools/__init__.py +0 -0
  101. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.22}/src/jarvis/jarvis_tools/ask_user.py +0 -0
  102. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.22}/src/jarvis/jarvis_tools/base.py +0 -0
  103. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.22}/src/jarvis/jarvis_tools/clear_memory.py +0 -0
  104. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.22}/src/jarvis/jarvis_tools/cli/__init__.py +0 -0
  105. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.22}/src/jarvis/jarvis_tools/cli/main.py +0 -0
  106. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.22}/src/jarvis/jarvis_tools/execute_script.py +0 -0
  107. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.22}/src/jarvis/jarvis_tools/file_analyzer.py +0 -0
  108. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.22}/src/jarvis/jarvis_tools/generate_new_tool.py +0 -0
  109. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.22}/src/jarvis/jarvis_tools/methodology.py +0 -0
  110. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.22}/src/jarvis/jarvis_tools/read_code.py +0 -0
  111. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.22}/src/jarvis/jarvis_tools/read_webpage.py +0 -0
  112. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.22}/src/jarvis/jarvis_tools/retrieve_memory.py +0 -0
  113. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.22}/src/jarvis/jarvis_tools/rewrite_file.py +0 -0
  114. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.22}/src/jarvis/jarvis_tools/save_memory.py +0 -0
  115. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.22}/src/jarvis/jarvis_tools/search_web.py +0 -0
  116. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.22}/src/jarvis/jarvis_tools/sub_agent.py +0 -0
  117. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.22}/src/jarvis/jarvis_tools/sub_code_agent.py +0 -0
  118. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.22}/src/jarvis/jarvis_tools/virtual_tty.py +0 -0
  119. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.22}/src/jarvis/jarvis_utils/__init__.py +0 -0
  120. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.22}/src/jarvis/jarvis_utils/builtin_replace_map.py +0 -0
  121. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.22}/src/jarvis/jarvis_utils/clipboard.py +0 -0
  122. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.22}/src/jarvis/jarvis_utils/config.py +0 -0
  123. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.22}/src/jarvis/jarvis_utils/embedding.py +0 -0
  124. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.22}/src/jarvis/jarvis_utils/file_processors.py +0 -0
  125. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.22}/src/jarvis/jarvis_utils/git_utils.py +0 -0
  126. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.22}/src/jarvis/jarvis_utils/globals.py +0 -0
  127. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.22}/src/jarvis/jarvis_utils/http.py +0 -0
  128. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.22}/src/jarvis/jarvis_utils/input.py +0 -0
  129. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.22}/src/jarvis/jarvis_utils/methodology.py +0 -0
  130. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.22}/src/jarvis/jarvis_utils/output.py +0 -0
  131. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.22}/src/jarvis/jarvis_utils/tag.py +0 -0
  132. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.22}/src/jarvis_ai_assistant.egg-info/SOURCES.txt +0 -0
  133. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.22}/src/jarvis_ai_assistant.egg-info/dependency_links.txt +0 -0
  134. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.22}/src/jarvis_ai_assistant.egg-info/entry_points.txt +0 -0
  135. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.22}/src/jarvis_ai_assistant.egg-info/requires.txt +0 -0
  136. {jarvis_ai_assistant-0.3.21 → jarvis_ai_assistant-0.3.22}/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.22
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.22"
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.22",
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.22"
@@ -70,6 +70,7 @@ class CodeAgent:
70
70
  "retrieve_memory",
71
71
  "clear_memory",
72
72
  "sub_code_agent",
73
+ "edit_file",
73
74
  ]
74
75
 
75
76
  if append_tools:
@@ -86,7 +87,7 @@ class CodeAgent:
86
87
  system_prompt=code_system_prompt,
87
88
  name="CodeAgent",
88
89
  auto_complete=False,
89
- output_handler=[tool_registry, EditFileHandler()], # type: ignore
90
+ output_handler=[tool_registry], # type: ignore
90
91
  llm_type=llm_type,
91
92
  model_group=model_group,
92
93
  input_handler=[shell_input_handler, builtin_input_handler],
@@ -135,7 +136,7 @@ class CodeAgent:
135
136
  - 仅在命令行工具不足时使用专用工具
136
137
 
137
138
  ## 文件编辑工具使用规范
138
- - 对于部分文件内容修改,使用PATCH
139
+ - 对于部分文件内容修改,使用edit_file工具
139
140
  - 对于需要重写整个文件内容,使用rewrite_file工具
140
141
  - 对于简单的修改,可以使用execute_script工具执行shell命令完成
141
142
 
@@ -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,37 @@ 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("检测到索引变更,是否现在更新索引后再开始检索?", default=True):
174
+ retriever.update_index_for_changes(changed, deleted)
175
+ else:
176
+ PrettyOutput.print("已跳过索引更新,将直接使用当前索引进行检索。", OutputType.INFO)
177
+ except Exception as e:
178
+ PrettyOutput.print(f"检索前索引检查失败:{e}", OutputType.WARNING)
179
+
148
180
  def add_documents(self, documents: List[Document]):
149
181
  """
150
182
  将文档添加到向量知识库。
@@ -190,6 +222,8 @@ class JarvisRAGPipeline:
190
222
  返回:
191
223
  由LLM生成的答案。
192
224
  """
225
+ # 0. 检测索引变更并可选更新(在重写query之前)
226
+ self._pre_search_update_index_if_needed()
193
227
  # 1. 将原始查询重写为多个查询
194
228
  rewritten_queries = self._get_query_rewriter().rewrite(query_text)
195
229
 
@@ -259,6 +293,8 @@ class JarvisRAGPipeline:
259
293
  返回:
260
294
  检索到的文档列表。
261
295
  """
296
+ # 0. 检测索引变更并可选更新(在重写query之前)
297
+ self._pre_search_update_index_if_needed()
262
298
  # 1. 重写查询
263
299
  rewritten_queries = self._get_query_rewriter().rewrite(query_text)
264
300
 
@@ -211,6 +211,95 @@ 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(f"已从索引清单中移除 {removed} 个已删除的源文件记录。", OutputType.INFO)
235
+
236
+ def update_index_for_changes(self, changed: List[str], deleted: List[str]) -> None:
237
+ """
238
+ 公共方法:根据变更与删除列表更新索引。
239
+ - 对 deleted: 从向量库按 metadata.source 删除
240
+ - 对 changed: 先删除旧条目,再从源文件重建并添加
241
+ - 最后:从集合重建BM25索引,更新manifest
242
+ """
243
+ changed = list(dict.fromkeys([p for p in (changed or []) if isinstance(p, str)]))
244
+ deleted = list(dict.fromkeys([p for p in (deleted or []) if isinstance(p, str)]))
245
+
246
+ if not changed and not deleted:
247
+ return
248
+
249
+ # 先处理删除
250
+ for src in deleted:
251
+ try:
252
+ self.collection.delete(where={"source": src}) # type: ignore[arg-type]
253
+ except Exception as e:
254
+ PrettyOutput.print(f"删除源 '{src}' 时出错: {e}", OutputType.WARNING)
255
+
256
+ # 再处理变更(重建)
257
+ docs_to_add: List[Document] = []
258
+ for src in changed:
259
+ try:
260
+ # 删除旧条目
261
+ try:
262
+ self.collection.delete(where={"source": src}) # type: ignore[arg-type]
263
+ except Exception:
264
+ pass
265
+ # 读取源文件内容(作为单文档载入,由 add_documents 进行拆分与嵌入)
266
+ with open(src, "r", encoding="utf-8", errors="ignore") as f:
267
+ content = f.read()
268
+ docs_to_add.append(Document(page_content=content, metadata={"source": src}))
269
+ except Exception as e:
270
+ PrettyOutput.print(f"重建源 '{src}' 内容时出错: {e}", OutputType.WARNING)
271
+
272
+ if docs_to_add:
273
+ try:
274
+ # 复用现有拆分与嵌入逻辑
275
+ self.add_documents(docs_to_add)
276
+ except Exception as e:
277
+ PrettyOutput.print(f"添加变更文档到索引时出错: {e}", OutputType.ERROR)
278
+
279
+ # 重建BM25索引,确保删除后的语料被清理
280
+ try:
281
+ all_docs_in_collection = self.collection.get()
282
+ all_documents = all_docs_in_collection.get("documents") or []
283
+ self.bm25_corpus = [str(text).split() for text in all_documents if text]
284
+ self.bm25_index = BM25Okapi(self.bm25_corpus) if self.bm25_corpus else None
285
+ self._save_bm25_index()
286
+ except Exception as e:
287
+ PrettyOutput.print(f"重建BM25索引失败: {e}", OutputType.WARNING)
288
+
289
+ # 更新manifest:变更文件更新状态;删除文件从清单中移除
290
+ try:
291
+ if changed:
292
+ self._update_manifest_with_sources(changed)
293
+ if deleted:
294
+ self._remove_sources_from_manifest(deleted)
295
+ except Exception as e:
296
+ PrettyOutput.print(f"更新索引清单时出错: {e}", OutputType.WARNING)
297
+
298
+ PrettyOutput.print(
299
+ f"索引已更新:变更 {len(changed)} 个,删除 {len(deleted)} 个。",
300
+ OutputType.SUCCESS,
301
+ )
302
+
214
303
  def add_documents(
215
304
  self, documents: List[Document], chunk_size=1000, chunk_overlap=100
216
305
  ):
@@ -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,35 @@ 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
+ }
147
+ )
148
+ else:
149
+ PrettyOutput.print(
150
+ f"文件 {file_path} 处理失败", OutputType.ERROR
153
151
  )
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
202
152
  file_results.append(
203
153
  {
204
154
  "file": file_path,
205
155
  "success": False,
206
156
  "stdout": "",
207
- "stderr": stderr_message,
157
+ "stderr": result,
208
158
  }
209
159
  )
210
-
211
160
  except Exception as e:
212
161
  error_msg = f"文件搜索替换操作失败: {str(e)}"
213
162
  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
163
  file_results.append(
236
164
  {
237
165
  "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,17 @@ 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(content: str) -> Tuple[Dict[str, Dict[str, Any]], str, bool]:
613
617
  """从内容中提取工具调用。
614
618
 
615
619
  参数:
616
620
  content: 包含工具调用的内容
617
621
 
618
622
  返回:
619
- Tuple[Dict[str, Dict[str, Any]], str]:
623
+ Tuple[Dict[str, Dict[str, Any]], str, bool]:
620
624
  - 第一个元素是提取的工具调用字典
621
625
  - 第二个元素是错误消息字符串(成功时为"")
626
+ - 第三个元素是是否自动补全了结束标签
622
627
 
623
628
  异常:
624
629
  Exception: 如果工具调用缺少必要字段
@@ -627,6 +632,7 @@ class ToolRegistry(OutputHandlerProtocol):
627
632
  data = re.findall(
628
633
  ot("TOOL_CALL") + r"(.*?)" + ct("TOOL_CALL"), content, re.DOTALL
629
634
  )
635
+ auto_completed = False
630
636
  if not data:
631
637
  # can_handle 确保 ot("TOOL_CALL") 在内容中。
632
638
  # 如果数据为空,则表示 ct("TOOL_CALL") 可能丢失。
@@ -648,6 +654,7 @@ class ToolRegistry(OutputHandlerProtocol):
648
654
  # Ask user for confirmation
649
655
 
650
656
  data = temp_data
657
+ auto_completed = True
651
658
  except (yaml.YAMLError, EOFError, KeyboardInterrupt):
652
659
  # Even after fixing, it's not valid YAML, or user cancelled.
653
660
  # Fall through to the original error.
@@ -657,6 +664,7 @@ class ToolRegistry(OutputHandlerProtocol):
657
664
  return (
658
665
  {},
659
666
  f"只有{ot('TOOL_CALL')}标签,未找到{ct('TOOL_CALL')}标签,调用格式错误,请检查工具调用格式。\n{tool_call_help}",
667
+ False,
660
668
  )
661
669
  ret = []
662
670
  for item in data:
@@ -669,6 +677,7 @@ class ToolRegistry(OutputHandlerProtocol):
669
677
  {e}
670
678
 
671
679
  {tool_call_help}""",
680
+ False,
672
681
  )
673
682
 
674
683
  if "name" in msg and "arguments" in msg and "want" in msg:
@@ -679,10 +688,11 @@ class ToolRegistry(OutputHandlerProtocol):
679
688
  f"""工具调用格式错误,请检查工具调用格式(缺少name、arguments、want字段)。
680
689
 
681
690
  {tool_call_help}""",
691
+ False,
682
692
  )
683
693
  if len(ret) > 1:
684
- return {}, "检测到多个工具调用,请一次只处理一个工具调用。"
685
- return ret[0] if ret else {}, ""
694
+ return {}, "检测到多个工具调用,请一次只处理一个工具调用。", False
695
+ return ret[0] if ret else {}, "", auto_completed
686
696
 
687
697
  def register_tool(
688
698
  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.22
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