jarvis-ai-assistant 0.1.181__tar.gz → 0.1.182__tar.gz
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_ai_assistant-0.1.181/src/jarvis_ai_assistant.egg-info → jarvis_ai_assistant-0.1.182}/PKG-INFO +1 -1
- {jarvis_ai_assistant-0.1.181 → jarvis_ai_assistant-0.1.182}/pyproject.toml +1 -1
- {jarvis_ai_assistant-0.1.181 → jarvis_ai_assistant-0.1.182}/setup.py +1 -1
- {jarvis_ai_assistant-0.1.181 → jarvis_ai_assistant-0.1.182}/src/jarvis/__init__.py +1 -1
- {jarvis_ai_assistant-0.1.181 → jarvis_ai_assistant-0.1.182}/src/jarvis/jarvis_agent/__init__.py +13 -3
- jarvis_ai_assistant-0.1.182/src/jarvis/jarvis_agent/file_input_handler.py +112 -0
- {jarvis_ai_assistant-0.1.181 → jarvis_ai_assistant-0.1.182}/src/jarvis/jarvis_code_agent/code_agent.py +2 -0
- {jarvis_ai_assistant-0.1.181 → jarvis_ai_assistant-0.1.182}/src/jarvis/jarvis_tools/edit_file.py +12 -0
- {jarvis_ai_assistant-0.1.181 → jarvis_ai_assistant-0.1.182}/src/jarvis/jarvis_tools/file_operation.py +13 -3
- {jarvis_ai_assistant-0.1.181 → jarvis_ai_assistant-0.1.182}/src/jarvis/jarvis_tools/read_code.py +12 -2
- {jarvis_ai_assistant-0.1.181 → jarvis_ai_assistant-0.1.182/src/jarvis_ai_assistant.egg-info}/PKG-INFO +1 -1
- {jarvis_ai_assistant-0.1.181 → jarvis_ai_assistant-0.1.182}/src/jarvis_ai_assistant.egg-info/SOURCES.txt +1 -0
- {jarvis_ai_assistant-0.1.181 → jarvis_ai_assistant-0.1.182}/LICENSE +0 -0
- {jarvis_ai_assistant-0.1.181 → jarvis_ai_assistant-0.1.182}/MANIFEST.in +0 -0
- {jarvis_ai_assistant-0.1.181 → jarvis_ai_assistant-0.1.182}/README.md +0 -0
- {jarvis_ai_assistant-0.1.181 → jarvis_ai_assistant-0.1.182}/setup.cfg +0 -0
- {jarvis_ai_assistant-0.1.181 → jarvis_ai_assistant-0.1.182}/src/jarvis/jarvis_agent/builtin_input_handler.py +0 -0
- {jarvis_ai_assistant-0.1.181 → jarvis_ai_assistant-0.1.182}/src/jarvis/jarvis_agent/jarvis.py +0 -0
- {jarvis_ai_assistant-0.1.181 → jarvis_ai_assistant-0.1.182}/src/jarvis/jarvis_agent/main.py +0 -0
- {jarvis_ai_assistant-0.1.181 → jarvis_ai_assistant-0.1.182}/src/jarvis/jarvis_agent/output_handler.py +0 -0
- {jarvis_ai_assistant-0.1.181 → jarvis_ai_assistant-0.1.182}/src/jarvis/jarvis_agent/shell_input_handler.py +0 -0
- {jarvis_ai_assistant-0.1.181 → jarvis_ai_assistant-0.1.182}/src/jarvis/jarvis_code_agent/__init__.py +0 -0
- {jarvis_ai_assistant-0.1.181 → jarvis_ai_assistant-0.1.182}/src/jarvis/jarvis_code_agent/lint.py +0 -0
- {jarvis_ai_assistant-0.1.181 → jarvis_ai_assistant-0.1.182}/src/jarvis/jarvis_code_analysis/checklists/__init__.py +0 -0
- {jarvis_ai_assistant-0.1.181 → jarvis_ai_assistant-0.1.182}/src/jarvis/jarvis_code_analysis/checklists/c_cpp.py +0 -0
- {jarvis_ai_assistant-0.1.181 → jarvis_ai_assistant-0.1.182}/src/jarvis/jarvis_code_analysis/checklists/csharp.py +0 -0
- {jarvis_ai_assistant-0.1.181 → jarvis_ai_assistant-0.1.182}/src/jarvis/jarvis_code_analysis/checklists/data_format.py +0 -0
- {jarvis_ai_assistant-0.1.181 → jarvis_ai_assistant-0.1.182}/src/jarvis/jarvis_code_analysis/checklists/devops.py +0 -0
- {jarvis_ai_assistant-0.1.181 → jarvis_ai_assistant-0.1.182}/src/jarvis/jarvis_code_analysis/checklists/docs.py +0 -0
- {jarvis_ai_assistant-0.1.181 → jarvis_ai_assistant-0.1.182}/src/jarvis/jarvis_code_analysis/checklists/go.py +0 -0
- {jarvis_ai_assistant-0.1.181 → jarvis_ai_assistant-0.1.182}/src/jarvis/jarvis_code_analysis/checklists/infrastructure.py +0 -0
- {jarvis_ai_assistant-0.1.181 → jarvis_ai_assistant-0.1.182}/src/jarvis/jarvis_code_analysis/checklists/java.py +0 -0
- {jarvis_ai_assistant-0.1.181 → jarvis_ai_assistant-0.1.182}/src/jarvis/jarvis_code_analysis/checklists/javascript.py +0 -0
- {jarvis_ai_assistant-0.1.181 → jarvis_ai_assistant-0.1.182}/src/jarvis/jarvis_code_analysis/checklists/kotlin.py +0 -0
- {jarvis_ai_assistant-0.1.181 → jarvis_ai_assistant-0.1.182}/src/jarvis/jarvis_code_analysis/checklists/loader.py +0 -0
- {jarvis_ai_assistant-0.1.181 → jarvis_ai_assistant-0.1.182}/src/jarvis/jarvis_code_analysis/checklists/php.py +0 -0
- {jarvis_ai_assistant-0.1.181 → jarvis_ai_assistant-0.1.182}/src/jarvis/jarvis_code_analysis/checklists/python.py +0 -0
- {jarvis_ai_assistant-0.1.181 → jarvis_ai_assistant-0.1.182}/src/jarvis/jarvis_code_analysis/checklists/ruby.py +0 -0
- {jarvis_ai_assistant-0.1.181 → jarvis_ai_assistant-0.1.182}/src/jarvis/jarvis_code_analysis/checklists/rust.py +0 -0
- {jarvis_ai_assistant-0.1.181 → jarvis_ai_assistant-0.1.182}/src/jarvis/jarvis_code_analysis/checklists/shell.py +0 -0
- {jarvis_ai_assistant-0.1.181 → jarvis_ai_assistant-0.1.182}/src/jarvis/jarvis_code_analysis/checklists/sql.py +0 -0
- {jarvis_ai_assistant-0.1.181 → jarvis_ai_assistant-0.1.182}/src/jarvis/jarvis_code_analysis/checklists/swift.py +0 -0
- {jarvis_ai_assistant-0.1.181 → jarvis_ai_assistant-0.1.182}/src/jarvis/jarvis_code_analysis/checklists/web.py +0 -0
- {jarvis_ai_assistant-0.1.181 → jarvis_ai_assistant-0.1.182}/src/jarvis/jarvis_code_analysis/code_review.py +0 -0
- {jarvis_ai_assistant-0.1.181 → jarvis_ai_assistant-0.1.182}/src/jarvis/jarvis_data/config_schema.json +0 -0
- {jarvis_ai_assistant-0.1.181 → jarvis_ai_assistant-0.1.182}/src/jarvis/jarvis_data/huggingface.tar.gz +0 -0
- {jarvis_ai_assistant-0.1.181 → jarvis_ai_assistant-0.1.182}/src/jarvis/jarvis_dev/main.py +0 -0
- {jarvis_ai_assistant-0.1.181 → jarvis_ai_assistant-0.1.182}/src/jarvis/jarvis_event/__init__.py +0 -0
- {jarvis_ai_assistant-0.1.181 → jarvis_ai_assistant-0.1.182}/src/jarvis/jarvis_git_details/__init__.py +0 -0
- {jarvis_ai_assistant-0.1.181 → jarvis_ai_assistant-0.1.182}/src/jarvis/jarvis_git_details/main.py +0 -0
- {jarvis_ai_assistant-0.1.181 → jarvis_ai_assistant-0.1.182}/src/jarvis/jarvis_git_squash/__init__.py +0 -0
- {jarvis_ai_assistant-0.1.181 → jarvis_ai_assistant-0.1.182}/src/jarvis/jarvis_git_squash/main.py +0 -0
- {jarvis_ai_assistant-0.1.181 → jarvis_ai_assistant-0.1.182}/src/jarvis/jarvis_git_utils/git_commiter.py +0 -0
- {jarvis_ai_assistant-0.1.181 → jarvis_ai_assistant-0.1.182}/src/jarvis/jarvis_mcp/__init__.py +0 -0
- {jarvis_ai_assistant-0.1.181 → jarvis_ai_assistant-0.1.182}/src/jarvis/jarvis_mcp/sse_mcp_client.py +0 -0
- {jarvis_ai_assistant-0.1.181 → jarvis_ai_assistant-0.1.182}/src/jarvis/jarvis_mcp/stdio_mcp_client.py +0 -0
- {jarvis_ai_assistant-0.1.181 → jarvis_ai_assistant-0.1.182}/src/jarvis/jarvis_mcp/streamable_mcp_client.py +0 -0
- {jarvis_ai_assistant-0.1.181 → jarvis_ai_assistant-0.1.182}/src/jarvis/jarvis_methodology/main.py +0 -0
- {jarvis_ai_assistant-0.1.181 → jarvis_ai_assistant-0.1.182}/src/jarvis/jarvis_multi_agent/__init__.py +0 -0
- {jarvis_ai_assistant-0.1.181 → jarvis_ai_assistant-0.1.182}/src/jarvis/jarvis_multi_agent/main.py +0 -0
- {jarvis_ai_assistant-0.1.181 → jarvis_ai_assistant-0.1.182}/src/jarvis/jarvis_platform/__init__.py +0 -0
- {jarvis_ai_assistant-0.1.181 → jarvis_ai_assistant-0.1.182}/src/jarvis/jarvis_platform/base.py +0 -0
- {jarvis_ai_assistant-0.1.181 → jarvis_ai_assistant-0.1.182}/src/jarvis/jarvis_platform/human.py +0 -0
- {jarvis_ai_assistant-0.1.181 → jarvis_ai_assistant-0.1.182}/src/jarvis/jarvis_platform/kimi.py +0 -0
- {jarvis_ai_assistant-0.1.181 → jarvis_ai_assistant-0.1.182}/src/jarvis/jarvis_platform/openai.py +0 -0
- {jarvis_ai_assistant-0.1.181 → jarvis_ai_assistant-0.1.182}/src/jarvis/jarvis_platform/registry.py +0 -0
- {jarvis_ai_assistant-0.1.181 → jarvis_ai_assistant-0.1.182}/src/jarvis/jarvis_platform/yuanbao.py +0 -0
- {jarvis_ai_assistant-0.1.181 → jarvis_ai_assistant-0.1.182}/src/jarvis/jarvis_platform_manager/__init__.py +0 -0
- {jarvis_ai_assistant-0.1.181 → jarvis_ai_assistant-0.1.182}/src/jarvis/jarvis_platform_manager/main.py +0 -0
- {jarvis_ai_assistant-0.1.181 → jarvis_ai_assistant-0.1.182}/src/jarvis/jarvis_smart_shell/__init__.py +0 -0
- {jarvis_ai_assistant-0.1.181 → jarvis_ai_assistant-0.1.182}/src/jarvis/jarvis_smart_shell/main.py +0 -0
- {jarvis_ai_assistant-0.1.181 → jarvis_ai_assistant-0.1.182}/src/jarvis/jarvis_tools/__init__.py +0 -0
- {jarvis_ai_assistant-0.1.181 → jarvis_ai_assistant-0.1.182}/src/jarvis/jarvis_tools/ask_user.py +0 -0
- {jarvis_ai_assistant-0.1.181 → jarvis_ai_assistant-0.1.182}/src/jarvis/jarvis_tools/base.py +0 -0
- {jarvis_ai_assistant-0.1.181 → jarvis_ai_assistant-0.1.182}/src/jarvis/jarvis_tools/chdir.py +0 -0
- {jarvis_ai_assistant-0.1.181 → jarvis_ai_assistant-0.1.182}/src/jarvis/jarvis_tools/cli/__init__.py +0 -0
- {jarvis_ai_assistant-0.1.181 → jarvis_ai_assistant-0.1.182}/src/jarvis/jarvis_tools/cli/main.py +0 -0
- {jarvis_ai_assistant-0.1.181 → jarvis_ai_assistant-0.1.182}/src/jarvis/jarvis_tools/code_plan.py +0 -0
- {jarvis_ai_assistant-0.1.181 → jarvis_ai_assistant-0.1.182}/src/jarvis/jarvis_tools/create_code_agent.py +0 -0
- {jarvis_ai_assistant-0.1.181 → jarvis_ai_assistant-0.1.182}/src/jarvis/jarvis_tools/create_sub_agent.py +0 -0
- {jarvis_ai_assistant-0.1.181 → jarvis_ai_assistant-0.1.182}/src/jarvis/jarvis_tools/execute_script.py +0 -0
- {jarvis_ai_assistant-0.1.181 → jarvis_ai_assistant-0.1.182}/src/jarvis/jarvis_tools/file_analyzer.py +0 -0
- {jarvis_ai_assistant-0.1.181 → jarvis_ai_assistant-0.1.182}/src/jarvis/jarvis_tools/generate_new_tool.py +0 -0
- {jarvis_ai_assistant-0.1.181 → jarvis_ai_assistant-0.1.182}/src/jarvis/jarvis_tools/methodology.py +0 -0
- {jarvis_ai_assistant-0.1.181 → jarvis_ai_assistant-0.1.182}/src/jarvis/jarvis_tools/read_webpage.py +0 -0
- {jarvis_ai_assistant-0.1.181 → jarvis_ai_assistant-0.1.182}/src/jarvis/jarvis_tools/registry.py +0 -0
- {jarvis_ai_assistant-0.1.181 → jarvis_ai_assistant-0.1.182}/src/jarvis/jarvis_tools/rewrite_file.py +0 -0
- {jarvis_ai_assistant-0.1.181 → jarvis_ai_assistant-0.1.182}/src/jarvis/jarvis_tools/search_web.py +0 -0
- {jarvis_ai_assistant-0.1.181 → jarvis_ai_assistant-0.1.182}/src/jarvis/jarvis_tools/virtual_tty.py +0 -0
- {jarvis_ai_assistant-0.1.181 → jarvis_ai_assistant-0.1.182}/src/jarvis/jarvis_utils/__init__.py +0 -0
- {jarvis_ai_assistant-0.1.181 → jarvis_ai_assistant-0.1.182}/src/jarvis/jarvis_utils/builtin_replace_map.py +0 -0
- {jarvis_ai_assistant-0.1.181 → jarvis_ai_assistant-0.1.182}/src/jarvis/jarvis_utils/config.py +0 -0
- {jarvis_ai_assistant-0.1.181 → jarvis_ai_assistant-0.1.182}/src/jarvis/jarvis_utils/embedding.py +0 -0
- {jarvis_ai_assistant-0.1.181 → jarvis_ai_assistant-0.1.182}/src/jarvis/jarvis_utils/file_processors.py +0 -0
- {jarvis_ai_assistant-0.1.181 → jarvis_ai_assistant-0.1.182}/src/jarvis/jarvis_utils/git_utils.py +0 -0
- {jarvis_ai_assistant-0.1.181 → jarvis_ai_assistant-0.1.182}/src/jarvis/jarvis_utils/globals.py +0 -0
- {jarvis_ai_assistant-0.1.181 → jarvis_ai_assistant-0.1.182}/src/jarvis/jarvis_utils/input.py +0 -0
- {jarvis_ai_assistant-0.1.181 → jarvis_ai_assistant-0.1.182}/src/jarvis/jarvis_utils/methodology.py +0 -0
- {jarvis_ai_assistant-0.1.181 → jarvis_ai_assistant-0.1.182}/src/jarvis/jarvis_utils/output.py +0 -0
- {jarvis_ai_assistant-0.1.181 → jarvis_ai_assistant-0.1.182}/src/jarvis/jarvis_utils/tag.py +0 -0
- {jarvis_ai_assistant-0.1.181 → jarvis_ai_assistant-0.1.182}/src/jarvis/jarvis_utils/utils.py +0 -0
- {jarvis_ai_assistant-0.1.181 → jarvis_ai_assistant-0.1.182}/src/jarvis_ai_assistant.egg-info/dependency_links.txt +0 -0
- {jarvis_ai_assistant-0.1.181 → jarvis_ai_assistant-0.1.182}/src/jarvis_ai_assistant.egg-info/entry_points.txt +0 -0
- {jarvis_ai_assistant-0.1.181 → jarvis_ai_assistant-0.1.182}/src/jarvis_ai_assistant.egg-info/requires.txt +0 -0
- {jarvis_ai_assistant-0.1.181 → jarvis_ai_assistant-0.1.182}/src/jarvis_ai_assistant.egg-info/top_level.txt +0 -0
|
@@ -8,7 +8,7 @@ default = true
|
|
|
8
8
|
|
|
9
9
|
[project]
|
|
10
10
|
name = "jarvis-ai-assistant"
|
|
11
|
-
version = "0.1.
|
|
11
|
+
version = "0.1.182"
|
|
12
12
|
description = "Jarvis: An AI assistant that uses tools to interact with the system"
|
|
13
13
|
readme = "README.md"
|
|
14
14
|
authors = [{ name = "skyfire", email = "skyfireitdiy@hotmail.com" }]
|
|
@@ -3,7 +3,7 @@ from setuptools import setup, find_packages
|
|
|
3
3
|
|
|
4
4
|
setup(
|
|
5
5
|
name="jarvis-ai-assistant",
|
|
6
|
-
version="0.1.
|
|
6
|
+
version="0.1.182",
|
|
7
7
|
author="skyfire",
|
|
8
8
|
author_email="skyfireitdiy@hotmail.com",
|
|
9
9
|
description="An AI assistant that uses various tools to interact with the system",
|
{jarvis_ai_assistant-0.1.181 → jarvis_ai_assistant-0.1.182}/src/jarvis/jarvis_agent/__init__.py
RENAMED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
# 标准库导入
|
|
3
3
|
import datetime
|
|
4
4
|
import platform
|
|
5
|
-
from typing import Any, Callable, List, Optional, Protocol, Tuple, Union
|
|
5
|
+
from typing import Any, Callable, Dict, List, Optional, Protocol, Tuple, Union
|
|
6
6
|
|
|
7
7
|
# 第三方库导入
|
|
8
8
|
from yaspin import yaspin # type: ignore
|
|
@@ -205,6 +205,8 @@ class Agent:
|
|
|
205
205
|
if model_name is not None:
|
|
206
206
|
self.model.set_model_name(model_name)
|
|
207
207
|
|
|
208
|
+
self.user_data: Dict[str, Any] = {}
|
|
209
|
+
|
|
208
210
|
self.model.set_suppress_output(False)
|
|
209
211
|
|
|
210
212
|
from jarvis.jarvis_tools.registry import ToolRegistry
|
|
@@ -319,6 +321,14 @@ class Agent:
|
|
|
319
321
|
)
|
|
320
322
|
self.first = True
|
|
321
323
|
|
|
324
|
+
def set_user_data(self, key: str, value: Any):
|
|
325
|
+
"""设置用户数据"""
|
|
326
|
+
self.user_data[key] = value
|
|
327
|
+
|
|
328
|
+
def get_user_data(self, key: str) -> Optional[Any]:
|
|
329
|
+
"""获取用户数据"""
|
|
330
|
+
return self.user_data.get(key, None)
|
|
331
|
+
|
|
322
332
|
def set_use_tools(self, use_tools):
|
|
323
333
|
"""设置要使用的工具列表"""
|
|
324
334
|
from jarvis.jarvis_tools.registry import ToolRegistry
|
|
@@ -372,7 +382,7 @@ class Agent:
|
|
|
372
382
|
)
|
|
373
383
|
|
|
374
384
|
addon_prompt = f"""
|
|
375
|
-
|
|
385
|
+
<system_prompt>
|
|
376
386
|
请判断是否已经完成任务,如果已经完成:
|
|
377
387
|
- 直接输出完成原因,不需要再有新的操作,不要输出{ot("TOOL_CALL")}标签
|
|
378
388
|
{complete_prompt}
|
|
@@ -381,7 +391,7 @@ class Agent:
|
|
|
381
391
|
- 如果信息不明确,请请求用户补充
|
|
382
392
|
- 如果执行过程中连续失败5次,请使用ask_user询问用户操作
|
|
383
393
|
- 操作列表:{action_handlers}
|
|
384
|
-
|
|
394
|
+
</system_prompt>
|
|
385
395
|
|
|
386
396
|
请继续。
|
|
387
397
|
"""
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
import os
|
|
5
|
+
import re
|
|
6
|
+
from typing import Any, Tuple
|
|
7
|
+
|
|
8
|
+
from yaspin import yaspin
|
|
9
|
+
|
|
10
|
+
from jarvis.jarvis_tools.file_operation import FileOperationTool
|
|
11
|
+
from jarvis.jarvis_utils.output import OutputType, PrettyOutput
|
|
12
|
+
from jarvis.jarvis_utils.utils import is_context_overflow
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
def file_input_handler(user_input: str, agent: Any) -> Tuple[str, bool]:
|
|
16
|
+
"""Process user input containing file references and read file contents.
|
|
17
|
+
|
|
18
|
+
Args:
|
|
19
|
+
user_input: Input string that may contain file references in format:
|
|
20
|
+
- 'file_path' (whole file)
|
|
21
|
+
- 'file_path:start_line,end_line' (line range)
|
|
22
|
+
- 'file_path:start_line:end_line' (alternative range format)
|
|
23
|
+
agent: Agent object for further processing (currently unused)
|
|
24
|
+
|
|
25
|
+
Returns:
|
|
26
|
+
Tuple[str, bool]:
|
|
27
|
+
- Processed prompt string with file contents prepended
|
|
28
|
+
- Boolean indicating if context overflow occurred
|
|
29
|
+
"""
|
|
30
|
+
prompt = user_input
|
|
31
|
+
files = []
|
|
32
|
+
|
|
33
|
+
file_refs = re.findall(r"'([^']+)'", user_input)
|
|
34
|
+
for ref in file_refs:
|
|
35
|
+
# Handle file:start,end or file:start:end format
|
|
36
|
+
if ':' in ref:
|
|
37
|
+
file_path, line_range = ref.split(':', 1)
|
|
38
|
+
# Initialize with default values
|
|
39
|
+
start_line = 1 # 1-based
|
|
40
|
+
end_line = -1
|
|
41
|
+
|
|
42
|
+
# Process line range if specified
|
|
43
|
+
if ',' in line_range or ':' in line_range:
|
|
44
|
+
try:
|
|
45
|
+
raw_start, raw_end = map(int, re.split(r'[,:]', line_range))
|
|
46
|
+
|
|
47
|
+
# Handle special values and Python-style negative indices
|
|
48
|
+
try:
|
|
49
|
+
with open(file_path, 'r', encoding='utf-8', errors="ignore") as f:
|
|
50
|
+
total_lines = len(f.readlines())
|
|
51
|
+
except FileNotFoundError:
|
|
52
|
+
PrettyOutput.print(f"文件不存在: {file_path}", OutputType.WARNING)
|
|
53
|
+
continue
|
|
54
|
+
# Process start line (0 means whole file, negative means from end)
|
|
55
|
+
if raw_start == 0: # 0表示整个文件
|
|
56
|
+
start_line = 1
|
|
57
|
+
end_line = total_lines
|
|
58
|
+
else:
|
|
59
|
+
start_line = raw_start if raw_start > 0 else total_lines + raw_start + 1
|
|
60
|
+
|
|
61
|
+
# Process end line
|
|
62
|
+
if raw_end == 0: # 0表示整个文件(如果start也是0)
|
|
63
|
+
end_line = total_lines
|
|
64
|
+
else:
|
|
65
|
+
end_line = raw_end if raw_end > 0 else total_lines + raw_end + 1
|
|
66
|
+
|
|
67
|
+
# Auto-correct ranges
|
|
68
|
+
start_line = max(1, min(start_line, total_lines))
|
|
69
|
+
end_line = max(start_line, min(end_line, total_lines))
|
|
70
|
+
|
|
71
|
+
# Final validation
|
|
72
|
+
if start_line < 1 or end_line > total_lines or start_line > end_line:
|
|
73
|
+
raise ValueError
|
|
74
|
+
|
|
75
|
+
except:
|
|
76
|
+
continue
|
|
77
|
+
|
|
78
|
+
# Add file if it exists
|
|
79
|
+
if os.path.isfile(file_path):
|
|
80
|
+
files.append({
|
|
81
|
+
"path": file_path,
|
|
82
|
+
"start_line": start_line,
|
|
83
|
+
"end_line": end_line
|
|
84
|
+
})
|
|
85
|
+
else:
|
|
86
|
+
# Handle simple file path
|
|
87
|
+
if os.path.isfile(ref):
|
|
88
|
+
files.append({
|
|
89
|
+
"path": ref,
|
|
90
|
+
"start_line": 1, # 1-based
|
|
91
|
+
"end_line": -1
|
|
92
|
+
})
|
|
93
|
+
|
|
94
|
+
# Read and process files if any were found
|
|
95
|
+
if files:
|
|
96
|
+
with yaspin(text="正在读取文件...", color="cyan") as spinner:
|
|
97
|
+
old_prompt = prompt
|
|
98
|
+
result = FileOperationTool().execute({"operation":"read","files": files})
|
|
99
|
+
if result["success"]:
|
|
100
|
+
spinner.text = "文件读取完成"
|
|
101
|
+
spinner.ok("✅")
|
|
102
|
+
# Prepend file contents to prompt and check for overflow
|
|
103
|
+
prompt = f"""{prompt}
|
|
104
|
+
|
|
105
|
+
<file_context>
|
|
106
|
+
{result["stdout"]}
|
|
107
|
+
</file_context>"""
|
|
108
|
+
if is_context_overflow(prompt):
|
|
109
|
+
return old_prompt, False
|
|
110
|
+
|
|
111
|
+
return prompt, False
|
|
112
|
+
|
|
@@ -15,6 +15,7 @@ from yaspin import yaspin # type: ignore
|
|
|
15
15
|
from jarvis import __version__
|
|
16
16
|
from jarvis.jarvis_agent import Agent
|
|
17
17
|
from jarvis.jarvis_agent.builtin_input_handler import builtin_input_handler
|
|
18
|
+
from jarvis.jarvis_agent.file_input_handler import file_input_handler
|
|
18
19
|
from jarvis.jarvis_agent.shell_input_handler import shell_input_handler
|
|
19
20
|
# 忽略yaspin的类型检查
|
|
20
21
|
from jarvis.jarvis_code_agent.lint import get_lint_tools
|
|
@@ -108,6 +109,7 @@ class CodeAgent:
|
|
|
108
109
|
output_handler=[tool_registry],
|
|
109
110
|
platform=platform_instance,
|
|
110
111
|
input_handler=[
|
|
112
|
+
file_input_handler,
|
|
111
113
|
shell_input_handler,
|
|
112
114
|
builtin_input_handler
|
|
113
115
|
],
|
{jarvis_ai_assistant-0.1.181 → jarvis_ai_assistant-0.1.182}/src/jarvis/jarvis_tools/edit_file.py
RENAMED
|
@@ -138,6 +138,7 @@ class FileSearchReplaceTool:
|
|
|
138
138
|
|
|
139
139
|
file_path = args["file"]
|
|
140
140
|
changes = args["changes"]
|
|
141
|
+
agent = args.get("agent", None)
|
|
141
142
|
|
|
142
143
|
# 创建已处理文件变量,用于失败时回滚
|
|
143
144
|
original_content = None
|
|
@@ -153,6 +154,17 @@ class FileSearchReplaceTool:
|
|
|
153
154
|
with open(file_path, 'r', encoding='utf-8') as f:
|
|
154
155
|
content = f.read()
|
|
155
156
|
original_content = content
|
|
157
|
+
|
|
158
|
+
if file_exists and agent:
|
|
159
|
+
files = agent.get_user_data("files")
|
|
160
|
+
if not files or files.get(file_path, None) is None:
|
|
161
|
+
return {
|
|
162
|
+
"success": False,
|
|
163
|
+
"stdout": "",
|
|
164
|
+
"stderr": f"请先读取文件 {file_path} 的内容后再编辑"
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
|
|
156
168
|
with yaspin(text=f"正在处理文件 {file_path}...", color="cyan") as spinner:
|
|
157
169
|
success, temp_content = fast_edit(file_path, changes, spinner)
|
|
158
170
|
if not success:
|
|
@@ -50,7 +50,7 @@ class FileOperationTool:
|
|
|
50
50
|
return None # 如果没有合适的处理器,返回None
|
|
51
51
|
|
|
52
52
|
def _handle_single_file(self, operation: str, filepath: str, content: str = "",
|
|
53
|
-
start_line: int = 1, end_line: int = -1) -> Dict[str, Any]:
|
|
53
|
+
start_line: int = 1, end_line: int = -1, agent: Any = None) -> Dict[str, Any]:
|
|
54
54
|
"""Handle operations for a single file"""
|
|
55
55
|
try:
|
|
56
56
|
abs_path = os.path.abspath(filepath)
|
|
@@ -128,6 +128,15 @@ class FileOperationTool:
|
|
|
128
128
|
|
|
129
129
|
spinner.text = f"文件读取完成: {abs_path}"
|
|
130
130
|
spinner.ok("✅")
|
|
131
|
+
|
|
132
|
+
if agent:
|
|
133
|
+
files = agent.get_user_data("files")
|
|
134
|
+
if files:
|
|
135
|
+
files.append(abs_path)
|
|
136
|
+
else:
|
|
137
|
+
files = [abs_path]
|
|
138
|
+
agent.set_user_data("files", files)
|
|
139
|
+
|
|
131
140
|
return {
|
|
132
141
|
"success": True,
|
|
133
142
|
"stdout": output,
|
|
@@ -173,7 +182,7 @@ class FileOperationTool:
|
|
|
173
182
|
"""
|
|
174
183
|
try:
|
|
175
184
|
operation = args["operation"].strip()
|
|
176
|
-
|
|
185
|
+
agent = args.get("agent", None)
|
|
177
186
|
if "files" not in args or not isinstance(args["files"], list):
|
|
178
187
|
return {
|
|
179
188
|
"success": False,
|
|
@@ -194,7 +203,8 @@ class FileOperationTool:
|
|
|
194
203
|
file_info["path"].strip(),
|
|
195
204
|
content,
|
|
196
205
|
file_info.get("start_line", 1),
|
|
197
|
-
file_info.get("end_line", -1)
|
|
206
|
+
file_info.get("end_line", -1),
|
|
207
|
+
agent
|
|
198
208
|
)
|
|
199
209
|
|
|
200
210
|
if result["success"]:
|
{jarvis_ai_assistant-0.1.181 → jarvis_ai_assistant-0.1.182}/src/jarvis/jarvis_tools/read_code.py
RENAMED
|
@@ -31,7 +31,7 @@ class ReadCodeTool:
|
|
|
31
31
|
"required": ["files"]
|
|
32
32
|
}
|
|
33
33
|
|
|
34
|
-
def _handle_single_file(self, filepath: str, start_line: int = 1, end_line: int = -1) -> Dict[str, Any]:
|
|
34
|
+
def _handle_single_file(self, filepath: str, start_line: int = 1, end_line: int = -1, agent: Any = None) -> Dict[str, Any]:
|
|
35
35
|
"""处理单个文件的读取操作
|
|
36
36
|
|
|
37
37
|
Args:
|
|
@@ -99,6 +99,14 @@ class ReadCodeTool:
|
|
|
99
99
|
spinner.text = f"文件读取完成: {abs_path}"
|
|
100
100
|
spinner.ok("✅")
|
|
101
101
|
|
|
102
|
+
if agent:
|
|
103
|
+
files = agent.get_user_data("files")
|
|
104
|
+
if files:
|
|
105
|
+
files.append(abs_path)
|
|
106
|
+
else:
|
|
107
|
+
files = [abs_path]
|
|
108
|
+
agent.set_user_data("files", files)
|
|
109
|
+
|
|
102
110
|
return {
|
|
103
111
|
"success": True,
|
|
104
112
|
"stdout": output,
|
|
@@ -123,6 +131,7 @@ class ReadCodeTool:
|
|
|
123
131
|
Dict[str, Any]: 包含成功状态、输出内容和错误信息的字典
|
|
124
132
|
"""
|
|
125
133
|
try:
|
|
134
|
+
agent = args.get("agent", None)
|
|
126
135
|
if "files" not in args or not isinstance(args["files"], list):
|
|
127
136
|
return {
|
|
128
137
|
"success": False,
|
|
@@ -140,7 +149,8 @@ class ReadCodeTool:
|
|
|
140
149
|
result = self._handle_single_file(
|
|
141
150
|
file_info["path"].strip(),
|
|
142
151
|
file_info.get("start_line", 1),
|
|
143
|
-
file_info.get("end_line", -1)
|
|
152
|
+
file_info.get("end_line", -1),
|
|
153
|
+
agent
|
|
144
154
|
)
|
|
145
155
|
|
|
146
156
|
if result["success"]:
|
|
@@ -6,6 +6,7 @@ setup.py
|
|
|
6
6
|
src/jarvis/__init__.py
|
|
7
7
|
src/jarvis/jarvis_agent/__init__.py
|
|
8
8
|
src/jarvis/jarvis_agent/builtin_input_handler.py
|
|
9
|
+
src/jarvis/jarvis_agent/file_input_handler.py
|
|
9
10
|
src/jarvis/jarvis_agent/jarvis.py
|
|
10
11
|
src/jarvis/jarvis_agent/main.py
|
|
11
12
|
src/jarvis/jarvis_agent/output_handler.py
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{jarvis_ai_assistant-0.1.181 → jarvis_ai_assistant-0.1.182}/src/jarvis/jarvis_agent/jarvis.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{jarvis_ai_assistant-0.1.181 → jarvis_ai_assistant-0.1.182}/src/jarvis/jarvis_code_agent/__init__.py
RENAMED
|
File without changes
|
{jarvis_ai_assistant-0.1.181 → jarvis_ai_assistant-0.1.182}/src/jarvis/jarvis_code_agent/lint.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{jarvis_ai_assistant-0.1.181 → jarvis_ai_assistant-0.1.182}/src/jarvis/jarvis_event/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
{jarvis_ai_assistant-0.1.181 → jarvis_ai_assistant-0.1.182}/src/jarvis/jarvis_git_details/main.py
RENAMED
|
File without changes
|
{jarvis_ai_assistant-0.1.181 → jarvis_ai_assistant-0.1.182}/src/jarvis/jarvis_git_squash/__init__.py
RENAMED
|
File without changes
|
{jarvis_ai_assistant-0.1.181 → jarvis_ai_assistant-0.1.182}/src/jarvis/jarvis_git_squash/main.py
RENAMED
|
File without changes
|
|
File without changes
|
{jarvis_ai_assistant-0.1.181 → jarvis_ai_assistant-0.1.182}/src/jarvis/jarvis_mcp/__init__.py
RENAMED
|
File without changes
|
{jarvis_ai_assistant-0.1.181 → jarvis_ai_assistant-0.1.182}/src/jarvis/jarvis_mcp/sse_mcp_client.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{jarvis_ai_assistant-0.1.181 → jarvis_ai_assistant-0.1.182}/src/jarvis/jarvis_methodology/main.py
RENAMED
|
File without changes
|
|
File without changes
|
{jarvis_ai_assistant-0.1.181 → jarvis_ai_assistant-0.1.182}/src/jarvis/jarvis_multi_agent/main.py
RENAMED
|
File without changes
|
{jarvis_ai_assistant-0.1.181 → jarvis_ai_assistant-0.1.182}/src/jarvis/jarvis_platform/__init__.py
RENAMED
|
File without changes
|
{jarvis_ai_assistant-0.1.181 → jarvis_ai_assistant-0.1.182}/src/jarvis/jarvis_platform/base.py
RENAMED
|
File without changes
|
{jarvis_ai_assistant-0.1.181 → jarvis_ai_assistant-0.1.182}/src/jarvis/jarvis_platform/human.py
RENAMED
|
File without changes
|
{jarvis_ai_assistant-0.1.181 → jarvis_ai_assistant-0.1.182}/src/jarvis/jarvis_platform/kimi.py
RENAMED
|
File without changes
|
{jarvis_ai_assistant-0.1.181 → jarvis_ai_assistant-0.1.182}/src/jarvis/jarvis_platform/openai.py
RENAMED
|
File without changes
|
{jarvis_ai_assistant-0.1.181 → jarvis_ai_assistant-0.1.182}/src/jarvis/jarvis_platform/registry.py
RENAMED
|
File without changes
|
{jarvis_ai_assistant-0.1.181 → jarvis_ai_assistant-0.1.182}/src/jarvis/jarvis_platform/yuanbao.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{jarvis_ai_assistant-0.1.181 → jarvis_ai_assistant-0.1.182}/src/jarvis/jarvis_smart_shell/main.py
RENAMED
|
File without changes
|
{jarvis_ai_assistant-0.1.181 → jarvis_ai_assistant-0.1.182}/src/jarvis/jarvis_tools/__init__.py
RENAMED
|
File without changes
|
{jarvis_ai_assistant-0.1.181 → jarvis_ai_assistant-0.1.182}/src/jarvis/jarvis_tools/ask_user.py
RENAMED
|
File without changes
|
|
File without changes
|
{jarvis_ai_assistant-0.1.181 → jarvis_ai_assistant-0.1.182}/src/jarvis/jarvis_tools/chdir.py
RENAMED
|
File without changes
|
{jarvis_ai_assistant-0.1.181 → jarvis_ai_assistant-0.1.182}/src/jarvis/jarvis_tools/cli/__init__.py
RENAMED
|
File without changes
|
{jarvis_ai_assistant-0.1.181 → jarvis_ai_assistant-0.1.182}/src/jarvis/jarvis_tools/cli/main.py
RENAMED
|
File without changes
|
{jarvis_ai_assistant-0.1.181 → jarvis_ai_assistant-0.1.182}/src/jarvis/jarvis_tools/code_plan.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{jarvis_ai_assistant-0.1.181 → jarvis_ai_assistant-0.1.182}/src/jarvis/jarvis_tools/file_analyzer.py
RENAMED
|
File without changes
|
|
File without changes
|
{jarvis_ai_assistant-0.1.181 → jarvis_ai_assistant-0.1.182}/src/jarvis/jarvis_tools/methodology.py
RENAMED
|
File without changes
|
{jarvis_ai_assistant-0.1.181 → jarvis_ai_assistant-0.1.182}/src/jarvis/jarvis_tools/read_webpage.py
RENAMED
|
File without changes
|
{jarvis_ai_assistant-0.1.181 → jarvis_ai_assistant-0.1.182}/src/jarvis/jarvis_tools/registry.py
RENAMED
|
File without changes
|
{jarvis_ai_assistant-0.1.181 → jarvis_ai_assistant-0.1.182}/src/jarvis/jarvis_tools/rewrite_file.py
RENAMED
|
File without changes
|
{jarvis_ai_assistant-0.1.181 → jarvis_ai_assistant-0.1.182}/src/jarvis/jarvis_tools/search_web.py
RENAMED
|
File without changes
|
{jarvis_ai_assistant-0.1.181 → jarvis_ai_assistant-0.1.182}/src/jarvis/jarvis_tools/virtual_tty.py
RENAMED
|
File without changes
|
{jarvis_ai_assistant-0.1.181 → jarvis_ai_assistant-0.1.182}/src/jarvis/jarvis_utils/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
{jarvis_ai_assistant-0.1.181 → jarvis_ai_assistant-0.1.182}/src/jarvis/jarvis_utils/config.py
RENAMED
|
File without changes
|
{jarvis_ai_assistant-0.1.181 → jarvis_ai_assistant-0.1.182}/src/jarvis/jarvis_utils/embedding.py
RENAMED
|
File without changes
|
|
File without changes
|
{jarvis_ai_assistant-0.1.181 → jarvis_ai_assistant-0.1.182}/src/jarvis/jarvis_utils/git_utils.py
RENAMED
|
File without changes
|
{jarvis_ai_assistant-0.1.181 → jarvis_ai_assistant-0.1.182}/src/jarvis/jarvis_utils/globals.py
RENAMED
|
File without changes
|
{jarvis_ai_assistant-0.1.181 → jarvis_ai_assistant-0.1.182}/src/jarvis/jarvis_utils/input.py
RENAMED
|
File without changes
|
{jarvis_ai_assistant-0.1.181 → jarvis_ai_assistant-0.1.182}/src/jarvis/jarvis_utils/methodology.py
RENAMED
|
File without changes
|
{jarvis_ai_assistant-0.1.181 → jarvis_ai_assistant-0.1.182}/src/jarvis/jarvis_utils/output.py
RENAMED
|
File without changes
|
|
File without changes
|
{jarvis_ai_assistant-0.1.181 → jarvis_ai_assistant-0.1.182}/src/jarvis/jarvis_utils/utils.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|