jarvis-ai-assistant 0.2.5__tar.gz → 0.2.7__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.
Files changed (123) hide show
  1. {jarvis_ai_assistant-0.2.5/src/jarvis_ai_assistant.egg-info → jarvis_ai_assistant-0.2.7}/PKG-INFO +1 -1
  2. {jarvis_ai_assistant-0.2.5 → jarvis_ai_assistant-0.2.7}/pyproject.toml +1 -1
  3. {jarvis_ai_assistant-0.2.5 → jarvis_ai_assistant-0.2.7}/setup.py +1 -1
  4. {jarvis_ai_assistant-0.2.5 → jarvis_ai_assistant-0.2.7}/src/jarvis/__init__.py +1 -1
  5. {jarvis_ai_assistant-0.2.5 → jarvis_ai_assistant-0.2.7}/src/jarvis/jarvis_agent/__init__.py +78 -9
  6. {jarvis_ai_assistant-0.2.5 → jarvis_ai_assistant-0.2.7}/src/jarvis/jarvis_agent/edit_file_handler.py +4 -4
  7. jarvis_ai_assistant-0.2.7/src/jarvis/jarvis_agent/jarvis.py +462 -0
  8. {jarvis_ai_assistant-0.2.5 → jarvis_ai_assistant-0.2.7}/src/jarvis/jarvis_code_agent/code_agent.py +11 -11
  9. {jarvis_ai_assistant-0.2.5 → jarvis_ai_assistant-0.2.7}/src/jarvis/jarvis_data/config_schema.json +5 -0
  10. {jarvis_ai_assistant-0.2.5 → jarvis_ai_assistant-0.2.7}/src/jarvis/jarvis_multi_agent/main.py +1 -0
  11. {jarvis_ai_assistant-0.2.5 → jarvis_ai_assistant-0.2.7}/src/jarvis/jarvis_stats/storage.py +2 -2
  12. jarvis_ai_assistant-0.2.7/src/jarvis/jarvis_tools/clear_memory.py +252 -0
  13. jarvis_ai_assistant-0.2.7/src/jarvis/jarvis_tools/retrieve_memory.py +212 -0
  14. jarvis_ai_assistant-0.2.7/src/jarvis/jarvis_tools/save_memory.py +203 -0
  15. {jarvis_ai_assistant-0.2.5 → jarvis_ai_assistant-0.2.7}/src/jarvis/jarvis_utils/config.py +10 -0
  16. {jarvis_ai_assistant-0.2.5 → jarvis_ai_assistant-0.2.7}/src/jarvis/jarvis_utils/globals.py +120 -1
  17. {jarvis_ai_assistant-0.2.5 → jarvis_ai_assistant-0.2.7}/src/jarvis/jarvis_utils/input.py +5 -3
  18. {jarvis_ai_assistant-0.2.5 → jarvis_ai_assistant-0.2.7}/src/jarvis/jarvis_utils/methodology.py +41 -6
  19. {jarvis_ai_assistant-0.2.5 → jarvis_ai_assistant-0.2.7}/src/jarvis/jarvis_utils/output.py +1 -1
  20. {jarvis_ai_assistant-0.2.5 → jarvis_ai_assistant-0.2.7}/src/jarvis/jarvis_utils/utils.py +59 -41
  21. {jarvis_ai_assistant-0.2.5 → jarvis_ai_assistant-0.2.7/src/jarvis_ai_assistant.egg-info}/PKG-INFO +1 -1
  22. {jarvis_ai_assistant-0.2.5 → jarvis_ai_assistant-0.2.7}/src/jarvis_ai_assistant.egg-info/SOURCES.txt +3 -0
  23. jarvis_ai_assistant-0.2.5/src/jarvis/jarvis_agent/jarvis.py +0 -230
  24. {jarvis_ai_assistant-0.2.5 → jarvis_ai_assistant-0.2.7}/LICENSE +0 -0
  25. {jarvis_ai_assistant-0.2.5 → jarvis_ai_assistant-0.2.7}/MANIFEST.in +0 -0
  26. {jarvis_ai_assistant-0.2.5 → jarvis_ai_assistant-0.2.7}/README.md +0 -0
  27. {jarvis_ai_assistant-0.2.5 → jarvis_ai_assistant-0.2.7}/setup.cfg +0 -0
  28. {jarvis_ai_assistant-0.2.5 → jarvis_ai_assistant-0.2.7}/src/jarvis/jarvis_agent/builtin_input_handler.py +0 -0
  29. {jarvis_ai_assistant-0.2.5 → jarvis_ai_assistant-0.2.7}/src/jarvis/jarvis_agent/main.py +0 -0
  30. {jarvis_ai_assistant-0.2.5 → jarvis_ai_assistant-0.2.7}/src/jarvis/jarvis_agent/output_handler.py +0 -0
  31. {jarvis_ai_assistant-0.2.5 → jarvis_ai_assistant-0.2.7}/src/jarvis/jarvis_agent/prompt_builder.py +0 -0
  32. {jarvis_ai_assistant-0.2.5 → jarvis_ai_assistant-0.2.7}/src/jarvis/jarvis_agent/prompts.py +0 -0
  33. {jarvis_ai_assistant-0.2.5 → jarvis_ai_assistant-0.2.7}/src/jarvis/jarvis_agent/protocols.py +0 -0
  34. {jarvis_ai_assistant-0.2.5 → jarvis_ai_assistant-0.2.7}/src/jarvis/jarvis_agent/session_manager.py +0 -0
  35. {jarvis_ai_assistant-0.2.5 → jarvis_ai_assistant-0.2.7}/src/jarvis/jarvis_agent/shell_input_handler.py +0 -0
  36. {jarvis_ai_assistant-0.2.5 → jarvis_ai_assistant-0.2.7}/src/jarvis/jarvis_agent/tool_executor.py +0 -0
  37. {jarvis_ai_assistant-0.2.5 → jarvis_ai_assistant-0.2.7}/src/jarvis/jarvis_code_agent/__init__.py +0 -0
  38. {jarvis_ai_assistant-0.2.5 → jarvis_ai_assistant-0.2.7}/src/jarvis/jarvis_code_agent/lint.py +0 -0
  39. {jarvis_ai_assistant-0.2.5 → jarvis_ai_assistant-0.2.7}/src/jarvis/jarvis_code_analysis/checklists/__init__.py +0 -0
  40. {jarvis_ai_assistant-0.2.5 → jarvis_ai_assistant-0.2.7}/src/jarvis/jarvis_code_analysis/checklists/c_cpp.py +0 -0
  41. {jarvis_ai_assistant-0.2.5 → jarvis_ai_assistant-0.2.7}/src/jarvis/jarvis_code_analysis/checklists/csharp.py +0 -0
  42. {jarvis_ai_assistant-0.2.5 → jarvis_ai_assistant-0.2.7}/src/jarvis/jarvis_code_analysis/checklists/data_format.py +0 -0
  43. {jarvis_ai_assistant-0.2.5 → jarvis_ai_assistant-0.2.7}/src/jarvis/jarvis_code_analysis/checklists/devops.py +0 -0
  44. {jarvis_ai_assistant-0.2.5 → jarvis_ai_assistant-0.2.7}/src/jarvis/jarvis_code_analysis/checklists/docs.py +0 -0
  45. {jarvis_ai_assistant-0.2.5 → jarvis_ai_assistant-0.2.7}/src/jarvis/jarvis_code_analysis/checklists/go.py +0 -0
  46. {jarvis_ai_assistant-0.2.5 → jarvis_ai_assistant-0.2.7}/src/jarvis/jarvis_code_analysis/checklists/infrastructure.py +0 -0
  47. {jarvis_ai_assistant-0.2.5 → jarvis_ai_assistant-0.2.7}/src/jarvis/jarvis_code_analysis/checklists/java.py +0 -0
  48. {jarvis_ai_assistant-0.2.5 → jarvis_ai_assistant-0.2.7}/src/jarvis/jarvis_code_analysis/checklists/javascript.py +0 -0
  49. {jarvis_ai_assistant-0.2.5 → jarvis_ai_assistant-0.2.7}/src/jarvis/jarvis_code_analysis/checklists/kotlin.py +0 -0
  50. {jarvis_ai_assistant-0.2.5 → jarvis_ai_assistant-0.2.7}/src/jarvis/jarvis_code_analysis/checklists/loader.py +0 -0
  51. {jarvis_ai_assistant-0.2.5 → jarvis_ai_assistant-0.2.7}/src/jarvis/jarvis_code_analysis/checklists/php.py +0 -0
  52. {jarvis_ai_assistant-0.2.5 → jarvis_ai_assistant-0.2.7}/src/jarvis/jarvis_code_analysis/checklists/python.py +0 -0
  53. {jarvis_ai_assistant-0.2.5 → jarvis_ai_assistant-0.2.7}/src/jarvis/jarvis_code_analysis/checklists/ruby.py +0 -0
  54. {jarvis_ai_assistant-0.2.5 → jarvis_ai_assistant-0.2.7}/src/jarvis/jarvis_code_analysis/checklists/rust.py +0 -0
  55. {jarvis_ai_assistant-0.2.5 → jarvis_ai_assistant-0.2.7}/src/jarvis/jarvis_code_analysis/checklists/shell.py +0 -0
  56. {jarvis_ai_assistant-0.2.5 → jarvis_ai_assistant-0.2.7}/src/jarvis/jarvis_code_analysis/checklists/sql.py +0 -0
  57. {jarvis_ai_assistant-0.2.5 → jarvis_ai_assistant-0.2.7}/src/jarvis/jarvis_code_analysis/checklists/swift.py +0 -0
  58. {jarvis_ai_assistant-0.2.5 → jarvis_ai_assistant-0.2.7}/src/jarvis/jarvis_code_analysis/checklists/web.py +0 -0
  59. {jarvis_ai_assistant-0.2.5 → jarvis_ai_assistant-0.2.7}/src/jarvis/jarvis_code_analysis/code_review.py +0 -0
  60. {jarvis_ai_assistant-0.2.5 → jarvis_ai_assistant-0.2.7}/src/jarvis/jarvis_data/tiktoken/9b5ad71b2ce5302211f9c61530b329a4922fc6a4 +0 -0
  61. {jarvis_ai_assistant-0.2.5 → jarvis_ai_assistant-0.2.7}/src/jarvis/jarvis_git_squash/__init__.py +0 -0
  62. {jarvis_ai_assistant-0.2.5 → jarvis_ai_assistant-0.2.7}/src/jarvis/jarvis_git_squash/main.py +0 -0
  63. {jarvis_ai_assistant-0.2.5 → jarvis_ai_assistant-0.2.7}/src/jarvis/jarvis_git_utils/git_commiter.py +0 -0
  64. {jarvis_ai_assistant-0.2.5 → jarvis_ai_assistant-0.2.7}/src/jarvis/jarvis_mcp/__init__.py +0 -0
  65. {jarvis_ai_assistant-0.2.5 → jarvis_ai_assistant-0.2.7}/src/jarvis/jarvis_mcp/sse_mcp_client.py +0 -0
  66. {jarvis_ai_assistant-0.2.5 → jarvis_ai_assistant-0.2.7}/src/jarvis/jarvis_mcp/stdio_mcp_client.py +0 -0
  67. {jarvis_ai_assistant-0.2.5 → jarvis_ai_assistant-0.2.7}/src/jarvis/jarvis_mcp/streamable_mcp_client.py +0 -0
  68. {jarvis_ai_assistant-0.2.5 → jarvis_ai_assistant-0.2.7}/src/jarvis/jarvis_methodology/main.py +0 -0
  69. {jarvis_ai_assistant-0.2.5 → jarvis_ai_assistant-0.2.7}/src/jarvis/jarvis_multi_agent/__init__.py +0 -0
  70. {jarvis_ai_assistant-0.2.5 → jarvis_ai_assistant-0.2.7}/src/jarvis/jarvis_platform/__init__.py +0 -0
  71. {jarvis_ai_assistant-0.2.5 → jarvis_ai_assistant-0.2.7}/src/jarvis/jarvis_platform/ai8.py +0 -0
  72. {jarvis_ai_assistant-0.2.5 → jarvis_ai_assistant-0.2.7}/src/jarvis/jarvis_platform/base.py +0 -0
  73. {jarvis_ai_assistant-0.2.5 → jarvis_ai_assistant-0.2.7}/src/jarvis/jarvis_platform/human.py +0 -0
  74. {jarvis_ai_assistant-0.2.5 → jarvis_ai_assistant-0.2.7}/src/jarvis/jarvis_platform/kimi.py +0 -0
  75. {jarvis_ai_assistant-0.2.5 → jarvis_ai_assistant-0.2.7}/src/jarvis/jarvis_platform/openai.py +0 -0
  76. {jarvis_ai_assistant-0.2.5 → jarvis_ai_assistant-0.2.7}/src/jarvis/jarvis_platform/registry.py +0 -0
  77. {jarvis_ai_assistant-0.2.5 → jarvis_ai_assistant-0.2.7}/src/jarvis/jarvis_platform/tongyi.py +0 -0
  78. {jarvis_ai_assistant-0.2.5 → jarvis_ai_assistant-0.2.7}/src/jarvis/jarvis_platform/yuanbao.py +0 -0
  79. {jarvis_ai_assistant-0.2.5 → jarvis_ai_assistant-0.2.7}/src/jarvis/jarvis_platform_manager/__init__.py +0 -0
  80. {jarvis_ai_assistant-0.2.5 → jarvis_ai_assistant-0.2.7}/src/jarvis/jarvis_platform_manager/main.py +0 -0
  81. {jarvis_ai_assistant-0.2.5 → jarvis_ai_assistant-0.2.7}/src/jarvis/jarvis_platform_manager/service.py +0 -0
  82. {jarvis_ai_assistant-0.2.5 → jarvis_ai_assistant-0.2.7}/src/jarvis/jarvis_rag/__init__.py +0 -0
  83. {jarvis_ai_assistant-0.2.5 → jarvis_ai_assistant-0.2.7}/src/jarvis/jarvis_rag/cache.py +0 -0
  84. {jarvis_ai_assistant-0.2.5 → jarvis_ai_assistant-0.2.7}/src/jarvis/jarvis_rag/cli.py +0 -0
  85. {jarvis_ai_assistant-0.2.5 → jarvis_ai_assistant-0.2.7}/src/jarvis/jarvis_rag/embedding_manager.py +0 -0
  86. {jarvis_ai_assistant-0.2.5 → jarvis_ai_assistant-0.2.7}/src/jarvis/jarvis_rag/llm_interface.py +0 -0
  87. {jarvis_ai_assistant-0.2.5 → jarvis_ai_assistant-0.2.7}/src/jarvis/jarvis_rag/query_rewriter.py +0 -0
  88. {jarvis_ai_assistant-0.2.5 → jarvis_ai_assistant-0.2.7}/src/jarvis/jarvis_rag/rag_pipeline.py +0 -0
  89. {jarvis_ai_assistant-0.2.5 → jarvis_ai_assistant-0.2.7}/src/jarvis/jarvis_rag/reranker.py +0 -0
  90. {jarvis_ai_assistant-0.2.5 → jarvis_ai_assistant-0.2.7}/src/jarvis/jarvis_rag/retriever.py +0 -0
  91. {jarvis_ai_assistant-0.2.5 → jarvis_ai_assistant-0.2.7}/src/jarvis/jarvis_smart_shell/__init__.py +0 -0
  92. {jarvis_ai_assistant-0.2.5 → jarvis_ai_assistant-0.2.7}/src/jarvis/jarvis_smart_shell/main.py +0 -0
  93. {jarvis_ai_assistant-0.2.5 → jarvis_ai_assistant-0.2.7}/src/jarvis/jarvis_stats/__init__.py +0 -0
  94. {jarvis_ai_assistant-0.2.5 → jarvis_ai_assistant-0.2.7}/src/jarvis/jarvis_stats/cli.py +0 -0
  95. {jarvis_ai_assistant-0.2.5 → jarvis_ai_assistant-0.2.7}/src/jarvis/jarvis_stats/stats.py +0 -0
  96. {jarvis_ai_assistant-0.2.5 → jarvis_ai_assistant-0.2.7}/src/jarvis/jarvis_stats/visualizer.py +0 -0
  97. {jarvis_ai_assistant-0.2.5 → jarvis_ai_assistant-0.2.7}/src/jarvis/jarvis_tools/__init__.py +0 -0
  98. {jarvis_ai_assistant-0.2.5 → jarvis_ai_assistant-0.2.7}/src/jarvis/jarvis_tools/ask_user.py +0 -0
  99. {jarvis_ai_assistant-0.2.5 → jarvis_ai_assistant-0.2.7}/src/jarvis/jarvis_tools/base.py +0 -0
  100. {jarvis_ai_assistant-0.2.5 → jarvis_ai_assistant-0.2.7}/src/jarvis/jarvis_tools/cli/__init__.py +0 -0
  101. {jarvis_ai_assistant-0.2.5 → jarvis_ai_assistant-0.2.7}/src/jarvis/jarvis_tools/cli/main.py +0 -0
  102. {jarvis_ai_assistant-0.2.5 → jarvis_ai_assistant-0.2.7}/src/jarvis/jarvis_tools/edit_file.py +0 -0
  103. {jarvis_ai_assistant-0.2.5 → jarvis_ai_assistant-0.2.7}/src/jarvis/jarvis_tools/execute_script.py +0 -0
  104. {jarvis_ai_assistant-0.2.5 → jarvis_ai_assistant-0.2.7}/src/jarvis/jarvis_tools/file_analyzer.py +0 -0
  105. {jarvis_ai_assistant-0.2.5 → jarvis_ai_assistant-0.2.7}/src/jarvis/jarvis_tools/generate_new_tool.py +0 -0
  106. {jarvis_ai_assistant-0.2.5 → jarvis_ai_assistant-0.2.7}/src/jarvis/jarvis_tools/methodology.py +0 -0
  107. {jarvis_ai_assistant-0.2.5 → jarvis_ai_assistant-0.2.7}/src/jarvis/jarvis_tools/read_code.py +0 -0
  108. {jarvis_ai_assistant-0.2.5 → jarvis_ai_assistant-0.2.7}/src/jarvis/jarvis_tools/read_webpage.py +0 -0
  109. {jarvis_ai_assistant-0.2.5 → jarvis_ai_assistant-0.2.7}/src/jarvis/jarvis_tools/registry.py +0 -0
  110. {jarvis_ai_assistant-0.2.5 → jarvis_ai_assistant-0.2.7}/src/jarvis/jarvis_tools/rewrite_file.py +0 -0
  111. {jarvis_ai_assistant-0.2.5 → jarvis_ai_assistant-0.2.7}/src/jarvis/jarvis_tools/search_web.py +0 -0
  112. {jarvis_ai_assistant-0.2.5 → jarvis_ai_assistant-0.2.7}/src/jarvis/jarvis_tools/virtual_tty.py +0 -0
  113. {jarvis_ai_assistant-0.2.5 → jarvis_ai_assistant-0.2.7}/src/jarvis/jarvis_utils/__init__.py +0 -0
  114. {jarvis_ai_assistant-0.2.5 → jarvis_ai_assistant-0.2.7}/src/jarvis/jarvis_utils/builtin_replace_map.py +0 -0
  115. {jarvis_ai_assistant-0.2.5 → jarvis_ai_assistant-0.2.7}/src/jarvis/jarvis_utils/embedding.py +0 -0
  116. {jarvis_ai_assistant-0.2.5 → jarvis_ai_assistant-0.2.7}/src/jarvis/jarvis_utils/file_processors.py +0 -0
  117. {jarvis_ai_assistant-0.2.5 → jarvis_ai_assistant-0.2.7}/src/jarvis/jarvis_utils/git_utils.py +0 -0
  118. {jarvis_ai_assistant-0.2.5 → jarvis_ai_assistant-0.2.7}/src/jarvis/jarvis_utils/http.py +0 -0
  119. {jarvis_ai_assistant-0.2.5 → jarvis_ai_assistant-0.2.7}/src/jarvis/jarvis_utils/tag.py +0 -0
  120. {jarvis_ai_assistant-0.2.5 → jarvis_ai_assistant-0.2.7}/src/jarvis_ai_assistant.egg-info/dependency_links.txt +0 -0
  121. {jarvis_ai_assistant-0.2.5 → jarvis_ai_assistant-0.2.7}/src/jarvis_ai_assistant.egg-info/entry_points.txt +0 -0
  122. {jarvis_ai_assistant-0.2.5 → jarvis_ai_assistant-0.2.7}/src/jarvis_ai_assistant.egg-info/requires.txt +0 -0
  123. {jarvis_ai_assistant-0.2.5 → jarvis_ai_assistant-0.2.7}/src/jarvis_ai_assistant.egg-info/top_level.txt +0 -0
@@ -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
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "jarvis-ai-assistant"
7
- version = "0.2.5"
7
+ version = "0.2.7"
8
8
  description = "Jarvis: An AI assistant that uses tools to interact with the system"
9
9
  readme = "README.md"
10
10
  authors = [{ name = "skyfire", email = "skyfireitdiy@hotmail.com" }]
@@ -3,7 +3,7 @@ from setuptools import setup, find_packages # type: ignore
3
3
 
4
4
  setup(
5
5
  name="jarvis-ai-assistant",
6
- version="0.2.5",
6
+ version="0.2.7",
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",
@@ -1,4 +1,4 @@
1
1
  # -*- coding: utf-8 -*-
2
2
  """Jarvis AI Assistant"""
3
3
 
4
- __version__ = "0.2.5"
4
+ __version__ = "0.2.7"
@@ -396,7 +396,7 @@ class Agent:
396
396
  """
397
397
  return execute_tool_call(response, self)
398
398
 
399
- def _complete_task(self) -> str:
399
+ def _complete_task(self, auto_completed: bool = False) -> str:
400
400
  """完成任务并生成总结(如果需要)
401
401
 
402
402
  返回:
@@ -407,8 +407,26 @@ class Agent:
407
407
  2. 对于子Agent: 可能会生成总结(如果启用)
408
408
  3. 使用spinner显示生成状态
409
409
  """
410
+ satisfaction_feedback = ""
411
+
412
+ if not auto_completed and self.use_analysis:
413
+ if user_confirm("您对本次任务的完成是否满意?", True):
414
+ satisfaction_feedback = "\n\n用户对本次任务的完成表示满意。"
415
+ else:
416
+ feedback = self.multiline_inputer(
417
+ "请提供您的反馈意见(可留空直接回车):"
418
+ )
419
+ if feedback:
420
+ satisfaction_feedback = (
421
+ f"\n\n用户对本次任务的完成不满意,反馈意见如下:\n{feedback}"
422
+ )
423
+ else:
424
+ satisfaction_feedback = (
425
+ "\n\n用户对本次任务的完成不满意,未提供具体反馈意见。"
426
+ )
427
+
410
428
  if self.use_analysis:
411
- self._analysis_task()
429
+ self._analysis_task(satisfaction_feedback)
412
430
  if self.need_summary:
413
431
  print("📄 正在生成总结...")
414
432
  self.session.prompt = self.summary_prompt
@@ -420,11 +438,13 @@ class Agent:
420
438
 
421
439
  return "任务完成"
422
440
 
423
- def _analysis_task(self):
441
+ def _analysis_task(self, satisfaction_feedback: str = ""):
424
442
  print("🔍 正在分析任务...")
425
443
  try:
426
444
  # 让模型判断是否需要生成方法论
427
445
  analysis_prompt = TASK_ANALYSIS_PROMPT
446
+ if satisfaction_feedback:
447
+ analysis_prompt += satisfaction_feedback
428
448
 
429
449
  self.session.prompt = analysis_prompt
430
450
  if not self.model:
@@ -452,6 +472,23 @@ class Agent:
452
472
  else ""
453
473
  )
454
474
 
475
+ # 检查工具列表并添加记忆工具相关提示
476
+ memory_prompts = ""
477
+ tool_registry = self.get_tool_registry()
478
+ if tool_registry:
479
+ tool_names = [tool.name for tool in tool_registry.tools.values()]
480
+
481
+ # 如果有save_memory工具,添加相关提示
482
+ if "save_memory" in tool_names:
483
+ memory_prompts += "\n - 如果有关键信息需要记忆,请调用save_memory工具进行记忆:"
484
+ memory_prompts += "\n * project_long_term: 保存与当前项目相关的长期信息"
485
+ memory_prompts += "\n * global_long_term: 保存通用的信息、用户喜好、知识、方法等"
486
+ memory_prompts += "\n * short_term: 保存当前任务相关的临时信息"
487
+
488
+ # 如果有retrieve_memory工具,添加相关提示
489
+ if "retrieve_memory" in tool_names:
490
+ memory_prompts += "\n - 如果需要检索相关记忆信息,请调用retrieve_memory工具"
491
+
455
492
  addon_prompt = f"""
456
493
  <system_prompt>
457
494
  请判断是否已经完成任务,如果已经完成:
@@ -461,7 +498,7 @@ class Agent:
461
498
  - 仅包含一个操作
462
499
  - 如果信息不明确,请请求用户补充
463
500
  - 如果执行过程中连续失败5次,请使用ask_user询问用户操作
464
- - 操作列表:{action_handlers}
501
+ - 操作列表:{action_handlers}{memory_prompts}
465
502
  </system_prompt>
466
503
 
467
504
  请继续。
@@ -547,7 +584,7 @@ class Agent:
547
584
  continue
548
585
 
549
586
  if self.auto_complete and ot("!!!COMPLETE!!!") in current_response:
550
- return self._complete_task()
587
+ return self._complete_task(auto_completed=True)
551
588
 
552
589
  # 获取用户输入
553
590
  user_input = self.multiline_inputer(
@@ -560,7 +597,7 @@ class Agent:
560
597
  continue
561
598
 
562
599
  if not user_input:
563
- return self._complete_task()
600
+ return self._complete_task(auto_completed=False)
564
601
 
565
602
  except Exception as e:
566
603
  PrettyOutput.print(f"任务失败: {str(e)}", OutputType.ERROR)
@@ -571,6 +608,34 @@ class Agent:
571
608
  return f"Task failed: {str(e)}"
572
609
 
573
610
  def _first_run(self):
611
+ # 获取所有记忆标签并添加到提示中
612
+ from jarvis.jarvis_utils.globals import get_all_memory_tags
613
+
614
+ memory_tags = get_all_memory_tags()
615
+ memory_tags_prompt = ""
616
+
617
+ # 检查是否有save_memory工具
618
+ tool_registry = self.get_tool_registry()
619
+ has_save_memory = False
620
+ if tool_registry:
621
+ tool_names = [tool.name for tool in tool_registry.tools.values()]
622
+ has_save_memory = "save_memory" in tool_names
623
+
624
+ # 如果有save_memory工具,添加记录关键信息的提示
625
+ if has_save_memory:
626
+ memory_tags_prompt = "\n\n💡 提示:在分析任务之前,建议使用 save_memory 工具将关键信息记录下来,便于后续检索和复用。"
627
+
628
+ if any(tags for tags in memory_tags.values()):
629
+ memory_tags_prompt += "\n\n系统中存在以下记忆标签,你可以使用 retrieve_memory 工具检索相关记忆:"
630
+ for memory_type, tags in memory_tags.items():
631
+ if tags:
632
+ type_name = {
633
+ "short_term": "短期记忆",
634
+ "project_long_term": "项目长期记忆",
635
+ "global_long_term": "全局长期记忆"
636
+ }.get(memory_type, memory_type)
637
+ memory_tags_prompt += f"\n- {type_name}: {', '.join(tags)}"
638
+
574
639
  # 如果有上传文件,先上传文件
575
640
  if self.model and self.model.support_upload_files():
576
641
  if self.use_methodology:
@@ -583,12 +648,12 @@ class Agent:
583
648
  msg = self.session.prompt
584
649
  for handler in self.input_handler:
585
650
  msg, _ = handler(msg, self)
586
- self.session.prompt = f"{self.session.prompt}\n\n以下是历史类似问题的执行经验,可参考:\n{load_methodology(msg, self.get_tool_registry())}"
651
+ self.session.prompt = f"{self.session.prompt}\n\n以下是历史类似问题的执行经验,可参考:\n{load_methodology(msg, self.get_tool_registry())}{memory_tags_prompt}"
587
652
  else:
588
653
  if self.files:
589
- self.session.prompt = f"{self.session.prompt}\n\n上传的文件包含历史对话信息和方法论文件,可以从中获取一些经验信息。"
654
+ self.session.prompt = f"{self.session.prompt}\n\n上传的文件包含历史对话信息和方法论文件,可以从中获取一些经验信息。{memory_tags_prompt}"
590
655
  else:
591
- self.session.prompt = f"{self.session.prompt}\n\n上传的文件包含历史对话信息,可以从中获取一些经验信息。"
656
+ self.session.prompt = f"{self.session.prompt}\n\n上传的文件包含历史对话信息,可以从中获取一些经验信息。{memory_tags_prompt}"
592
657
  elif self.files:
593
658
  if not self.model.upload_files(self.files):
594
659
  PrettyOutput.print(
@@ -604,6 +669,10 @@ class Agent:
604
669
  for handler in self.input_handler:
605
670
  msg, _ = handler(msg, self)
606
671
  self.session.prompt = f"{self.session.prompt}\n\n以下是历史类似问题的执行经验,可参考:\n{load_methodology(msg, self.get_tool_registry())}"
672
+
673
+ # 添加记忆标签提示
674
+ if memory_tags_prompt:
675
+ self.session.prompt = f"{self.session.prompt}{memory_tags_prompt}"
607
676
 
608
677
  self.first = False
609
678
 
@@ -204,9 +204,9 @@ class EditFileHandler(OutputHandler):
204
204
  found = False
205
205
 
206
206
  if exact_search in modified_content:
207
- # 直接执行替换(保留所有原始格式)
207
+ # 直接执行替换(保留所有原始格式),只替换第一个匹配
208
208
  modified_content = modified_content.replace(
209
- exact_search, replace_text
209
+ exact_search, replace_text, 1
210
210
  )
211
211
  print(f"✅ 补丁 #{patch_count} 应用成功")
212
212
  found = True
@@ -222,7 +222,7 @@ class EditFileHandler(OutputHandler):
222
222
  stripped_replace = replace_text[1:-1]
223
223
  if stripped_search in modified_content:
224
224
  modified_content = modified_content.replace(
225
- stripped_search, stripped_replace
225
+ stripped_search, stripped_replace, 1
226
226
  )
227
227
  print(f"✅ 补丁 #{patch_count} 应用成功 (自动去除首尾换行)")
228
228
  found = True
@@ -251,7 +251,7 @@ class EditFileHandler(OutputHandler):
251
251
  )
252
252
  if indented_search in modified_content:
253
253
  modified_content = modified_content.replace(
254
- indented_search, indented_replace
254
+ indented_search, indented_replace, 1
255
255
  )
256
256
  print(
257
257
  f"✅ 补丁 #{patch_count} 应用成功 (自动增加 {space_count} 个空格缩进)"