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.
- jarvis/__init__.py +1 -1
- jarvis/jarvis_agent/__init__.py +567 -222
- jarvis/jarvis_agent/agent_manager.py +19 -12
- jarvis/jarvis_agent/builtin_input_handler.py +79 -11
- jarvis/jarvis_agent/config_editor.py +7 -2
- jarvis/jarvis_agent/event_bus.py +24 -13
- jarvis/jarvis_agent/events.py +19 -1
- jarvis/jarvis_agent/file_context_handler.py +67 -64
- jarvis/jarvis_agent/file_methodology_manager.py +38 -24
- jarvis/jarvis_agent/jarvis.py +186 -114
- jarvis/jarvis_agent/language_extractors/__init__.py +8 -1
- jarvis/jarvis_agent/language_extractors/c_extractor.py +7 -4
- jarvis/jarvis_agent/language_extractors/cpp_extractor.py +9 -4
- jarvis/jarvis_agent/language_extractors/go_extractor.py +7 -4
- jarvis/jarvis_agent/language_extractors/java_extractor.py +27 -20
- jarvis/jarvis_agent/language_extractors/javascript_extractor.py +22 -17
- jarvis/jarvis_agent/language_extractors/python_extractor.py +7 -4
- jarvis/jarvis_agent/language_extractors/rust_extractor.py +7 -4
- jarvis/jarvis_agent/language_extractors/typescript_extractor.py +22 -17
- jarvis/jarvis_agent/language_support_info.py +250 -219
- jarvis/jarvis_agent/main.py +19 -23
- jarvis/jarvis_agent/memory_manager.py +9 -6
- jarvis/jarvis_agent/methodology_share_manager.py +21 -15
- jarvis/jarvis_agent/output_handler.py +4 -2
- jarvis/jarvis_agent/prompt_builder.py +7 -6
- jarvis/jarvis_agent/prompt_manager.py +113 -8
- jarvis/jarvis_agent/prompts.py +317 -85
- jarvis/jarvis_agent/protocols.py +5 -2
- jarvis/jarvis_agent/run_loop.py +192 -32
- jarvis/jarvis_agent/session_manager.py +7 -3
- jarvis/jarvis_agent/share_manager.py +23 -13
- jarvis/jarvis_agent/shell_input_handler.py +12 -8
- jarvis/jarvis_agent/stdio_redirect.py +25 -26
- jarvis/jarvis_agent/task_analyzer.py +29 -23
- jarvis/jarvis_agent/task_list.py +869 -0
- jarvis/jarvis_agent/task_manager.py +26 -23
- jarvis/jarvis_agent/tool_executor.py +6 -5
- jarvis/jarvis_agent/tool_share_manager.py +24 -14
- jarvis/jarvis_agent/user_interaction.py +3 -3
- jarvis/jarvis_agent/utils.py +9 -1
- jarvis/jarvis_agent/web_bridge.py +37 -17
- jarvis/jarvis_agent/web_output_sink.py +5 -2
- jarvis/jarvis_agent/web_server.py +165 -36
- jarvis/jarvis_c2rust/__init__.py +1 -1
- jarvis/jarvis_c2rust/cli.py +260 -141
- jarvis/jarvis_c2rust/collector.py +37 -18
- jarvis/jarvis_c2rust/constants.py +60 -0
- jarvis/jarvis_c2rust/library_replacer.py +242 -1010
- jarvis/jarvis_c2rust/library_replacer_checkpoint.py +133 -0
- jarvis/jarvis_c2rust/library_replacer_llm.py +287 -0
- jarvis/jarvis_c2rust/library_replacer_loader.py +191 -0
- jarvis/jarvis_c2rust/library_replacer_output.py +134 -0
- jarvis/jarvis_c2rust/library_replacer_prompts.py +124 -0
- jarvis/jarvis_c2rust/library_replacer_utils.py +188 -0
- jarvis/jarvis_c2rust/llm_module_agent.py +98 -1044
- jarvis/jarvis_c2rust/llm_module_agent_apply.py +170 -0
- jarvis/jarvis_c2rust/llm_module_agent_executor.py +288 -0
- jarvis/jarvis_c2rust/llm_module_agent_loader.py +170 -0
- jarvis/jarvis_c2rust/llm_module_agent_prompts.py +268 -0
- jarvis/jarvis_c2rust/llm_module_agent_types.py +57 -0
- jarvis/jarvis_c2rust/llm_module_agent_utils.py +150 -0
- jarvis/jarvis_c2rust/llm_module_agent_validator.py +119 -0
- jarvis/jarvis_c2rust/loaders.py +28 -10
- jarvis/jarvis_c2rust/models.py +5 -2
- jarvis/jarvis_c2rust/optimizer.py +192 -1974
- jarvis/jarvis_c2rust/optimizer_build_fix.py +286 -0
- jarvis/jarvis_c2rust/optimizer_clippy.py +766 -0
- jarvis/jarvis_c2rust/optimizer_config.py +49 -0
- jarvis/jarvis_c2rust/optimizer_docs.py +183 -0
- jarvis/jarvis_c2rust/optimizer_options.py +48 -0
- jarvis/jarvis_c2rust/optimizer_progress.py +469 -0
- jarvis/jarvis_c2rust/optimizer_report.py +52 -0
- jarvis/jarvis_c2rust/optimizer_unsafe.py +309 -0
- jarvis/jarvis_c2rust/optimizer_utils.py +469 -0
- jarvis/jarvis_c2rust/optimizer_visibility.py +185 -0
- jarvis/jarvis_c2rust/scanner.py +229 -166
- jarvis/jarvis_c2rust/transpiler.py +531 -2732
- jarvis/jarvis_c2rust/transpiler_agents.py +503 -0
- jarvis/jarvis_c2rust/transpiler_build.py +1294 -0
- jarvis/jarvis_c2rust/transpiler_codegen.py +204 -0
- jarvis/jarvis_c2rust/transpiler_compile.py +146 -0
- jarvis/jarvis_c2rust/transpiler_config.py +178 -0
- jarvis/jarvis_c2rust/transpiler_context.py +122 -0
- jarvis/jarvis_c2rust/transpiler_executor.py +516 -0
- jarvis/jarvis_c2rust/transpiler_generation.py +278 -0
- jarvis/jarvis_c2rust/transpiler_git.py +163 -0
- jarvis/jarvis_c2rust/transpiler_mod_utils.py +225 -0
- jarvis/jarvis_c2rust/transpiler_modules.py +336 -0
- jarvis/jarvis_c2rust/transpiler_planning.py +394 -0
- jarvis/jarvis_c2rust/transpiler_review.py +1196 -0
- jarvis/jarvis_c2rust/transpiler_symbols.py +176 -0
- jarvis/jarvis_c2rust/utils.py +269 -79
- jarvis/jarvis_code_agent/after_change.py +233 -0
- jarvis/jarvis_code_agent/build_validation_config.py +37 -30
- jarvis/jarvis_code_agent/builtin_rules.py +68 -0
- jarvis/jarvis_code_agent/code_agent.py +976 -1517
- jarvis/jarvis_code_agent/code_agent_build.py +227 -0
- jarvis/jarvis_code_agent/code_agent_diff.py +246 -0
- jarvis/jarvis_code_agent/code_agent_git.py +525 -0
- jarvis/jarvis_code_agent/code_agent_impact.py +177 -0
- jarvis/jarvis_code_agent/code_agent_lint.py +283 -0
- jarvis/jarvis_code_agent/code_agent_llm.py +159 -0
- jarvis/jarvis_code_agent/code_agent_postprocess.py +105 -0
- jarvis/jarvis_code_agent/code_agent_prompts.py +46 -0
- jarvis/jarvis_code_agent/code_agent_rules.py +305 -0
- jarvis/jarvis_code_agent/code_analyzer/__init__.py +52 -48
- jarvis/jarvis_code_agent/code_analyzer/base_language.py +12 -10
- jarvis/jarvis_code_agent/code_analyzer/build_validator/__init__.py +12 -11
- jarvis/jarvis_code_agent/code_analyzer/build_validator/base.py +16 -12
- jarvis/jarvis_code_agent/code_analyzer/build_validator/cmake.py +26 -17
- jarvis/jarvis_code_agent/code_analyzer/build_validator/detector.py +558 -104
- jarvis/jarvis_code_agent/code_analyzer/build_validator/fallback.py +27 -16
- jarvis/jarvis_code_agent/code_analyzer/build_validator/go.py +22 -18
- jarvis/jarvis_code_agent/code_analyzer/build_validator/java_gradle.py +21 -16
- jarvis/jarvis_code_agent/code_analyzer/build_validator/java_maven.py +20 -16
- jarvis/jarvis_code_agent/code_analyzer/build_validator/makefile.py +27 -16
- jarvis/jarvis_code_agent/code_analyzer/build_validator/nodejs.py +47 -23
- jarvis/jarvis_code_agent/code_analyzer/build_validator/python.py +71 -37
- jarvis/jarvis_code_agent/code_analyzer/build_validator/rust.py +162 -35
- jarvis/jarvis_code_agent/code_analyzer/build_validator/validator.py +111 -57
- jarvis/jarvis_code_agent/code_analyzer/build_validator.py +18 -12
- jarvis/jarvis_code_agent/code_analyzer/context_manager.py +185 -183
- jarvis/jarvis_code_agent/code_analyzer/context_recommender.py +2 -1
- jarvis/jarvis_code_agent/code_analyzer/dependency_analyzer.py +24 -15
- jarvis/jarvis_code_agent/code_analyzer/file_ignore.py +227 -141
- jarvis/jarvis_code_agent/code_analyzer/impact_analyzer.py +321 -247
- jarvis/jarvis_code_agent/code_analyzer/language_registry.py +37 -29
- jarvis/jarvis_code_agent/code_analyzer/language_support.py +21 -13
- jarvis/jarvis_code_agent/code_analyzer/languages/__init__.py +15 -9
- jarvis/jarvis_code_agent/code_analyzer/languages/c_cpp_language.py +75 -45
- jarvis/jarvis_code_agent/code_analyzer/languages/go_language.py +87 -52
- jarvis/jarvis_code_agent/code_analyzer/languages/java_language.py +84 -51
- jarvis/jarvis_code_agent/code_analyzer/languages/javascript_language.py +94 -64
- jarvis/jarvis_code_agent/code_analyzer/languages/python_language.py +109 -71
- jarvis/jarvis_code_agent/code_analyzer/languages/rust_language.py +97 -63
- jarvis/jarvis_code_agent/code_analyzer/languages/typescript_language.py +103 -69
- jarvis/jarvis_code_agent/code_analyzer/llm_context_recommender.py +271 -268
- jarvis/jarvis_code_agent/code_analyzer/symbol_extractor.py +76 -64
- jarvis/jarvis_code_agent/code_analyzer/tree_sitter_extractor.py +92 -19
- jarvis/jarvis_code_agent/diff_visualizer.py +998 -0
- jarvis/jarvis_code_agent/lint.py +223 -524
- jarvis/jarvis_code_agent/rule_share_manager.py +158 -0
- jarvis/jarvis_code_agent/rules/clean_code.md +144 -0
- jarvis/jarvis_code_agent/rules/code_review.md +115 -0
- jarvis/jarvis_code_agent/rules/documentation.md +165 -0
- jarvis/jarvis_code_agent/rules/generate_rules.md +52 -0
- jarvis/jarvis_code_agent/rules/performance.md +158 -0
- jarvis/jarvis_code_agent/rules/refactoring.md +139 -0
- jarvis/jarvis_code_agent/rules/security.md +160 -0
- jarvis/jarvis_code_agent/rules/tdd.md +78 -0
- jarvis/jarvis_code_agent/test_rules/cpp_test.md +118 -0
- jarvis/jarvis_code_agent/test_rules/go_test.md +98 -0
- jarvis/jarvis_code_agent/test_rules/java_test.md +99 -0
- jarvis/jarvis_code_agent/test_rules/javascript_test.md +113 -0
- jarvis/jarvis_code_agent/test_rules/php_test.md +117 -0
- jarvis/jarvis_code_agent/test_rules/python_test.md +91 -0
- jarvis/jarvis_code_agent/test_rules/ruby_test.md +102 -0
- jarvis/jarvis_code_agent/test_rules/rust_test.md +86 -0
- jarvis/jarvis_code_agent/utils.py +36 -26
- jarvis/jarvis_code_analysis/checklists/loader.py +21 -21
- jarvis/jarvis_code_analysis/code_review.py +64 -33
- jarvis/jarvis_data/config_schema.json +285 -192
- jarvis/jarvis_git_squash/main.py +8 -6
- jarvis/jarvis_git_utils/git_commiter.py +53 -76
- jarvis/jarvis_mcp/__init__.py +5 -2
- jarvis/jarvis_mcp/sse_mcp_client.py +40 -30
- jarvis/jarvis_mcp/stdio_mcp_client.py +27 -19
- jarvis/jarvis_mcp/streamable_mcp_client.py +35 -26
- jarvis/jarvis_memory_organizer/memory_organizer.py +78 -55
- jarvis/jarvis_methodology/main.py +48 -39
- jarvis/jarvis_multi_agent/__init__.py +56 -23
- jarvis/jarvis_multi_agent/main.py +15 -18
- jarvis/jarvis_platform/base.py +179 -111
- jarvis/jarvis_platform/human.py +27 -16
- jarvis/jarvis_platform/kimi.py +52 -45
- jarvis/jarvis_platform/openai.py +101 -40
- jarvis/jarvis_platform/registry.py +51 -33
- jarvis/jarvis_platform/tongyi.py +68 -38
- jarvis/jarvis_platform/yuanbao.py +59 -43
- jarvis/jarvis_platform_manager/main.py +68 -76
- jarvis/jarvis_platform_manager/service.py +24 -14
- jarvis/jarvis_rag/README_CONFIG.md +314 -0
- jarvis/jarvis_rag/README_DYNAMIC_LOADING.md +311 -0
- jarvis/jarvis_rag/README_ONLINE_MODELS.md +230 -0
- jarvis/jarvis_rag/__init__.py +57 -4
- jarvis/jarvis_rag/cache.py +3 -1
- jarvis/jarvis_rag/cli.py +48 -68
- jarvis/jarvis_rag/embedding_interface.py +39 -0
- jarvis/jarvis_rag/embedding_manager.py +7 -230
- jarvis/jarvis_rag/embeddings/__init__.py +41 -0
- jarvis/jarvis_rag/embeddings/base.py +114 -0
- jarvis/jarvis_rag/embeddings/cohere.py +66 -0
- jarvis/jarvis_rag/embeddings/edgefn.py +117 -0
- jarvis/jarvis_rag/embeddings/local.py +260 -0
- jarvis/jarvis_rag/embeddings/openai.py +62 -0
- jarvis/jarvis_rag/embeddings/registry.py +293 -0
- jarvis/jarvis_rag/llm_interface.py +8 -6
- jarvis/jarvis_rag/query_rewriter.py +8 -9
- jarvis/jarvis_rag/rag_pipeline.py +61 -52
- jarvis/jarvis_rag/reranker.py +7 -75
- jarvis/jarvis_rag/reranker_interface.py +32 -0
- jarvis/jarvis_rag/rerankers/__init__.py +41 -0
- jarvis/jarvis_rag/rerankers/base.py +109 -0
- jarvis/jarvis_rag/rerankers/cohere.py +67 -0
- jarvis/jarvis_rag/rerankers/edgefn.py +140 -0
- jarvis/jarvis_rag/rerankers/jina.py +79 -0
- jarvis/jarvis_rag/rerankers/local.py +89 -0
- jarvis/jarvis_rag/rerankers/registry.py +293 -0
- jarvis/jarvis_rag/retriever.py +58 -43
- jarvis/jarvis_sec/__init__.py +66 -141
- jarvis/jarvis_sec/agents.py +21 -17
- jarvis/jarvis_sec/analysis.py +80 -33
- jarvis/jarvis_sec/checkers/__init__.py +7 -13
- jarvis/jarvis_sec/checkers/c_checker.py +356 -164
- jarvis/jarvis_sec/checkers/rust_checker.py +47 -29
- jarvis/jarvis_sec/cli.py +43 -21
- jarvis/jarvis_sec/clustering.py +430 -272
- jarvis/jarvis_sec/file_manager.py +99 -55
- jarvis/jarvis_sec/parsers.py +9 -6
- jarvis/jarvis_sec/prompts.py +4 -3
- jarvis/jarvis_sec/report.py +44 -22
- jarvis/jarvis_sec/review.py +180 -107
- jarvis/jarvis_sec/status.py +50 -41
- jarvis/jarvis_sec/types.py +3 -0
- jarvis/jarvis_sec/utils.py +160 -83
- jarvis/jarvis_sec/verification.py +411 -181
- jarvis/jarvis_sec/workflow.py +132 -21
- jarvis/jarvis_smart_shell/main.py +28 -41
- jarvis/jarvis_stats/cli.py +14 -12
- jarvis/jarvis_stats/stats.py +28 -19
- jarvis/jarvis_stats/storage.py +14 -8
- jarvis/jarvis_stats/visualizer.py +12 -7
- jarvis/jarvis_tools/base.py +5 -2
- jarvis/jarvis_tools/clear_memory.py +13 -9
- jarvis/jarvis_tools/cli/main.py +23 -18
- jarvis/jarvis_tools/edit_file.py +572 -873
- jarvis/jarvis_tools/execute_script.py +10 -7
- jarvis/jarvis_tools/file_analyzer.py +7 -8
- jarvis/jarvis_tools/meta_agent.py +287 -0
- jarvis/jarvis_tools/methodology.py +5 -3
- jarvis/jarvis_tools/read_code.py +305 -1438
- jarvis/jarvis_tools/read_symbols.py +50 -17
- jarvis/jarvis_tools/read_webpage.py +19 -18
- jarvis/jarvis_tools/registry.py +435 -156
- jarvis/jarvis_tools/retrieve_memory.py +16 -11
- jarvis/jarvis_tools/save_memory.py +8 -6
- jarvis/jarvis_tools/search_web.py +31 -31
- jarvis/jarvis_tools/sub_agent.py +32 -28
- jarvis/jarvis_tools/sub_code_agent.py +44 -60
- jarvis/jarvis_tools/task_list_manager.py +1811 -0
- jarvis/jarvis_tools/virtual_tty.py +29 -19
- jarvis/jarvis_utils/__init__.py +4 -0
- jarvis/jarvis_utils/builtin_replace_map.py +2 -1
- jarvis/jarvis_utils/clipboard.py +9 -8
- jarvis/jarvis_utils/collections.py +331 -0
- jarvis/jarvis_utils/config.py +699 -194
- jarvis/jarvis_utils/dialogue_recorder.py +294 -0
- jarvis/jarvis_utils/embedding.py +6 -3
- jarvis/jarvis_utils/file_processors.py +7 -1
- jarvis/jarvis_utils/fzf.py +9 -3
- jarvis/jarvis_utils/git_utils.py +71 -42
- jarvis/jarvis_utils/globals.py +116 -32
- jarvis/jarvis_utils/http.py +6 -2
- jarvis/jarvis_utils/input.py +318 -83
- jarvis/jarvis_utils/jsonnet_compat.py +119 -104
- jarvis/jarvis_utils/methodology.py +37 -28
- jarvis/jarvis_utils/output.py +201 -44
- jarvis/jarvis_utils/utils.py +986 -628
- {jarvis_ai_assistant-0.7.16.dist-info → jarvis_ai_assistant-1.0.2.dist-info}/METADATA +49 -33
- jarvis_ai_assistant-1.0.2.dist-info/RECORD +304 -0
- jarvis/jarvis_code_agent/code_analyzer/structured_code.py +0 -556
- jarvis/jarvis_tools/generate_new_tool.py +0 -205
- jarvis/jarvis_tools/lsp_client.py +0 -1552
- jarvis/jarvis_tools/rewrite_file.py +0 -105
- jarvis_ai_assistant-0.7.16.dist-info/RECORD +0 -218
- {jarvis_ai_assistant-0.7.16.dist-info → jarvis_ai_assistant-1.0.2.dist-info}/WHEEL +0 -0
- {jarvis_ai_assistant-0.7.16.dist-info → jarvis_ai_assistant-1.0.2.dist-info}/entry_points.txt +0 -0
- {jarvis_ai_assistant-0.7.16.dist-info → jarvis_ai_assistant-1.0.2.dist-info}/licenses/LICENSE +0 -0
- {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
|
-
|
|
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 =
|
|
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 =
|
|
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
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
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
|
|
181
|
-
sig = symbol[
|
|
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
|
-
#
|
|
230
|
-
|
|
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):
|
|
46
|
+
if not upload_methodology(self.agent.model, other_files=self.agent.files):
|
|
42
47
|
if self.agent.files:
|
|
43
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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):
|
|
63
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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=
|
|
90
|
-
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
|
"""使用文件上传方式处理历史"""
|