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_stats/storage.py
CHANGED
|
@@ -6,13 +6,19 @@
|
|
|
6
6
|
|
|
7
7
|
import json
|
|
8
8
|
import os
|
|
9
|
-
from datetime import datetime, timedelta
|
|
10
|
-
from pathlib import Path
|
|
11
|
-
from typing import Dict, List, Optional, Any, Set
|
|
12
|
-
from collections import defaultdict
|
|
13
9
|
import sys
|
|
14
10
|
import time
|
|
15
11
|
import uuid
|
|
12
|
+
from collections import defaultdict
|
|
13
|
+
from datetime import datetime
|
|
14
|
+
from datetime import timedelta
|
|
15
|
+
from pathlib import Path
|
|
16
|
+
from typing import Any
|
|
17
|
+
from typing import Dict
|
|
18
|
+
from typing import List
|
|
19
|
+
from typing import Optional
|
|
20
|
+
from typing import Set
|
|
21
|
+
from typing import cast
|
|
16
22
|
|
|
17
23
|
|
|
18
24
|
class StatsStorage:
|
|
@@ -70,7 +76,7 @@ class StatsStorage:
|
|
|
70
76
|
try:
|
|
71
77
|
with open(filepath, "r", encoding="utf-8") as f:
|
|
72
78
|
data = json.load(f)
|
|
73
|
-
return data
|
|
79
|
+
return cast(Dict[Any, Any], data)
|
|
74
80
|
except Exception:
|
|
75
81
|
if attempt < max_retries - 1:
|
|
76
82
|
time.sleep(0.1 * (attempt + 1)) # 递增延迟
|
|
@@ -400,7 +406,7 @@ class StatsStorage:
|
|
|
400
406
|
if info and isinstance(info, dict):
|
|
401
407
|
grp = info.get("group")
|
|
402
408
|
if grp:
|
|
403
|
-
return grp
|
|
409
|
+
return cast(str, grp)
|
|
404
410
|
|
|
405
411
|
# 扫描历史记录以推断
|
|
406
412
|
group_counts: Dict[str, int] = {}
|
|
@@ -448,10 +454,10 @@ class StatsStorage:
|
|
|
448
454
|
except Exception:
|
|
449
455
|
return None
|
|
450
456
|
|
|
451
|
-
def get_metric_info(self, metric_name: str) -> Optional[Dict]:
|
|
457
|
+
def get_metric_info(self, metric_name: str) -> Optional[Dict[Any, Any]]:
|
|
452
458
|
"""获取指标元信息"""
|
|
453
459
|
meta = self._load_json(self.meta_file)
|
|
454
|
-
return meta.get("metrics", {}).get(metric_name)
|
|
460
|
+
return cast(Optional[Dict[Any, Any]], meta.get("metrics", {}).get(metric_name))
|
|
455
461
|
|
|
456
462
|
def list_metrics(self) -> List[str]:
|
|
457
463
|
"""列出所有指标"""
|
|
@@ -4,15 +4,20 @@
|
|
|
4
4
|
提供终端图形化展示功能
|
|
5
5
|
"""
|
|
6
6
|
|
|
7
|
-
import os
|
|
8
7
|
import io
|
|
9
|
-
|
|
8
|
+
import os
|
|
10
9
|
from collections import OrderedDict
|
|
10
|
+
from typing import Any
|
|
11
|
+
from typing import Dict
|
|
12
|
+
from typing import List
|
|
13
|
+
from typing import Optional
|
|
14
|
+
from typing import cast
|
|
15
|
+
|
|
11
16
|
import plotext as plt
|
|
17
|
+
from rich import box
|
|
12
18
|
from rich.console import Console
|
|
13
|
-
from rich.table import Table
|
|
14
19
|
from rich.panel import Panel
|
|
15
|
-
from rich import
|
|
20
|
+
from rich.table import Table
|
|
16
21
|
|
|
17
22
|
|
|
18
23
|
class StatsVisualizer:
|
|
@@ -70,7 +75,7 @@ class StatsVisualizer:
|
|
|
70
75
|
if unit:
|
|
71
76
|
plt.ylabel(unit)
|
|
72
77
|
|
|
73
|
-
chart = plt.build()
|
|
78
|
+
chart = cast(str, plt.build())
|
|
74
79
|
|
|
75
80
|
if show_values and values:
|
|
76
81
|
min_val = min(values)
|
|
@@ -125,7 +130,7 @@ class StatsVisualizer:
|
|
|
125
130
|
if unit:
|
|
126
131
|
plt.ylabel(unit)
|
|
127
132
|
|
|
128
|
-
return plt.build()
|
|
133
|
+
return cast(str, plt.build())
|
|
129
134
|
|
|
130
135
|
def show_summary(
|
|
131
136
|
self,
|
|
@@ -267,7 +272,7 @@ class StatsVisualizer:
|
|
|
267
272
|
f"显示: {len(display_records)} | "
|
|
268
273
|
f"最小值: {min(values):.2f} | "
|
|
269
274
|
f"最大值: {max(values):.2f} | "
|
|
270
|
-
f"平均值: {sum(values)/len(values):.2f}"
|
|
275
|
+
f"平均值: {sum(values) / len(values):.2f}"
|
|
271
276
|
)
|
|
272
277
|
self.console.print(
|
|
273
278
|
Panel(
|
jarvis/jarvis_tools/base.py
CHANGED
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
# -*- coding: utf-8 -*-
|
|
2
2
|
import json
|
|
3
|
-
from typing import Any
|
|
3
|
+
from typing import Any
|
|
4
|
+
from typing import Callable
|
|
5
|
+
from typing import Dict
|
|
6
|
+
from typing import cast
|
|
4
7
|
|
|
5
8
|
|
|
6
9
|
class Tool:
|
|
@@ -49,7 +52,7 @@ class Tool:
|
|
|
49
52
|
Dict[str, Any]: 工具执行结果
|
|
50
53
|
"""
|
|
51
54
|
try:
|
|
52
|
-
return self.func(arguments)
|
|
55
|
+
return cast(Dict[str, Any], self.func(arguments))
|
|
53
56
|
except Exception as e:
|
|
54
57
|
return {
|
|
55
58
|
"success": False,
|
|
@@ -1,13 +1,15 @@
|
|
|
1
1
|
# -*- coding: utf-8 -*-
|
|
2
2
|
import json
|
|
3
3
|
from pathlib import Path
|
|
4
|
-
from typing import Any
|
|
4
|
+
from typing import Any
|
|
5
|
+
from typing import Dict
|
|
6
|
+
from typing import List
|
|
7
|
+
from typing import Optional
|
|
5
8
|
|
|
6
9
|
from jarvis.jarvis_utils.config import get_data_dir
|
|
7
|
-
from jarvis.jarvis_utils.globals import
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
)
|
|
10
|
+
from jarvis.jarvis_utils.globals import clear_short_term_memories
|
|
11
|
+
from jarvis.jarvis_utils.globals import short_term_memories
|
|
12
|
+
from jarvis.jarvis_utils.output import PrettyOutput
|
|
11
13
|
|
|
12
14
|
|
|
13
15
|
class ClearMemoryTool:
|
|
@@ -59,9 +61,9 @@ class ClearMemoryTool:
|
|
|
59
61
|
def _get_memory_dir(self, memory_type: str) -> Path:
|
|
60
62
|
"""根据记忆类型获取存储目录"""
|
|
61
63
|
if memory_type == "project_long_term":
|
|
62
|
-
return self.project_memory_dir
|
|
64
|
+
return Path(self.project_memory_dir)
|
|
63
65
|
elif memory_type in ["global_long_term", "short_term"]:
|
|
64
|
-
return self.global_memory_dir / memory_type
|
|
66
|
+
return Path(self.global_memory_dir) / memory_type
|
|
65
67
|
else:
|
|
66
68
|
raise ValueError(f"未知的记忆类型: {memory_type}")
|
|
67
69
|
|
|
@@ -145,7 +147,9 @@ class ClearMemoryTool:
|
|
|
145
147
|
removed_count += 1
|
|
146
148
|
|
|
147
149
|
except Exception as e:
|
|
148
|
-
|
|
150
|
+
PrettyOutput.auto_print(
|
|
151
|
+
f"⚠️ 处理记忆文件 {memory_file} 时出错: {str(e)}"
|
|
152
|
+
)
|
|
149
153
|
|
|
150
154
|
# 如果目录为空,可以删除目录
|
|
151
155
|
if not any(memory_dir.iterdir()) and memory_dir != self.project_memory_dir:
|
|
@@ -218,5 +222,5 @@ class ClearMemoryTool:
|
|
|
218
222
|
|
|
219
223
|
except Exception as e:
|
|
220
224
|
error_msg = f"清除记忆失败: {str(e)}"
|
|
221
|
-
|
|
225
|
+
PrettyOutput.auto_print(f"❌ {error_msg}")
|
|
222
226
|
return {"success": False, "stdout": "", "stderr": error_msg}
|
jarvis/jarvis_tools/cli/main.py
CHANGED
|
@@ -5,13 +5,13 @@ import typer
|
|
|
5
5
|
from tabulate import tabulate
|
|
6
6
|
|
|
7
7
|
from jarvis.jarvis_tools.registry import ToolRegistry
|
|
8
|
-
from jarvis.jarvis_utils.output import OutputType
|
|
8
|
+
from jarvis.jarvis_utils.output import OutputType
|
|
9
|
+
from jarvis.jarvis_utils.output import PrettyOutput
|
|
9
10
|
from jarvis.jarvis_utils.utils import init_env
|
|
10
11
|
|
|
11
12
|
app = typer.Typer(help="Jarvis 工具系统命令行界面")
|
|
12
13
|
|
|
13
14
|
|
|
14
|
-
|
|
15
15
|
@app.command("list")
|
|
16
16
|
def list_tools(
|
|
17
17
|
as_json: bool = typer.Option(False, "--json", help="以JSON格式输出"),
|
|
@@ -38,10 +38,11 @@ def list_tools(
|
|
|
38
38
|
lang="json",
|
|
39
39
|
)
|
|
40
40
|
else:
|
|
41
|
-
|
|
41
|
+
PrettyOutput.auto_print("📋 可用工具列表")
|
|
42
42
|
# 为避免 PrettyOutput 对每行加框造成信息稀疏,先拼接字符串再统一打印
|
|
43
43
|
lines = []
|
|
44
44
|
import json as _json # local import to ensure available
|
|
45
|
+
|
|
45
46
|
for tool in tools:
|
|
46
47
|
lines.append(f"\n{tool['name']}")
|
|
47
48
|
lines.append(f" 描述: {tool['description']}")
|
|
@@ -50,7 +51,9 @@ def list_tools(
|
|
|
50
51
|
# 使用 Markdown 代码块统一展示参数
|
|
51
52
|
lines.append("```json")
|
|
52
53
|
try:
|
|
53
|
-
lines.append(
|
|
54
|
+
lines.append(
|
|
55
|
+
_json.dumps(tool["parameters"], ensure_ascii=False, indent=2)
|
|
56
|
+
)
|
|
54
57
|
except Exception:
|
|
55
58
|
lines.append(str(tool.get("parameters")))
|
|
56
59
|
lines.append("```")
|
|
@@ -90,7 +93,7 @@ def stat_tools(
|
|
|
90
93
|
)
|
|
91
94
|
else:
|
|
92
95
|
time_desc = f"最近{last_days}天" if last_days else "所有历史"
|
|
93
|
-
|
|
96
|
+
PrettyOutput.auto_print(f"📊 工具调用统计 ({time_desc})")
|
|
94
97
|
if table_data:
|
|
95
98
|
PrettyOutput.print(
|
|
96
99
|
tabulate(
|
|
@@ -99,12 +102,14 @@ def stat_tools(
|
|
|
99
102
|
OutputType.CODE,
|
|
100
103
|
lang="text",
|
|
101
104
|
)
|
|
102
|
-
|
|
105
|
+
PrettyOutput.auto_print(
|
|
106
|
+
f"ℹ️ 总计: {len(table_data)} 个工具被使用,共 {sum(x[1] for x in table_data)} 次调用"
|
|
107
|
+
)
|
|
103
108
|
else:
|
|
104
|
-
|
|
109
|
+
PrettyOutput.auto_print("ℹ️ 暂无工具调用记录")
|
|
105
110
|
else:
|
|
106
111
|
# 使用 stats 系统的高级功能
|
|
107
|
-
|
|
112
|
+
PrettyOutput.auto_print("📊 工具组统计")
|
|
108
113
|
# 显示所有标记为 tool 组的指标
|
|
109
114
|
metrics = StatsManager.list_metrics()
|
|
110
115
|
tool_metrics = []
|
|
@@ -163,7 +168,7 @@ def stat_tools(
|
|
|
163
168
|
tags={"group": "tool"},
|
|
164
169
|
)
|
|
165
170
|
else:
|
|
166
|
-
|
|
171
|
+
PrettyOutput.auto_print("ℹ️ 暂无工具调用记录")
|
|
167
172
|
|
|
168
173
|
|
|
169
174
|
@app.command("call")
|
|
@@ -179,9 +184,9 @@ def call_tool(
|
|
|
179
184
|
tool_obj = registry.get_tool(tool_name)
|
|
180
185
|
|
|
181
186
|
if not tool_obj:
|
|
182
|
-
|
|
187
|
+
PrettyOutput.auto_print(f"❌ 错误: 工具 '{tool_name}' 不存在")
|
|
183
188
|
available_tools = ", ".join([t["name"] for t in registry.get_all_tools()])
|
|
184
|
-
|
|
189
|
+
PrettyOutput.auto_print(f"ℹ️ 可用工具: {available_tools}")
|
|
185
190
|
raise typer.Exit(code=1)
|
|
186
191
|
|
|
187
192
|
tool_args = {}
|
|
@@ -189,14 +194,14 @@ def call_tool(
|
|
|
189
194
|
try:
|
|
190
195
|
tool_args = json.loads(args)
|
|
191
196
|
except Exception:
|
|
192
|
-
|
|
197
|
+
PrettyOutput.auto_print("❌ 错误: 参数必须是有效的JSON格式")
|
|
193
198
|
raise typer.Exit(code=1)
|
|
194
199
|
elif args_file:
|
|
195
200
|
try:
|
|
196
201
|
with open(args_file, "r", encoding="utf-8") as f:
|
|
197
202
|
tool_args = json.load(f)
|
|
198
203
|
except (Exception, FileNotFoundError) as e:
|
|
199
|
-
|
|
204
|
+
PrettyOutput.auto_print(f"❌ 错误: 无法从文件加载参数: {str(e)}")
|
|
200
205
|
raise typer.Exit(code=1)
|
|
201
206
|
|
|
202
207
|
required_params = tool_obj.parameters.get("required", [])
|
|
@@ -214,22 +219,22 @@ def call_tool(
|
|
|
214
219
|
param_info = params.get(param_name, {})
|
|
215
220
|
desc = param_info.get("description", "无描述")
|
|
216
221
|
lines.append(f" - {param_name}: {desc}")
|
|
217
|
-
|
|
222
|
+
PrettyOutput.auto_print("❌ " + "\n❌ ".join(lines))
|
|
218
223
|
raise typer.Exit(code=1)
|
|
219
224
|
|
|
220
225
|
result = registry.execute_tool(tool_name, tool_args)
|
|
221
226
|
|
|
222
227
|
if result["success"]:
|
|
223
|
-
|
|
228
|
+
PrettyOutput.auto_print(f"✅ 工具 {tool_name} 执行成功")
|
|
224
229
|
else:
|
|
225
|
-
|
|
230
|
+
PrettyOutput.auto_print(f"❌ 工具 {tool_name} 执行失败")
|
|
226
231
|
|
|
227
232
|
if result.get("stdout"):
|
|
228
|
-
|
|
233
|
+
PrettyOutput.auto_print("\n📤 输出:")
|
|
229
234
|
PrettyOutput.print(result["stdout"], OutputType.CODE, lang="text")
|
|
230
235
|
|
|
231
236
|
if result.get("stderr"):
|
|
232
|
-
|
|
237
|
+
PrettyOutput.auto_print("\n❌ 错误:")
|
|
233
238
|
PrettyOutput.print(result["stderr"], OutputType.CODE, lang="text")
|
|
234
239
|
|
|
235
240
|
if not result["success"]:
|