jarvis-ai-assistant 0.7.0__py3-none-any.whl → 0.7.8__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 (159) hide show
  1. jarvis/__init__.py +1 -1
  2. jarvis/jarvis_agent/__init__.py +243 -139
  3. jarvis/jarvis_agent/agent_manager.py +5 -10
  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 +265 -15
  8. jarvis/jarvis_agent/file_methodology_manager.py +3 -4
  9. jarvis/jarvis_agent/jarvis.py +113 -98
  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 +6 -12
  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 +77 -14
  27. jarvis/jarvis_agent/session_manager.py +2 -3
  28. jarvis/jarvis_agent/share_manager.py +12 -21
  29. jarvis/jarvis_agent/shell_input_handler.py +1 -2
  30. jarvis/jarvis_agent/task_analyzer.py +26 -4
  31. jarvis/jarvis_agent/task_manager.py +11 -27
  32. jarvis/jarvis_agent/tool_executor.py +2 -3
  33. jarvis/jarvis_agent/tool_share_manager.py +12 -24
  34. jarvis/jarvis_agent/web_server.py +55 -20
  35. jarvis/jarvis_c2rust/__init__.py +5 -5
  36. jarvis/jarvis_c2rust/cli.py +461 -499
  37. jarvis/jarvis_c2rust/collector.py +45 -53
  38. jarvis/jarvis_c2rust/constants.py +26 -0
  39. jarvis/jarvis_c2rust/library_replacer.py +264 -132
  40. jarvis/jarvis_c2rust/llm_module_agent.py +162 -190
  41. jarvis/jarvis_c2rust/loaders.py +207 -0
  42. jarvis/jarvis_c2rust/models.py +28 -0
  43. jarvis/jarvis_c2rust/optimizer.py +1592 -395
  44. jarvis/jarvis_c2rust/transpiler.py +1722 -1064
  45. jarvis/jarvis_c2rust/utils.py +385 -0
  46. jarvis/jarvis_code_agent/build_validation_config.py +2 -3
  47. jarvis/jarvis_code_agent/code_agent.py +394 -320
  48. jarvis/jarvis_code_agent/code_analyzer/__init__.py +3 -0
  49. jarvis/jarvis_code_agent/code_analyzer/build_validator/base.py +4 -0
  50. jarvis/jarvis_code_agent/code_analyzer/build_validator/cmake.py +17 -2
  51. jarvis/jarvis_code_agent/code_analyzer/build_validator/fallback.py +3 -0
  52. jarvis/jarvis_code_agent/code_analyzer/build_validator/go.py +36 -4
  53. jarvis/jarvis_code_agent/code_analyzer/build_validator/java_gradle.py +9 -0
  54. jarvis/jarvis_code_agent/code_analyzer/build_validator/java_maven.py +9 -0
  55. jarvis/jarvis_code_agent/code_analyzer/build_validator/makefile.py +12 -1
  56. jarvis/jarvis_code_agent/code_analyzer/build_validator/nodejs.py +22 -5
  57. jarvis/jarvis_code_agent/code_analyzer/build_validator/python.py +57 -32
  58. jarvis/jarvis_code_agent/code_analyzer/build_validator/rust.py +62 -6
  59. jarvis/jarvis_code_agent/code_analyzer/build_validator/validator.py +8 -9
  60. jarvis/jarvis_code_agent/code_analyzer/context_manager.py +290 -5
  61. jarvis/jarvis_code_agent/code_analyzer/language_support.py +21 -0
  62. jarvis/jarvis_code_agent/code_analyzer/languages/__init__.py +21 -3
  63. jarvis/jarvis_code_agent/code_analyzer/languages/c_cpp_language.py +72 -4
  64. jarvis/jarvis_code_agent/code_analyzer/languages/go_language.py +35 -3
  65. jarvis/jarvis_code_agent/code_analyzer/languages/java_language.py +212 -0
  66. jarvis/jarvis_code_agent/code_analyzer/languages/javascript_language.py +254 -0
  67. jarvis/jarvis_code_agent/code_analyzer/languages/python_language.py +52 -2
  68. jarvis/jarvis_code_agent/code_analyzer/languages/rust_language.py +73 -1
  69. jarvis/jarvis_code_agent/code_analyzer/languages/typescript_language.py +280 -0
  70. jarvis/jarvis_code_agent/code_analyzer/llm_context_recommender.py +306 -152
  71. jarvis/jarvis_code_agent/code_analyzer/structured_code.py +556 -0
  72. jarvis/jarvis_code_agent/code_analyzer/symbol_extractor.py +193 -18
  73. jarvis/jarvis_code_agent/code_analyzer/tree_sitter_extractor.py +18 -8
  74. jarvis/jarvis_code_agent/lint.py +258 -27
  75. jarvis/jarvis_code_agent/utils.py +0 -1
  76. jarvis/jarvis_code_analysis/code_review.py +19 -24
  77. jarvis/jarvis_data/config_schema.json +53 -26
  78. jarvis/jarvis_git_squash/main.py +4 -5
  79. jarvis/jarvis_git_utils/git_commiter.py +44 -49
  80. jarvis/jarvis_mcp/sse_mcp_client.py +20 -27
  81. jarvis/jarvis_mcp/stdio_mcp_client.py +11 -12
  82. jarvis/jarvis_mcp/streamable_mcp_client.py +15 -14
  83. jarvis/jarvis_memory_organizer/memory_organizer.py +55 -74
  84. jarvis/jarvis_methodology/main.py +32 -48
  85. jarvis/jarvis_multi_agent/__init__.py +79 -61
  86. jarvis/jarvis_multi_agent/main.py +3 -7
  87. jarvis/jarvis_platform/base.py +469 -199
  88. jarvis/jarvis_platform/human.py +7 -8
  89. jarvis/jarvis_platform/kimi.py +30 -36
  90. jarvis/jarvis_platform/openai.py +65 -27
  91. jarvis/jarvis_platform/registry.py +26 -10
  92. jarvis/jarvis_platform/tongyi.py +24 -25
  93. jarvis/jarvis_platform/yuanbao.py +31 -42
  94. jarvis/jarvis_platform_manager/main.py +66 -77
  95. jarvis/jarvis_platform_manager/service.py +8 -13
  96. jarvis/jarvis_rag/cli.py +49 -51
  97. jarvis/jarvis_rag/embedding_manager.py +13 -18
  98. jarvis/jarvis_rag/llm_interface.py +8 -9
  99. jarvis/jarvis_rag/query_rewriter.py +10 -21
  100. jarvis/jarvis_rag/rag_pipeline.py +24 -27
  101. jarvis/jarvis_rag/reranker.py +4 -5
  102. jarvis/jarvis_rag/retriever.py +28 -30
  103. jarvis/jarvis_sec/__init__.py +220 -3520
  104. jarvis/jarvis_sec/agents.py +143 -0
  105. jarvis/jarvis_sec/analysis.py +276 -0
  106. jarvis/jarvis_sec/cli.py +29 -6
  107. jarvis/jarvis_sec/clustering.py +1439 -0
  108. jarvis/jarvis_sec/file_manager.py +427 -0
  109. jarvis/jarvis_sec/parsers.py +73 -0
  110. jarvis/jarvis_sec/prompts.py +268 -0
  111. jarvis/jarvis_sec/report.py +83 -4
  112. jarvis/jarvis_sec/review.py +453 -0
  113. jarvis/jarvis_sec/utils.py +499 -0
  114. jarvis/jarvis_sec/verification.py +848 -0
  115. jarvis/jarvis_sec/workflow.py +7 -0
  116. jarvis/jarvis_smart_shell/main.py +38 -87
  117. jarvis/jarvis_stats/cli.py +1 -1
  118. jarvis/jarvis_stats/stats.py +7 -7
  119. jarvis/jarvis_stats/storage.py +15 -21
  120. jarvis/jarvis_tools/clear_memory.py +3 -20
  121. jarvis/jarvis_tools/cli/main.py +20 -23
  122. jarvis/jarvis_tools/edit_file.py +1066 -0
  123. jarvis/jarvis_tools/execute_script.py +42 -21
  124. jarvis/jarvis_tools/file_analyzer.py +6 -9
  125. jarvis/jarvis_tools/generate_new_tool.py +11 -20
  126. jarvis/jarvis_tools/lsp_client.py +1552 -0
  127. jarvis/jarvis_tools/methodology.py +2 -3
  128. jarvis/jarvis_tools/read_code.py +1525 -87
  129. jarvis/jarvis_tools/read_symbols.py +2 -3
  130. jarvis/jarvis_tools/read_webpage.py +7 -10
  131. jarvis/jarvis_tools/registry.py +370 -181
  132. jarvis/jarvis_tools/retrieve_memory.py +20 -19
  133. jarvis/jarvis_tools/rewrite_file.py +105 -0
  134. jarvis/jarvis_tools/save_memory.py +3 -15
  135. jarvis/jarvis_tools/search_web.py +3 -7
  136. jarvis/jarvis_tools/sub_agent.py +17 -6
  137. jarvis/jarvis_tools/sub_code_agent.py +14 -16
  138. jarvis/jarvis_tools/virtual_tty.py +54 -32
  139. jarvis/jarvis_utils/clipboard.py +7 -10
  140. jarvis/jarvis_utils/config.py +98 -63
  141. jarvis/jarvis_utils/embedding.py +5 -5
  142. jarvis/jarvis_utils/fzf.py +8 -8
  143. jarvis/jarvis_utils/git_utils.py +81 -67
  144. jarvis/jarvis_utils/input.py +24 -49
  145. jarvis/jarvis_utils/jsonnet_compat.py +465 -0
  146. jarvis/jarvis_utils/methodology.py +33 -35
  147. jarvis/jarvis_utils/utils.py +245 -202
  148. {jarvis_ai_assistant-0.7.0.dist-info → jarvis_ai_assistant-0.7.8.dist-info}/METADATA +205 -70
  149. jarvis_ai_assistant-0.7.8.dist-info/RECORD +218 -0
  150. jarvis/jarvis_agent/edit_file_handler.py +0 -584
  151. jarvis/jarvis_agent/rewrite_file_handler.py +0 -141
  152. jarvis/jarvis_agent/task_planner.py +0 -496
  153. jarvis/jarvis_platform/ai8.py +0 -332
  154. jarvis/jarvis_tools/ask_user.py +0 -54
  155. jarvis_ai_assistant-0.7.0.dist-info/RECORD +0 -192
  156. {jarvis_ai_assistant-0.7.0.dist-info → jarvis_ai_assistant-0.7.8.dist-info}/WHEEL +0 -0
  157. {jarvis_ai_assistant-0.7.0.dist-info → jarvis_ai_assistant-0.7.8.dist-info}/entry_points.txt +0 -0
  158. {jarvis_ai_assistant-0.7.0.dist-info → jarvis_ai_assistant-0.7.8.dist-info}/licenses/LICENSE +0 -0
  159. {jarvis_ai_assistant-0.7.0.dist-info → jarvis_ai_assistant-0.7.8.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,207 @@
1
+ # -*- coding: utf-8 -*-
2
+ """
3
+ C2Rust 转译器数据加载器
4
+ """
5
+ from __future__ import annotations
6
+
7
+ import json
8
+ import time
9
+ from pathlib import Path
10
+ from typing import Any, Dict, List, Optional, Tuple
11
+
12
+ from jarvis.jarvis_c2rust.constants import C2RUST_DIRNAME, SYMBOLS_JSONL
13
+ from jarvis.jarvis_c2rust.models import FnRecord
14
+
15
+
16
+ class _DbLoader:
17
+ """读取 symbols.jsonl 并提供按 id/name 查询与源码片段读取"""
18
+
19
+ def __init__(self, project_root: Path) -> None:
20
+ self.project_root = project_root.resolve()
21
+ self.data_dir = self.project_root / C2RUST_DIRNAME
22
+
23
+ self.symbols_path = self.data_dir / SYMBOLS_JSONL
24
+ # 统一流程:仅使用 symbols.jsonl,不再兼容 functions.jsonl
25
+ if not self.symbols_path.exists():
26
+ raise FileNotFoundError(
27
+ f"在目录下未找到 symbols.jsonl: {self.data_dir}"
28
+ )
29
+
30
+ self.fn_by_id: Dict[int, FnRecord] = {}
31
+ self.name_to_id: Dict[str, int] = {}
32
+ self._load()
33
+
34
+ def _load(self) -> None:
35
+ """
36
+ 读取统一的 symbols.jsonl。
37
+ 不区分函数与类型定义,均加载为通用记录(位置与引用信息)。
38
+ """
39
+ def _iter_records_from_file(path: Path):
40
+ try:
41
+ with path.open("r", encoding="utf-8") as f:
42
+ idx = 0
43
+ for line in f:
44
+ line = line.strip()
45
+ if not line:
46
+ continue
47
+ try:
48
+ obj = json.loads(line)
49
+ except Exception:
50
+ continue
51
+ idx += 1
52
+ yield idx, obj
53
+ except FileNotFoundError:
54
+ return
55
+
56
+ # 加载所有符号记录(函数、类型等)
57
+ for idx, obj in _iter_records_from_file(self.symbols_path):
58
+ fid = int(obj.get("id") or idx)
59
+ nm = obj.get("name") or ""
60
+ qn = obj.get("qualified_name") or ""
61
+ fp = obj.get("file") or ""
62
+ refs = obj.get("ref")
63
+ # 统一使用列表类型的引用字段
64
+ if not isinstance(refs, list):
65
+ refs = []
66
+ refs = [c for c in refs if isinstance(c, str) and c]
67
+ sr = int(obj.get("start_line") or 0)
68
+ sc = int(obj.get("start_col") or 0)
69
+ er = int(obj.get("end_line") or 0)
70
+ ec = int(obj.get("end_col") or 0)
71
+ lr = obj.get("lib_replacement") if isinstance(obj.get("lib_replacement"), dict) else None
72
+ rec = FnRecord(
73
+ id=fid,
74
+ name=nm,
75
+ qname=qn,
76
+ file=fp,
77
+ start_line=sr,
78
+ start_col=sc,
79
+ end_line=er,
80
+ end_col=ec,
81
+ refs=refs,
82
+ lib_replacement=lr,
83
+ )
84
+ self.fn_by_id[fid] = rec
85
+ if nm:
86
+ self.name_to_id.setdefault(nm, fid)
87
+ if qn:
88
+ self.name_to_id.setdefault(qn, fid)
89
+
90
+ def get(self, fid: int) -> Optional[FnRecord]:
91
+ return self.fn_by_id.get(fid)
92
+
93
+ def get_id_by_name(self, name_or_qname: str) -> Optional[int]:
94
+ return self.name_to_id.get(name_or_qname)
95
+
96
+ def read_source_span(self, rec: FnRecord) -> str:
97
+ """按起止行读取源码片段(忽略列边界,尽量完整)"""
98
+ try:
99
+ p = Path(rec.file)
100
+ # 若记录为相对路径,基于 project_root 解析
101
+ if not p.is_absolute():
102
+ p = (self.project_root / p).resolve()
103
+ if not p.exists():
104
+ return ""
105
+ lines = p.read_text(encoding="utf-8", errors="replace").splitlines()
106
+ s = max(1, rec.start_line)
107
+ e = min(len(lines), max(rec.end_line, s))
108
+ # Python 索引从0开始,包含终止行
109
+ chunk = "\n".join(lines[s - 1 : e])
110
+ return chunk
111
+ except Exception:
112
+ return ""
113
+
114
+
115
+ class _SymbolMapJsonl:
116
+ """
117
+ JSONL 形式的符号映射管理:
118
+ - 每行一条记录,支持同名函数的多条映射(用于处理重载/同名符号)
119
+ - 记录字段:
120
+ {
121
+ "c_name": "<简单名>",
122
+ "c_qname": "<限定名,可为空字符串>",
123
+ "c_file": "<源文件路径>",
124
+ "start_line": <int>,
125
+ "end_line": <int>,
126
+ "module": "src/xxx.rs 或 src/xxx/mod.rs",
127
+ "rust_symbol": "<Rust函数名>",
128
+ "updated_at": "YYYY-MM-DDTHH:MM:SS"
129
+ }
130
+ - 提供按名称(c_name/c_qname)查询、按源位置判断是否已记录等能力
131
+ """
132
+
133
+ def __init__(self, jsonl_path: Path) -> None:
134
+ self.jsonl_path = jsonl_path
135
+ self.records: List[Dict[str, Any]] = []
136
+ # 索引:名称 -> 记录列表索引
137
+ self.by_key: Dict[str, List[int]] = {}
138
+ # 唯一定位(避免同名冲突):(c_file, start_line, end_line, c_qname or c_name) -> 记录索引列表
139
+ self.by_pos: Dict[Tuple[str, int, int, str], List[int]] = {}
140
+ self._load()
141
+
142
+ def _load(self) -> None:
143
+ self.records = []
144
+ self.by_key = {}
145
+ self.by_pos = {}
146
+ # 读取 JSONL
147
+ if self.jsonl_path.exists():
148
+ try:
149
+ with self.jsonl_path.open("r", encoding="utf-8") as f:
150
+ for line in f:
151
+ line = line.strip()
152
+ if not line:
153
+ continue
154
+ try:
155
+ obj = json.loads(line)
156
+ except Exception:
157
+ continue
158
+ self._add_record_in_memory(obj)
159
+ except Exception:
160
+ pass
161
+
162
+ def _add_record_in_memory(self, rec: Dict[str, Any]) -> None:
163
+ idx = len(self.records)
164
+ self.records.append(rec)
165
+ for key in [rec.get("c_name") or "", rec.get("c_qname") or ""]:
166
+ k = str(key or "").strip()
167
+ if not k:
168
+ continue
169
+ self.by_key.setdefault(k, []).append(idx)
170
+ pos_key = (str(rec.get("c_file") or ""), int(rec.get("start_line") or 0), int(rec.get("end_line") or 0), str(rec.get("c_qname") or rec.get("c_name") or ""))
171
+ self.by_pos.setdefault(pos_key, []).append(idx)
172
+
173
+ def has_symbol(self, sym: str) -> bool:
174
+ return bool(self.by_key.get(sym))
175
+
176
+ def get(self, sym: str) -> List[Dict[str, Any]]:
177
+ idxs = self.by_key.get(sym) or []
178
+ return [self.records[i] for i in idxs]
179
+
180
+ def get_any(self, sym: str) -> Optional[Dict[str, Any]]:
181
+ recs = self.get(sym)
182
+ return recs[-1] if recs else None
183
+
184
+ def has_rec(self, rec: FnRecord) -> bool:
185
+ key = (str(rec.file or ""), int(rec.start_line or 0), int(rec.end_line or 0), str(rec.qname or rec.name or ""))
186
+ return bool(self.by_pos.get(key))
187
+
188
+ def add(self, rec: FnRecord, module: str, rust_symbol: str) -> None:
189
+ obj = {
190
+ "c_name": rec.name or "",
191
+ "c_qname": rec.qname or "",
192
+ "c_file": rec.file or "",
193
+ "start_line": int(rec.start_line or 0),
194
+ "end_line": int(rec.end_line or 0),
195
+ "module": str(module or ""),
196
+ "rust_symbol": str(rust_symbol or (rec.name or f"fn_{rec.id}")),
197
+ "updated_at": time.strftime("%Y-%m-%dT%H:%M:%S", time.localtime()),
198
+ }
199
+ # 先写盘,再更新内存索引
200
+ try:
201
+ self.jsonl_path.parent.mkdir(parents=True, exist_ok=True)
202
+ with self.jsonl_path.open("a", encoding="utf-8") as f:
203
+ f.write(json.dumps(obj, ensure_ascii=False) + "\n")
204
+ except Exception:
205
+ pass
206
+ self._add_record_in_memory(obj)
207
+
@@ -0,0 +1,28 @@
1
+ # -*- coding: utf-8 -*-
2
+ """
3
+ C2Rust 转译器数据模型
4
+ """
5
+ from __future__ import annotations
6
+
7
+ from dataclasses import dataclass
8
+ from typing import Any, Dict, List, Optional
9
+
10
+
11
+ @dataclass
12
+ class FnRecord:
13
+ id: int
14
+ name: str
15
+ qname: str
16
+ file: str
17
+ start_line: int
18
+ start_col: int
19
+ end_line: int
20
+ end_col: int
21
+ refs: List[str]
22
+ # 额外元信息(来自 symbols/items):函数签名、返回类型与参数(可选)
23
+ signature: str = ""
24
+ return_type: str = ""
25
+ params: Optional[List[Dict[str, str]]] = None
26
+ # 来自库替代阶段的上下文元数据(若存在)
27
+ lib_replacement: Optional[Dict[str, Any]] = None
28
+