jarvis-ai-assistant 0.2.5__py3-none-any.whl → 0.2.7__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.
@@ -10,11 +10,16 @@
10
10
  import os
11
11
 
12
12
  # 全局变量:保存消息历史
13
- from typing import Any, Dict, Set, List
13
+ from typing import Any, Dict, Set, List, Optional
14
+ from datetime import datetime
14
15
 
15
16
  message_history: List[str] = []
16
17
  MAX_HISTORY_SIZE = 50
17
18
 
19
+ # 短期记忆存储
20
+ short_term_memories: List[Dict[str, Any]] = []
21
+ MAX_SHORT_TERM_MEMORIES = 100
22
+
18
23
  import colorama
19
24
  from rich.console import Console
20
25
  from rich.theme import Theme
@@ -207,3 +212,117 @@ def get_message_history() -> List[str]:
207
212
  """
208
213
  global message_history
209
214
  return message_history
215
+
216
+
217
+ def add_short_term_memory(memory_data: Dict[str, Any]) -> None:
218
+ """
219
+ 添加短期记忆到全局存储。
220
+
221
+ 参数:
222
+ memory_data: 包含记忆信息的字典
223
+ """
224
+ global short_term_memories
225
+ short_term_memories.append(memory_data)
226
+ # 如果超过最大数量,删除最旧的记忆
227
+ if len(short_term_memories) > MAX_SHORT_TERM_MEMORIES:
228
+ short_term_memories.pop(0)
229
+
230
+
231
+ def get_short_term_memories(tags: Optional[List[str]] = None) -> List[Dict[str, Any]]:
232
+ """
233
+ 获取短期记忆,可选择按标签过滤。
234
+
235
+ 参数:
236
+ tags: 用于过滤的标签列表(可选)
237
+
238
+ 返回:
239
+ List[Dict[str, Any]]: 符合条件的短期记忆列表
240
+ """
241
+ global short_term_memories
242
+ if not tags:
243
+ return short_term_memories.copy()
244
+
245
+ # 按标签过滤
246
+ filtered_memories = []
247
+ for memory in short_term_memories:
248
+ memory_tags = memory.get("tags", [])
249
+ if any(tag in memory_tags for tag in tags):
250
+ filtered_memories.append(memory)
251
+
252
+ return filtered_memories
253
+
254
+
255
+ def clear_short_term_memories() -> None:
256
+ """
257
+ 清空所有短期记忆。
258
+ """
259
+ global short_term_memories
260
+ short_term_memories.clear()
261
+
262
+
263
+ def get_all_memory_tags() -> Dict[str, List[str]]:
264
+ """
265
+ 获取所有记忆类型中的标签集合。
266
+ 每个类型最多返回200个标签,超过时随机提取。
267
+
268
+ 返回:
269
+ Dict[str, List[str]]: 按记忆类型分组的标签列表
270
+ """
271
+ from pathlib import Path
272
+ import json
273
+ import random
274
+ from jarvis.jarvis_utils.config import get_data_dir
275
+
276
+ tags_by_type = {
277
+ "short_term": [],
278
+ "project_long_term": [],
279
+ "global_long_term": []
280
+ }
281
+
282
+ MAX_TAGS_PER_TYPE = 200
283
+
284
+ # 获取短期记忆标签
285
+ short_term_tags = set()
286
+ for memory in short_term_memories:
287
+ short_term_tags.update(memory.get("tags", []))
288
+ short_term_tags_list = sorted(list(short_term_tags))
289
+ if len(short_term_tags_list) > MAX_TAGS_PER_TYPE:
290
+ tags_by_type["short_term"] = sorted(random.sample(short_term_tags_list, MAX_TAGS_PER_TYPE))
291
+ else:
292
+ tags_by_type["short_term"] = short_term_tags_list
293
+
294
+ # 获取项目长期记忆标签
295
+ project_memory_dir = Path(".jarvis/memory")
296
+ if project_memory_dir.exists():
297
+ project_tags = set()
298
+ for memory_file in project_memory_dir.glob("*.json"):
299
+ try:
300
+ with open(memory_file, "r", encoding="utf-8") as f:
301
+ memory_data = json.load(f)
302
+ project_tags.update(memory_data.get("tags", []))
303
+ except Exception:
304
+ pass
305
+ project_tags_list = sorted(list(project_tags))
306
+ if len(project_tags_list) > MAX_TAGS_PER_TYPE:
307
+ tags_by_type["project_long_term"] = sorted(random.sample(project_tags_list, MAX_TAGS_PER_TYPE))
308
+ else:
309
+ tags_by_type["project_long_term"] = project_tags_list
310
+
311
+ # 获取全局长期记忆标签
312
+ global_memory_dir = Path(get_data_dir()) / "memory" / "global_long_term"
313
+ if global_memory_dir.exists():
314
+ global_tags = set()
315
+ for memory_file in global_memory_dir.glob("*.json"):
316
+ try:
317
+ with open(memory_file, "r", encoding="utf-8") as f:
318
+ memory_data = json.load(f)
319
+ global_tags.update(memory_data.get("tags", []))
320
+ except Exception:
321
+ pass
322
+ global_tags_list = sorted(list(global_tags))
323
+ if len(global_tags_list) > MAX_TAGS_PER_TYPE:
324
+ tags_by_type["global_long_term"] = sorted(random.sample(global_tags_list, MAX_TAGS_PER_TYPE))
325
+ else:
326
+ tags_by_type["global_long_term"] = global_tags_list
327
+
328
+ return tags_by_type
@@ -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.apply_completion(
220
- event.current_buffer.complete_state.current_completion
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 get_data_dir, get_methodology_dirs
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(f"警告: 方法论目录不存在或不是一个目录: {directory}", OutputType.WARNING)
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
- PrettyOutput.print(f"警告: 方法论 '{problem_type}' 被 '{filepath}' 覆盖。", OutputType.WARNING)
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
- num_match = re.search(r'<NUM>(.*?)</NUM>', response, re.DOTALL)
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 = [int(idx.strip()) for idx in selected_indices_str.split(",") if idx.strip().isdigit()]
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]
@@ -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="gold1", frame=True, bgcolor="#2b2b1c", meta={"icon": "ℹ️"}
207
+ color="bright_cyan", frame=True, bgcolor="#2b2b1c", meta={"icon": "ℹ️"}
208
208
  ),
209
209
  OutputType.PLANNING: RichStyle(
210
210
  color="purple",
@@ -30,6 +30,35 @@ from jarvis.jarvis_utils.output import OutputType, PrettyOutput
30
30
 
31
31
  g_config_file = None
32
32
 
33
+ COMMAND_MAPPING = {
34
+ # jarvis主命令
35
+ "jvs": "jarvis",
36
+ # 代码代理
37
+ "jca": "jarvis-code-agent",
38
+ # 智能shell
39
+ "jss": "jarvis-smart-shell",
40
+ # 平台管理
41
+ "jpm": "jarvis-platform-manager",
42
+ # Git提交
43
+ "jgc": "jarvis-git-commit",
44
+ # 代码审查
45
+ "jcr": "jarvis-code-review",
46
+ # Git压缩
47
+ "jgs": "jarvis-git-squash",
48
+ # 多代理
49
+ "jma": "jarvis-multi-agent",
50
+ # 代理
51
+ "ja": "jarvis-agent",
52
+ # 工具
53
+ "jt": "jarvis-tool",
54
+ # 方法论
55
+ "jm": "jarvis-methodology",
56
+ # RAG
57
+ "jrg": "jarvis-rag",
58
+ # 统计
59
+ "jst": "jarvis-stats",
60
+ }
61
+
33
62
 
34
63
  def _setup_signal_handler() -> None:
35
64
  """设置SIGINT信号处理函数"""
@@ -149,6 +178,15 @@ def _show_usage_stats() -> None:
149
178
  elif group == "command":
150
179
  categorized_stats["command"]["metrics"][metric] = int(total)
151
180
 
181
+ # 合并长短命令的历史统计数据
182
+ command_stats = categorized_stats["command"]["metrics"]
183
+ if command_stats:
184
+ merged_stats: Dict[str, int] = {}
185
+ for metric, count in command_stats.items():
186
+ long_command = COMMAND_MAPPING.get(metric, metric)
187
+ merged_stats[long_command] = merged_stats.get(long_command, 0) + count
188
+ categorized_stats["command"]["metrics"] = merged_stats
189
+
152
190
  # 计算采纳率并添加到统计中
153
191
  commit_stats = categorized_stats["commit"]["metrics"]
154
192
  # 尝试多种可能的指标名称
@@ -348,7 +386,7 @@ def _show_usage_stats() -> None:
348
386
  remaining_days_after_months = remaining_days_after_years % 20
349
387
  work_days = remaining_days_after_months
350
388
  remaining_hours = int(hours % 8) # 剩余不足一个工作日的小时数
351
-
389
+
352
390
  # 构建时间描述
353
391
  time_parts = []
354
392
  if work_years > 0:
@@ -359,17 +397,25 @@ def _show_usage_stats() -> None:
359
397
  time_parts.append(f"{work_days} 个工作日")
360
398
  if remaining_hours > 0:
361
399
  time_parts.append(f"{remaining_hours} 小时")
362
-
400
+
363
401
  if time_parts:
364
402
  time_description = "、".join(time_parts)
365
403
  if work_years >= 1:
366
- encouragement = f"🎉 相当于节省了 {time_description} 的工作时间!"
404
+ encouragement = (
405
+ f"🎉 相当于节省了 {time_description} 的工作时间!"
406
+ )
367
407
  elif work_months >= 1:
368
- encouragement = f"🚀 相当于节省了 {time_description} 的工作时间!"
408
+ encouragement = (
409
+ f"🚀 相当于节省了 {time_description} 的工作时间!"
410
+ )
369
411
  elif work_days >= 1:
370
- encouragement = f"💪 相当于节省了 {time_description} 的工作时间!"
412
+ encouragement = (
413
+ f"💪 相当于节省了 {time_description} 的工作时间!"
414
+ )
371
415
  else:
372
- encouragement = f"✨ 相当于节省了 {time_description} 的工作时间!"
416
+ encouragement = (
417
+ f"✨ 相当于节省了 {time_description} 的工作时间!"
418
+ )
373
419
  elif hours >= 1:
374
420
  encouragement = f"⭐ 相当于节省了 {int(hours)} 小时的工作时间,积少成多,继续保持!"
375
421
  if encouragement:
@@ -459,7 +505,9 @@ def load_config():
459
505
  if schema_path.exists():
460
506
  try:
461
507
  config_file_path.parent.mkdir(parents=True, exist_ok=True)
462
- generate_default_config(str(schema_path), str(config_file_path))
508
+ generate_default_config(
509
+ str(schema_path.absolute()), str(config_file_path)
510
+ )
463
511
  PrettyOutput.print(
464
512
  f"已生成默认配置文件: {config_file_path}", OutputType.INFO
465
513
  )
@@ -576,7 +624,7 @@ def generate_default_config(schema_path: str, output_path: str) -> None:
576
624
 
577
625
  default_config = _generate_from_schema(schema)
578
626
 
579
- content = f"# yaml-language-server: $schema={schema}\n"
627
+ content = f"# yaml-language-server: $schema={schema_path}\n"
580
628
  content += yaml.dump(default_config, allow_unicode=True, sort_keys=False)
581
629
 
582
630
  with open(output_path, "w", encoding="utf-8") as f:
@@ -718,43 +766,13 @@ def count_cmd_usage() -> None:
718
766
  import os
719
767
  from jarvis.jarvis_stats.stats import StatsManager
720
768
 
721
- # 命令映射关系:将短命令映射到长命令
722
- command_mapping = {
723
- # jarvis主命令
724
- "jvs": "jarvis",
725
- # 代码代理
726
- "jca": "jarvis-code-agent",
727
- # 智能shell
728
- "jss": "jarvis-smart-shell",
729
- # 平台管理
730
- "jpm": "jarvis-platform-manager",
731
- # Git提交
732
- "jgc": "jarvis-git-commit",
733
- # 代码审查
734
- "jcr": "jarvis-code-review",
735
- # Git压缩
736
- "jgs": "jarvis-git-squash",
737
- # 多代理
738
- "jma": "jarvis-multi-agent",
739
- # 代理
740
- "ja": "jarvis-agent",
741
- # 工具
742
- "jt": "jarvis-tool",
743
- # 方法论
744
- "jm": "jarvis-methodology",
745
- # RAG
746
- "jrg": "jarvis-rag",
747
- # 统计
748
- "jst": "jarvis-stats",
749
- }
750
-
751
769
  # 从完整路径中提取命令名称
752
770
  cmd_path = sys.argv[0]
753
771
  cmd_name = os.path.basename(cmd_path)
754
-
772
+
755
773
  # 如果是短命令,映射到长命令
756
- if cmd_name in command_mapping:
757
- metric_name = command_mapping[cmd_name]
774
+ if cmd_name in COMMAND_MAPPING:
775
+ metric_name = COMMAND_MAPPING[cmd_name]
758
776
  else:
759
777
  metric_name = cmd_name
760
778
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: jarvis-ai-assistant
3
- Version: 0.2.5
3
+ Version: 0.2.7
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
@@ -1,8 +1,8 @@
1
- jarvis/__init__.py,sha256=aS_w22vow2WExj_McIPVjDx3AihnwV9M6DLoPEXvmzk,73
2
- jarvis/jarvis_agent/__init__.py,sha256=tClK_8jgNti_A-o4SecZAeMYRz_JWjf01sdWt1ho420,23190
1
+ jarvis/__init__.py,sha256=2oEyA1qaR5QI1ZfAHJn9_9z3DRmOtWPUEtfnySBHunk,73
2
+ jarvis/jarvis_agent/__init__.py,sha256=feyq1jxhgzAy8y0X7nNidmFTm8gkpJdhikzmphZNU7M,26945
3
3
  jarvis/jarvis_agent/builtin_input_handler.py,sha256=Qs4LAr4xdKLBJpQE81YP4CkucAop86ms0iVoKa1nnso,2468
4
- jarvis/jarvis_agent/edit_file_handler.py,sha256=zZAhv5zYQQNNhpu6bOjL3exC9le4DSQnefzotBB-jPY,11818
5
- jarvis/jarvis_agent/jarvis.py,sha256=L2sI-Y7gxqH6M4E4F2GlNoZcxxvz_f72rxvjh7bxuZE,8443
4
+ jarvis/jarvis_agent/edit_file_handler.py,sha256=w-byNJ4TN_SlV3djjfFC7OksySOFGrM8ku49w662dzc,11854
5
+ jarvis/jarvis_agent/jarvis.py,sha256=Z4Alt7J5cOKUkdkPuSqPD-Zy338Zg8IizJZ3SzCRWbg,17696
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=M3eEMMnIb7ndIIe4Hg8XZ1rnEbtYIUdDi9IS9pzWC2U,29191
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=87zzs16tQOzbkkg1y1j1zQHYSw1Awsl8grYa02DwNs8,10116
38
+ jarvis/jarvis_data/config_schema.json,sha256=ml7Z3dhjh227K1RsBPVTGJYSXFDG3p3OR-nTb_cxK88,10317
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
@@ -46,7 +46,7 @@ jarvis/jarvis_mcp/stdio_mcp_client.py,sha256=APYUksYKlMx7AVNODKOLrTkKZPnp4kqTQIY
46
46
  jarvis/jarvis_mcp/streamable_mcp_client.py,sha256=sP0KEsxVcXGht0eA7a_m-ECtZAk39s4PL9OUdm35x2Y,14467
47
47
  jarvis/jarvis_methodology/main.py,sha256=6QF8hH3vB6rfxim0fPR34uVPf41zVpb4ZLqrFN2qONg,10983
48
48
  jarvis/jarvis_multi_agent/__init__.py,sha256=kCgtAX7VvliyEOQxIj2DvNjRAuh6bpNaOtDn60nzph4,6089
49
- jarvis/jarvis_multi_agent/main.py,sha256=EUJCLjiN6ZZkOTmRS13oeTquo3tXD-cdO_QvaEPCK_c,1715
49
+ jarvis/jarvis_multi_agent/main.py,sha256=Wbarez48QxXexlKEOcRsoMbcQEOP5rv_DzGkNk0SfpY,1779
50
50
  jarvis/jarvis_platform/__init__.py,sha256=WLQHSiE87PPket2M50_hHzjdMIgPIBx2VF8JfB_NNRk,105
51
51
  jarvis/jarvis_platform/ai8.py,sha256=uiL1BkONteUB2aXg6kMGSXLLOhzGDl5_SNQYyQzmFNk,11412
52
52
  jarvis/jarvis_platform/base.py,sha256=cfeYB6ldfQH1tz1rroQpmJTLAw8KByKS74qun0pqE1c,9498
@@ -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=SI6PwmXFy-Ryot-XQwZGHbTOuyKnxCwrN6hpuD_P5wg,12687
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
@@ -86,27 +87,29 @@ jarvis/jarvis_tools/methodology.py,sha256=_K4GIDUodGEma3SvNRo7Qs5rliijgNespVLyAP
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
89
  jarvis/jarvis_tools/registry.py,sha256=8qhZgmmGIXJsYwtpsp_Ls8woT0qmBrthF8lIuQqOu7c,28614
90
+ jarvis/jarvis_tools/retrieve_memory.py,sha256=zItXPSMGzaPyH-4p_CP3z24fBYFnCK3OQJctgVunZMI,8288
89
91
  jarvis/jarvis_tools/rewrite_file.py,sha256=eG_WKg6cVAXmuGwUqlWkcuyay5S8DOzEi8vZCmX3O8w,7255
92
+ jarvis/jarvis_tools/save_memory.py,sha256=DjeFb38OtK9Y_RpWYHz8vL72JdauXZTlc_Y0FUQBtiM,7486
90
93
  jarvis/jarvis_tools/search_web.py,sha256=zh6EYLQPIQneoz27Hheh-fifMeMNhrTVldXKMSsMz2Y,5801
91
94
  jarvis/jarvis_tools/virtual_tty.py,sha256=LTsg1PlsPvgaLShUaxpAKwTpyjXRr0l0qSREI7Q-fBc,26349
92
95
  jarvis/jarvis_tools/cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
93
96
  jarvis/jarvis_tools/cli/main.py,sha256=GsfZJ4OS4Hvxh0H2XiLkgbzm-ajBsb4c0LyjuIAAatE,7718
94
97
  jarvis/jarvis_utils/__init__.py,sha256=67h0ldisGlh3oK4DAeNEL2Bl_VsI3tSmfclasyVlueM,850
95
98
  jarvis/jarvis_utils/builtin_replace_map.py,sha256=4BurljGuiG_I93EBs7mlFlPm9wYC_4CmdTG5tQWpF6g,1712
96
- jarvis/jarvis_utils/config.py,sha256=-ZgqIkzsp8VP5qsXke9XAGuwtAB9XlOAo_k4L6jhcrE,12904
99
+ jarvis/jarvis_utils/config.py,sha256=ESvxmUxbxX8B80ft1H2qQsdyu73xAYvr3Dql7CYnzwI,13178
97
100
  jarvis/jarvis_utils/embedding.py,sha256=oEOEM2qf16DMYwPsQe6srET9BknyjOdY2ef0jsp3Or8,2714
98
101
  jarvis/jarvis_utils/file_processors.py,sha256=XiM248SHS7lLgQDCbORVFWqinbVDUawYxWDOsLXDxP8,3043
99
102
  jarvis/jarvis_utils/git_utils.py,sha256=dkC0HcUdm_rF5vXNoLByne3mGykZEviD3Lo_SYbwROU,21667
100
- jarvis/jarvis_utils/globals.py,sha256=INBGXbDkXOQa0AE7L6JhR5gr-TAZMsE5y4yK1sbB98U,4643
103
+ jarvis/jarvis_utils/globals.py,sha256=lpS1lmWRnLgqOeoyhZlktdZK9SK8YMekc6XWamho0Jw,8561
101
104
  jarvis/jarvis_utils/http.py,sha256=eRhV3-GYuWmQ0ogq9di9WMlQkFcVb1zGCrySnOgT1x0,4392
102
- jarvis/jarvis_utils/input.py,sha256=g0Xa1TNZHxLaYduREV_Wc55iqHD6djN73YFJbR83gUg,9488
103
- jarvis/jarvis_utils/methodology.py,sha256=EqS9feS3HHgNcKYoGs-Dkhp4pGwylwXt96r2J61cxUo,9223
104
- jarvis/jarvis_utils/output.py,sha256=E_J_RYXtkOgRiDSHCRE9QPHY8WQmmhIotQtIQru8GZA,10888
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
105
108
  jarvis/jarvis_utils/tag.py,sha256=f211opbbbTcSyzCDwuIK_oCnKhXPNK-RknYyGzY1yD0,431
106
- jarvis/jarvis_utils/utils.py,sha256=6_KsDN2_L9CB0jJvfbGTpBPWaQf-qMIPwq3_s3qUYww,36512
107
- jarvis_ai_assistant-0.2.5.dist-info/licenses/LICENSE,sha256=AGgVgQmTqFvaztRtCAXsAMryUymB18gZif7_l2e1XOg,1063
108
- jarvis_ai_assistant-0.2.5.dist-info/METADATA,sha256=jaM72Jlpyd-UmR-6riUlssskcGTy9C69j7FGUKwZP4Q,16807
109
- jarvis_ai_assistant-0.2.5.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
110
- jarvis_ai_assistant-0.2.5.dist-info/entry_points.txt,sha256=8cwi1VxZGU5UeSZMFiH-jG6NK95Asjukj5SBLBrGiGo,1257
111
- jarvis_ai_assistant-0.2.5.dist-info/top_level.txt,sha256=1BOxyWfzOP_ZXj8rVTDnNCJ92bBGB0rwq8N1PCpoMIs,7
112
- jarvis_ai_assistant-0.2.5.dist-info/RECORD,,
109
+ jarvis/jarvis_utils/utils.py,sha256=b7t2BsoPEU_3ZhippcQW9qwQD0PO-sGkjjtZ4DvwI2s,37056
110
+ jarvis_ai_assistant-0.2.7.dist-info/licenses/LICENSE,sha256=AGgVgQmTqFvaztRtCAXsAMryUymB18gZif7_l2e1XOg,1063
111
+ jarvis_ai_assistant-0.2.7.dist-info/METADATA,sha256=NQFGWTpKdTU1HU9yjEjoFwSYz7DiAulBpVnB70WZDkg,16807
112
+ jarvis_ai_assistant-0.2.7.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
113
+ jarvis_ai_assistant-0.2.7.dist-info/entry_points.txt,sha256=8cwi1VxZGU5UeSZMFiH-jG6NK95Asjukj5SBLBrGiGo,1257
114
+ jarvis_ai_assistant-0.2.7.dist-info/top_level.txt,sha256=1BOxyWfzOP_ZXj8rVTDnNCJ92bBGB0rwq8N1PCpoMIs,7
115
+ jarvis_ai_assistant-0.2.7.dist-info/RECORD,,