jarvis-ai-assistant 0.7.8__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.8.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.8.dist-info/RECORD +0 -218
- {jarvis_ai_assistant-0.7.8.dist-info → jarvis_ai_assistant-1.0.2.dist-info}/WHEEL +0 -0
- {jarvis_ai_assistant-0.7.8.dist-info → jarvis_ai_assistant-1.0.2.dist-info}/entry_points.txt +0 -0
- {jarvis_ai_assistant-0.7.8.dist-info → jarvis_ai_assistant-1.0.2.dist-info}/licenses/LICENSE +0 -0
- {jarvis_ai_assistant-0.7.8.dist-info → jarvis_ai_assistant-1.0.2.dist-info}/top_level.txt +0 -0
jarvis/jarvis_sec/analysis.py
CHANGED
|
@@ -1,12 +1,15 @@
|
|
|
1
1
|
# -*- coding: utf-8 -*-
|
|
2
2
|
"""分析相关模块"""
|
|
3
3
|
|
|
4
|
-
from typing import Dict
|
|
5
|
-
import
|
|
4
|
+
from typing import Dict
|
|
5
|
+
from typing import List
|
|
6
|
+
from typing import Optional
|
|
7
|
+
|
|
8
|
+
from jarvis.jarvis_utils.output import PrettyOutput
|
|
6
9
|
|
|
7
10
|
from jarvis.jarvis_agent import Agent
|
|
8
|
-
from jarvis.jarvis_sec.prompts import build_summary_prompt
|
|
9
11
|
from jarvis.jarvis_sec.parsers import try_parse_summary_report
|
|
12
|
+
from jarvis.jarvis_sec.prompts import build_summary_prompt
|
|
10
13
|
from jarvis.jarvis_sec.utils import git_restore_if_dirty
|
|
11
14
|
|
|
12
15
|
|
|
@@ -49,9 +52,12 @@ def valid_items(items: Optional[List]) -> bool:
|
|
|
49
52
|
return True
|
|
50
53
|
|
|
51
54
|
|
|
52
|
-
def build_analysis_task_context(
|
|
55
|
+
def build_analysis_task_context(
|
|
56
|
+
batch: List[Dict], entry_path: str, langs: List[str]
|
|
57
|
+
) -> str:
|
|
53
58
|
"""构建分析任务上下文"""
|
|
54
59
|
import json as _json2
|
|
60
|
+
|
|
55
61
|
batch_ctx: List[Dict] = list(batch)
|
|
56
62
|
cluster_verify = str(batch_ctx[0].get("verify") if batch_ctx else "")
|
|
57
63
|
cluster_gids_ctx = [it.get("gid") for it in batch_ctx]
|
|
@@ -76,7 +82,12 @@ def build_validation_error_guidance(
|
|
|
76
82
|
) -> str:
|
|
77
83
|
"""构建验证错误指导信息"""
|
|
78
84
|
if parse_error_analysis:
|
|
79
|
-
return f"
|
|
85
|
+
return f"""
|
|
86
|
+
|
|
87
|
+
**格式错误详情(请根据以下错误修复输出格式):**
|
|
88
|
+
- JSON解析失败: {parse_error_analysis}
|
|
89
|
+
|
|
90
|
+
请确保输出的JSON格式正确,包括正确的引号、逗号、大括号等。仅输出一个 <REPORT> 块,块内直接包含 JSON 数组(不需要额外的标签)。支持jsonnet语法(如尾随逗号、注释、||| 或 ``` 分隔符多行字符串等)。"""
|
|
80
91
|
elif prev_parsed_items is None:
|
|
81
92
|
return "\n\n**格式错误详情(请根据以下错误修复输出格式):**\n- 无法从摘要中解析出有效的 JSON 数组"
|
|
82
93
|
elif not valid_items(prev_parsed_items):
|
|
@@ -102,29 +113,47 @@ def build_validation_error_guidance(
|
|
|
102
113
|
validation_errors.append(f"元素{idx}的 gid 必须 >= 1")
|
|
103
114
|
break
|
|
104
115
|
except Exception:
|
|
105
|
-
validation_errors.append(
|
|
116
|
+
validation_errors.append(
|
|
117
|
+
f"元素{idx}的 gid 格式错误(必须是整数)"
|
|
118
|
+
)
|
|
106
119
|
break
|
|
107
120
|
elif has_gids:
|
|
108
|
-
if
|
|
121
|
+
if (
|
|
122
|
+
not isinstance(it.get("gids"), list)
|
|
123
|
+
or len(it.get("gids", [])) == 0
|
|
124
|
+
):
|
|
109
125
|
validation_errors.append(f"元素{idx}的 gids 必须是非空数组")
|
|
110
126
|
break
|
|
111
127
|
try:
|
|
112
128
|
for gid_idx, gid_val in enumerate(it.get("gids", [])):
|
|
113
129
|
if int(gid_val) < 1:
|
|
114
|
-
validation_errors.append(
|
|
130
|
+
validation_errors.append(
|
|
131
|
+
f"元素{idx}的 gids[{gid_idx}] 必须 >= 1"
|
|
132
|
+
)
|
|
115
133
|
break
|
|
116
134
|
if validation_errors:
|
|
117
135
|
break
|
|
118
136
|
except Exception:
|
|
119
|
-
validation_errors.append(
|
|
137
|
+
validation_errors.append(
|
|
138
|
+
f"元素{idx}的 gids 格式错误(必须是整数数组)"
|
|
139
|
+
)
|
|
120
140
|
break
|
|
121
141
|
if "has_risk" not in it or not isinstance(it.get("has_risk"), bool):
|
|
122
|
-
validation_errors.append(
|
|
142
|
+
validation_errors.append(
|
|
143
|
+
f"元素{idx}缺少必填字段 has_risk(必须是布尔值)"
|
|
144
|
+
)
|
|
123
145
|
break
|
|
124
146
|
if it.get("has_risk"):
|
|
125
|
-
for key in [
|
|
147
|
+
for key in [
|
|
148
|
+
"preconditions",
|
|
149
|
+
"trigger_path",
|
|
150
|
+
"consequences",
|
|
151
|
+
"suggestions",
|
|
152
|
+
]:
|
|
126
153
|
if key not in it:
|
|
127
|
-
validation_errors.append(
|
|
154
|
+
validation_errors.append(
|
|
155
|
+
f"元素{idx}的 has_risk 为 true,但缺少必填字段 {key}"
|
|
156
|
+
)
|
|
128
157
|
break
|
|
129
158
|
if not isinstance(it[key], str) or not it[key].strip():
|
|
130
159
|
validation_errors.append(f"元素{idx}的 {key} 字段不能为空")
|
|
@@ -132,7 +161,9 @@ def build_validation_error_guidance(
|
|
|
132
161
|
if validation_errors:
|
|
133
162
|
break
|
|
134
163
|
if validation_errors:
|
|
135
|
-
return "\n\n**格式错误详情(请根据以下错误修复输出格式):**\n" + "\n".join(
|
|
164
|
+
return "\n\n**格式错误详情(请根据以下错误修复输出格式):**\n" + "\n".join(
|
|
165
|
+
f"- {err}" for err in validation_errors
|
|
166
|
+
)
|
|
136
167
|
return ""
|
|
137
168
|
|
|
138
169
|
|
|
@@ -152,21 +183,25 @@ def run_analysis_agent_with_retry(
|
|
|
152
183
|
prev_parsed_items: Optional[List] = None
|
|
153
184
|
parse_error_analysis: Optional[str] = None
|
|
154
185
|
attempt = 0
|
|
155
|
-
|
|
186
|
+
|
|
156
187
|
while True:
|
|
157
188
|
attempt += 1
|
|
158
189
|
summary_container["text"] = ""
|
|
159
|
-
|
|
190
|
+
|
|
160
191
|
if use_direct_model_analysis:
|
|
161
192
|
summary_prompt_text = build_summary_prompt()
|
|
162
|
-
error_guidance = build_validation_error_guidance(
|
|
193
|
+
error_guidance = build_validation_error_guidance(
|
|
194
|
+
parse_error_analysis, prev_parsed_items
|
|
195
|
+
)
|
|
163
196
|
full_prompt = f"{per_task}{error_guidance}\n\n{summary_prompt_text}"
|
|
164
197
|
try:
|
|
165
|
-
response = agent.model.chat_until_success(full_prompt)
|
|
198
|
+
response = agent.model.chat_until_success(full_prompt)
|
|
166
199
|
summary_container["text"] = response
|
|
167
200
|
except Exception as e:
|
|
168
201
|
try:
|
|
169
|
-
|
|
202
|
+
PrettyOutput.auto_print(
|
|
203
|
+
f"⚠️ [jarvis-sec] 直接模型调用失败: {e},回退到 run()"
|
|
204
|
+
)
|
|
170
205
|
except Exception:
|
|
171
206
|
pass
|
|
172
207
|
agent.run(per_task)
|
|
@@ -181,15 +216,19 @@ def run_analysis_agent_with_retry(
|
|
|
181
216
|
"changed_files_count": int(_changed or 0),
|
|
182
217
|
"action": "git checkout -- .",
|
|
183
218
|
}
|
|
184
|
-
meta_records.append(
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
219
|
+
meta_records.append(
|
|
220
|
+
{
|
|
221
|
+
"task_id": task_id,
|
|
222
|
+
"batch_index": bidx,
|
|
223
|
+
"workspace_restore": workspace_restore_info,
|
|
224
|
+
"attempt": attempt + 1,
|
|
225
|
+
}
|
|
226
|
+
)
|
|
190
227
|
if _changed:
|
|
191
228
|
try:
|
|
192
|
-
|
|
229
|
+
PrettyOutput.auto_print(
|
|
230
|
+
f"🔵 [jarvis-sec] 工作区已恢复 ({_changed} 个文件),操作: git checkout -- ."
|
|
231
|
+
)
|
|
193
232
|
except Exception:
|
|
194
233
|
pass
|
|
195
234
|
except Exception:
|
|
@@ -203,7 +242,9 @@ def run_analysis_agent_with_retry(
|
|
|
203
242
|
rep, parse_error_analysis = try_parse_summary_report(summary_text)
|
|
204
243
|
if parse_error_analysis:
|
|
205
244
|
try:
|
|
206
|
-
|
|
245
|
+
PrettyOutput.auto_print(
|
|
246
|
+
f"⚠️ [jarvis-sec] 分析结果JSON解析失败: {parse_error_analysis}"
|
|
247
|
+
)
|
|
207
248
|
except Exception:
|
|
208
249
|
pass
|
|
209
250
|
elif isinstance(rep, list):
|
|
@@ -224,30 +265,36 @@ def run_analysis_agent_with_retry(
|
|
|
224
265
|
# 非空数组需要验证格式
|
|
225
266
|
summary_items = parsed_items
|
|
226
267
|
break
|
|
227
|
-
|
|
268
|
+
|
|
228
269
|
# 格式校验失败,后续重试使用直接模型调用
|
|
229
270
|
use_direct_model_analysis = True
|
|
230
271
|
prev_parsed_items = parsed_items
|
|
231
272
|
if parse_error_analysis:
|
|
232
273
|
try:
|
|
233
|
-
|
|
274
|
+
PrettyOutput.auto_print(
|
|
275
|
+
f"⚠️ [jarvis-sec] 分析结果JSON解析失败 -> 重试第 {attempt} 次 (批次={bidx},使用直接模型调用,将反馈解析错误)"
|
|
276
|
+
)
|
|
234
277
|
except Exception:
|
|
235
278
|
pass
|
|
236
279
|
else:
|
|
237
280
|
try:
|
|
238
|
-
|
|
281
|
+
PrettyOutput.auto_print(
|
|
282
|
+
f"⚠️ [jarvis-sec] 分析结果格式无效 -> 重试第 {attempt} 次 (批次={bidx},使用直接模型调用)"
|
|
283
|
+
)
|
|
239
284
|
except Exception:
|
|
240
285
|
pass
|
|
241
|
-
|
|
286
|
+
|
|
242
287
|
return summary_items, workspace_restore_info
|
|
243
288
|
|
|
244
289
|
|
|
245
|
-
def expand_and_filter_analysis_results(
|
|
290
|
+
def expand_and_filter_analysis_results(
|
|
291
|
+
summary_items: List[Dict],
|
|
292
|
+
) -> tuple[List[Dict], List[Dict]]:
|
|
246
293
|
"""展开gids格式为单个gid格式,并过滤出有风险的项目"""
|
|
247
294
|
items_with_risk: List[Dict] = []
|
|
248
295
|
items_without_risk: List[Dict] = []
|
|
249
296
|
merged_items: List[Dict] = []
|
|
250
|
-
|
|
297
|
+
|
|
251
298
|
for it in summary_items:
|
|
252
299
|
has_risk = it.get("has_risk") is True
|
|
253
300
|
if "gids" in it and isinstance(it.get("gids"), list):
|
|
@@ -272,5 +319,5 @@ def expand_and_filter_analysis_results(summary_items: List[Dict]) -> tuple[List[
|
|
|
272
319
|
items_with_risk.append(it)
|
|
273
320
|
else:
|
|
274
321
|
items_without_risk.append(it)
|
|
275
|
-
|
|
322
|
+
|
|
276
323
|
return items_with_risk, items_without_risk
|
|
@@ -7,18 +7,12 @@ Jarvis 安全演进多Agent套件 —— Checkers 包初始化
|
|
|
7
7
|
- 保持最小依赖,不在此处执行任何扫描逻辑,仅做导入与别名暴露。
|
|
8
8
|
"""
|
|
9
9
|
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
from .c_checker import
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
)
|
|
17
|
-
from .rust_checker import (
|
|
18
|
-
analyze_rust_files,
|
|
19
|
-
analyze_rust_file,
|
|
20
|
-
analyze_rust_text,
|
|
21
|
-
)
|
|
10
|
+
from .c_checker import analyze_c_cpp_file
|
|
11
|
+
from .c_checker import analyze_c_cpp_text
|
|
12
|
+
from .c_checker import analyze_files as analyze_c_files
|
|
13
|
+
from .rust_checker import analyze_rust_file
|
|
14
|
+
from .rust_checker import analyze_rust_files
|
|
15
|
+
from .rust_checker import analyze_rust_text
|
|
22
16
|
|
|
23
17
|
__all__ = [
|
|
24
18
|
# C/C++
|
|
@@ -29,4 +23,4 @@ __all__ = [
|
|
|
29
23
|
"analyze_rust_files",
|
|
30
24
|
"analyze_rust_file",
|
|
31
25
|
"analyze_rust_text",
|
|
32
|
-
]
|
|
26
|
+
]
|