jarvis-ai-assistant 0.1.224__py3-none-any.whl → 0.2.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 (32) hide show
  1. jarvis/__init__.py +1 -1
  2. jarvis/jarvis_agent/__init__.py +33 -11
  3. jarvis/jarvis_agent/jarvis.py +87 -32
  4. jarvis/jarvis_agent/main.py +13 -2
  5. jarvis/jarvis_code_agent/code_agent.py +17 -4
  6. jarvis/jarvis_code_analysis/checklists/loader.py +20 -6
  7. jarvis/jarvis_code_analysis/code_review.py +14 -3
  8. jarvis/jarvis_data/config_schema.json +41 -0
  9. jarvis/jarvis_git_utils/git_commiter.py +9 -2
  10. jarvis/jarvis_mcp/sse_mcp_client.py +9 -7
  11. jarvis/jarvis_mcp/stdio_mcp_client.py +2 -2
  12. jarvis/jarvis_platform/base.py +28 -13
  13. jarvis/jarvis_platform_manager/main.py +18 -6
  14. jarvis/jarvis_rag/llm_interface.py +1 -3
  15. jarvis/jarvis_smart_shell/main.py +18 -12
  16. jarvis/jarvis_tools/ask_user.py +1 -0
  17. jarvis/jarvis_tools/generate_new_tool.py +1 -0
  18. jarvis/jarvis_tools/registry.py +17 -9
  19. jarvis/jarvis_tools/search_web.py +19 -9
  20. jarvis/jarvis_utils/builtin_replace_map.py +0 -1
  21. jarvis/jarvis_utils/config.py +80 -21
  22. jarvis/jarvis_utils/git_utils.py +2 -2
  23. jarvis/jarvis_utils/globals.py +17 -11
  24. jarvis/jarvis_utils/methodology.py +37 -23
  25. jarvis/jarvis_utils/output.py +2 -2
  26. jarvis/jarvis_utils/utils.py +138 -3
  27. {jarvis_ai_assistant-0.1.224.dist-info → jarvis_ai_assistant-0.2.0.dist-info}/METADATA +49 -12
  28. {jarvis_ai_assistant-0.1.224.dist-info → jarvis_ai_assistant-0.2.0.dist-info}/RECORD +32 -32
  29. {jarvis_ai_assistant-0.1.224.dist-info → jarvis_ai_assistant-0.2.0.dist-info}/WHEEL +0 -0
  30. {jarvis_ai_assistant-0.1.224.dist-info → jarvis_ai_assistant-0.2.0.dist-info}/entry_points.txt +0 -0
  31. {jarvis_ai_assistant-0.1.224.dist-info → jarvis_ai_assistant-0.2.0.dist-info}/licenses/LICENSE +0 -0
  32. {jarvis_ai_assistant-0.1.224.dist-info → jarvis_ai_assistant-0.2.0.dist-info}/top_level.txt +0 -0
@@ -10,14 +10,15 @@
10
10
  import json
11
11
  import os
12
12
  import tempfile
13
+ from pathlib import Path
13
14
  from typing import Any, Dict, List, Optional
14
15
 
15
16
  from jarvis.jarvis_platform.base import BasePlatform
16
17
  from jarvis.jarvis_platform.registry import PlatformRegistry
17
- from jarvis.jarvis_utils.config import get_data_dir
18
+ from jarvis.jarvis_utils.config import get_data_dir, get_methodology_dirs
19
+ from jarvis.jarvis_utils.globals import get_agent, current_agent_name
18
20
  from jarvis.jarvis_utils.output import OutputType, PrettyOutput
19
- from jarvis.jarvis_utils.utils import is_context_overflow
20
-
21
+ from jarvis.jarvis_utils.utils import is_context_overflow, daily_check_git_updates
21
22
 
22
23
  def _get_methodology_directory() -> str:
23
24
  """
@@ -37,32 +38,39 @@ def _get_methodology_directory() -> str:
37
38
 
38
39
  def _load_all_methodologies() -> Dict[str, str]:
39
40
  """
40
- 加载所有方法论文件
41
+ 从默认目录和配置的外部目录加载所有方法论文件。
41
42
 
42
43
  返回:
43
- Dict[str, str]: 方法论字典,键为问题类型,值为方法论内容
44
+ Dict[str, str]: 方法论字典,键为问题类型,值为方法论内容。
44
45
  """
45
- methodology_dir = _get_methodology_directory()
46
46
  all_methodologies = {}
47
+ methodology_dirs = [_get_methodology_directory()] + get_methodology_dirs()
47
48
 
48
- if not os.path.exists(methodology_dir):
49
- return all_methodologies
49
+ # --- 全局每日更新检查 ---
50
+ daily_check_git_updates(methodology_dirs, "methodologies")
50
51
 
51
52
  import glob
52
53
 
53
- for filepath in glob.glob(os.path.join(methodology_dir, "*.json")):
54
- try:
55
- with open(filepath, "r", encoding="utf-8", errors="ignore") as f:
56
- methodology = json.load(f)
57
- problem_type = methodology.get("problem_type", "")
58
- content = methodology.get("content", "")
59
- if problem_type and content:
60
- all_methodologies[problem_type] = content
61
- except Exception as e:
62
- filename = os.path.basename(filepath)
63
- PrettyOutput.print(
64
- f"加载方法论文件 {filename} 失败: {str(e)}", OutputType.WARNING
65
- )
54
+ for directory in set(methodology_dirs): # Use set to avoid duplicates
55
+ if not os.path.isdir(directory):
56
+ PrettyOutput.print(f"警告: 方法论目录不存在或不是一个目录: {directory}", OutputType.WARNING)
57
+ continue
58
+
59
+ for filepath in glob.glob(os.path.join(directory, "*.json")):
60
+ try:
61
+ with open(filepath, "r", encoding="utf-8", errors="ignore") as f:
62
+ methodology = json.load(f)
63
+ problem_type = methodology.get("problem_type", "")
64
+ content = methodology.get("content", "")
65
+ if problem_type and content:
66
+ if problem_type in all_methodologies:
67
+ PrettyOutput.print(f"警告: 方法论 '{problem_type}' 被 '{filepath}' 覆盖。", OutputType.WARNING)
68
+ all_methodologies[problem_type] = content
69
+ except Exception as e:
70
+ filename = os.path.basename(filepath)
71
+ PrettyOutput.print(
72
+ f"加载方法论文件 {filename} 失败: {str(e)}", OutputType.WARNING
73
+ )
66
74
 
67
75
  return all_methodologies
68
76
 
@@ -163,7 +171,13 @@ def load_methodology(user_input: str, tool_registery: Optional[Any] = None) -> s
163
171
  print(f"✅ 加载方法论文件完成 (共 {len(methodologies)} 个)")
164
172
 
165
173
  # 获取当前平台
166
- platform = PlatformRegistry().get_normal_platform()
174
+ agent = get_agent(current_agent_name)
175
+ if agent:
176
+ platform = agent.model
177
+ model_group = agent.model.model_group
178
+ else:
179
+ platform = PlatformRegistry().get_normal_platform()
180
+ model_group = None
167
181
  platform.set_suppress_output(False)
168
182
  if not platform:
169
183
  return ""
@@ -198,7 +212,7 @@ def load_methodology(user_input: str, tool_registery: Optional[Any] = None) -> s
198
212
  """
199
213
 
200
214
  # 检查内容是否过大
201
- is_large_content = is_context_overflow(full_content)
215
+ is_large_content = is_context_overflow(full_content, model_group)
202
216
  temp_file_path = None
203
217
 
204
218
  try:
@@ -10,7 +10,7 @@
10
10
  """
11
11
  from datetime import datetime
12
12
  from enum import Enum
13
- from typing import Optional, Tuple
13
+ from typing import Dict, Optional, Tuple, Any
14
14
 
15
15
  from pygments.lexers import guess_lexer
16
16
  from pygments.util import ClassNotFound
@@ -175,7 +175,7 @@ class PrettyOutput:
175
175
  lang: 语法高亮的语言
176
176
  traceback: 是否显示错误的回溯信息
177
177
  """
178
- styles = {
178
+ styles: Dict[OutputType, Dict[str, Any]] = {
179
179
  OutputType.SYSTEM: dict(bgcolor="#1e2b3c"),
180
180
  OutputType.CODE: dict(bgcolor="#1c2b1c"),
181
181
  OutputType.RESULT: dict(bgcolor="#1c1c2b"),
@@ -7,7 +7,8 @@ import subprocess
7
7
  import sys
8
8
  import time
9
9
  from pathlib import Path
10
- from typing import Any, Callable, Dict, Optional
10
+ from typing import Any, Callable, Dict, List, Optional
11
+ from datetime import datetime
11
12
 
12
13
  import yaml # type: ignore
13
14
 
@@ -129,6 +130,7 @@ def load_config():
129
130
  PrettyOutput.print(
130
131
  f"已生成默认配置文件: {config_file_path}", OutputType.INFO
131
132
  )
133
+ sys.exit(0)
132
134
  except Exception as e:
133
135
  PrettyOutput.print(f"生成默认配置文件失败: {e}", OutputType.ERROR)
134
136
  else:
@@ -415,9 +417,13 @@ def count_cmd_usage() -> None:
415
417
  _update_cmd_stats(sys.argv[0])
416
418
 
417
419
 
418
- def is_context_overflow(content: str) -> bool:
420
+ def is_context_overflow(
421
+ content: str, model_group_override: Optional[str] = None
422
+ ) -> bool:
419
423
  """判断文件内容是否超出上下文限制"""
420
- return get_context_token_count(content) > get_max_big_content_size()
424
+ return get_context_token_count(content) > get_max_big_content_size(
425
+ model_group_override
426
+ )
421
427
 
422
428
 
423
429
  def get_loc_stats() -> str:
@@ -474,3 +480,132 @@ def copy_to_clipboard(text: str) -> None:
474
480
  )
475
481
  except Exception as e:
476
482
  PrettyOutput.print(f"使用xclip时出错: {e}", OutputType.WARNING)
483
+
484
+
485
+ def _pull_git_repo(repo_path: Path, repo_type: str):
486
+ """对指定的git仓库执行git pull操作,并根据commit hash判断是否有更新。"""
487
+ git_dir = repo_path / ".git"
488
+ if not git_dir.is_dir():
489
+ return
490
+
491
+ PrettyOutput.print(f"正在更新{repo_type}库 '{repo_path.name}'...", OutputType.INFO)
492
+ try:
493
+ # 检查是否有远程仓库
494
+ remote_result = subprocess.run(
495
+ ["git", "remote"],
496
+ cwd=repo_path,
497
+ capture_output=True,
498
+ text=True,
499
+ check=True,
500
+ timeout=10,
501
+ )
502
+ if not remote_result.stdout.strip():
503
+ PrettyOutput.print(
504
+ f"'{repo_path.name}' 未配置远程仓库,跳过更新。",
505
+ OutputType.INFO,
506
+ )
507
+ return
508
+
509
+ # 检查git仓库状态
510
+ status_result = subprocess.run(
511
+ ["git", "status", "--porcelain"],
512
+ cwd=repo_path,
513
+ capture_output=True,
514
+ text=True,
515
+ check=True,
516
+ timeout=10,
517
+ )
518
+ if status_result.stdout:
519
+ PrettyOutput.print(
520
+ f"检测到 '{repo_path.name}' 存在未提交的更改,跳过自动更新。",
521
+ OutputType.WARNING,
522
+ )
523
+ return
524
+
525
+ # 获取更新前的commit hash
526
+ before_hash_result = subprocess.run(
527
+ ["git", "rev-parse", "HEAD"],
528
+ cwd=repo_path,
529
+ capture_output=True,
530
+ text=True,
531
+ check=True,
532
+ timeout=10,
533
+ )
534
+ before_hash = before_hash_result.stdout.strip()
535
+
536
+ # 执行 git pull
537
+ pull_result = subprocess.run(
538
+ ["git", "pull"],
539
+ cwd=repo_path,
540
+ capture_output=True,
541
+ text=True,
542
+ check=True,
543
+ timeout=60,
544
+ )
545
+
546
+ # 获取更新后的commit hash
547
+ after_hash_result = subprocess.run(
548
+ ["git", "rev-parse", "HEAD"],
549
+ cwd=repo_path,
550
+ capture_output=True,
551
+ text=True,
552
+ check=True,
553
+ timeout=10,
554
+ )
555
+ after_hash = after_hash_result.stdout.strip()
556
+
557
+ if before_hash != after_hash:
558
+ PrettyOutput.print(f"{repo_type}库 '{repo_path.name}' 已更新。", OutputType.SUCCESS)
559
+ if pull_result.stdout.strip():
560
+ PrettyOutput.print(pull_result.stdout.strip(), OutputType.INFO)
561
+ else:
562
+ PrettyOutput.print(f"{repo_type}库 '{repo_path.name}' 已是最新版本。", OutputType.INFO)
563
+
564
+ except FileNotFoundError:
565
+ PrettyOutput.print(
566
+ f"git 命令未找到,跳过更新 '{repo_path.name}'。", OutputType.WARNING
567
+ )
568
+ except subprocess.TimeoutExpired:
569
+ PrettyOutput.print(f"更新 '{repo_path.name}' 超时。", OutputType.ERROR)
570
+ except subprocess.CalledProcessError as e:
571
+ error_message = e.stderr.strip() if e.stderr else str(e)
572
+ PrettyOutput.print(
573
+ f"更新 '{repo_path.name}' 失败: {error_message}", OutputType.ERROR
574
+ )
575
+ except Exception as e:
576
+ PrettyOutput.print(
577
+ f"更新 '{repo_path.name}' 时发生未知错误: {str(e)}", OutputType.ERROR
578
+ )
579
+
580
+
581
+ def daily_check_git_updates(repo_dirs: List[str], repo_type: str):
582
+ """
583
+ 对指定的目录列表执行每日一次的git更新检查。
584
+
585
+ Args:
586
+ repo_dirs (List[str]): 需要检查的git仓库目录列表。
587
+ repo_type (str): 仓库的类型名称,例如 "工具" 或 "方法论",用于日志输出。
588
+ """
589
+ data_dir = Path(get_data_dir())
590
+ last_check_file = data_dir / f"{repo_type}_updates_last_check.txt"
591
+ should_check_for_updates = True
592
+
593
+ if last_check_file.exists():
594
+ try:
595
+ last_check_timestamp = float(last_check_file.read_text())
596
+ last_check_date = datetime.fromtimestamp(last_check_timestamp).date()
597
+ if last_check_date == datetime.now().date():
598
+ should_check_for_updates = False
599
+ except (ValueError, IOError):
600
+ pass
601
+
602
+ if should_check_for_updates:
603
+ PrettyOutput.print(f"执行每日{repo_type}库更新检查...", OutputType.INFO)
604
+ for repo_dir in repo_dirs:
605
+ p_repo_dir = Path(repo_dir)
606
+ if p_repo_dir.exists() and p_repo_dir.is_dir():
607
+ _pull_git_repo(p_repo_dir, repo_type)
608
+ try:
609
+ last_check_file.write_text(str(time.time()))
610
+ except IOError as e:
611
+ PrettyOutput.print(f"无法写入git更新检查时间戳: {e}", OutputType.WARNING)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: jarvis-ai-assistant
3
- Version: 0.1.224
3
+ Version: 0.2.0
4
4
  Summary: Jarvis: An AI assistant that uses tools to interact with the system
5
5
  Home-page: https://github.com/skyfireitdiy/Jarvis
6
6
  Author: skyfire
@@ -57,8 +57,8 @@ Requires-Dist: pyte==0.8.2
57
57
  Requires-Dist: httpx>=0.28.1
58
58
  Requires-Dist: pyyaml>=5.3.1
59
59
  Requires-Dist: ddgs==9.0.2
60
- Requires-Dist: beautifulsoup4==4.13.4
61
60
  Requires-Dist: lxml==6.0.0
61
+ Requires-Dist: markdownify>=1.1.0
62
62
  Provides-Extra: dev
63
63
  Requires-Dist: pytest; extra == "dev"
64
64
  Requires-Dist: black; extra == "dev"
@@ -158,6 +158,7 @@ jarvis --llm_type thinking -t "初始任务"
158
158
  | `-t/--task` | 直接从命令行输入任务内容 |
159
159
  | `-f/--config` | 自定义配置文件的路径 |
160
160
  | `--restore-session` | 从 .jarvis/saved_session.json 恢复会话 |
161
+ | `-e/--edit` | 编辑配置文件 |
161
162
 
162
163
  #### 4. 工作流程
163
164
  1. 初始化环境
@@ -507,9 +508,9 @@ ENV:
507
508
  #### Kimi
508
509
  ```yaml
509
510
  JARVIS_PLATFORM: kimi
510
- JARVIS_MODEL: kimi
511
+ JARVIS_MODEL: k1.5
511
512
  JARVIS_THINKING_PLATFORM: kimi
512
- JARVIS_THINKING_MODEL: k1
513
+ JARVIS_THINKING_MODEL: k1.5-thinking
513
514
  ENV:
514
515
  KIMI_API_KEY: <Kimi API KEY>
515
516
  ```
@@ -534,19 +535,55 @@ OPENAI_API_KEY: <OpenAI API Key>
534
535
  OPENAI_API_BASE: https://api.openai.com/v1
535
536
  ```
536
537
 
537
- ### 2. 配置项说明
538
+ ### 2. 模型组配置 (高级)
539
+
540
+ 除了单独配置每个模型参数,您还可以定义和使用**模型组**来快速切换不同的模型组合。这对于需要在不同任务或平台间频繁切换的场景非常有用。
541
+
542
+ **配置示例** (`~/.jarvis/config.yaml`):
543
+
544
+ ```yaml
545
+ # 定义模型组
546
+ JARVIS_MODEL_GROUPS:
547
+ - kimi:
548
+ JARVIS_PLATFORM: kimi
549
+ JARVIS_MODEL: k1.5
550
+ JARVIS_THINKING_PLATFORM: kimi
551
+ JARVIS_THINKING_MODEL: k1.5-thinking
552
+ JARVIS_MAX_TOKEN_COUNT: 8192
553
+ - ai8:
554
+ JARVIS_PLATFORM: ai8
555
+ JARVIS_MODEL: gemini-2.5-pro
556
+ # 如果不指定思考模型,将自动使用常规模型
557
+ # JARVIS_THINKING_PLATFORM: ai8
558
+ # JARVIS_THINKING_MODEL: gemini-2.5-pro
559
+
560
+ # 选择要使用的模型组
561
+ JARVIS_MODEL_GROUP: kimi
562
+ ```
563
+
564
+ **配置优先级规则:**
565
+
566
+ Jarvis 会按照以下顺序解析模型配置,序号越小优先级越高:
567
+
568
+ 1. **独立配置**: 直接设置的 `JARVIS_PLATFORM`, `JARVIS_MODEL`, `JARVIS_THINKING_PLATFORM`, `JARVIS_THINKING_MODEL` 环境变量。这些配置会**覆盖**任何模型组中的设置。
569
+ 2. **模型组配置**: 通过 `JARVIS_MODEL_GROUP` 选中的模型组配置。
570
+ 3. **默认值**: 如果以上均未配置,则使用代码中定义的默认模型(如 `yuanbao` 和 `deep_seek_v3`)。
571
+
572
+ ### 3. 全部配置项说明
538
573
  | 变量名称 | 默认值 | 说明 |
539
574
  |----------|--------|------|
540
575
  | `ENV` | {} | 环境变量配置 |
541
- | `JARVIS_MAX_TOKEN_COUNT` | 960000 | 上下文窗口的最大token数量 |
542
- | `JARVIS_MAX_INPUT_TOKEN_COUNT` | 32000 | 输入的最大token数量 |
543
- | `JARVIS_PLATFORM` | yuanbao | 默认AI平台 |
544
- | `JARVIS_MODEL` | deep_seek_v3 | 默认模型 |
545
- | `JARVIS_THINKING_PLATFORM` | JARVIS_PLATFORM | 推理任务使用的平台 |
546
- | `JARVIS_THINKING_MODEL` | JARVIS_MODEL | 推理任务使用的模型 |
576
+ | `JARVIS_MODEL_GROUPS` | `[]` | 预定义的模型配置组列表 |
577
+ | `JARVIS_MODEL_GROUP` | `null` | 选择要激活的模型组名称 |
578
+ | `JARVIS_MAX_TOKEN_COUNT` | 960000 | 上下文窗口的最大token数量 (可被模型组覆盖) |
579
+ | `JARVIS_MAX_INPUT_TOKEN_COUNT` | 32000 | 输入的最大token数量 (可被模型组覆盖) |
580
+ | `JARVIS_PLATFORM` | yuanbao | 默认AI平台 (可被模型组覆盖) |
581
+ | `JARVIS_MODEL` | deep_seek_v3 | 默认模型 (可被模型组覆盖) |
582
+ | `JARVIS_THINKING_PLATFORM` | JARVIS_PLATFORM | 推理任务使用的平台 (可被模型组覆盖) |
583
+ | `JARVIS_THINKING_MODEL` | JARVIS_MODEL | 推理任务使用的模型 (可被模型组覆盖) |
547
584
  | `JARVIS_EXECUTE_TOOL_CONFIRM` | false | 执行工具前是否需要确认 |
548
585
  | `JARVIS_CONFIRM_BEFORE_APPLY_PATCH` | false | 应用补丁前是否需要确认 |
549
- | `JARVIS_MAX_BIG_CONTENT_SIZE` | 160000 | 最大大内容大小 |
586
+ | `JARVIS_MAX_BIG_CONTENT_SIZE` | 160000 | 最大大内容大小 (可被模型组覆盖) |
550
587
  | `JARVIS_PRETTY_OUTPUT` | false | 是否启用PrettyOutput |
551
588
  | `JARVIS_GIT_COMMIT_PROMPT` | "" | 自定义git提交信息生成提示模板 |
552
589
  | `JARVIS_PRINT_PROMPT` | false | 是否打印提示 |
@@ -1,9 +1,9 @@
1
- jarvis/__init__.py,sha256=gaZuEX29UqdWvgGIXuboMfdenif5NCuNvfhYM6Ffzqg,75
2
- jarvis/jarvis_agent/__init__.py,sha256=PHTP4P0iOCzdozNYj2d02a-yz-4pm8TykaUqzji7H4I,21607
1
+ jarvis/__init__.py,sha256=EmFCOffXrFq1m3oGpL5fp5ciwQF4OV_6X1esvw2Ukdg,73
2
+ jarvis/jarvis_agent/__init__.py,sha256=BmBbMUsCwe_0znrwxSipaKj-MuOgJTZvLbyKzBFfpic,22559
3
3
  jarvis/jarvis_agent/builtin_input_handler.py,sha256=Qs4LAr4xdKLBJpQE81YP4CkucAop86ms0iVoKa1nnso,2468
4
4
  jarvis/jarvis_agent/edit_file_handler.py,sha256=ml1o-BE2Ca1-ybPlKuhstLQYwdJag39o0_-PXTUvFaE,11646
5
- jarvis/jarvis_agent/jarvis.py,sha256=2Ilt-eLs-dCvD6V1-UGyJ3PleY0AozkYhi8Rx6_zUr4,6315
6
- jarvis/jarvis_agent/main.py,sha256=nXOw2mewhYYmj_8rohcEmETjUFqror1NiRwDusFMUKQ,3055
5
+ jarvis/jarvis_agent/jarvis.py,sha256=dRJWrMbZnxo5g7_5-x9IPypPYynUhMIYBVlqtlOlOb0,7969
6
+ jarvis/jarvis_agent/main.py,sha256=ufMQsv1-9wU2E3UAyu48oITwFSIBVFsUfnlhDZ7dWbU,3293
7
7
  jarvis/jarvis_agent/output_handler.py,sha256=P7oWpXBGFfOsWq7cIhS_z9crkQ19ES7qU5pM92KKjAs,1172
8
8
  jarvis/jarvis_agent/prompt_builder.py,sha256=PH1fPDVa8z_RXkoXHJFNDf8PQjUoLNLYwkh2lC__p40,1705
9
9
  jarvis/jarvis_agent/prompts.py,sha256=e8i-3kaGr96mlzL3UUhQUHFDfbJSoE4xiF9TDksNDm4,7720
@@ -12,9 +12,9 @@ jarvis/jarvis_agent/session_manager.py,sha256=DnvI9rWkVmkyO1XfKZyo9lTn4ajg4ccwzE
12
12
  jarvis/jarvis_agent/shell_input_handler.py,sha256=1IboqdxcJuoIqRpmDU10GugR9fWXUHyCEbVF4nIWbyo,1328
13
13
  jarvis/jarvis_agent/tool_executor.py,sha256=nIq-sPNgrtimtM-IHpN09cWmId8jDzWRdCFoRzXnnoo,1721
14
14
  jarvis/jarvis_code_agent/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
15
- jarvis/jarvis_code_agent/code_agent.py,sha256=h6wynQYZ1pPW5efU9ufY_I1di-YzRaQBOPn9IgAuxmo,18376
15
+ jarvis/jarvis_code_agent/code_agent.py,sha256=YQYeaFx-dlf5p6_vw7T4mmtwyqQkytlxMUWDhF2V3_Y,18659
16
16
  jarvis/jarvis_code_agent/lint.py,sha256=LZPsfyZPMo7Wm7LN4osZocuNJwZx1ojacO3MlF870x8,4009
17
- jarvis/jarvis_code_analysis/code_review.py,sha256=Huia4w1SkhxfzAk2GNC75uo3a_BcVTCDbj0rx8_t0r4,30424
17
+ jarvis/jarvis_code_analysis/code_review.py,sha256=eyezZ64ffiNC8vIHF-BZ1cF9cTnk1NdpuUXfoa-jWpc,30971
18
18
  jarvis/jarvis_code_analysis/checklists/__init__.py,sha256=LIXAYa1sW3l7foP6kohLWnE98I_EQ0T7z5bYKHq6rJA,78
19
19
  jarvis/jarvis_code_analysis/checklists/c_cpp.py,sha256=9t62bMqs6qTkFSio4SKkj88qyb5ZubWrw3MxJBQ4X1A,1317
20
20
  jarvis/jarvis_code_analysis/checklists/csharp.py,sha256=ShPXrl2_UPAnGaCHAG2wLl90COG3HK2XCSr1UK2dxN4,2420
@@ -26,7 +26,7 @@ jarvis/jarvis_code_analysis/checklists/infrastructure.py,sha256=7z5MZnOUT3FpMrTQ
26
26
  jarvis/jarvis_code_analysis/checklists/java.py,sha256=gWRVhXfsNhRFdthjIiQTkviqLwisuKCrr6gjxP0S9Z4,2085
27
27
  jarvis/jarvis_code_analysis/checklists/javascript.py,sha256=SQkw2I09DaaLxD_WTZjuHn4leUKil68IEPB03BoSYuo,2340
28
28
  jarvis/jarvis_code_analysis/checklists/kotlin.py,sha256=dNSHM1u3R7lxe8BU8ADtDyKJxmj3NUh9ZQuC7HHWHGY,4436
29
- jarvis/jarvis_code_analysis/checklists/loader.py,sha256=XYqVBOM6ouWXMfFuYPE6tMBONkuP3VKQByyB7MFUw9E,2088
29
+ jarvis/jarvis_code_analysis/checklists/loader.py,sha256=bjE4On6WMLt41bfkCZsHnBpfXF61VPthFPsgNcbH90c,1903
30
30
  jarvis/jarvis_code_analysis/checklists/php.py,sha256=qW34sF9AqLuSVuOVP5yJUHnB9V3-YRQjNPuB3lFI5UY,2481
31
31
  jarvis/jarvis_code_analysis/checklists/python.py,sha256=gjyJ0QPY1CAwqhbDnIyLYruvFduZU5hiKyehAXMHu-I,1452
32
32
  jarvis/jarvis_code_analysis/checklists/ruby.py,sha256=kzwd7Wl6gKrkAANq7_MvA5X5du5r1MeE-EY2Xb43n7U,4274
@@ -35,23 +35,23 @@ jarvis/jarvis_code_analysis/checklists/shell.py,sha256=aRFYhQQvTgbYd-uY5pc8UHIUA
35
35
  jarvis/jarvis_code_analysis/checklists/sql.py,sha256=vR0T6qC7b4dURjJVAd7kSVxyvZEQXPG1Jqc2sNTGp5c,2355
36
36
  jarvis/jarvis_code_analysis/checklists/swift.py,sha256=TPx4I6Gupvs6tSerRKmTSKEPQpOLEbH2Y7LXg1uBgxc,2566
37
37
  jarvis/jarvis_code_analysis/checklists/web.py,sha256=25gGD7pDadZQybNFvALYxWvK0VRjGQb1NVJQElwjyk0,3943
38
- jarvis/jarvis_data/config_schema.json,sha256=uuDN-25NJRnKfb6KuuqxOnfRGMphkKQbjxfu0Me6pAI,7494
38
+ jarvis/jarvis_data/config_schema.json,sha256=XpQ7aaHMW-YCuFrnaAEjMWrnv6a8B7MqGjm2XgrvtgQ,8573
39
39
  jarvis/jarvis_data/tiktoken/9b5ad71b2ce5302211f9c61530b329a4922fc6a4,sha256=Ijkht27pm96ZW3_3OFE-7xAPtR0YyTWXoRO8_-hlsqc,1681126
40
40
  jarvis/jarvis_git_details/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
41
41
  jarvis/jarvis_git_details/main.py,sha256=DE1DcX-1lvUsb_K-FExpHs3NBRmo5KZb53PGa8QFBOc,8875
42
42
  jarvis/jarvis_git_squash/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
43
43
  jarvis/jarvis_git_squash/main.py,sha256=2nwX-Ghphn97Ua0SXPJIxix-rgm_Z9KRkrovjpSklUk,2311
44
- jarvis/jarvis_git_utils/git_commiter.py,sha256=erZ3wNJuaEgHlKTaYv0UKargG_Yl9OnssTIcErEAdtw,12472
44
+ jarvis/jarvis_git_utils/git_commiter.py,sha256=Yir26RyvoToTmkeh1-cFnG3LE3fH7z2njPOK3FIpQDc,12801
45
45
  jarvis/jarvis_mcp/__init__.py,sha256=OPMtjD-uq9xAaKCRIDyKIosaFfBe1GBPu1az-mQ0rVM,2048
46
- jarvis/jarvis_mcp/sse_mcp_client.py,sha256=-3Qy1LyqgHswoc6YbadVRG3ias2op7lUp7Ne2-QUKBM,22474
47
- jarvis/jarvis_mcp/stdio_mcp_client.py,sha256=armvgyHAv-AxF5lqiK-TbVLzg3XgSCwmTdWmxBSTLRk,11248
46
+ jarvis/jarvis_mcp/sse_mcp_client.py,sha256=AhYLPQb0mE9-6ZQw1JesRNyEy0esJumNEFb5LyzyIn0,22612
47
+ jarvis/jarvis_mcp/stdio_mcp_client.py,sha256=APYUksYKlMx7AVNODKOLrTkKZPnp4kqTQIYIuNDDKko,11286
48
48
  jarvis/jarvis_mcp/streamable_mcp_client.py,sha256=1OZpsG82U2MLbGuojllJAblFUAMmp1N0i5fsKM4n5Ts,14453
49
49
  jarvis/jarvis_methodology/main.py,sha256=-PqsWvtpUJkkhiGgV-1JegEnEZBmv8SHnNMNNm_-QQc,11720
50
50
  jarvis/jarvis_multi_agent/__init__.py,sha256=efB04nWPRl4EOD64RThqQ6w78GZc2t0GGisX2wwTP8I,5949
51
51
  jarvis/jarvis_multi_agent/main.py,sha256=h7VUSwoPrES0XTK8z5kt3XLX1mmcm8UEuFEHQOUWPH4,1696
52
52
  jarvis/jarvis_platform/__init__.py,sha256=WLQHSiE87PPket2M50_hHzjdMIgPIBx2VF8JfB_NNRk,105
53
53
  jarvis/jarvis_platform/ai8.py,sha256=yi7xG8ld4Yrf7drz-uu_JT_XCGYRB0obhygt-jKik8o,10871
54
- jarvis/jarvis_platform/base.py,sha256=-XegiAS8G_nzwsWPOVEAQ2iTxE33fxu5-TWV4c3Pz-g,8981
54
+ jarvis/jarvis_platform/base.py,sha256=cfeYB6ldfQH1tz1rroQpmJTLAw8KByKS74qun0pqE1c,9498
55
55
  jarvis/jarvis_platform/human.py,sha256=cSN8Lqf0ts2_pPfS2_v7PaWxQKqcW_3bSmhRTHey7Qo,4674
56
56
  jarvis/jarvis_platform/kimi.py,sha256=dn_P4EEZvWWCPS67MDbWStsP7n3MN4-Rrc6R7GhJyEg,15436
57
57
  jarvis/jarvis_platform/openai.py,sha256=ccGqsU2cFfd5324P7SH1tSmFABpvto8fytmxQGkr3BA,6412
@@ -60,51 +60,51 @@ jarvis/jarvis_platform/registry.py,sha256=1bMy0YZUa8NLzuZlKfC4CBtpa0iniypTxUZk0H
60
60
  jarvis/jarvis_platform/tongyi.py,sha256=vSK1b4NhTeHbNhTgGRj4PANXptwCAwitczwK8VXwWwU,22921
61
61
  jarvis/jarvis_platform/yuanbao.py,sha256=AIGQ0VOD_IAwWLnU9G19OG0XAbHpcJDzVWX2VazsyAI,23092
62
62
  jarvis/jarvis_platform_manager/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
63
- jarvis/jarvis_platform_manager/main.py,sha256=LxlXSfIfmkYNcajOG_XvvlmwlSWSGb0DmbzIDSHHYOU,18330
63
+ jarvis/jarvis_platform_manager/main.py,sha256=ysdM-_2vdOorqQiXiJOpZ50ukD5yPmakRHthK-JIl30,18558
64
64
  jarvis/jarvis_platform_manager/service.py,sha256=hQGWQ2qAlzm_C_lNQDuLORQ4rmjR1P1-V3ou7l2Bv0s,13622
65
65
  jarvis/jarvis_rag/__init__.py,sha256=HRTXgnQxDuaE9x-e3r6SYqhJ5d4DSI_rrIxy2IGY6qk,320
66
66
  jarvis/jarvis_rag/cache.py,sha256=Tqx_Oe-AhuWlMXHGHUaIuG6OEHoHBVZq7mL3kldtFFU,2723
67
67
  jarvis/jarvis_rag/cli.py,sha256=q1W7XWZ7u7oMckqeNUX7YQoiQ3PzT3Rh-FZvTeG_U3I,13159
68
68
  jarvis/jarvis_rag/embedding_manager.py,sha256=BoV6Vr_3F4zbjBAOQ1FdEBnJXGPwBkv1IEkdRP9CgFw,3338
69
- jarvis/jarvis_rag/llm_interface.py,sha256=44Uu04v2_MxweLmMdR0YWbnxlfchAPAzLBEQmJdLjeU,4368
69
+ jarvis/jarvis_rag/llm_interface.py,sha256=eZHibNHD5dFK9yolr3hYNNhAEZUsPA-cIf1uHapI2h8,4338
70
70
  jarvis/jarvis_rag/query_rewriter.py,sha256=JM1Q23zZISze77BleRgTPgNAtLUtLAXkEo3G70kaTK8,2190
71
71
  jarvis/jarvis_rag/rag_pipeline.py,sha256=9yeNRv6qOS2zo7o0b0u3gFmiW_XSivesvPKVJ8e5DlE,6209
72
72
  jarvis/jarvis_rag/reranker.py,sha256=wYUDIMHQL8_tFcQ7GFn_zYHTE1AbKk4a9TRoN2lKtA8,1767
73
73
  jarvis/jarvis_rag/retriever.py,sha256=B6oq1SAh7QAE9G5o0sXyNtLjFodukd8p-Was2QJZXg0,7637
74
74
  jarvis/jarvis_smart_shell/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
75
- jarvis/jarvis_smart_shell/main.py,sha256=DbhRSP1sZfSIaTltP1YWVDSQOTYEsbiOnfO9kSYwcNs,6959
75
+ jarvis/jarvis_smart_shell/main.py,sha256=3oAl4LbpkiJWCpxqwXF6-vmydZr5HMFKCvkQR94dzLc,6946
76
76
  jarvis/jarvis_tools/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
77
- jarvis/jarvis_tools/ask_user.py,sha256=iz2PTGx66IRL8e4DOpj3XhEGHFWeKQl0ggEOl_zOwQ0,1972
77
+ jarvis/jarvis_tools/ask_user.py,sha256=M6DdLNryCE8y1JcdZHEifUgZkPUEPNKc-zDW5p0Mb1k,2029
78
78
  jarvis/jarvis_tools/base.py,sha256=tFVmK6ppsImW2BzHZmrNmMRiOJdW-4aZP6Me3VxdYcA,1194
79
79
  jarvis/jarvis_tools/edit_file.py,sha256=hM345E9rxS-EkqCZpwwizL6fmPdTadtB798tEO5Ce3g,10417
80
80
  jarvis/jarvis_tools/execute_script.py,sha256=gMarE5yCCSPU6Dp6HlcL2KT-2xCzR-1p-oQNlYOJK58,6157
81
81
  jarvis/jarvis_tools/file_analyzer.py,sha256=aVe1jBSp0YmlypihxrGADJpYrU_7CxDETxGUNySuSlI,4044
82
- jarvis/jarvis_tools/generate_new_tool.py,sha256=2YAs8DC7fJnxOkjSmhmSAwqSpBlicVhYc06WZ8YVBls,7679
82
+ jarvis/jarvis_tools/generate_new_tool.py,sha256=ppMRuTYUZ0c02rHo7xi8DCGiDVPZTANVp9nS7bvkqqo,7819
83
83
  jarvis/jarvis_tools/methodology.py,sha256=_K4GIDUodGEma3SvNRo7Qs5rliijgNespVLyAPN35JU,5233
84
84
  jarvis/jarvis_tools/read_code.py,sha256=EnI-R-5HyIQYhMD391nZWXHIuHHBF-OJIRE0QpLcPX4,6417
85
85
  jarvis/jarvis_tools/read_webpage.py,sha256=NmDUboVZd4CGHBPRFK6dp3uqVhuGopW1bOi3TcaLDF4,2092
86
- jarvis/jarvis_tools/registry.py,sha256=KA6dw5ka_OSg0BNuVdk0tN8X0InaOWxKgkEs2XOiHFQ,26386
86
+ jarvis/jarvis_tools/registry.py,sha256=3SMzVM9rhI9Gl8EdI13_NOHBxwygueqw-nUcCi6AgRM,26754
87
87
  jarvis/jarvis_tools/rewrite_file.py,sha256=eG_WKg6cVAXmuGwUqlWkcuyay5S8DOzEi8vZCmX3O8w,7255
88
- jarvis/jarvis_tools/search_web.py,sha256=DqBwNGFK3vZleZ7_4Go3q27DzPCp4m0ZeEi1N7UEFc4,5363
88
+ jarvis/jarvis_tools/search_web.py,sha256=DDAPjYWTFaF85zsnhJ6VNDSc1BcY8EHus5ymKP9nnPs,5703
89
89
  jarvis/jarvis_tools/virtual_tty.py,sha256=KKr3jpvQWWMPr2o40hlmN6fuXJCN8H4_ma5QU40Citc,16089
90
90
  jarvis/jarvis_tools/cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
91
91
  jarvis/jarvis_tools/cli/main.py,sha256=Mg6TQDxMdzB1Ua1UrZ2EE-uQWsbaeojWaEGHJp2HimA,6375
92
92
  jarvis/jarvis_utils/__init__.py,sha256=67h0ldisGlh3oK4DAeNEL2Bl_VsI3tSmfclasyVlueM,850
93
- jarvis/jarvis_utils/builtin_replace_map.py,sha256=EI8JnHqr-ZpAhpwocTu48DhHUMHNd8tNUpDNYI47OLE,1717
94
- jarvis/jarvis_utils/config.py,sha256=eTarDAeBdFZx2jX4KQrzanEu4W6hpS5Cw1DHmiB5nN0,8247
93
+ jarvis/jarvis_utils/builtin_replace_map.py,sha256=4BurljGuiG_I93EBs7mlFlPm9wYC_4CmdTG5tQWpF6g,1712
94
+ jarvis/jarvis_utils/config.py,sha256=YcPGjCSJ2_2CKtlY8ecyqaovKVb65XcQ5WNizjwmdVs,10689
95
95
  jarvis/jarvis_utils/embedding.py,sha256=oEOEM2qf16DMYwPsQe6srET9BknyjOdY2ef0jsp3Or8,2714
96
96
  jarvis/jarvis_utils/file_processors.py,sha256=XiM248SHS7lLgQDCbORVFWqinbVDUawYxWDOsLXDxP8,3043
97
- jarvis/jarvis_utils/git_utils.py,sha256=EpyS8AvvK9M9WnkObtQsU2gXq45PnY-WJo2c4kMtyFM,21702
98
- jarvis/jarvis_utils/globals.py,sha256=WzZh_acNfHJj1LDulhyLQ7cojksBy0gdrITe0vH1XA0,3901
97
+ jarvis/jarvis_utils/git_utils.py,sha256=_b4-5uWOTVFjAB48QbRJNBR7PTD_jzi7-5V5M_wjXFo,21740
98
+ jarvis/jarvis_utils/globals.py,sha256=QKeiiWhUlu9HE7SzAn0lKaeaXQF1uhmLXPZTeLKyGPQ,4048
99
99
  jarvis/jarvis_utils/http.py,sha256=Uqt1kcz0HWnAfXHHi1fNGwLb2lcVUqpbrG2Uk_-kcIU,4882
100
100
  jarvis/jarvis_utils/input.py,sha256=V2w3xV0MO73c4Y4XY_yy9jVNg7MmN76FmAnpKRiJUog,9160
101
- jarvis/jarvis_utils/methodology.py,sha256=-cvM6pwgJK7BXCYg2uVjIId_j3v5RUh2z2PBcK_2vj4,8155
102
- jarvis/jarvis_utils/output.py,sha256=PRCgudPOB8gMEP3u-g0FGD2c6tBgJhLXUMqNPglfjV8,10813
101
+ jarvis/jarvis_utils/methodology.py,sha256=V2Y0mbamrWBhhCK-3foAM1hKewOEcIDcXO-Sv_AU-kQ,9106
102
+ jarvis/jarvis_utils/output.py,sha256=2QMpzb8ZOysQ6HHsRjRzjgUnNXaFGkIiZ_qElPKLbsA,10858
103
103
  jarvis/jarvis_utils/tag.py,sha256=f211opbbbTcSyzCDwuIK_oCnKhXPNK-RknYyGzY1yD0,431
104
- jarvis/jarvis_utils/utils.py,sha256=ojupkZQfFIE6ysTyCy0jUdePucpwpvZlZJSXkGsdyQE,15263
105
- jarvis_ai_assistant-0.1.224.dist-info/licenses/LICENSE,sha256=AGgVgQmTqFvaztRtCAXsAMryUymB18gZif7_l2e1XOg,1063
106
- jarvis_ai_assistant-0.1.224.dist-info/METADATA,sha256=UAICgGTzfZc6Gob8uMokO0qUUENIvYUKZQidjdCyq5w,24061
107
- jarvis_ai_assistant-0.1.224.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
108
- jarvis_ai_assistant-0.1.224.dist-info/entry_points.txt,sha256=JXK_n-d9HZ_RLz959CvpK5-UPOCwssn5oAH8dAHuebA,1277
109
- jarvis_ai_assistant-0.1.224.dist-info/top_level.txt,sha256=1BOxyWfzOP_ZXj8rVTDnNCJ92bBGB0rwq8N1PCpoMIs,7
110
- jarvis_ai_assistant-0.1.224.dist-info/RECORD,,
104
+ jarvis/jarvis_utils/utils.py,sha256=G6UuiBrPlWLpau1LbSGStrlAHCHG8JufINLD_bwtjTE,20006
105
+ jarvis_ai_assistant-0.2.0.dist-info/licenses/LICENSE,sha256=AGgVgQmTqFvaztRtCAXsAMryUymB18gZif7_l2e1XOg,1063
106
+ jarvis_ai_assistant-0.2.0.dist-info/METADATA,sha256=ddh41XdsU955MHnmlVF1YhXW5D2oYZK-M7ZsTUqVMAs,25713
107
+ jarvis_ai_assistant-0.2.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
108
+ jarvis_ai_assistant-0.2.0.dist-info/entry_points.txt,sha256=JXK_n-d9HZ_RLz959CvpK5-UPOCwssn5oAH8dAHuebA,1277
109
+ jarvis_ai_assistant-0.2.0.dist-info/top_level.txt,sha256=1BOxyWfzOP_ZXj8rVTDnNCJ92bBGB0rwq8N1PCpoMIs,7
110
+ jarvis_ai_assistant-0.2.0.dist-info/RECORD,,