jarvis-ai-assistant 0.3.30__py3-none-any.whl → 0.7.6__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 (181) hide show
  1. jarvis/__init__.py +1 -1
  2. jarvis/jarvis_agent/__init__.py +458 -152
  3. jarvis/jarvis_agent/agent_manager.py +17 -13
  4. jarvis/jarvis_agent/builtin_input_handler.py +2 -6
  5. jarvis/jarvis_agent/config_editor.py +2 -7
  6. jarvis/jarvis_agent/event_bus.py +82 -12
  7. jarvis/jarvis_agent/file_context_handler.py +329 -0
  8. jarvis/jarvis_agent/file_methodology_manager.py +3 -4
  9. jarvis/jarvis_agent/jarvis.py +628 -55
  10. jarvis/jarvis_agent/language_extractors/__init__.py +57 -0
  11. jarvis/jarvis_agent/language_extractors/c_extractor.py +21 -0
  12. jarvis/jarvis_agent/language_extractors/cpp_extractor.py +21 -0
  13. jarvis/jarvis_agent/language_extractors/go_extractor.py +21 -0
  14. jarvis/jarvis_agent/language_extractors/java_extractor.py +84 -0
  15. jarvis/jarvis_agent/language_extractors/javascript_extractor.py +79 -0
  16. jarvis/jarvis_agent/language_extractors/python_extractor.py +21 -0
  17. jarvis/jarvis_agent/language_extractors/rust_extractor.py +21 -0
  18. jarvis/jarvis_agent/language_extractors/typescript_extractor.py +84 -0
  19. jarvis/jarvis_agent/language_support_info.py +486 -0
  20. jarvis/jarvis_agent/main.py +34 -10
  21. jarvis/jarvis_agent/memory_manager.py +7 -16
  22. jarvis/jarvis_agent/methodology_share_manager.py +10 -16
  23. jarvis/jarvis_agent/prompt_manager.py +1 -1
  24. jarvis/jarvis_agent/prompts.py +193 -171
  25. jarvis/jarvis_agent/protocols.py +8 -12
  26. jarvis/jarvis_agent/run_loop.py +105 -9
  27. jarvis/jarvis_agent/session_manager.py +2 -3
  28. jarvis/jarvis_agent/share_manager.py +20 -22
  29. jarvis/jarvis_agent/shell_input_handler.py +1 -2
  30. jarvis/jarvis_agent/stdio_redirect.py +295 -0
  31. jarvis/jarvis_agent/task_analyzer.py +31 -6
  32. jarvis/jarvis_agent/task_manager.py +11 -27
  33. jarvis/jarvis_agent/tool_executor.py +2 -3
  34. jarvis/jarvis_agent/tool_share_manager.py +12 -24
  35. jarvis/jarvis_agent/utils.py +5 -1
  36. jarvis/jarvis_agent/web_bridge.py +189 -0
  37. jarvis/jarvis_agent/web_output_sink.py +53 -0
  38. jarvis/jarvis_agent/web_server.py +786 -0
  39. jarvis/jarvis_c2rust/__init__.py +26 -0
  40. jarvis/jarvis_c2rust/cli.py +575 -0
  41. jarvis/jarvis_c2rust/collector.py +250 -0
  42. jarvis/jarvis_c2rust/constants.py +26 -0
  43. jarvis/jarvis_c2rust/library_replacer.py +1254 -0
  44. jarvis/jarvis_c2rust/llm_module_agent.py +1272 -0
  45. jarvis/jarvis_c2rust/loaders.py +207 -0
  46. jarvis/jarvis_c2rust/models.py +28 -0
  47. jarvis/jarvis_c2rust/optimizer.py +2157 -0
  48. jarvis/jarvis_c2rust/scanner.py +1681 -0
  49. jarvis/jarvis_c2rust/transpiler.py +2983 -0
  50. jarvis/jarvis_c2rust/utils.py +385 -0
  51. jarvis/jarvis_code_agent/build_validation_config.py +132 -0
  52. jarvis/jarvis_code_agent/code_agent.py +1371 -220
  53. jarvis/jarvis_code_agent/code_analyzer/__init__.py +65 -0
  54. jarvis/jarvis_code_agent/code_analyzer/base_language.py +74 -0
  55. jarvis/jarvis_code_agent/code_analyzer/build_validator/__init__.py +44 -0
  56. jarvis/jarvis_code_agent/code_analyzer/build_validator/base.py +106 -0
  57. jarvis/jarvis_code_agent/code_analyzer/build_validator/cmake.py +74 -0
  58. jarvis/jarvis_code_agent/code_analyzer/build_validator/detector.py +125 -0
  59. jarvis/jarvis_code_agent/code_analyzer/build_validator/fallback.py +72 -0
  60. jarvis/jarvis_code_agent/code_analyzer/build_validator/go.py +70 -0
  61. jarvis/jarvis_code_agent/code_analyzer/build_validator/java_gradle.py +53 -0
  62. jarvis/jarvis_code_agent/code_analyzer/build_validator/java_maven.py +47 -0
  63. jarvis/jarvis_code_agent/code_analyzer/build_validator/makefile.py +61 -0
  64. jarvis/jarvis_code_agent/code_analyzer/build_validator/nodejs.py +110 -0
  65. jarvis/jarvis_code_agent/code_analyzer/build_validator/python.py +154 -0
  66. jarvis/jarvis_code_agent/code_analyzer/build_validator/rust.py +110 -0
  67. jarvis/jarvis_code_agent/code_analyzer/build_validator/validator.py +153 -0
  68. jarvis/jarvis_code_agent/code_analyzer/build_validator.py +43 -0
  69. jarvis/jarvis_code_agent/code_analyzer/context_manager.py +648 -0
  70. jarvis/jarvis_code_agent/code_analyzer/context_recommender.py +18 -0
  71. jarvis/jarvis_code_agent/code_analyzer/dependency_analyzer.py +132 -0
  72. jarvis/jarvis_code_agent/code_analyzer/file_ignore.py +330 -0
  73. jarvis/jarvis_code_agent/code_analyzer/impact_analyzer.py +781 -0
  74. jarvis/jarvis_code_agent/code_analyzer/language_registry.py +185 -0
  75. jarvis/jarvis_code_agent/code_analyzer/language_support.py +110 -0
  76. jarvis/jarvis_code_agent/code_analyzer/languages/__init__.py +49 -0
  77. jarvis/jarvis_code_agent/code_analyzer/languages/c_cpp_language.py +299 -0
  78. jarvis/jarvis_code_agent/code_analyzer/languages/go_language.py +215 -0
  79. jarvis/jarvis_code_agent/code_analyzer/languages/java_language.py +212 -0
  80. jarvis/jarvis_code_agent/code_analyzer/languages/javascript_language.py +254 -0
  81. jarvis/jarvis_code_agent/code_analyzer/languages/python_language.py +269 -0
  82. jarvis/jarvis_code_agent/code_analyzer/languages/rust_language.py +281 -0
  83. jarvis/jarvis_code_agent/code_analyzer/languages/typescript_language.py +280 -0
  84. jarvis/jarvis_code_agent/code_analyzer/llm_context_recommender.py +605 -0
  85. jarvis/jarvis_code_agent/code_analyzer/structured_code.py +556 -0
  86. jarvis/jarvis_code_agent/code_analyzer/symbol_extractor.py +252 -0
  87. jarvis/jarvis_code_agent/code_analyzer/tree_sitter_extractor.py +58 -0
  88. jarvis/jarvis_code_agent/lint.py +501 -8
  89. jarvis/jarvis_code_agent/utils.py +141 -0
  90. jarvis/jarvis_code_analysis/code_review.py +493 -584
  91. jarvis/jarvis_data/config_schema.json +128 -12
  92. jarvis/jarvis_git_squash/main.py +4 -5
  93. jarvis/jarvis_git_utils/git_commiter.py +82 -75
  94. jarvis/jarvis_mcp/sse_mcp_client.py +22 -29
  95. jarvis/jarvis_mcp/stdio_mcp_client.py +12 -13
  96. jarvis/jarvis_mcp/streamable_mcp_client.py +15 -14
  97. jarvis/jarvis_memory_organizer/memory_organizer.py +55 -74
  98. jarvis/jarvis_methodology/main.py +32 -48
  99. jarvis/jarvis_multi_agent/__init__.py +287 -55
  100. jarvis/jarvis_multi_agent/main.py +36 -4
  101. jarvis/jarvis_platform/base.py +524 -202
  102. jarvis/jarvis_platform/human.py +7 -8
  103. jarvis/jarvis_platform/kimi.py +30 -36
  104. jarvis/jarvis_platform/openai.py +88 -25
  105. jarvis/jarvis_platform/registry.py +26 -10
  106. jarvis/jarvis_platform/tongyi.py +24 -25
  107. jarvis/jarvis_platform/yuanbao.py +32 -43
  108. jarvis/jarvis_platform_manager/main.py +66 -77
  109. jarvis/jarvis_platform_manager/service.py +8 -13
  110. jarvis/jarvis_rag/cli.py +53 -55
  111. jarvis/jarvis_rag/embedding_manager.py +13 -18
  112. jarvis/jarvis_rag/llm_interface.py +8 -9
  113. jarvis/jarvis_rag/query_rewriter.py +10 -21
  114. jarvis/jarvis_rag/rag_pipeline.py +24 -27
  115. jarvis/jarvis_rag/reranker.py +4 -5
  116. jarvis/jarvis_rag/retriever.py +28 -30
  117. jarvis/jarvis_sec/__init__.py +305 -0
  118. jarvis/jarvis_sec/agents.py +143 -0
  119. jarvis/jarvis_sec/analysis.py +276 -0
  120. jarvis/jarvis_sec/checkers/__init__.py +32 -0
  121. jarvis/jarvis_sec/checkers/c_checker.py +2680 -0
  122. jarvis/jarvis_sec/checkers/rust_checker.py +1108 -0
  123. jarvis/jarvis_sec/cli.py +139 -0
  124. jarvis/jarvis_sec/clustering.py +1439 -0
  125. jarvis/jarvis_sec/file_manager.py +427 -0
  126. jarvis/jarvis_sec/parsers.py +73 -0
  127. jarvis/jarvis_sec/prompts.py +268 -0
  128. jarvis/jarvis_sec/report.py +336 -0
  129. jarvis/jarvis_sec/review.py +453 -0
  130. jarvis/jarvis_sec/status.py +264 -0
  131. jarvis/jarvis_sec/types.py +20 -0
  132. jarvis/jarvis_sec/utils.py +499 -0
  133. jarvis/jarvis_sec/verification.py +848 -0
  134. jarvis/jarvis_sec/workflow.py +226 -0
  135. jarvis/jarvis_smart_shell/main.py +38 -87
  136. jarvis/jarvis_stats/cli.py +2 -2
  137. jarvis/jarvis_stats/stats.py +8 -8
  138. jarvis/jarvis_stats/storage.py +15 -21
  139. jarvis/jarvis_stats/visualizer.py +1 -1
  140. jarvis/jarvis_tools/clear_memory.py +3 -20
  141. jarvis/jarvis_tools/cli/main.py +21 -23
  142. jarvis/jarvis_tools/edit_file.py +1019 -132
  143. jarvis/jarvis_tools/execute_script.py +83 -25
  144. jarvis/jarvis_tools/file_analyzer.py +6 -9
  145. jarvis/jarvis_tools/generate_new_tool.py +14 -21
  146. jarvis/jarvis_tools/lsp_client.py +1552 -0
  147. jarvis/jarvis_tools/methodology.py +2 -3
  148. jarvis/jarvis_tools/read_code.py +1736 -35
  149. jarvis/jarvis_tools/read_symbols.py +140 -0
  150. jarvis/jarvis_tools/read_webpage.py +12 -13
  151. jarvis/jarvis_tools/registry.py +427 -200
  152. jarvis/jarvis_tools/retrieve_memory.py +20 -19
  153. jarvis/jarvis_tools/rewrite_file.py +72 -158
  154. jarvis/jarvis_tools/save_memory.py +3 -15
  155. jarvis/jarvis_tools/search_web.py +18 -18
  156. jarvis/jarvis_tools/sub_agent.py +36 -43
  157. jarvis/jarvis_tools/sub_code_agent.py +25 -26
  158. jarvis/jarvis_tools/virtual_tty.py +55 -33
  159. jarvis/jarvis_utils/clipboard.py +7 -10
  160. jarvis/jarvis_utils/config.py +232 -45
  161. jarvis/jarvis_utils/embedding.py +8 -5
  162. jarvis/jarvis_utils/fzf.py +8 -8
  163. jarvis/jarvis_utils/git_utils.py +225 -36
  164. jarvis/jarvis_utils/globals.py +3 -3
  165. jarvis/jarvis_utils/http.py +1 -1
  166. jarvis/jarvis_utils/input.py +99 -48
  167. jarvis/jarvis_utils/jsonnet_compat.py +465 -0
  168. jarvis/jarvis_utils/methodology.py +52 -48
  169. jarvis/jarvis_utils/utils.py +819 -491
  170. jarvis_ai_assistant-0.7.6.dist-info/METADATA +600 -0
  171. jarvis_ai_assistant-0.7.6.dist-info/RECORD +218 -0
  172. {jarvis_ai_assistant-0.3.30.dist-info → jarvis_ai_assistant-0.7.6.dist-info}/entry_points.txt +4 -0
  173. jarvis/jarvis_agent/config.py +0 -92
  174. jarvis/jarvis_agent/edit_file_handler.py +0 -296
  175. jarvis/jarvis_platform/ai8.py +0 -332
  176. jarvis/jarvis_tools/ask_user.py +0 -54
  177. jarvis_ai_assistant-0.3.30.dist-info/METADATA +0 -381
  178. jarvis_ai_assistant-0.3.30.dist-info/RECORD +0 -137
  179. {jarvis_ai_assistant-0.3.30.dist-info → jarvis_ai_assistant-0.7.6.dist-info}/WHEEL +0 -0
  180. {jarvis_ai_assistant-0.3.30.dist-info → jarvis_ai_assistant-0.7.6.dist-info}/licenses/LICENSE +0 -0
  181. {jarvis_ai_assistant-0.3.30.dist-info → jarvis_ai_assistant-0.7.6.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,57 @@
1
+ # -*- coding: utf-8 -*-
2
+ """Language extractors for file context handler.
3
+
4
+ This module automatically registers all language extractors.
5
+ """
6
+
7
+ # Import all language extractors to trigger registration
8
+ try:
9
+ from .python_extractor import register_python_extractor
10
+ register_python_extractor()
11
+ except (ImportError, Exception):
12
+ pass
13
+
14
+ try:
15
+ from .rust_extractor import register_rust_extractor
16
+ register_rust_extractor()
17
+ except (ImportError, Exception):
18
+ pass
19
+
20
+ try:
21
+ from .go_extractor import register_go_extractor
22
+ register_go_extractor()
23
+ except (ImportError, Exception):
24
+ pass
25
+
26
+ try:
27
+ from .c_extractor import register_c_extractor
28
+ register_c_extractor()
29
+ except (ImportError, Exception):
30
+ pass
31
+
32
+ try:
33
+ from .cpp_extractor import register_cpp_extractor
34
+ register_cpp_extractor()
35
+ except (ImportError, Exception):
36
+ pass
37
+
38
+ try:
39
+ from .javascript_extractor import register_javascript_extractor
40
+ register_javascript_extractor()
41
+ except (ImportError, Exception):
42
+ pass
43
+
44
+ try:
45
+ from .typescript_extractor import register_typescript_extractor
46
+ register_typescript_extractor()
47
+ except (ImportError, Exception):
48
+ pass
49
+
50
+ try:
51
+ from .java_extractor import register_java_extractor
52
+ register_java_extractor()
53
+ except (ImportError, Exception):
54
+ pass
55
+
56
+ __all__ = []
57
+
@@ -0,0 +1,21 @@
1
+ # -*- coding: utf-8 -*-
2
+ """C language symbol extractor."""
3
+
4
+ from typing import Optional, Any
5
+
6
+ from jarvis.jarvis_agent.file_context_handler import register_language_extractor
7
+
8
+
9
+ def create_c_extractor() -> Optional[Any]:
10
+ """Create C symbol extractor using tree-sitter."""
11
+ try:
12
+ from jarvis.jarvis_code_agent.code_analyzer.languages.c_cpp_language import CSymbolExtractor
13
+ return CSymbolExtractor()
14
+ except (ImportError, RuntimeError, Exception):
15
+ return None
16
+
17
+
18
+ def register_c_extractor() -> None:
19
+ """Register C extractor for .c and .h files."""
20
+ register_language_extractor(['.c', '.h'], create_c_extractor)
21
+
@@ -0,0 +1,21 @@
1
+ # -*- coding: utf-8 -*-
2
+ """C++ language symbol extractor."""
3
+
4
+ from typing import Optional, Any
5
+
6
+ from jarvis.jarvis_agent.file_context_handler import register_language_extractor
7
+
8
+
9
+ def create_cpp_extractor() -> Optional[Any]:
10
+ """Create C++ symbol extractor using tree-sitter."""
11
+ try:
12
+ from jarvis.jarvis_code_agent.code_analyzer.languages.c_cpp_language import CppSymbolExtractor
13
+ return CppSymbolExtractor()
14
+ except (ImportError, RuntimeError, Exception):
15
+ return None
16
+
17
+
18
+ def register_cpp_extractor() -> None:
19
+ """Register C++ extractor for .cpp, .cc, .cxx, .hpp, .hxx files."""
20
+ register_language_extractor(['.cpp', '.cc', '.cxx', '.hpp', '.hxx'], create_cpp_extractor)
21
+
@@ -0,0 +1,21 @@
1
+ # -*- coding: utf-8 -*-
2
+ """Go language symbol extractor."""
3
+
4
+ from typing import Optional, Any
5
+
6
+ from jarvis.jarvis_agent.file_context_handler import register_language_extractor
7
+
8
+
9
+ def create_go_extractor() -> Optional[Any]:
10
+ """Create Go symbol extractor using tree-sitter."""
11
+ try:
12
+ from jarvis.jarvis_code_agent.code_analyzer.languages.go_language import GoSymbolExtractor
13
+ return GoSymbolExtractor()
14
+ except (ImportError, RuntimeError, Exception):
15
+ return None
16
+
17
+
18
+ def register_go_extractor() -> None:
19
+ """Register Go extractor for .go files."""
20
+ register_language_extractor('.go', create_go_extractor)
21
+
@@ -0,0 +1,84 @@
1
+ # -*- coding: utf-8 -*-
2
+ """Java language symbol extractor."""
3
+
4
+ from typing import Optional, Any
5
+
6
+ from jarvis.jarvis_agent.file_context_handler import register_language_extractor
7
+
8
+
9
+ def create_java_extractor() -> Optional[Any]:
10
+ """Create Java symbol extractor using tree-sitter."""
11
+ try:
12
+ from jarvis.jarvis_code_agent.code_analyzer.languages.java_language import JavaSymbolExtractor
13
+ return JavaSymbolExtractor()
14
+ except (ImportError, RuntimeError, Exception):
15
+ # 如果 code_analyzer 中没有 Java 支持,尝试直接使用 tree-sitter
16
+ try:
17
+ from tree_sitter import Language, Parser
18
+ import tree_sitter_java
19
+ from jarvis.jarvis_code_agent.code_analyzer.symbol_extractor import Symbol
20
+
21
+ JAVA_LANGUAGE = tree_sitter_java.language()
22
+ JAVA_SYMBOL_QUERY = """
23
+ (method_declaration
24
+ name: (identifier) @method.name)
25
+
26
+ (class_declaration
27
+ name: (identifier) @class.name)
28
+
29
+ (interface_declaration
30
+ name: (identifier) @interface.name)
31
+
32
+ (field_declaration
33
+ (variable_declarator
34
+ name: (identifier) @field.name))
35
+ """
36
+
37
+ class JavaSymbolExtractor:
38
+ def __init__(self):
39
+ # 如果传入的是 PyCapsule,需要转换为 Language 对象
40
+ if not isinstance(JAVA_LANGUAGE, Language):
41
+ self.language = Language(JAVA_LANGUAGE)
42
+ else:
43
+ self.language = JAVA_LANGUAGE
44
+ self.parser = Parser()
45
+ # 使用 language 属性而不是 set_language 方法
46
+ self.parser.language = self.language
47
+ self.symbol_query = JAVA_SYMBOL_QUERY
48
+
49
+ def extract_symbols(self, file_path: str, content: str) -> list:
50
+ try:
51
+ tree = self.parser.parse(bytes(content, "utf8"))
52
+ query = self.language.query(self.symbol_query)
53
+ captures = query.captures(tree.root_node)
54
+
55
+ symbols = []
56
+ for node, name in captures:
57
+ kind_map = {
58
+ "method.name": "method",
59
+ "class.name": "class",
60
+ "interface.name": "interface",
61
+ "field.name": "field",
62
+ }
63
+ symbol_kind = kind_map.get(name)
64
+ if symbol_kind:
65
+ symbols.append(Symbol(
66
+ name=node.text.decode('utf8'),
67
+ kind=symbol_kind,
68
+ file_path=file_path,
69
+ line_start=node.start_point[0] + 1,
70
+ line_end=node.end_point[0] + 1,
71
+ ))
72
+ return symbols
73
+ except Exception:
74
+ return []
75
+
76
+ return JavaSymbolExtractor()
77
+ except (ImportError, Exception):
78
+ return None
79
+
80
+
81
+ def register_java_extractor() -> None:
82
+ """Register Java extractor for .java files."""
83
+ register_language_extractor('.java', create_java_extractor)
84
+
@@ -0,0 +1,79 @@
1
+ # -*- coding: utf-8 -*-
2
+ """JavaScript language symbol extractor."""
3
+
4
+ from typing import Optional, Any, List
5
+
6
+ from jarvis.jarvis_agent.file_context_handler import register_language_extractor
7
+
8
+
9
+ def create_javascript_extractor() -> Optional[Any]:
10
+ """Create JavaScript symbol extractor using tree-sitter."""
11
+ try:
12
+ from tree_sitter import Language, Parser
13
+ import tree_sitter_javascript
14
+ from jarvis.jarvis_code_agent.code_analyzer.symbol_extractor import Symbol
15
+
16
+ JS_LANGUAGE = tree_sitter_javascript.language()
17
+ JS_SYMBOL_QUERY = """
18
+ (function_declaration
19
+ name: (identifier) @function.name)
20
+
21
+ (method_definition
22
+ name: (property_identifier) @method.name)
23
+
24
+ (class_declaration
25
+ name: (identifier) @class.name)
26
+
27
+ (variable_declaration
28
+ (variable_declarator
29
+ name: (identifier) @variable.name))
30
+ """
31
+
32
+ class JSSymbolExtractor:
33
+ def __init__(self):
34
+ # 如果传入的是 PyCapsule,需要转换为 Language 对象
35
+ if not isinstance(JS_LANGUAGE, Language):
36
+ self.language = Language(JS_LANGUAGE)
37
+ else:
38
+ self.language = JS_LANGUAGE
39
+ self.parser = Parser()
40
+ # 使用 language 属性而不是 set_language 方法
41
+ self.parser.language = self.language
42
+ self.symbol_query = JS_SYMBOL_QUERY
43
+
44
+ def extract_symbols(self, file_path: str, content: str) -> List[Any]:
45
+ try:
46
+ tree = self.parser.parse(bytes(content, "utf8"))
47
+ query = self.language.query(self.symbol_query)
48
+ captures = query.captures(tree.root_node)
49
+
50
+ symbols = []
51
+ for node, name in captures:
52
+ kind_map = {
53
+ "function.name": "function",
54
+ "method.name": "method",
55
+ "class.name": "class",
56
+ "variable.name": "variable",
57
+ }
58
+ symbol_kind = kind_map.get(name)
59
+ if symbol_kind:
60
+ symbols.append(Symbol(
61
+ name=node.text.decode('utf8'),
62
+ kind=symbol_kind,
63
+ file_path=file_path,
64
+ line_start=node.start_point[0] + 1,
65
+ line_end=node.end_point[0] + 1,
66
+ ))
67
+ return symbols
68
+ except Exception:
69
+ return []
70
+
71
+ return JSSymbolExtractor()
72
+ except (ImportError, Exception):
73
+ return None
74
+
75
+
76
+ def register_javascript_extractor() -> None:
77
+ """Register JavaScript extractor for .js and .jsx files."""
78
+ register_language_extractor(['.js', '.jsx'], create_javascript_extractor)
79
+
@@ -0,0 +1,21 @@
1
+ # -*- coding: utf-8 -*-
2
+ """Python language symbol extractor."""
3
+
4
+ from typing import Optional, Any
5
+
6
+ from jarvis.jarvis_agent.file_context_handler import register_language_extractor
7
+
8
+
9
+ def create_python_extractor() -> Optional[Any]:
10
+ """Create Python symbol extractor using AST."""
11
+ try:
12
+ from jarvis.jarvis_code_agent.code_analyzer.languages.python_language import PythonSymbolExtractor
13
+ return PythonSymbolExtractor()
14
+ except (ImportError, Exception):
15
+ return None
16
+
17
+
18
+ def register_python_extractor() -> None:
19
+ """Register Python extractor for .py and .pyw files."""
20
+ register_language_extractor(['.py', '.pyw'], create_python_extractor)
21
+
@@ -0,0 +1,21 @@
1
+ # -*- coding: utf-8 -*-
2
+ """Rust language symbol extractor."""
3
+
4
+ from typing import Optional, Any
5
+
6
+ from jarvis.jarvis_agent.file_context_handler import register_language_extractor
7
+
8
+
9
+ def create_rust_extractor() -> Optional[Any]:
10
+ """Create Rust symbol extractor using tree-sitter."""
11
+ try:
12
+ from jarvis.jarvis_code_agent.code_analyzer.languages.rust_language import RustSymbolExtractor
13
+ return RustSymbolExtractor()
14
+ except (ImportError, RuntimeError, Exception):
15
+ return None
16
+
17
+
18
+ def register_rust_extractor() -> None:
19
+ """Register Rust extractor for .rs files."""
20
+ register_language_extractor('.rs', create_rust_extractor)
21
+
@@ -0,0 +1,84 @@
1
+ # -*- coding: utf-8 -*-
2
+ """TypeScript language symbol extractor."""
3
+
4
+ from typing import Optional, Any, List
5
+
6
+ from jarvis.jarvis_agent.file_context_handler import register_language_extractor
7
+
8
+
9
+ def create_typescript_extractor() -> Optional[Any]:
10
+ """Create TypeScript symbol extractor using tree-sitter."""
11
+ try:
12
+ from tree_sitter import Language, Parser
13
+ import tree_sitter_typescript
14
+ from jarvis.jarvis_code_agent.code_analyzer.symbol_extractor import Symbol
15
+
16
+ # tree-sitter-typescript 使用 language_typescript() 和 language_tsx()
17
+ TS_LANGUAGE = tree_sitter_typescript.language_typescript()
18
+ TS_SYMBOL_QUERY = """
19
+ (function_declaration
20
+ name: (identifier) @function.name)
21
+
22
+ (method_definition
23
+ name: (property_identifier) @method.name)
24
+
25
+ (class_declaration
26
+ name: (type_identifier) @class.name)
27
+
28
+ (interface_declaration
29
+ name: (type_identifier) @interface.name)
30
+
31
+ (variable_declaration
32
+ (variable_declarator
33
+ name: (identifier) @variable.name))
34
+ """
35
+
36
+ class TSSymbolExtractor:
37
+ def __init__(self):
38
+ # 如果传入的是 PyCapsule,需要转换为 Language 对象
39
+ if not isinstance(TS_LANGUAGE, Language):
40
+ self.language = Language(TS_LANGUAGE)
41
+ else:
42
+ self.language = TS_LANGUAGE
43
+ self.parser = Parser()
44
+ # 使用 language 属性而不是 set_language 方法
45
+ self.parser.language = self.language
46
+ self.symbol_query = TS_SYMBOL_QUERY
47
+
48
+ def extract_symbols(self, file_path: str, content: str) -> List[Any]:
49
+ try:
50
+ tree = self.parser.parse(bytes(content, "utf8"))
51
+ query = self.language.query(self.symbol_query)
52
+ captures = query.captures(tree.root_node)
53
+
54
+ symbols = []
55
+ for node, name in captures:
56
+ kind_map = {
57
+ "function.name": "function",
58
+ "method.name": "method",
59
+ "class.name": "class",
60
+ "interface.name": "interface",
61
+ "variable.name": "variable",
62
+ }
63
+ symbol_kind = kind_map.get(name)
64
+ if symbol_kind:
65
+ symbols.append(Symbol(
66
+ name=node.text.decode('utf8'),
67
+ kind=symbol_kind,
68
+ file_path=file_path,
69
+ line_start=node.start_point[0] + 1,
70
+ line_end=node.end_point[0] + 1,
71
+ ))
72
+ return symbols
73
+ except Exception:
74
+ return []
75
+
76
+ return TSSymbolExtractor()
77
+ except (ImportError, Exception):
78
+ return None
79
+
80
+
81
+ def register_typescript_extractor() -> None:
82
+ """Register TypeScript extractor for .ts and .tsx files."""
83
+ register_language_extractor(['.ts', '.tsx'], create_typescript_extractor)
84
+