jarvis-ai-assistant 0.2.6__py3-none-any.whl → 0.2.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.
- jarvis/__init__.py +1 -1
- jarvis/jarvis_agent/__init__.py +12 -1
- jarvis/jarvis_agent/jarvis.py +467 -7
- jarvis/jarvis_code_agent/code_agent.py +1 -0
- jarvis/jarvis_data/config_schema.json +10 -0
- jarvis/jarvis_stats/storage.py +2 -2
- jarvis/jarvis_tools/clear_memory.py +252 -0
- jarvis/jarvis_tools/registry.py +47 -20
- jarvis/jarvis_tools/retrieve_memory.py +17 -11
- jarvis/jarvis_tools/save_memory.py +136 -75
- jarvis/jarvis_utils/config.py +20 -0
- jarvis/jarvis_utils/input.py +5 -3
- jarvis/jarvis_utils/methodology.py +41 -6
- jarvis/jarvis_utils/output.py +1 -1
- jarvis/jarvis_utils/utils.py +27 -1
- {jarvis_ai_assistant-0.2.6.dist-info → jarvis_ai_assistant-0.2.8.dist-info}/METADATA +1 -1
- {jarvis_ai_assistant-0.2.6.dist-info → jarvis_ai_assistant-0.2.8.dist-info}/RECORD +21 -20
- {jarvis_ai_assistant-0.2.6.dist-info → jarvis_ai_assistant-0.2.8.dist-info}/WHEEL +0 -0
- {jarvis_ai_assistant-0.2.6.dist-info → jarvis_ai_assistant-0.2.8.dist-info}/entry_points.txt +0 -0
- {jarvis_ai_assistant-0.2.6.dist-info → jarvis_ai_assistant-0.2.8.dist-info}/licenses/LICENSE +0 -0
- {jarvis_ai_assistant-0.2.6.dist-info → jarvis_ai_assistant-0.2.8.dist-info}/top_level.txt +0 -0
@@ -1,5 +1,6 @@
|
|
1
1
|
# -*- coding: utf-8 -*-
|
2
2
|
import json
|
3
|
+
import time
|
3
4
|
from datetime import datetime
|
4
5
|
from pathlib import Path
|
5
6
|
from typing import Any, Dict, List
|
@@ -15,6 +16,8 @@ class SaveMemoryTool:
|
|
15
16
|
name = "save_memory"
|
16
17
|
description = """保存信息到长短期记忆系统。
|
17
18
|
|
19
|
+
支持批量保存多条记忆,可以同时保存不同类型的记忆。
|
20
|
+
|
18
21
|
支持的记忆类型:
|
19
22
|
- project_long_term: 项目长期记忆(与当前项目相关的信息)
|
20
23
|
- global_long_term: 全局长期记忆(通用的信息、用户喜好、知识、方法等)
|
@@ -27,19 +30,36 @@ class SaveMemoryTool:
|
|
27
30
|
parameters = {
|
28
31
|
"type": "object",
|
29
32
|
"properties": {
|
30
|
-
"
|
31
|
-
"type": "string",
|
32
|
-
"enum": ["project_long_term", "global_long_term", "short_term"],
|
33
|
-
"description": "记忆类型",
|
34
|
-
},
|
35
|
-
"tags": {
|
33
|
+
"memories": {
|
36
34
|
"type": "array",
|
37
|
-
"items": {
|
38
|
-
|
39
|
-
|
40
|
-
|
35
|
+
"items": {
|
36
|
+
"type": "object",
|
37
|
+
"properties": {
|
38
|
+
"memory_type": {
|
39
|
+
"type": "string",
|
40
|
+
"enum": [
|
41
|
+
"project_long_term",
|
42
|
+
"global_long_term",
|
43
|
+
"short_term",
|
44
|
+
],
|
45
|
+
"description": "记忆类型",
|
46
|
+
},
|
47
|
+
"tags": {
|
48
|
+
"type": "array",
|
49
|
+
"items": {"type": "string"},
|
50
|
+
"description": "用于索引记忆的标签列表",
|
51
|
+
},
|
52
|
+
"content": {
|
53
|
+
"type": "string",
|
54
|
+
"description": "要保存的记忆内容",
|
55
|
+
},
|
56
|
+
},
|
57
|
+
"required": ["memory_type", "tags", "content"],
|
58
|
+
},
|
59
|
+
"description": "要保存的记忆列表",
|
60
|
+
}
|
41
61
|
},
|
42
|
-
"required": ["
|
62
|
+
"required": ["memories"],
|
43
63
|
}
|
44
64
|
|
45
65
|
def __init__(self):
|
@@ -58,81 +78,122 @@ class SaveMemoryTool:
|
|
58
78
|
|
59
79
|
def _generate_memory_id(self) -> str:
|
60
80
|
"""生成唯一的记忆ID"""
|
81
|
+
# 添加微秒级时间戳确保唯一性
|
82
|
+
time.sleep(0.001) # 确保不同记忆有不同的时间戳
|
61
83
|
return datetime.now().strftime("%Y%m%d_%H%M%S_%f")
|
62
84
|
|
85
|
+
def _save_single_memory(self, memory_data: Dict[str, Any]) -> Dict[str, Any]:
|
86
|
+
"""保存单条记忆"""
|
87
|
+
memory_type = memory_data["memory_type"]
|
88
|
+
tags = memory_data.get("tags", [])
|
89
|
+
content = memory_data.get("content", "")
|
90
|
+
|
91
|
+
# 生成记忆ID
|
92
|
+
memory_id = self._generate_memory_id()
|
93
|
+
|
94
|
+
# 创建记忆对象
|
95
|
+
memory_obj = {
|
96
|
+
"id": memory_id,
|
97
|
+
"type": memory_type,
|
98
|
+
"tags": tags,
|
99
|
+
"content": content,
|
100
|
+
"created_at": datetime.now().isoformat(),
|
101
|
+
"updated_at": datetime.now().isoformat(),
|
102
|
+
}
|
103
|
+
|
104
|
+
if memory_type == "short_term":
|
105
|
+
# 短期记忆保存到全局变量
|
106
|
+
add_short_term_memory(memory_obj)
|
107
|
+
|
108
|
+
result = {
|
109
|
+
"memory_id": memory_id,
|
110
|
+
"memory_type": memory_type,
|
111
|
+
"tags": tags,
|
112
|
+
"storage": "memory",
|
113
|
+
"message": f"短期记忆已成功保存到内存,ID: {memory_id}",
|
114
|
+
}
|
115
|
+
else:
|
116
|
+
# 长期记忆保存到文件
|
117
|
+
# 获取存储目录并确保存在
|
118
|
+
memory_dir = self._get_memory_dir(memory_type)
|
119
|
+
memory_dir.mkdir(parents=True, exist_ok=True)
|
120
|
+
|
121
|
+
# 保存记忆文件
|
122
|
+
memory_file = memory_dir / f"{memory_id}.json"
|
123
|
+
with open(memory_file, "w", encoding="utf-8") as f:
|
124
|
+
json.dump(memory_obj, f, ensure_ascii=False, indent=2)
|
125
|
+
|
126
|
+
result = {
|
127
|
+
"memory_id": memory_id,
|
128
|
+
"memory_type": memory_type,
|
129
|
+
"tags": tags,
|
130
|
+
"file_path": str(memory_file),
|
131
|
+
"message": f"记忆已成功保存,ID: {memory_id}",
|
132
|
+
}
|
133
|
+
|
134
|
+
return result
|
135
|
+
|
63
136
|
def execute(self, args: Dict[str, Any]) -> Dict[str, Any]:
|
64
137
|
"""执行保存记忆操作"""
|
65
138
|
try:
|
66
|
-
|
67
|
-
tags = args.get("tags", [])
|
68
|
-
content = args.get("content", "")
|
139
|
+
memories = args.get("memories", [])
|
69
140
|
|
70
|
-
|
71
|
-
|
141
|
+
if not memories:
|
142
|
+
return {
|
143
|
+
"success": False,
|
144
|
+
"stdout": "",
|
145
|
+
"stderr": "没有提供要保存的记忆",
|
146
|
+
}
|
72
147
|
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
148
|
+
results = []
|
149
|
+
success_count = 0
|
150
|
+
failed_count = 0
|
151
|
+
|
152
|
+
# 保存每条记忆
|
153
|
+
for i, memory_data in enumerate(memories):
|
154
|
+
try:
|
155
|
+
result = self._save_single_memory(memory_data)
|
156
|
+
results.append(result)
|
157
|
+
success_count += 1
|
158
|
+
|
159
|
+
# 打印单条记忆保存信息
|
160
|
+
memory_type = memory_data["memory_type"]
|
161
|
+
tags = memory_data.get("tags", [])
|
162
|
+
PrettyOutput.print(
|
163
|
+
f"[{i+1}/{len(memories)}] {memory_type} 记忆已保存\n"
|
164
|
+
f"ID: {result['memory_id']}\n"
|
165
|
+
f"标签: {', '.join(tags)}",
|
166
|
+
OutputType.SUCCESS,
|
167
|
+
)
|
168
|
+
except Exception as e:
|
169
|
+
failed_count += 1
|
170
|
+
error_msg = f"保存第 {i+1} 条记忆失败: {str(e)}"
|
171
|
+
PrettyOutput.print(error_msg, OutputType.ERROR)
|
172
|
+
results.append(
|
173
|
+
{
|
174
|
+
"error": error_msg,
|
175
|
+
"memory_type": memory_data.get("memory_type", "unknown"),
|
176
|
+
"tags": memory_data.get("tags", []),
|
177
|
+
}
|
178
|
+
)
|
179
|
+
|
180
|
+
# 生成总结报告
|
181
|
+
PrettyOutput.print(
|
182
|
+
f"\n批量保存完成:成功 {success_count} 条,失败 {failed_count} 条",
|
183
|
+
OutputType.INFO,
|
184
|
+
)
|
185
|
+
|
186
|
+
# 构建返回结果
|
187
|
+
output = {
|
188
|
+
"total": len(memories),
|
189
|
+
"success": success_count,
|
190
|
+
"failed": failed_count,
|
191
|
+
"results": results,
|
81
192
|
}
|
82
193
|
|
83
|
-
if memory_type == "short_term":
|
84
|
-
# 短期记忆保存到全局变量
|
85
|
-
add_short_term_memory(memory_data)
|
86
|
-
|
87
|
-
# 打印成功信息
|
88
|
-
PrettyOutput.print(
|
89
|
-
f"短期记忆已保存\n"
|
90
|
-
f"ID: {memory_id}\n"
|
91
|
-
f"类型: {memory_type}\n"
|
92
|
-
f"标签: {', '.join(tags)}\n"
|
93
|
-
f"存储位置: 内存(非持久化)",
|
94
|
-
OutputType.SUCCESS,
|
95
|
-
)
|
96
|
-
|
97
|
-
result = {
|
98
|
-
"memory_id": memory_id,
|
99
|
-
"memory_type": memory_type,
|
100
|
-
"tags": tags,
|
101
|
-
"storage": "memory",
|
102
|
-
"message": f"短期记忆已成功保存到内存,ID: {memory_id}",
|
103
|
-
}
|
104
|
-
else:
|
105
|
-
# 长期记忆保存到文件
|
106
|
-
# 获取存储目录并确保存在
|
107
|
-
memory_dir = self._get_memory_dir(memory_type)
|
108
|
-
memory_dir.mkdir(parents=True, exist_ok=True)
|
109
|
-
|
110
|
-
# 保存记忆文件
|
111
|
-
memory_file = memory_dir / f"{memory_id}.json"
|
112
|
-
with open(memory_file, "w", encoding="utf-8") as f:
|
113
|
-
json.dump(memory_data, f, ensure_ascii=False, indent=2)
|
114
|
-
|
115
|
-
# 打印成功信息
|
116
|
-
PrettyOutput.print(
|
117
|
-
f"记忆已保存\n"
|
118
|
-
f"ID: {memory_id}\n"
|
119
|
-
f"类型: {memory_type}\n"
|
120
|
-
f"标签: {', '.join(tags)}\n"
|
121
|
-
f"位置: {memory_file}",
|
122
|
-
OutputType.SUCCESS,
|
123
|
-
)
|
124
|
-
|
125
|
-
result = {
|
126
|
-
"memory_id": memory_id,
|
127
|
-
"memory_type": memory_type,
|
128
|
-
"tags": tags,
|
129
|
-
"file_path": str(memory_file),
|
130
|
-
"message": f"记忆已成功保存,ID: {memory_id}",
|
131
|
-
}
|
132
|
-
|
133
194
|
return {
|
134
195
|
"success": True,
|
135
|
-
"stdout": json.dumps(
|
196
|
+
"stdout": json.dumps(output, ensure_ascii=False, indent=2),
|
136
197
|
"stderr": "",
|
137
198
|
}
|
138
199
|
|
jarvis/jarvis_utils/config.py
CHANGED
@@ -309,6 +309,26 @@ def get_methodology_dirs() -> List[str]:
|
|
309
309
|
return GLOBAL_CONFIG_DATA.get("JARVIS_METHODOLOGY_DIRS", [])
|
310
310
|
|
311
311
|
|
312
|
+
def get_central_methodology_repo() -> str:
|
313
|
+
"""
|
314
|
+
获取中心方法论Git仓库地址。
|
315
|
+
|
316
|
+
返回:
|
317
|
+
str: 中心方法论Git仓库地址,如果未配置则返回空字符串
|
318
|
+
"""
|
319
|
+
return GLOBAL_CONFIG_DATA.get("JARVIS_CENTRAL_METHODOLOGY_REPO", "")
|
320
|
+
|
321
|
+
|
322
|
+
def get_central_tool_repo() -> str:
|
323
|
+
"""
|
324
|
+
获取中心工具Git仓库地址。
|
325
|
+
|
326
|
+
返回:
|
327
|
+
str: 中心工具Git仓库地址,如果未配置则返回空字符串
|
328
|
+
"""
|
329
|
+
return GLOBAL_CONFIG_DATA.get("JARVIS_CENTRAL_TOOL_REPO", "")
|
330
|
+
|
331
|
+
|
312
332
|
def is_print_prompt() -> bool:
|
313
333
|
"""
|
314
334
|
获取是否打印提示。
|
jarvis/jarvis_utils/input.py
CHANGED
@@ -216,9 +216,11 @@ def _get_multiline_input_internal(tip: str) -> str:
|
|
216
216
|
@bindings.add("enter")
|
217
217
|
def _(event):
|
218
218
|
if event.current_buffer.complete_state:
|
219
|
-
event.current_buffer.
|
220
|
-
|
221
|
-
|
219
|
+
completion = event.current_buffer.complete_state.current_completion
|
220
|
+
if completion:
|
221
|
+
event.current_buffer.apply_completion(completion)
|
222
|
+
else:
|
223
|
+
event.current_buffer.insert_text("\n")
|
222
224
|
else:
|
223
225
|
event.current_buffer.insert_text("\n")
|
224
226
|
|
@@ -15,11 +15,16 @@ from typing import Any, Dict, List, Optional
|
|
15
15
|
|
16
16
|
from jarvis.jarvis_platform.base import BasePlatform
|
17
17
|
from jarvis.jarvis_platform.registry import PlatformRegistry
|
18
|
-
from jarvis.jarvis_utils.config import
|
18
|
+
from jarvis.jarvis_utils.config import (
|
19
|
+
get_data_dir,
|
20
|
+
get_methodology_dirs,
|
21
|
+
get_central_methodology_repo,
|
22
|
+
)
|
19
23
|
from jarvis.jarvis_utils.globals import get_agent, current_agent_name
|
20
24
|
from jarvis.jarvis_utils.output import OutputType, PrettyOutput
|
21
25
|
from jarvis.jarvis_utils.utils import is_context_overflow, daily_check_git_updates
|
22
26
|
|
27
|
+
|
23
28
|
def _get_methodology_directory() -> str:
|
24
29
|
"""
|
25
30
|
获取方法论目录路径,如果不存在则创建
|
@@ -46,6 +51,29 @@ def _load_all_methodologies() -> Dict[str, str]:
|
|
46
51
|
all_methodologies = {}
|
47
52
|
methodology_dirs = [_get_methodology_directory()] + get_methodology_dirs()
|
48
53
|
|
54
|
+
# 如果配置了中心方法论仓库,将其添加到加载路径
|
55
|
+
central_repo = get_central_methodology_repo()
|
56
|
+
if central_repo:
|
57
|
+
# 中心方法论仓库存储在数据目录下的特定位置
|
58
|
+
central_repo_path = os.path.join(get_data_dir(), "central_methodology_repo")
|
59
|
+
methodology_dirs.append(central_repo_path)
|
60
|
+
|
61
|
+
# 确保中心方法论仓库被克隆/更新
|
62
|
+
if not os.path.exists(central_repo_path):
|
63
|
+
try:
|
64
|
+
import subprocess
|
65
|
+
|
66
|
+
PrettyOutput.print(
|
67
|
+
f"正在克隆中心方法论仓库: {central_repo}", OutputType.INFO
|
68
|
+
)
|
69
|
+
subprocess.run(
|
70
|
+
["git", "clone", central_repo, central_repo_path], check=True
|
71
|
+
)
|
72
|
+
except Exception as e:
|
73
|
+
PrettyOutput.print(
|
74
|
+
f"克隆中心方法论仓库失败: {str(e)}", OutputType.ERROR
|
75
|
+
)
|
76
|
+
|
49
77
|
# --- 全局每日更新检查 ---
|
50
78
|
daily_check_git_updates(methodology_dirs, "methodologies")
|
51
79
|
|
@@ -53,7 +81,9 @@ def _load_all_methodologies() -> Dict[str, str]:
|
|
53
81
|
|
54
82
|
for directory in set(methodology_dirs): # Use set to avoid duplicates
|
55
83
|
if not os.path.isdir(directory):
|
56
|
-
PrettyOutput.print(
|
84
|
+
PrettyOutput.print(
|
85
|
+
f"警告: 方法论目录不存在或不是一个目录: {directory}", OutputType.WARNING
|
86
|
+
)
|
57
87
|
continue
|
58
88
|
|
59
89
|
for filepath in glob.glob(os.path.join(directory, "*.json")):
|
@@ -64,7 +94,7 @@ def _load_all_methodologies() -> Dict[str, str]:
|
|
64
94
|
content = methodology.get("content", "")
|
65
95
|
if problem_type and content:
|
66
96
|
if problem_type in all_methodologies:
|
67
|
-
|
97
|
+
pass
|
68
98
|
all_methodologies[problem_type] = content
|
69
99
|
except Exception as e:
|
70
100
|
filename = os.path.basename(filepath)
|
@@ -211,8 +241,9 @@ def load_methodology(user_input: str, tool_registery: Optional[Any] = None) -> s
|
|
211
241
|
|
212
242
|
# 从响应中提取<NUM>标签内的内容
|
213
243
|
import re
|
214
|
-
|
215
|
-
|
244
|
+
|
245
|
+
num_match = re.search(r"<NUM>(.*?)</NUM>", response, re.DOTALL)
|
246
|
+
|
216
247
|
if not num_match:
|
217
248
|
# 如果没有找到<NUM>标签,尝试直接解析响应
|
218
249
|
selected_indices_str = response
|
@@ -226,7 +257,11 @@ def load_methodology(user_input: str, tool_registery: Optional[Any] = None) -> s
|
|
226
257
|
selected_methodologies = {}
|
227
258
|
try:
|
228
259
|
if selected_indices_str:
|
229
|
-
indices = [
|
260
|
+
indices = [
|
261
|
+
int(idx.strip())
|
262
|
+
for idx in selected_indices_str.split(",")
|
263
|
+
if idx.strip().isdigit()
|
264
|
+
]
|
230
265
|
for idx in indices:
|
231
266
|
if 1 <= idx <= len(methodology_titles):
|
232
267
|
title = methodology_titles[idx - 1]
|
jarvis/jarvis_utils/output.py
CHANGED
@@ -204,7 +204,7 @@ class PrettyOutput:
|
|
204
204
|
color="red", frame=True, bgcolor="#2b1c1c", meta={"icon": "❌"}
|
205
205
|
),
|
206
206
|
OutputType.INFO: RichStyle(
|
207
|
-
color="
|
207
|
+
color="bright_cyan", frame=True, bgcolor="#2b2b1c", meta={"icon": "ℹ️"}
|
208
208
|
),
|
209
209
|
OutputType.PLANNING: RichStyle(
|
210
210
|
color="purple",
|
jarvis/jarvis_utils/utils.py
CHANGED
@@ -330,11 +330,18 @@ def _show_usage_stats() -> None:
|
|
330
330
|
if total_changes > 0:
|
331
331
|
parts.append(f"代码修改 {total_changes:,} 次")
|
332
332
|
if total_lines_modified > 0:
|
333
|
-
parts.append(f"
|
333
|
+
parts.append(f"修改代码行数 {total_lines_modified:,} 行")
|
334
334
|
|
335
335
|
if parts:
|
336
336
|
summary_content.append(f"📈 总计: {', '.join(parts)}")
|
337
337
|
|
338
|
+
# 添加代码采纳率显示
|
339
|
+
adoption_metrics = categorized_stats["adoption"]["metrics"]
|
340
|
+
if "adoption_rate" in adoption_metrics:
|
341
|
+
summary_content.append(
|
342
|
+
f"✅ 代码采纳率: {adoption_metrics['adoption_rate']}"
|
343
|
+
)
|
344
|
+
|
338
345
|
# 计算节省的时间
|
339
346
|
time_saved_seconds = 0
|
340
347
|
tool_stats = categorized_stats["tool"]["metrics"]
|
@@ -946,6 +953,25 @@ def _pull_git_repo(repo_path: Path, repo_type: str):
|
|
946
953
|
)
|
947
954
|
before_hash = before_hash_result.stdout.strip()
|
948
955
|
|
956
|
+
# 检查是否是空仓库
|
957
|
+
ls_remote_result = subprocess.run(
|
958
|
+
["git", "ls-remote", "--heads", "origin"],
|
959
|
+
cwd=repo_path,
|
960
|
+
capture_output=True,
|
961
|
+
text=True,
|
962
|
+
encoding="utf-8",
|
963
|
+
errors="replace",
|
964
|
+
check=True,
|
965
|
+
timeout=10,
|
966
|
+
)
|
967
|
+
|
968
|
+
if not ls_remote_result.stdout.strip():
|
969
|
+
PrettyOutput.print(
|
970
|
+
f"{repo_type}库 '{repo_path.name}' 的远程仓库是空的,跳过更新。",
|
971
|
+
OutputType.INFO,
|
972
|
+
)
|
973
|
+
return
|
974
|
+
|
949
975
|
# 执行 git pull
|
950
976
|
pull_result = subprocess.run(
|
951
977
|
["git", "pull"],
|
@@ -1,8 +1,8 @@
|
|
1
|
-
jarvis/__init__.py,sha256=
|
2
|
-
jarvis/jarvis_agent/__init__.py,sha256=
|
1
|
+
jarvis/__init__.py,sha256=rn_98P3W66_HZr-g2PfCqi31zz80PtoPiaPvZCINUKo,73
|
2
|
+
jarvis/jarvis_agent/__init__.py,sha256=feyq1jxhgzAy8y0X7nNidmFTm8gkpJdhikzmphZNU7M,26945
|
3
3
|
jarvis/jarvis_agent/builtin_input_handler.py,sha256=Qs4LAr4xdKLBJpQE81YP4CkucAop86ms0iVoKa1nnso,2468
|
4
4
|
jarvis/jarvis_agent/edit_file_handler.py,sha256=w-byNJ4TN_SlV3djjfFC7OksySOFGrM8ku49w662dzc,11854
|
5
|
-
jarvis/jarvis_agent/jarvis.py,sha256=
|
5
|
+
jarvis/jarvis_agent/jarvis.py,sha256=4CD18QQHL-7XrqrWJDhN1mAxyO4Gk64dd-NUJs3Gt6g,27175
|
6
6
|
jarvis/jarvis_agent/main.py,sha256=56pLVy6v-3ZdyPCcWXdRkgbjmYsoIfC7zrA6B7sYivU,3334
|
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
|
@@ -12,7 +12,7 @@ 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=
|
15
|
+
jarvis/jarvis_code_agent/code_agent.py,sha256=t1i9XPihW7xrsYn6I86_QvCocVgHgIg0ORQ-ADcheeM,29132
|
16
16
|
jarvis/jarvis_code_agent/lint.py,sha256=LZPsfyZPMo7Wm7LN4osZocuNJwZx1ojacO3MlF870x8,4009
|
17
17
|
jarvis/jarvis_code_analysis/code_review.py,sha256=TMov1pqDe1bg0vM1ndnYeW9ejHrRN_jMroo3T4L9yag,32368
|
18
18
|
jarvis/jarvis_code_analysis/checklists/__init__.py,sha256=LIXAYa1sW3l7foP6kohLWnE98I_EQ0T7z5bYKHq6rJA,78
|
@@ -35,7 +35,7 @@ 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=
|
38
|
+
jarvis/jarvis_data/config_schema.json,sha256=CPGIKXei1xgFkkGKXzFNy_LxmZCFtbd_8cHv22A9zQ0,10523
|
39
39
|
jarvis/jarvis_data/tiktoken/9b5ad71b2ce5302211f9c61530b329a4922fc6a4,sha256=Ijkht27pm96ZW3_3OFE-7xAPtR0YyTWXoRO8_-hlsqc,1681126
|
40
40
|
jarvis/jarvis_git_squash/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
41
41
|
jarvis/jarvis_git_squash/main.py,sha256=6PECdAbTbrsJBRLK1pXBh4hdJ_LADh-XXSic1xJi97E,2255
|
@@ -73,11 +73,12 @@ jarvis/jarvis_smart_shell/main.py,sha256=ReCC9bWPlgl84ylI0uvdzlE3J6fS0XzFSLOpQQy
|
|
73
73
|
jarvis/jarvis_stats/__init__.py,sha256=jJzgP43nxzLbNGs8Do4Jfta1PNCJMf1Oq9YTPd6EnFM,342
|
74
74
|
jarvis/jarvis_stats/cli.py,sha256=KqLH-9Kd_YlBJSke3QXY90XnFmiH2kYkRacL8ygtSsM,12649
|
75
75
|
jarvis/jarvis_stats/stats.py,sha256=qLyOJvWAv0fgV7oohAUSQ2W2E1Hr4wWgEQXDOiI-4Cg,17674
|
76
|
-
jarvis/jarvis_stats/storage.py,sha256=
|
76
|
+
jarvis/jarvis_stats/storage.py,sha256=0hs-TkmvWavsf6J2LLOLXyyZzVK8g77jecRnt89MzYE,12724
|
77
77
|
jarvis/jarvis_stats/visualizer.py,sha256=ZIBmGELzs6c7qM01tQql1HF6eFKn6HDGVQfKXRUUIY0,8529
|
78
78
|
jarvis/jarvis_tools/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
79
79
|
jarvis/jarvis_tools/ask_user.py,sha256=M6DdLNryCE8y1JcdZHEifUgZkPUEPNKc-zDW5p0Mb1k,2029
|
80
80
|
jarvis/jarvis_tools/base.py,sha256=tFVmK6ppsImW2BzHZmrNmMRiOJdW-4aZP6Me3VxdYcA,1194
|
81
|
+
jarvis/jarvis_tools/clear_memory.py,sha256=HQMK70UJhhDgPPHozGaTpYizzQblUzYRwPbvD1z3z6o,8730
|
81
82
|
jarvis/jarvis_tools/edit_file.py,sha256=hM345E9rxS-EkqCZpwwizL6fmPdTadtB798tEO5Ce3g,10417
|
82
83
|
jarvis/jarvis_tools/execute_script.py,sha256=gMarE5yCCSPU6Dp6HlcL2KT-2xCzR-1p-oQNlYOJK58,6157
|
83
84
|
jarvis/jarvis_tools/file_analyzer.py,sha256=aVe1jBSp0YmlypihxrGADJpYrU_7CxDETxGUNySuSlI,4044
|
@@ -85,30 +86,30 @@ jarvis/jarvis_tools/generate_new_tool.py,sha256=uaWKlDMGjetvvwKTj0_AVTdmd14IktRb
|
|
85
86
|
jarvis/jarvis_tools/methodology.py,sha256=_K4GIDUodGEma3SvNRo7Qs5rliijgNespVLyAPN35JU,5233
|
86
87
|
jarvis/jarvis_tools/read_code.py,sha256=EnI-R-5HyIQYhMD391nZWXHIuHHBF-OJIRE0QpLcPX4,6417
|
87
88
|
jarvis/jarvis_tools/read_webpage.py,sha256=NmDUboVZd4CGHBPRFK6dp3uqVhuGopW1bOi3TcaLDF4,2092
|
88
|
-
jarvis/jarvis_tools/registry.py,sha256=
|
89
|
-
jarvis/jarvis_tools/retrieve_memory.py,sha256=
|
89
|
+
jarvis/jarvis_tools/registry.py,sha256=RBQ6Z3UVv4R8dlM8EcGWtWV53C34fOSwXMBJasWv0tk,29781
|
90
|
+
jarvis/jarvis_tools/retrieve_memory.py,sha256=zItXPSMGzaPyH-4p_CP3z24fBYFnCK3OQJctgVunZMI,8288
|
90
91
|
jarvis/jarvis_tools/rewrite_file.py,sha256=eG_WKg6cVAXmuGwUqlWkcuyay5S8DOzEi8vZCmX3O8w,7255
|
91
|
-
jarvis/jarvis_tools/save_memory.py,sha256=
|
92
|
+
jarvis/jarvis_tools/save_memory.py,sha256=DjeFb38OtK9Y_RpWYHz8vL72JdauXZTlc_Y0FUQBtiM,7486
|
92
93
|
jarvis/jarvis_tools/search_web.py,sha256=zh6EYLQPIQneoz27Hheh-fifMeMNhrTVldXKMSsMz2Y,5801
|
93
94
|
jarvis/jarvis_tools/virtual_tty.py,sha256=LTsg1PlsPvgaLShUaxpAKwTpyjXRr0l0qSREI7Q-fBc,26349
|
94
95
|
jarvis/jarvis_tools/cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
95
96
|
jarvis/jarvis_tools/cli/main.py,sha256=GsfZJ4OS4Hvxh0H2XiLkgbzm-ajBsb4c0LyjuIAAatE,7718
|
96
97
|
jarvis/jarvis_utils/__init__.py,sha256=67h0ldisGlh3oK4DAeNEL2Bl_VsI3tSmfclasyVlueM,850
|
97
98
|
jarvis/jarvis_utils/builtin_replace_map.py,sha256=4BurljGuiG_I93EBs7mlFlPm9wYC_4CmdTG5tQWpF6g,1712
|
98
|
-
jarvis/jarvis_utils/config.py,sha256
|
99
|
+
jarvis/jarvis_utils/config.py,sha256=7LsdGsI2v6XAwPXBfeG_fk3bRJ1fEUTqhybVyw4SVhw,13432
|
99
100
|
jarvis/jarvis_utils/embedding.py,sha256=oEOEM2qf16DMYwPsQe6srET9BknyjOdY2ef0jsp3Or8,2714
|
100
101
|
jarvis/jarvis_utils/file_processors.py,sha256=XiM248SHS7lLgQDCbORVFWqinbVDUawYxWDOsLXDxP8,3043
|
101
102
|
jarvis/jarvis_utils/git_utils.py,sha256=dkC0HcUdm_rF5vXNoLByne3mGykZEviD3Lo_SYbwROU,21667
|
102
103
|
jarvis/jarvis_utils/globals.py,sha256=lpS1lmWRnLgqOeoyhZlktdZK9SK8YMekc6XWamho0Jw,8561
|
103
104
|
jarvis/jarvis_utils/http.py,sha256=eRhV3-GYuWmQ0ogq9di9WMlQkFcVb1zGCrySnOgT1x0,4392
|
104
|
-
jarvis/jarvis_utils/input.py,sha256=
|
105
|
-
jarvis/jarvis_utils/methodology.py,sha256=
|
106
|
-
jarvis/jarvis_utils/output.py,sha256=
|
105
|
+
jarvis/jarvis_utils/input.py,sha256=KMAbSubWHo2z-gACf5PyQSGozJKXQby-fwcfzobJld0,9598
|
106
|
+
jarvis/jarvis_utils/methodology.py,sha256=I8BTBijpApzUtRG20_Wu1Vuv0I0OoYOzshec6CMOPX8,10231
|
107
|
+
jarvis/jarvis_utils/output.py,sha256=QRLlKObQKT0KuRSeZRqYb7NlTQvsd1oZXZ41WxeWEuU,10894
|
107
108
|
jarvis/jarvis_utils/tag.py,sha256=f211opbbbTcSyzCDwuIK_oCnKhXPNK-RknYyGzY1yD0,431
|
108
|
-
jarvis/jarvis_utils/utils.py,sha256=
|
109
|
-
jarvis_ai_assistant-0.2.
|
110
|
-
jarvis_ai_assistant-0.2.
|
111
|
-
jarvis_ai_assistant-0.2.
|
112
|
-
jarvis_ai_assistant-0.2.
|
113
|
-
jarvis_ai_assistant-0.2.
|
114
|
-
jarvis_ai_assistant-0.2.
|
109
|
+
jarvis/jarvis_utils/utils.py,sha256=oGCGQ6BaeHAywLwHagPQTm-Q6y_gabATof-3NlDZfik,37970
|
110
|
+
jarvis_ai_assistant-0.2.8.dist-info/licenses/LICENSE,sha256=AGgVgQmTqFvaztRtCAXsAMryUymB18gZif7_l2e1XOg,1063
|
111
|
+
jarvis_ai_assistant-0.2.8.dist-info/METADATA,sha256=jTrkkv5Aq35ijhskPLJOaB7pcbOMWEXeXvTyfGxYPbE,16807
|
112
|
+
jarvis_ai_assistant-0.2.8.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
113
|
+
jarvis_ai_assistant-0.2.8.dist-info/entry_points.txt,sha256=8cwi1VxZGU5UeSZMFiH-jG6NK95Asjukj5SBLBrGiGo,1257
|
114
|
+
jarvis_ai_assistant-0.2.8.dist-info/top_level.txt,sha256=1BOxyWfzOP_ZXj8rVTDnNCJ92bBGB0rwq8N1PCpoMIs,7
|
115
|
+
jarvis_ai_assistant-0.2.8.dist-info/RECORD,,
|
File without changes
|
{jarvis_ai_assistant-0.2.6.dist-info → jarvis_ai_assistant-0.2.8.dist-info}/entry_points.txt
RENAMED
File without changes
|
{jarvis_ai_assistant-0.2.6.dist-info → jarvis_ai_assistant-0.2.8.dist-info}/licenses/LICENSE
RENAMED
File without changes
|
File without changes
|