jarvis-ai-assistant 0.7.16__py3-none-any.whl → 1.0.2__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.
Files changed (279) hide show
  1. jarvis/__init__.py +1 -1
  2. jarvis/jarvis_agent/__init__.py +567 -222
  3. jarvis/jarvis_agent/agent_manager.py +19 -12
  4. jarvis/jarvis_agent/builtin_input_handler.py +79 -11
  5. jarvis/jarvis_agent/config_editor.py +7 -2
  6. jarvis/jarvis_agent/event_bus.py +24 -13
  7. jarvis/jarvis_agent/events.py +19 -1
  8. jarvis/jarvis_agent/file_context_handler.py +67 -64
  9. jarvis/jarvis_agent/file_methodology_manager.py +38 -24
  10. jarvis/jarvis_agent/jarvis.py +186 -114
  11. jarvis/jarvis_agent/language_extractors/__init__.py +8 -1
  12. jarvis/jarvis_agent/language_extractors/c_extractor.py +7 -4
  13. jarvis/jarvis_agent/language_extractors/cpp_extractor.py +9 -4
  14. jarvis/jarvis_agent/language_extractors/go_extractor.py +7 -4
  15. jarvis/jarvis_agent/language_extractors/java_extractor.py +27 -20
  16. jarvis/jarvis_agent/language_extractors/javascript_extractor.py +22 -17
  17. jarvis/jarvis_agent/language_extractors/python_extractor.py +7 -4
  18. jarvis/jarvis_agent/language_extractors/rust_extractor.py +7 -4
  19. jarvis/jarvis_agent/language_extractors/typescript_extractor.py +22 -17
  20. jarvis/jarvis_agent/language_support_info.py +250 -219
  21. jarvis/jarvis_agent/main.py +19 -23
  22. jarvis/jarvis_agent/memory_manager.py +9 -6
  23. jarvis/jarvis_agent/methodology_share_manager.py +21 -15
  24. jarvis/jarvis_agent/output_handler.py +4 -2
  25. jarvis/jarvis_agent/prompt_builder.py +7 -6
  26. jarvis/jarvis_agent/prompt_manager.py +113 -8
  27. jarvis/jarvis_agent/prompts.py +317 -85
  28. jarvis/jarvis_agent/protocols.py +5 -2
  29. jarvis/jarvis_agent/run_loop.py +192 -32
  30. jarvis/jarvis_agent/session_manager.py +7 -3
  31. jarvis/jarvis_agent/share_manager.py +23 -13
  32. jarvis/jarvis_agent/shell_input_handler.py +12 -8
  33. jarvis/jarvis_agent/stdio_redirect.py +25 -26
  34. jarvis/jarvis_agent/task_analyzer.py +29 -23
  35. jarvis/jarvis_agent/task_list.py +869 -0
  36. jarvis/jarvis_agent/task_manager.py +26 -23
  37. jarvis/jarvis_agent/tool_executor.py +6 -5
  38. jarvis/jarvis_agent/tool_share_manager.py +24 -14
  39. jarvis/jarvis_agent/user_interaction.py +3 -3
  40. jarvis/jarvis_agent/utils.py +9 -1
  41. jarvis/jarvis_agent/web_bridge.py +37 -17
  42. jarvis/jarvis_agent/web_output_sink.py +5 -2
  43. jarvis/jarvis_agent/web_server.py +165 -36
  44. jarvis/jarvis_c2rust/__init__.py +1 -1
  45. jarvis/jarvis_c2rust/cli.py +260 -141
  46. jarvis/jarvis_c2rust/collector.py +37 -18
  47. jarvis/jarvis_c2rust/constants.py +60 -0
  48. jarvis/jarvis_c2rust/library_replacer.py +242 -1010
  49. jarvis/jarvis_c2rust/library_replacer_checkpoint.py +133 -0
  50. jarvis/jarvis_c2rust/library_replacer_llm.py +287 -0
  51. jarvis/jarvis_c2rust/library_replacer_loader.py +191 -0
  52. jarvis/jarvis_c2rust/library_replacer_output.py +134 -0
  53. jarvis/jarvis_c2rust/library_replacer_prompts.py +124 -0
  54. jarvis/jarvis_c2rust/library_replacer_utils.py +188 -0
  55. jarvis/jarvis_c2rust/llm_module_agent.py +98 -1044
  56. jarvis/jarvis_c2rust/llm_module_agent_apply.py +170 -0
  57. jarvis/jarvis_c2rust/llm_module_agent_executor.py +288 -0
  58. jarvis/jarvis_c2rust/llm_module_agent_loader.py +170 -0
  59. jarvis/jarvis_c2rust/llm_module_agent_prompts.py +268 -0
  60. jarvis/jarvis_c2rust/llm_module_agent_types.py +57 -0
  61. jarvis/jarvis_c2rust/llm_module_agent_utils.py +150 -0
  62. jarvis/jarvis_c2rust/llm_module_agent_validator.py +119 -0
  63. jarvis/jarvis_c2rust/loaders.py +28 -10
  64. jarvis/jarvis_c2rust/models.py +5 -2
  65. jarvis/jarvis_c2rust/optimizer.py +192 -1974
  66. jarvis/jarvis_c2rust/optimizer_build_fix.py +286 -0
  67. jarvis/jarvis_c2rust/optimizer_clippy.py +766 -0
  68. jarvis/jarvis_c2rust/optimizer_config.py +49 -0
  69. jarvis/jarvis_c2rust/optimizer_docs.py +183 -0
  70. jarvis/jarvis_c2rust/optimizer_options.py +48 -0
  71. jarvis/jarvis_c2rust/optimizer_progress.py +469 -0
  72. jarvis/jarvis_c2rust/optimizer_report.py +52 -0
  73. jarvis/jarvis_c2rust/optimizer_unsafe.py +309 -0
  74. jarvis/jarvis_c2rust/optimizer_utils.py +469 -0
  75. jarvis/jarvis_c2rust/optimizer_visibility.py +185 -0
  76. jarvis/jarvis_c2rust/scanner.py +229 -166
  77. jarvis/jarvis_c2rust/transpiler.py +531 -2732
  78. jarvis/jarvis_c2rust/transpiler_agents.py +503 -0
  79. jarvis/jarvis_c2rust/transpiler_build.py +1294 -0
  80. jarvis/jarvis_c2rust/transpiler_codegen.py +204 -0
  81. jarvis/jarvis_c2rust/transpiler_compile.py +146 -0
  82. jarvis/jarvis_c2rust/transpiler_config.py +178 -0
  83. jarvis/jarvis_c2rust/transpiler_context.py +122 -0
  84. jarvis/jarvis_c2rust/transpiler_executor.py +516 -0
  85. jarvis/jarvis_c2rust/transpiler_generation.py +278 -0
  86. jarvis/jarvis_c2rust/transpiler_git.py +163 -0
  87. jarvis/jarvis_c2rust/transpiler_mod_utils.py +225 -0
  88. jarvis/jarvis_c2rust/transpiler_modules.py +336 -0
  89. jarvis/jarvis_c2rust/transpiler_planning.py +394 -0
  90. jarvis/jarvis_c2rust/transpiler_review.py +1196 -0
  91. jarvis/jarvis_c2rust/transpiler_symbols.py +176 -0
  92. jarvis/jarvis_c2rust/utils.py +269 -79
  93. jarvis/jarvis_code_agent/after_change.py +233 -0
  94. jarvis/jarvis_code_agent/build_validation_config.py +37 -30
  95. jarvis/jarvis_code_agent/builtin_rules.py +68 -0
  96. jarvis/jarvis_code_agent/code_agent.py +976 -1517
  97. jarvis/jarvis_code_agent/code_agent_build.py +227 -0
  98. jarvis/jarvis_code_agent/code_agent_diff.py +246 -0
  99. jarvis/jarvis_code_agent/code_agent_git.py +525 -0
  100. jarvis/jarvis_code_agent/code_agent_impact.py +177 -0
  101. jarvis/jarvis_code_agent/code_agent_lint.py +283 -0
  102. jarvis/jarvis_code_agent/code_agent_llm.py +159 -0
  103. jarvis/jarvis_code_agent/code_agent_postprocess.py +105 -0
  104. jarvis/jarvis_code_agent/code_agent_prompts.py +46 -0
  105. jarvis/jarvis_code_agent/code_agent_rules.py +305 -0
  106. jarvis/jarvis_code_agent/code_analyzer/__init__.py +52 -48
  107. jarvis/jarvis_code_agent/code_analyzer/base_language.py +12 -10
  108. jarvis/jarvis_code_agent/code_analyzer/build_validator/__init__.py +12 -11
  109. jarvis/jarvis_code_agent/code_analyzer/build_validator/base.py +16 -12
  110. jarvis/jarvis_code_agent/code_analyzer/build_validator/cmake.py +26 -17
  111. jarvis/jarvis_code_agent/code_analyzer/build_validator/detector.py +558 -104
  112. jarvis/jarvis_code_agent/code_analyzer/build_validator/fallback.py +27 -16
  113. jarvis/jarvis_code_agent/code_analyzer/build_validator/go.py +22 -18
  114. jarvis/jarvis_code_agent/code_analyzer/build_validator/java_gradle.py +21 -16
  115. jarvis/jarvis_code_agent/code_analyzer/build_validator/java_maven.py +20 -16
  116. jarvis/jarvis_code_agent/code_analyzer/build_validator/makefile.py +27 -16
  117. jarvis/jarvis_code_agent/code_analyzer/build_validator/nodejs.py +47 -23
  118. jarvis/jarvis_code_agent/code_analyzer/build_validator/python.py +71 -37
  119. jarvis/jarvis_code_agent/code_analyzer/build_validator/rust.py +162 -35
  120. jarvis/jarvis_code_agent/code_analyzer/build_validator/validator.py +111 -57
  121. jarvis/jarvis_code_agent/code_analyzer/build_validator.py +18 -12
  122. jarvis/jarvis_code_agent/code_analyzer/context_manager.py +185 -183
  123. jarvis/jarvis_code_agent/code_analyzer/context_recommender.py +2 -1
  124. jarvis/jarvis_code_agent/code_analyzer/dependency_analyzer.py +24 -15
  125. jarvis/jarvis_code_agent/code_analyzer/file_ignore.py +227 -141
  126. jarvis/jarvis_code_agent/code_analyzer/impact_analyzer.py +321 -247
  127. jarvis/jarvis_code_agent/code_analyzer/language_registry.py +37 -29
  128. jarvis/jarvis_code_agent/code_analyzer/language_support.py +21 -13
  129. jarvis/jarvis_code_agent/code_analyzer/languages/__init__.py +15 -9
  130. jarvis/jarvis_code_agent/code_analyzer/languages/c_cpp_language.py +75 -45
  131. jarvis/jarvis_code_agent/code_analyzer/languages/go_language.py +87 -52
  132. jarvis/jarvis_code_agent/code_analyzer/languages/java_language.py +84 -51
  133. jarvis/jarvis_code_agent/code_analyzer/languages/javascript_language.py +94 -64
  134. jarvis/jarvis_code_agent/code_analyzer/languages/python_language.py +109 -71
  135. jarvis/jarvis_code_agent/code_analyzer/languages/rust_language.py +97 -63
  136. jarvis/jarvis_code_agent/code_analyzer/languages/typescript_language.py +103 -69
  137. jarvis/jarvis_code_agent/code_analyzer/llm_context_recommender.py +271 -268
  138. jarvis/jarvis_code_agent/code_analyzer/symbol_extractor.py +76 -64
  139. jarvis/jarvis_code_agent/code_analyzer/tree_sitter_extractor.py +92 -19
  140. jarvis/jarvis_code_agent/diff_visualizer.py +998 -0
  141. jarvis/jarvis_code_agent/lint.py +223 -524
  142. jarvis/jarvis_code_agent/rule_share_manager.py +158 -0
  143. jarvis/jarvis_code_agent/rules/clean_code.md +144 -0
  144. jarvis/jarvis_code_agent/rules/code_review.md +115 -0
  145. jarvis/jarvis_code_agent/rules/documentation.md +165 -0
  146. jarvis/jarvis_code_agent/rules/generate_rules.md +52 -0
  147. jarvis/jarvis_code_agent/rules/performance.md +158 -0
  148. jarvis/jarvis_code_agent/rules/refactoring.md +139 -0
  149. jarvis/jarvis_code_agent/rules/security.md +160 -0
  150. jarvis/jarvis_code_agent/rules/tdd.md +78 -0
  151. jarvis/jarvis_code_agent/test_rules/cpp_test.md +118 -0
  152. jarvis/jarvis_code_agent/test_rules/go_test.md +98 -0
  153. jarvis/jarvis_code_agent/test_rules/java_test.md +99 -0
  154. jarvis/jarvis_code_agent/test_rules/javascript_test.md +113 -0
  155. jarvis/jarvis_code_agent/test_rules/php_test.md +117 -0
  156. jarvis/jarvis_code_agent/test_rules/python_test.md +91 -0
  157. jarvis/jarvis_code_agent/test_rules/ruby_test.md +102 -0
  158. jarvis/jarvis_code_agent/test_rules/rust_test.md +86 -0
  159. jarvis/jarvis_code_agent/utils.py +36 -26
  160. jarvis/jarvis_code_analysis/checklists/loader.py +21 -21
  161. jarvis/jarvis_code_analysis/code_review.py +64 -33
  162. jarvis/jarvis_data/config_schema.json +285 -192
  163. jarvis/jarvis_git_squash/main.py +8 -6
  164. jarvis/jarvis_git_utils/git_commiter.py +53 -76
  165. jarvis/jarvis_mcp/__init__.py +5 -2
  166. jarvis/jarvis_mcp/sse_mcp_client.py +40 -30
  167. jarvis/jarvis_mcp/stdio_mcp_client.py +27 -19
  168. jarvis/jarvis_mcp/streamable_mcp_client.py +35 -26
  169. jarvis/jarvis_memory_organizer/memory_organizer.py +78 -55
  170. jarvis/jarvis_methodology/main.py +48 -39
  171. jarvis/jarvis_multi_agent/__init__.py +56 -23
  172. jarvis/jarvis_multi_agent/main.py +15 -18
  173. jarvis/jarvis_platform/base.py +179 -111
  174. jarvis/jarvis_platform/human.py +27 -16
  175. jarvis/jarvis_platform/kimi.py +52 -45
  176. jarvis/jarvis_platform/openai.py +101 -40
  177. jarvis/jarvis_platform/registry.py +51 -33
  178. jarvis/jarvis_platform/tongyi.py +68 -38
  179. jarvis/jarvis_platform/yuanbao.py +59 -43
  180. jarvis/jarvis_platform_manager/main.py +68 -76
  181. jarvis/jarvis_platform_manager/service.py +24 -14
  182. jarvis/jarvis_rag/README_CONFIG.md +314 -0
  183. jarvis/jarvis_rag/README_DYNAMIC_LOADING.md +311 -0
  184. jarvis/jarvis_rag/README_ONLINE_MODELS.md +230 -0
  185. jarvis/jarvis_rag/__init__.py +57 -4
  186. jarvis/jarvis_rag/cache.py +3 -1
  187. jarvis/jarvis_rag/cli.py +48 -68
  188. jarvis/jarvis_rag/embedding_interface.py +39 -0
  189. jarvis/jarvis_rag/embedding_manager.py +7 -230
  190. jarvis/jarvis_rag/embeddings/__init__.py +41 -0
  191. jarvis/jarvis_rag/embeddings/base.py +114 -0
  192. jarvis/jarvis_rag/embeddings/cohere.py +66 -0
  193. jarvis/jarvis_rag/embeddings/edgefn.py +117 -0
  194. jarvis/jarvis_rag/embeddings/local.py +260 -0
  195. jarvis/jarvis_rag/embeddings/openai.py +62 -0
  196. jarvis/jarvis_rag/embeddings/registry.py +293 -0
  197. jarvis/jarvis_rag/llm_interface.py +8 -6
  198. jarvis/jarvis_rag/query_rewriter.py +8 -9
  199. jarvis/jarvis_rag/rag_pipeline.py +61 -52
  200. jarvis/jarvis_rag/reranker.py +7 -75
  201. jarvis/jarvis_rag/reranker_interface.py +32 -0
  202. jarvis/jarvis_rag/rerankers/__init__.py +41 -0
  203. jarvis/jarvis_rag/rerankers/base.py +109 -0
  204. jarvis/jarvis_rag/rerankers/cohere.py +67 -0
  205. jarvis/jarvis_rag/rerankers/edgefn.py +140 -0
  206. jarvis/jarvis_rag/rerankers/jina.py +79 -0
  207. jarvis/jarvis_rag/rerankers/local.py +89 -0
  208. jarvis/jarvis_rag/rerankers/registry.py +293 -0
  209. jarvis/jarvis_rag/retriever.py +58 -43
  210. jarvis/jarvis_sec/__init__.py +66 -141
  211. jarvis/jarvis_sec/agents.py +21 -17
  212. jarvis/jarvis_sec/analysis.py +80 -33
  213. jarvis/jarvis_sec/checkers/__init__.py +7 -13
  214. jarvis/jarvis_sec/checkers/c_checker.py +356 -164
  215. jarvis/jarvis_sec/checkers/rust_checker.py +47 -29
  216. jarvis/jarvis_sec/cli.py +43 -21
  217. jarvis/jarvis_sec/clustering.py +430 -272
  218. jarvis/jarvis_sec/file_manager.py +99 -55
  219. jarvis/jarvis_sec/parsers.py +9 -6
  220. jarvis/jarvis_sec/prompts.py +4 -3
  221. jarvis/jarvis_sec/report.py +44 -22
  222. jarvis/jarvis_sec/review.py +180 -107
  223. jarvis/jarvis_sec/status.py +50 -41
  224. jarvis/jarvis_sec/types.py +3 -0
  225. jarvis/jarvis_sec/utils.py +160 -83
  226. jarvis/jarvis_sec/verification.py +411 -181
  227. jarvis/jarvis_sec/workflow.py +132 -21
  228. jarvis/jarvis_smart_shell/main.py +28 -41
  229. jarvis/jarvis_stats/cli.py +14 -12
  230. jarvis/jarvis_stats/stats.py +28 -19
  231. jarvis/jarvis_stats/storage.py +14 -8
  232. jarvis/jarvis_stats/visualizer.py +12 -7
  233. jarvis/jarvis_tools/base.py +5 -2
  234. jarvis/jarvis_tools/clear_memory.py +13 -9
  235. jarvis/jarvis_tools/cli/main.py +23 -18
  236. jarvis/jarvis_tools/edit_file.py +572 -873
  237. jarvis/jarvis_tools/execute_script.py +10 -7
  238. jarvis/jarvis_tools/file_analyzer.py +7 -8
  239. jarvis/jarvis_tools/meta_agent.py +287 -0
  240. jarvis/jarvis_tools/methodology.py +5 -3
  241. jarvis/jarvis_tools/read_code.py +305 -1438
  242. jarvis/jarvis_tools/read_symbols.py +50 -17
  243. jarvis/jarvis_tools/read_webpage.py +19 -18
  244. jarvis/jarvis_tools/registry.py +435 -156
  245. jarvis/jarvis_tools/retrieve_memory.py +16 -11
  246. jarvis/jarvis_tools/save_memory.py +8 -6
  247. jarvis/jarvis_tools/search_web.py +31 -31
  248. jarvis/jarvis_tools/sub_agent.py +32 -28
  249. jarvis/jarvis_tools/sub_code_agent.py +44 -60
  250. jarvis/jarvis_tools/task_list_manager.py +1811 -0
  251. jarvis/jarvis_tools/virtual_tty.py +29 -19
  252. jarvis/jarvis_utils/__init__.py +4 -0
  253. jarvis/jarvis_utils/builtin_replace_map.py +2 -1
  254. jarvis/jarvis_utils/clipboard.py +9 -8
  255. jarvis/jarvis_utils/collections.py +331 -0
  256. jarvis/jarvis_utils/config.py +699 -194
  257. jarvis/jarvis_utils/dialogue_recorder.py +294 -0
  258. jarvis/jarvis_utils/embedding.py +6 -3
  259. jarvis/jarvis_utils/file_processors.py +7 -1
  260. jarvis/jarvis_utils/fzf.py +9 -3
  261. jarvis/jarvis_utils/git_utils.py +71 -42
  262. jarvis/jarvis_utils/globals.py +116 -32
  263. jarvis/jarvis_utils/http.py +6 -2
  264. jarvis/jarvis_utils/input.py +318 -83
  265. jarvis/jarvis_utils/jsonnet_compat.py +119 -104
  266. jarvis/jarvis_utils/methodology.py +37 -28
  267. jarvis/jarvis_utils/output.py +201 -44
  268. jarvis/jarvis_utils/utils.py +986 -628
  269. {jarvis_ai_assistant-0.7.16.dist-info → jarvis_ai_assistant-1.0.2.dist-info}/METADATA +49 -33
  270. jarvis_ai_assistant-1.0.2.dist-info/RECORD +304 -0
  271. jarvis/jarvis_code_agent/code_analyzer/structured_code.py +0 -556
  272. jarvis/jarvis_tools/generate_new_tool.py +0 -205
  273. jarvis/jarvis_tools/lsp_client.py +0 -1552
  274. jarvis/jarvis_tools/rewrite_file.py +0 -105
  275. jarvis_ai_assistant-0.7.16.dist-info/RECORD +0 -218
  276. {jarvis_ai_assistant-0.7.16.dist-info → jarvis_ai_assistant-1.0.2.dist-info}/WHEEL +0 -0
  277. {jarvis_ai_assistant-0.7.16.dist-info → jarvis_ai_assistant-1.0.2.dist-info}/entry_points.txt +0 -0
  278. {jarvis_ai_assistant-0.7.16.dist-info → jarvis_ai_assistant-1.0.2.dist-info}/licenses/LICENSE +0 -0
  279. {jarvis_ai_assistant-0.7.16.dist-info → jarvis_ai_assistant-1.0.2.dist-info}/top_level.txt +0 -0
@@ -1,8 +1,12 @@
1
1
  # -*- coding: utf-8 -*-
2
- import re
3
2
  import os
4
- from typing import Any, Tuple, List, Dict, Optional, Callable
5
-
3
+ import re
4
+ from typing import Any
5
+ from typing import Callable
6
+ from typing import Dict
7
+ from typing import List
8
+ from typing import Optional
9
+ from typing import Tuple
6
10
 
7
11
  # 语言提取器注册表(导出供其他模块使用)
8
12
  _LANGUAGE_EXTRACTORS: Dict[str, Callable[[], Optional[Any]]] = {}
@@ -34,9 +38,9 @@ def count_lines(filepath: str) -> int:
34
38
  def register_language_extractor(extensions, extractor_factory=None):
35
39
  """
36
40
  Register a symbol extractor for one or more file extensions.
37
-
41
+
38
42
  Can be used as a decorator or as a regular function.
39
-
43
+
40
44
  Args:
41
45
  extensions: List of file extensions (e.g., ['.py', '.pyw']) or single extension string.
42
46
  If used as decorator, this is the first argument.
@@ -44,19 +48,19 @@ def register_language_extractor(extensions, extractor_factory=None):
44
48
  The extractor must have an extract_symbols(file_path: str, content: str) method
45
49
  that returns a list of Symbol objects.
46
50
  If used as decorator, this is the decorated function.
47
-
51
+
48
52
  Examples:
49
53
  # As decorator:
50
54
  @register_language_extractor(['.py', '.pyw'])
51
55
  def create_python_extractor():
52
56
  from jarvis.jarvis_code_agent.code_analyzer.languages.python_language import PythonSymbolExtractor
53
57
  return PythonSymbolExtractor()
54
-
58
+
55
59
  # As regular function:
56
60
  def create_java_extractor():
57
61
  # ... create extractor ...
58
62
  return JavaExtractor()
59
-
63
+
60
64
  register_language_extractor('.java', create_java_extractor)
61
65
  """
62
66
  # Support both decorator and function call syntax
@@ -67,39 +71,39 @@ def register_language_extractor(extensions, extractor_factory=None):
67
71
  exts = [extensions]
68
72
  else:
69
73
  exts = extensions
70
-
74
+
71
75
  for ext in exts:
72
76
  ext_lower = ext.lower()
73
- if not ext_lower.startswith('.'):
74
- ext_lower = '.' + ext_lower
77
+ if not ext_lower.startswith("."):
78
+ ext_lower = "." + ext_lower
75
79
  _LANGUAGE_EXTRACTORS[ext_lower] = func
76
-
80
+
77
81
  return func
78
-
82
+
79
83
  return decorator
80
84
  else:
81
85
  # Used as regular function: register_language_extractor(['.ext'], factory)
82
86
  if isinstance(extensions, str):
83
87
  extensions = [extensions]
84
-
88
+
85
89
  for ext in extensions:
86
90
  ext_lower = ext.lower()
87
- if not ext_lower.startswith('.'):
88
- ext_lower = '.' + ext_lower
91
+ if not ext_lower.startswith("."):
92
+ ext_lower = "." + ext_lower
89
93
  _LANGUAGE_EXTRACTORS[ext_lower] = extractor_factory
90
94
 
91
95
 
92
96
  def _get_symbol_extractor(filepath: str) -> Optional[Any]:
93
97
  """Get appropriate symbol extractor for the file based on extension"""
94
98
  ext = os.path.splitext(filepath)[1].lower()
95
-
99
+
96
100
  # Check registered extractors
97
101
  if ext in _LANGUAGE_EXTRACTORS:
98
102
  try:
99
103
  return _LANGUAGE_EXTRACTORS[ext]()
100
104
  except Exception:
101
105
  return None
102
-
106
+
103
107
  return None
104
108
 
105
109
 
@@ -111,29 +115,30 @@ except (ImportError, Exception):
111
115
  pass
112
116
 
113
117
 
114
-
115
118
  def extract_symbols_from_file(filepath: str) -> List[Dict[str, Any]]:
116
119
  """Extract symbols from a file using tree-sitter or AST"""
117
120
  extractor = _get_symbol_extractor(filepath)
118
121
  if not extractor:
119
122
  return []
120
-
123
+
121
124
  try:
122
125
  with open(filepath, "r", encoding="utf-8", errors="ignore") as f:
123
126
  content = f.read()
124
-
127
+
125
128
  symbols = extractor.extract_symbols(filepath, content)
126
-
129
+
127
130
  # Convert Symbol objects to dict format
128
131
  result = []
129
132
  for symbol in symbols:
130
- result.append({
131
- "name": symbol.name,
132
- "type": symbol.kind,
133
- "line": symbol.line_start,
134
- "signature": symbol.signature or f"{symbol.kind} {symbol.name}",
135
- })
136
-
133
+ result.append(
134
+ {
135
+ "name": symbol.name,
136
+ "type": symbol.kind,
137
+ "line": symbol.line_start,
138
+ "signature": symbol.signature or f"{symbol.kind} {symbol.name}",
139
+ }
140
+ )
141
+
137
142
  return result
138
143
  except Exception:
139
144
  return []
@@ -143,7 +148,7 @@ def format_symbols_output(filepath: str, symbols: List[Dict[str, Any]]) -> str:
143
148
  """Format symbols list as output string"""
144
149
  if not symbols:
145
150
  return ""
146
-
151
+
147
152
  # Group symbols by type
148
153
  by_type: Dict[str, List[Dict[str, Any]]] = {}
149
154
  for symbol in symbols:
@@ -151,14 +156,14 @@ def format_symbols_output(filepath: str, symbols: List[Dict[str, Any]]) -> str:
151
156
  if symbol_type not in by_type:
152
157
  by_type[symbol_type] = []
153
158
  by_type[symbol_type].append(symbol)
154
-
159
+
155
160
  # Sort symbols within each type by line number
156
161
  for symbol_type in by_type:
157
162
  by_type[symbol_type].sort(key=lambda x: x["line"])
158
-
163
+
159
164
  output_lines = [f"\n📋 文件符号: {filepath}"]
160
165
  output_lines.append("─" * 60)
161
-
166
+
162
167
  # Type names in Chinese
163
168
  type_names = {
164
169
  "function": "函数",
@@ -171,22 +176,22 @@ def format_symbols_output(filepath: str, symbols: List[Dict[str, Any]]) -> str:
171
176
  "variable": "变量",
172
177
  "constant": "常量",
173
178
  }
174
-
179
+
175
180
  for symbol_type, type_symbols in sorted(by_type.items()):
176
181
  type_name = type_names.get(symbol_type, symbol_type)
177
182
  output_lines.append(f"\n{type_name} ({len(type_symbols)} 个):")
178
183
  for symbol in type_symbols:
179
184
  line_info = f" 行 {symbol['line']:4d}: {symbol['name']}"
180
- if 'signature' in symbol and symbol['signature']:
181
- sig = symbol['signature'].strip()
185
+ if "signature" in symbol and symbol["signature"]:
186
+ sig = symbol["signature"].strip()
182
187
  if len(sig) > 50:
183
188
  sig = sig[:47] + "..."
184
189
  line_info += f" - {sig}"
185
190
  output_lines.append(line_info)
186
-
191
+
187
192
  output_lines.append("─" * 60)
188
193
  output_lines.append("")
189
-
194
+
190
195
  return "\n".join(output_lines)
191
196
 
192
197
 
@@ -224,12 +229,10 @@ def file_context_handler(user_input: str, agent_: Any) -> Tuple[str, bool]:
224
229
  if os.path.isfile(abs_path) and is_text_file(abs_path):
225
230
  # Extract symbols from the file
226
231
  symbols = extract_symbols_from_file(abs_path)
227
-
232
+
228
233
  if symbols:
229
- # Remove all original path tokens that map to this absolute path to avoid redundancy
230
- for _raw in abs_to_raws.get(abs_path, []):
231
- user_input = user_input.replace(f"'{_raw}'", "")
232
- # Append the formatted symbols output
234
+ # Keep the original path tokens and append symbol information as supplementary context
235
+ # This preserves the user's original reference to the file while adding symbol details
233
236
  added_context += format_symbols_output(abs_path, symbols)
234
237
 
235
238
  if added_context:
@@ -241,45 +244,45 @@ def file_context_handler(user_input: str, agent_: Any) -> Tuple[str, bool]:
241
244
  # ============================================================================
242
245
  # 如何添加新语言支持
243
246
  # ============================================================================
244
- #
247
+ #
245
248
  # 推荐方式:在 language_extractors/ 目录下创建新文件
246
- #
249
+ #
247
250
  # 1. 创建新文件:jarvis_agent/language_extractors/java_extractor.py
248
- #
251
+ #
249
252
  # # -*- coding: utf-8 -*-
250
253
  # """Java language symbol extractor."""
251
- #
254
+ #
252
255
  # from typing import Optional, Any, List
253
256
  # from jarvis.jarvis_agent.file_context_handler import register_language_extractor
254
257
  # from jarvis.jarvis_code_agent.code_analyzer.symbol_extractor import Symbol
255
- #
258
+ #
256
259
  # def create_java_extractor() -> Optional[Any]:
257
260
  # try:
258
261
  # from tree_sitter import Language, Parser
259
262
  # import tree_sitter_java
260
- #
263
+ #
261
264
  # JAVA_LANGUAGE = tree_sitter_java.language()
262
265
  # JAVA_SYMBOL_QUERY = """
263
266
  # (method_declaration
264
267
  # name: (identifier) @method.name)
265
- #
268
+ #
266
269
  # (class_declaration
267
270
  # name: (identifier) @class.name)
268
271
  # """
269
- #
272
+ #
270
273
  # class JavaSymbolExtractor:
271
274
  # def __init__(self):
272
275
  # self.language = JAVA_LANGUAGE
273
276
  # self.parser = Parser()
274
277
  # self.parser.set_language(self.language)
275
278
  # self.symbol_query = JAVA_SYMBOL_QUERY
276
- #
279
+ #
277
280
  # def extract_symbols(self, file_path: str, content: str) -> List[Any]:
278
281
  # try:
279
282
  # tree = self.parser.parse(bytes(content, "utf8"))
280
283
  # query = self.language.query(self.symbol_query)
281
284
  # captures = query.captures(tree.root_node)
282
- #
285
+ #
283
286
  # symbols = []
284
287
  # for node, name in captures:
285
288
  # kind_map = {
@@ -298,32 +301,32 @@ def file_context_handler(user_input: str, agent_: Any) -> Tuple[str, bool]:
298
301
  # return symbols
299
302
  # except Exception:
300
303
  # return []
301
- #
304
+ #
302
305
  # return JavaSymbolExtractor()
303
306
  # except (ImportError, Exception):
304
307
  # return None
305
- #
308
+ #
306
309
  # def register_java_extractor() -> None:
307
310
  # register_language_extractor(['.java', '.jav'], create_java_extractor)
308
- #
309
- #
311
+ #
312
+ #
310
313
  # 2. 在 language_extractors/__init__.py 中添加导入和注册:
311
- #
314
+ #
312
315
  # try:
313
316
  # from .java_extractor import register_java_extractor
314
317
  # register_java_extractor()
315
318
  # except (ImportError, Exception):
316
319
  # pass
317
- #
318
- #
320
+ #
321
+ #
319
322
  # 方法2: 在运行时动态注册(不推荐,但可用)
320
- #
323
+ #
321
324
  # from jarvis.jarvis_agent.file_context_handler import register_language_extractor
322
- #
325
+ #
323
326
  # def create_ruby_extractor():
324
327
  # # ... 实现提取器 ...
325
328
  # return RubyExtractor()
326
- #
329
+ #
327
330
  # register_language_extractor('.rb', create_ruby_extractor)
328
- #
331
+ #
329
332
  # ============================================================================
@@ -3,11 +3,16 @@
3
3
  文件和方法论管理器模块
4
4
  负责处理文件上传和方法论加载功能
5
5
  """
6
+
6
7
  import os
7
8
  import tempfile
8
9
 
9
- from jarvis.jarvis_utils.methodology import load_methodology, upload_methodology
10
10
  from jarvis.jarvis_agent.utils import join_prompts
11
+ from jarvis.jarvis_utils.config import get_normal_model_name
12
+ from jarvis.jarvis_utils.config import get_normal_platform_name
13
+ from jarvis.jarvis_utils.methodology import load_methodology
14
+ from jarvis.jarvis_utils.methodology import upload_methodology
15
+ from jarvis.jarvis_utils.output import PrettyOutput
11
16
 
12
17
 
13
18
  class FileMethodologyManager:
@@ -38,39 +43,45 @@ class FileMethodologyManager:
38
43
 
39
44
  def _handle_methodology_upload(self):
40
45
  """处理方法论上传"""
41
- if not upload_methodology(self.agent.model, other_files=self.agent.files): # type: ignore
46
+ if not upload_methodology(self.agent.model, other_files=self.agent.files):
42
47
  if self.agent.files:
43
- print("⚠️ 文件上传失败,将忽略文件列表")
48
+ PrettyOutput.auto_print("⚠️ 文件上传失败,将忽略文件列表")
44
49
  # 上传失败则回退到本地加载
45
50
  self._load_local_methodology()
46
51
  else:
47
52
  # 上传成功
48
53
 
49
54
  if self.agent.files:
50
- self.agent.session.prompt = join_prompts([
51
- self.agent.session.prompt,
52
- "上传的文件包含历史对话信息和方法论文件,可以从中获取一些经验信息。"
53
- ])
55
+ self.agent.session.prompt = join_prompts(
56
+ [
57
+ self.agent.session.prompt,
58
+ "上传的文件包含历史对话信息和方法论文件,可以从中获取一些经验信息。",
59
+ ]
60
+ )
54
61
  else:
55
- self.agent.session.prompt = join_prompts([
56
- self.agent.session.prompt,
57
- "上传的文件包含历史对话信息,可以从中获取一些经验信息。"
58
- ])
62
+ self.agent.session.prompt = join_prompts(
63
+ [
64
+ self.agent.session.prompt,
65
+ "上传的文件包含历史对话信息,可以从中获取一些经验信息。",
66
+ ]
67
+ )
59
68
 
60
69
  def _handle_files_upload(self):
61
70
  """处理普通文件上传"""
62
- if not self.agent.model.upload_files(self.agent.files): # type: ignore
63
- print("⚠️ 文件上传失败,将忽略文件列表")
71
+ if not self.agent.model.upload_files(self.agent.files):
72
+ PrettyOutput.auto_print("⚠️ 文件上传失败,将忽略文件列表")
64
73
  else:
65
- self.agent.session.prompt = join_prompts([
66
- self.agent.session.prompt,
67
- "上传的文件包含历史对话信息,可以从中获取一些经验信息。"
68
- ])
74
+ self.agent.session.prompt = join_prompts(
75
+ [
76
+ self.agent.session.prompt,
77
+ "上传的文件包含历史对话信息,可以从中获取一些经验信息。",
78
+ ]
79
+ )
69
80
 
70
81
  def _handle_local_mode(self):
71
82
  """处理本地模式(不支持文件上传)"""
72
83
  if self.agent.files:
73
- print("⚠️ 不支持上传文件,将忽略文件列表")
84
+ PrettyOutput.auto_print("⚠️ 不支持上传文件,将忽略文件列表")
74
85
  if self.agent.use_methodology:
75
86
  self._load_local_methodology()
76
87
 
@@ -83,16 +94,19 @@ class FileMethodologyManager:
83
94
  from jarvis.jarvis_agent.memory_manager import MemoryManager
84
95
 
85
96
  MemoryManager(self.agent)
97
+ # 使用normal模型加载方法论
86
98
  methodology = load_methodology(
87
99
  msg,
88
100
  self.agent.get_tool_registry(),
89
- platform_name=self.agent.model.platform_name(),
90
- model_name=self.agent.model.name(),
101
+ platform_name=get_normal_platform_name(None),
102
+ model_name=get_normal_model_name(None),
103
+ )
104
+ self.agent.session.prompt = join_prompts(
105
+ [
106
+ self.agent.session.prompt,
107
+ f"以下是历史类似问题的执行经验,可参考:\n{methodology}",
108
+ ]
91
109
  )
92
- self.agent.session.prompt = join_prompts([
93
- self.agent.session.prompt,
94
- f"以下是历史类似问题的执行经验,可参考:\n{methodology}"
95
- ])
96
110
 
97
111
  def handle_history_with_file_upload(self) -> str:
98
112
  """使用文件上传方式处理历史"""