jarvis-ai-assistant 0.1.222__py3-none-any.whl → 0.7.0__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 (162) hide show
  1. jarvis/__init__.py +1 -1
  2. jarvis/jarvis_agent/__init__.py +1143 -245
  3. jarvis/jarvis_agent/agent_manager.py +97 -0
  4. jarvis/jarvis_agent/builtin_input_handler.py +12 -10
  5. jarvis/jarvis_agent/config_editor.py +57 -0
  6. jarvis/jarvis_agent/edit_file_handler.py +392 -99
  7. jarvis/jarvis_agent/event_bus.py +48 -0
  8. jarvis/jarvis_agent/events.py +157 -0
  9. jarvis/jarvis_agent/file_context_handler.py +79 -0
  10. jarvis/jarvis_agent/file_methodology_manager.py +117 -0
  11. jarvis/jarvis_agent/jarvis.py +1117 -147
  12. jarvis/jarvis_agent/main.py +78 -34
  13. jarvis/jarvis_agent/memory_manager.py +195 -0
  14. jarvis/jarvis_agent/methodology_share_manager.py +174 -0
  15. jarvis/jarvis_agent/prompt_manager.py +82 -0
  16. jarvis/jarvis_agent/prompts.py +46 -9
  17. jarvis/jarvis_agent/protocols.py +4 -1
  18. jarvis/jarvis_agent/rewrite_file_handler.py +141 -0
  19. jarvis/jarvis_agent/run_loop.py +146 -0
  20. jarvis/jarvis_agent/session_manager.py +9 -9
  21. jarvis/jarvis_agent/share_manager.py +228 -0
  22. jarvis/jarvis_agent/shell_input_handler.py +23 -3
  23. jarvis/jarvis_agent/stdio_redirect.py +295 -0
  24. jarvis/jarvis_agent/task_analyzer.py +212 -0
  25. jarvis/jarvis_agent/task_manager.py +154 -0
  26. jarvis/jarvis_agent/task_planner.py +496 -0
  27. jarvis/jarvis_agent/tool_executor.py +8 -4
  28. jarvis/jarvis_agent/tool_share_manager.py +139 -0
  29. jarvis/jarvis_agent/user_interaction.py +42 -0
  30. jarvis/jarvis_agent/utils.py +54 -0
  31. jarvis/jarvis_agent/web_bridge.py +189 -0
  32. jarvis/jarvis_agent/web_output_sink.py +53 -0
  33. jarvis/jarvis_agent/web_server.py +751 -0
  34. jarvis/jarvis_c2rust/__init__.py +26 -0
  35. jarvis/jarvis_c2rust/cli.py +613 -0
  36. jarvis/jarvis_c2rust/collector.py +258 -0
  37. jarvis/jarvis_c2rust/library_replacer.py +1122 -0
  38. jarvis/jarvis_c2rust/llm_module_agent.py +1300 -0
  39. jarvis/jarvis_c2rust/optimizer.py +960 -0
  40. jarvis/jarvis_c2rust/scanner.py +1681 -0
  41. jarvis/jarvis_c2rust/transpiler.py +2325 -0
  42. jarvis/jarvis_code_agent/build_validation_config.py +133 -0
  43. jarvis/jarvis_code_agent/code_agent.py +1605 -178
  44. jarvis/jarvis_code_agent/code_analyzer/__init__.py +62 -0
  45. jarvis/jarvis_code_agent/code_analyzer/base_language.py +74 -0
  46. jarvis/jarvis_code_agent/code_analyzer/build_validator/__init__.py +44 -0
  47. jarvis/jarvis_code_agent/code_analyzer/build_validator/base.py +102 -0
  48. jarvis/jarvis_code_agent/code_analyzer/build_validator/cmake.py +59 -0
  49. jarvis/jarvis_code_agent/code_analyzer/build_validator/detector.py +125 -0
  50. jarvis/jarvis_code_agent/code_analyzer/build_validator/fallback.py +69 -0
  51. jarvis/jarvis_code_agent/code_analyzer/build_validator/go.py +38 -0
  52. jarvis/jarvis_code_agent/code_analyzer/build_validator/java_gradle.py +44 -0
  53. jarvis/jarvis_code_agent/code_analyzer/build_validator/java_maven.py +38 -0
  54. jarvis/jarvis_code_agent/code_analyzer/build_validator/makefile.py +50 -0
  55. jarvis/jarvis_code_agent/code_analyzer/build_validator/nodejs.py +93 -0
  56. jarvis/jarvis_code_agent/code_analyzer/build_validator/python.py +129 -0
  57. jarvis/jarvis_code_agent/code_analyzer/build_validator/rust.py +54 -0
  58. jarvis/jarvis_code_agent/code_analyzer/build_validator/validator.py +154 -0
  59. jarvis/jarvis_code_agent/code_analyzer/build_validator.py +43 -0
  60. jarvis/jarvis_code_agent/code_analyzer/context_manager.py +363 -0
  61. jarvis/jarvis_code_agent/code_analyzer/context_recommender.py +18 -0
  62. jarvis/jarvis_code_agent/code_analyzer/dependency_analyzer.py +132 -0
  63. jarvis/jarvis_code_agent/code_analyzer/file_ignore.py +330 -0
  64. jarvis/jarvis_code_agent/code_analyzer/impact_analyzer.py +781 -0
  65. jarvis/jarvis_code_agent/code_analyzer/language_registry.py +185 -0
  66. jarvis/jarvis_code_agent/code_analyzer/language_support.py +89 -0
  67. jarvis/jarvis_code_agent/code_analyzer/languages/__init__.py +31 -0
  68. jarvis/jarvis_code_agent/code_analyzer/languages/c_cpp_language.py +231 -0
  69. jarvis/jarvis_code_agent/code_analyzer/languages/go_language.py +183 -0
  70. jarvis/jarvis_code_agent/code_analyzer/languages/python_language.py +219 -0
  71. jarvis/jarvis_code_agent/code_analyzer/languages/rust_language.py +209 -0
  72. jarvis/jarvis_code_agent/code_analyzer/llm_context_recommender.py +451 -0
  73. jarvis/jarvis_code_agent/code_analyzer/symbol_extractor.py +77 -0
  74. jarvis/jarvis_code_agent/code_analyzer/tree_sitter_extractor.py +48 -0
  75. jarvis/jarvis_code_agent/lint.py +275 -13
  76. jarvis/jarvis_code_agent/utils.py +142 -0
  77. jarvis/jarvis_code_analysis/checklists/loader.py +20 -6
  78. jarvis/jarvis_code_analysis/code_review.py +583 -548
  79. jarvis/jarvis_data/config_schema.json +339 -28
  80. jarvis/jarvis_git_squash/main.py +22 -13
  81. jarvis/jarvis_git_utils/git_commiter.py +171 -55
  82. jarvis/jarvis_mcp/sse_mcp_client.py +22 -15
  83. jarvis/jarvis_mcp/stdio_mcp_client.py +4 -4
  84. jarvis/jarvis_mcp/streamable_mcp_client.py +36 -16
  85. jarvis/jarvis_memory_organizer/memory_organizer.py +753 -0
  86. jarvis/jarvis_methodology/main.py +48 -63
  87. jarvis/jarvis_multi_agent/__init__.py +302 -43
  88. jarvis/jarvis_multi_agent/main.py +70 -24
  89. jarvis/jarvis_platform/ai8.py +40 -23
  90. jarvis/jarvis_platform/base.py +210 -49
  91. jarvis/jarvis_platform/human.py +11 -1
  92. jarvis/jarvis_platform/kimi.py +82 -76
  93. jarvis/jarvis_platform/openai.py +73 -1
  94. jarvis/jarvis_platform/registry.py +8 -15
  95. jarvis/jarvis_platform/tongyi.py +115 -101
  96. jarvis/jarvis_platform/yuanbao.py +89 -63
  97. jarvis/jarvis_platform_manager/main.py +194 -132
  98. jarvis/jarvis_platform_manager/service.py +122 -86
  99. jarvis/jarvis_rag/cli.py +156 -53
  100. jarvis/jarvis_rag/embedding_manager.py +155 -12
  101. jarvis/jarvis_rag/llm_interface.py +10 -13
  102. jarvis/jarvis_rag/query_rewriter.py +63 -12
  103. jarvis/jarvis_rag/rag_pipeline.py +222 -40
  104. jarvis/jarvis_rag/reranker.py +26 -3
  105. jarvis/jarvis_rag/retriever.py +270 -14
  106. jarvis/jarvis_sec/__init__.py +3605 -0
  107. jarvis/jarvis_sec/checkers/__init__.py +32 -0
  108. jarvis/jarvis_sec/checkers/c_checker.py +2680 -0
  109. jarvis/jarvis_sec/checkers/rust_checker.py +1108 -0
  110. jarvis/jarvis_sec/cli.py +116 -0
  111. jarvis/jarvis_sec/report.py +257 -0
  112. jarvis/jarvis_sec/status.py +264 -0
  113. jarvis/jarvis_sec/types.py +20 -0
  114. jarvis/jarvis_sec/workflow.py +219 -0
  115. jarvis/jarvis_smart_shell/main.py +405 -137
  116. jarvis/jarvis_stats/__init__.py +13 -0
  117. jarvis/jarvis_stats/cli.py +387 -0
  118. jarvis/jarvis_stats/stats.py +711 -0
  119. jarvis/jarvis_stats/storage.py +612 -0
  120. jarvis/jarvis_stats/visualizer.py +282 -0
  121. jarvis/jarvis_tools/ask_user.py +1 -0
  122. jarvis/jarvis_tools/base.py +18 -2
  123. jarvis/jarvis_tools/clear_memory.py +239 -0
  124. jarvis/jarvis_tools/cli/main.py +220 -144
  125. jarvis/jarvis_tools/execute_script.py +52 -12
  126. jarvis/jarvis_tools/file_analyzer.py +17 -12
  127. jarvis/jarvis_tools/generate_new_tool.py +46 -24
  128. jarvis/jarvis_tools/read_code.py +277 -18
  129. jarvis/jarvis_tools/read_symbols.py +141 -0
  130. jarvis/jarvis_tools/read_webpage.py +86 -13
  131. jarvis/jarvis_tools/registry.py +294 -90
  132. jarvis/jarvis_tools/retrieve_memory.py +227 -0
  133. jarvis/jarvis_tools/save_memory.py +194 -0
  134. jarvis/jarvis_tools/search_web.py +62 -28
  135. jarvis/jarvis_tools/sub_agent.py +205 -0
  136. jarvis/jarvis_tools/sub_code_agent.py +217 -0
  137. jarvis/jarvis_tools/virtual_tty.py +330 -62
  138. jarvis/jarvis_utils/builtin_replace_map.py +4 -5
  139. jarvis/jarvis_utils/clipboard.py +90 -0
  140. jarvis/jarvis_utils/config.py +607 -50
  141. jarvis/jarvis_utils/embedding.py +3 -0
  142. jarvis/jarvis_utils/fzf.py +57 -0
  143. jarvis/jarvis_utils/git_utils.py +251 -29
  144. jarvis/jarvis_utils/globals.py +174 -17
  145. jarvis/jarvis_utils/http.py +58 -79
  146. jarvis/jarvis_utils/input.py +899 -153
  147. jarvis/jarvis_utils/methodology.py +210 -83
  148. jarvis/jarvis_utils/output.py +220 -137
  149. jarvis/jarvis_utils/utils.py +1906 -135
  150. jarvis_ai_assistant-0.7.0.dist-info/METADATA +465 -0
  151. jarvis_ai_assistant-0.7.0.dist-info/RECORD +192 -0
  152. {jarvis_ai_assistant-0.1.222.dist-info → jarvis_ai_assistant-0.7.0.dist-info}/entry_points.txt +8 -2
  153. jarvis/jarvis_git_details/main.py +0 -265
  154. jarvis/jarvis_platform/oyi.py +0 -357
  155. jarvis/jarvis_tools/edit_file.py +0 -255
  156. jarvis/jarvis_tools/rewrite_file.py +0 -195
  157. jarvis_ai_assistant-0.1.222.dist-info/METADATA +0 -767
  158. jarvis_ai_assistant-0.1.222.dist-info/RECORD +0 -110
  159. /jarvis/{jarvis_git_details → jarvis_memory_organizer}/__init__.py +0 -0
  160. {jarvis_ai_assistant-0.1.222.dist-info → jarvis_ai_assistant-0.7.0.dist-info}/WHEEL +0 -0
  161. {jarvis_ai_assistant-0.1.222.dist-info → jarvis_ai_assistant-0.7.0.dist-info}/licenses/LICENSE +0 -0
  162. {jarvis_ai_assistant-0.1.222.dist-info → jarvis_ai_assistant-0.7.0.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,219 @@
1
+ # -*- coding: utf-8 -*-
2
+ """
3
+ Jarvis 安全分析套件 —— Workflow(含可复现直扫基线)
4
+
5
+ 目标:
6
+ - 识别指定模块的安全问题(内存管理、缓冲区操作、错误处理等),检出率≥60% 为目标。
7
+ - 在不依赖外部服务的前提下,提供一个“可复现、可离线”的直扫基线(direct scan)。
8
+ - 当前采用“先直扫拆分子任务,再由单Agent逐条分析”的模式;保留接口便于后续切换。
9
+
10
+ 本模块提供:
11
+ - direct_scan(entry_path, languages=None, exclude_dirs=None) -> Dict:纯Python+正则/命令行辅助扫描,生成结构化结果
12
+ - format_markdown_report(result_json: Dict) -> str:将结构化结果转为可读的 Markdown
13
+
14
+ - run_with_agent(entry_path, languages=None) -> str:使用单Agent逐条子任务分析模式(复用 jarvis.jarvis_sec.__init__ 的实现)
15
+ """
16
+
17
+ from dataclasses import asdict
18
+ from pathlib import Path
19
+ from typing import Any, Dict, Iterable, List, Optional, cast
20
+
21
+ import typer
22
+
23
+ from jarvis.jarvis_sec.checkers import analyze_c_files, analyze_rust_files
24
+ from jarvis.jarvis_sec.types import Issue
25
+
26
+
27
+ # ---------------------------
28
+ # 数据结构
29
+ # ---------------------------
30
+
31
+ # Issue dataclass is provided by jarvis.jarvis_sec.types to avoid circular imports
32
+
33
+
34
+ # ---------------------------
35
+ # 工具函数
36
+ # ---------------------------
37
+
38
+
39
+ def _iter_source_files(
40
+ entry_path: str,
41
+ languages: Optional[List[str]] = None,
42
+ exclude_dirs: Optional[List[str]] = None,
43
+ ) -> Iterable[Path]:
44
+ """
45
+ 递归枚举源文件,支持按扩展名过滤与目录排除。
46
+ 默认语言扩展:c, cpp, h, hpp, rs
47
+ """
48
+ entry = Path(entry_path)
49
+ if not entry.exists():
50
+ return
51
+
52
+ exts = set((languages or ["c", "cpp", "h", "hpp", "rs"]))
53
+ excludes = set(exclude_dirs or [".git", "build", "out", "target", "dist", "bin", "obj", "third_party", "vendor", "deps", "dependencies", "libs", "libraries", "external", "node_modules", "test", "tests", "__tests__", "spec", "testsuite", "testdata", "benchmark", "benchmarks", "perf", "performance", "bench", "benches", "profiling", "profiler", "example", "examples", "tmp", "temp", "cache", ".cache", "docs", "doc", "documentation", "generated", "gen", "mocks", "fixtures", "samples", "sample", "playground", "sandbox"])
54
+
55
+ for p in entry.rglob("*"):
56
+ if not p.is_file():
57
+ continue
58
+ # 目录排除(任意祖先包含即排除)
59
+ skip = False
60
+ for parent in p.parents:
61
+ if parent.name in excludes:
62
+ skip = True
63
+ break
64
+ if skip:
65
+ continue
66
+
67
+ suf = p.suffix.lstrip(".").lower()
68
+ if suf in exts:
69
+ yield p.relative_to(entry)
70
+
71
+
72
+
73
+ # ---------------------------
74
+ # 汇总与报告
75
+ # ---------------------------
76
+
77
+ def direct_scan(
78
+ entry_path: str,
79
+ languages: Optional[List[str]] = None,
80
+ exclude_dirs: Optional[List[str]] = None,
81
+ ) -> Dict:
82
+ """
83
+ 直扫基线:对 C/C++/Rust 进行启发式扫描,输出结构化 JSON。
84
+ - 改进:委派至模块化检查器(oh_sec.checkers),统一规则与置信度模型。
85
+ """
86
+ base = Path(entry_path).resolve()
87
+ # 计算实际使用的排除目录列表
88
+ default_excludes = [".git", "build", "out", "target", "dist", "bin", "obj", "third_party", "vendor", "deps", "dependencies", "libs", "libraries", "external", "node_modules", "test", "tests", "__tests__", "spec", "testsuite", "testdata", "benchmark", "benchmarks", "perf", "performance", "bench", "benches", "profiling", "profiler", "example", "examples", "tmp", "temp", "cache", ".cache", "docs", "doc", "documentation", "generated", "gen", "mocks", "fixtures", "samples", "sample", "playground", "sandbox"]
89
+ actual_excludes = exclude_dirs if exclude_dirs is not None else default_excludes
90
+
91
+ # 检查代码库中实际存在的排除目录
92
+ excludes_set = set(actual_excludes)
93
+ actual_excluded_dirs = []
94
+ for item in base.rglob("*"):
95
+ if item.is_dir() and item.name in excludes_set:
96
+ rel_path = item.relative_to(base)
97
+ if str(rel_path) not in actual_excluded_dirs:
98
+ actual_excluded_dirs.append(str(rel_path))
99
+
100
+ if actual_excluded_dirs:
101
+ typer.secho("[jarvis-sec] 实际排除的目录:", fg=typer.colors.BLUE)
102
+ for dir_path in sorted(actual_excluded_dirs):
103
+ typer.secho(f" - {dir_path}", fg=typer.colors.BLUE)
104
+ else:
105
+ typer.secho(f"[jarvis-sec] 未发现需要排除的目录(配置的排除目录: {', '.join(sorted(actual_excludes))})", fg=typer.colors.BLUE)
106
+
107
+ files = list(_iter_source_files(entry_path, languages, exclude_dirs))
108
+
109
+ # 按语言分组
110
+ c_like_exts = {".c", ".cpp", ".h", ".hpp"}
111
+ rust_exts = {".rs"}
112
+ c_files: List[Path] = [p for p in files if p.suffix.lower() in c_like_exts]
113
+ r_files: List[Path] = [p for p in files if p.suffix.lower() in rust_exts]
114
+
115
+ # 调用检查器(保持相对路径,基于 base_path 解析)
116
+ issues_c = analyze_c_files(str(base), [str(p) for p in c_files]) if c_files else []
117
+ issues_r = analyze_rust_files(str(base), [str(p) for p in r_files]) if r_files else []
118
+ issues: List[Issue] = issues_c + issues_r
119
+
120
+
121
+ summary: Dict[str, Any] = {
122
+ "total": len(issues),
123
+ "by_language": {"c/cpp": 0, "rust": 0},
124
+ "by_category": {},
125
+ "top_risk_files": [],
126
+ "scanned_files": len(files),
127
+ "scanned_root": str(base),
128
+ }
129
+ file_score: Dict[str, int] = {}
130
+ # Safely update language/category counts with explicit typing
131
+ lang_counts = cast(Dict[str, int], summary["by_language"])
132
+ cat_counts = cast(Dict[str, int], summary["by_category"])
133
+ for it in issues:
134
+ lang_counts[it.language] = lang_counts.get(it.language, 0) + 1
135
+ cat_counts[it.category] = cat_counts.get(it.category, 0) + 1
136
+ file_score[it.file] = file_score.get(it.file, 0) + 1
137
+ # Top 风险文件
138
+ summary["top_risk_files"] = [f for f, _ in sorted(file_score.items(), key=lambda x: x[1], reverse=True)[:10]]
139
+
140
+ result = {
141
+ "summary": summary,
142
+ "issues": [asdict(i) for i in issues],
143
+ }
144
+ return result
145
+
146
+
147
+ def format_markdown_report(result_json: Dict) -> str:
148
+ """
149
+ 将结构化 JSON 转为 Markdown 可读报告。
150
+ """
151
+ s = result_json.get("summary", {})
152
+ issues: List[Dict] = result_json.get("issues", [])
153
+ md: List[str] = []
154
+ md.append("# Jarvis 安全问题分析报告(直扫基线)")
155
+ md.append("")
156
+ md.append(f"- 扫描根目录: {s.get('scanned_root', '')}")
157
+ md.append(f"- 扫描文件数: {s.get('scanned_files', 0)}")
158
+ md.append(f"- 检出问题总数: {s.get('total', 0)}")
159
+ md.append("")
160
+ md.append("## 统计概览")
161
+ by_lang = s.get("by_language", {})
162
+ md.append(f"- 按语言: c/cpp={by_lang.get('c/cpp', 0)}, rust={by_lang.get('rust', 0)}")
163
+ md.append("- 按类别:")
164
+ for k, v in s.get("by_category", {}).items():
165
+ md.append(f" - {k}: {v}")
166
+ if s.get("top_risk_files"):
167
+ md.append("- Top 风险文件:")
168
+ for f in s["top_risk_files"]:
169
+ md.append(f" - {f}")
170
+ md.append("")
171
+ md.append("## 详细问题")
172
+ for i, it in enumerate(issues, start=1):
173
+ md.append(f"### [{i}] {it.get('file')}:{it.get('line')} ({it.get('language')}, {it.get('category')})")
174
+ md.append(f"- 模式: {it.get('pattern')}")
175
+ md.append(f"- 证据: `{it.get('evidence')}`")
176
+ md.append(f"- 描述: {it.get('description')}")
177
+ md.append(f"- 建议: {it.get('suggestion')}")
178
+ md.append(f"- 置信度: {it.get('confidence')}, 严重性: {it.get('severity')}")
179
+ md.append("")
180
+ return "\n".join(md)
181
+
182
+
183
+ def run_with_agent(
184
+ entry_path: str,
185
+ languages: Optional[List[str]] = None,
186
+ llm_group: Optional[str] = None,
187
+ report_file: Optional[str] = None,
188
+ cluster_limit: int = 50,
189
+ exclude_dirs: Optional[List[str]] = None,
190
+ ) -> str:
191
+ """
192
+ 使用单Agent逐条子任务分析模式运行(与 jarvis.jarvis_sec.__init__ 中保持一致)。
193
+ - 先执行本地直扫,生成候选问题
194
+ - 为每条候选创建一次普通Agent任务进行分析与验证
195
+ - 聚合为最终报告(JSON + Markdown)返回
196
+
197
+ 其他:
198
+ - llm_group: 本次分析使用的模型组(仅透传给 Agent,不修改全局配置)
199
+ - report_file: JSONL 报告文件路径(可选,透传)
200
+ - cluster_limit: 聚类时每批次最多处理的告警数(默认 50),当单个文件告警过多时按批次进行聚类
201
+ - exclude_dirs: 要排除的目录列表(可选),默认已包含构建产物(build, out, target, dist, bin, obj)、依赖目录(third_party, vendor, deps, dependencies, libs, libraries, external, node_modules)、测试目录(test, tests, __tests__, spec, testsuite, testdata)、性能测试目录(benchmark, benchmarks, perf, performance, bench, benches, profiling, profiler)、示例目录(example, examples)、临时/缓存(tmp, temp, cache, .cache)、文档(docs, doc, documentation)、生成代码(generated, gen)和其他(mocks, fixtures, samples, sample, playground, sandbox)
202
+ """
203
+ from jarvis.jarvis_sec import run_security_analysis # 延迟导入,避免循环
204
+ return run_security_analysis(
205
+ entry_path,
206
+ languages=languages,
207
+ llm_group=llm_group,
208
+ report_file=report_file,
209
+ cluster_limit=cluster_limit,
210
+ exclude_dirs=exclude_dirs,
211
+ )
212
+
213
+
214
+ __all__ = [
215
+ "Issue",
216
+ "direct_scan",
217
+ "format_markdown_report",
218
+ "run_with_agent",
219
+ ]