jarvis-ai-assistant 0.3.16__tar.gz → 0.3.18__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 (136) hide show
  1. {jarvis_ai_assistant-0.3.16/src/jarvis_ai_assistant.egg-info → jarvis_ai_assistant-0.3.18}/PKG-INFO +1 -1
  2. {jarvis_ai_assistant-0.3.16 → jarvis_ai_assistant-0.3.18}/pyproject.toml +1 -1
  3. {jarvis_ai_assistant-0.3.16 → jarvis_ai_assistant-0.3.18}/setup.py +1 -1
  4. {jarvis_ai_assistant-0.3.16 → jarvis_ai_assistant-0.3.18}/src/jarvis/__init__.py +1 -1
  5. {jarvis_ai_assistant-0.3.16 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_agent/__init__.py +2 -0
  6. jarvis_ai_assistant-0.3.18/src/jarvis/jarvis_agent/jarvis.py +466 -0
  7. {jarvis_ai_assistant-0.3.16 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_agent/methodology_share_manager.py +2 -2
  8. {jarvis_ai_assistant-0.3.16 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_agent/session_manager.py +9 -1
  9. {jarvis_ai_assistant-0.3.16 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_agent/task_manager.py +11 -6
  10. {jarvis_ai_assistant-0.3.16 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_agent/tool_share_manager.py +2 -2
  11. {jarvis_ai_assistant-0.3.16 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_data/config_schema.json +39 -0
  12. {jarvis_ai_assistant-0.3.16 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_platform/base.py +8 -1
  13. {jarvis_ai_assistant-0.3.16 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_platform_manager/main.py +12 -22
  14. jarvis_ai_assistant-0.3.18/src/jarvis/jarvis_tools/read_webpage.py +120 -0
  15. {jarvis_ai_assistant-0.3.16 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_utils/config.py +56 -0
  16. {jarvis_ai_assistant-0.3.16 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_utils/input.py +49 -3
  17. {jarvis_ai_assistant-0.3.16 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_utils/utils.py +151 -0
  18. {jarvis_ai_assistant-0.3.16 → jarvis_ai_assistant-0.3.18/src/jarvis_ai_assistant.egg-info}/PKG-INFO +1 -1
  19. jarvis_ai_assistant-0.3.16/src/jarvis/jarvis_agent/jarvis.py +0 -286
  20. jarvis_ai_assistant-0.3.16/src/jarvis/jarvis_tools/read_webpage.py +0 -59
  21. {jarvis_ai_assistant-0.3.16 → jarvis_ai_assistant-0.3.18}/LICENSE +0 -0
  22. {jarvis_ai_assistant-0.3.16 → jarvis_ai_assistant-0.3.18}/MANIFEST.in +0 -0
  23. {jarvis_ai_assistant-0.3.16 → jarvis_ai_assistant-0.3.18}/README.md +0 -0
  24. {jarvis_ai_assistant-0.3.16 → jarvis_ai_assistant-0.3.18}/setup.cfg +0 -0
  25. {jarvis_ai_assistant-0.3.16 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_agent/agent_manager.py +0 -0
  26. {jarvis_ai_assistant-0.3.16 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_agent/builtin_input_handler.py +0 -0
  27. {jarvis_ai_assistant-0.3.16 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_agent/config_editor.py +0 -0
  28. {jarvis_ai_assistant-0.3.16 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_agent/edit_file_handler.py +0 -0
  29. {jarvis_ai_assistant-0.3.16 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_agent/file_methodology_manager.py +0 -0
  30. {jarvis_ai_assistant-0.3.16 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_agent/main.py +0 -0
  31. {jarvis_ai_assistant-0.3.16 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_agent/memory_manager.py +0 -0
  32. {jarvis_ai_assistant-0.3.16 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_agent/output_handler.py +0 -0
  33. {jarvis_ai_assistant-0.3.16 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_agent/prompt_builder.py +0 -0
  34. {jarvis_ai_assistant-0.3.16 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_agent/prompts.py +0 -0
  35. {jarvis_ai_assistant-0.3.16 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_agent/protocols.py +0 -0
  36. {jarvis_ai_assistant-0.3.16 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_agent/share_manager.py +0 -0
  37. {jarvis_ai_assistant-0.3.16 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_agent/shell_input_handler.py +0 -0
  38. {jarvis_ai_assistant-0.3.16 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_agent/task_analyzer.py +0 -0
  39. {jarvis_ai_assistant-0.3.16 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_agent/tool_executor.py +0 -0
  40. {jarvis_ai_assistant-0.3.16 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_code_agent/__init__.py +0 -0
  41. {jarvis_ai_assistant-0.3.16 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_code_agent/code_agent.py +0 -0
  42. {jarvis_ai_assistant-0.3.16 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_code_agent/lint.py +0 -0
  43. {jarvis_ai_assistant-0.3.16 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_code_analysis/checklists/__init__.py +0 -0
  44. {jarvis_ai_assistant-0.3.16 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_code_analysis/checklists/c_cpp.py +0 -0
  45. {jarvis_ai_assistant-0.3.16 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_code_analysis/checklists/csharp.py +0 -0
  46. {jarvis_ai_assistant-0.3.16 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_code_analysis/checklists/data_format.py +0 -0
  47. {jarvis_ai_assistant-0.3.16 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_code_analysis/checklists/devops.py +0 -0
  48. {jarvis_ai_assistant-0.3.16 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_code_analysis/checklists/docs.py +0 -0
  49. {jarvis_ai_assistant-0.3.16 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_code_analysis/checklists/go.py +0 -0
  50. {jarvis_ai_assistant-0.3.16 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_code_analysis/checklists/infrastructure.py +0 -0
  51. {jarvis_ai_assistant-0.3.16 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_code_analysis/checklists/java.py +0 -0
  52. {jarvis_ai_assistant-0.3.16 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_code_analysis/checklists/javascript.py +0 -0
  53. {jarvis_ai_assistant-0.3.16 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_code_analysis/checklists/kotlin.py +0 -0
  54. {jarvis_ai_assistant-0.3.16 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_code_analysis/checklists/loader.py +0 -0
  55. {jarvis_ai_assistant-0.3.16 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_code_analysis/checklists/php.py +0 -0
  56. {jarvis_ai_assistant-0.3.16 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_code_analysis/checklists/python.py +0 -0
  57. {jarvis_ai_assistant-0.3.16 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_code_analysis/checklists/ruby.py +0 -0
  58. {jarvis_ai_assistant-0.3.16 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_code_analysis/checklists/rust.py +0 -0
  59. {jarvis_ai_assistant-0.3.16 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_code_analysis/checklists/shell.py +0 -0
  60. {jarvis_ai_assistant-0.3.16 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_code_analysis/checklists/sql.py +0 -0
  61. {jarvis_ai_assistant-0.3.16 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_code_analysis/checklists/swift.py +0 -0
  62. {jarvis_ai_assistant-0.3.16 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_code_analysis/checklists/web.py +0 -0
  63. {jarvis_ai_assistant-0.3.16 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_code_analysis/code_review.py +0 -0
  64. {jarvis_ai_assistant-0.3.16 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_data/tiktoken/9b5ad71b2ce5302211f9c61530b329a4922fc6a4 +0 -0
  65. {jarvis_ai_assistant-0.3.16 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_git_squash/__init__.py +0 -0
  66. {jarvis_ai_assistant-0.3.16 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_git_squash/main.py +0 -0
  67. {jarvis_ai_assistant-0.3.16 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_git_utils/git_commiter.py +0 -0
  68. {jarvis_ai_assistant-0.3.16 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_mcp/__init__.py +0 -0
  69. {jarvis_ai_assistant-0.3.16 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_mcp/sse_mcp_client.py +0 -0
  70. {jarvis_ai_assistant-0.3.16 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_mcp/stdio_mcp_client.py +0 -0
  71. {jarvis_ai_assistant-0.3.16 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_mcp/streamable_mcp_client.py +0 -0
  72. {jarvis_ai_assistant-0.3.16 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_memory_organizer/__init__.py +0 -0
  73. {jarvis_ai_assistant-0.3.16 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_memory_organizer/memory_organizer.py +0 -0
  74. {jarvis_ai_assistant-0.3.16 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_methodology/main.py +0 -0
  75. {jarvis_ai_assistant-0.3.16 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_multi_agent/__init__.py +0 -0
  76. {jarvis_ai_assistant-0.3.16 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_multi_agent/main.py +0 -0
  77. {jarvis_ai_assistant-0.3.16 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_platform/__init__.py +0 -0
  78. {jarvis_ai_assistant-0.3.16 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_platform/ai8.py +0 -0
  79. {jarvis_ai_assistant-0.3.16 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_platform/human.py +0 -0
  80. {jarvis_ai_assistant-0.3.16 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_platform/kimi.py +0 -0
  81. {jarvis_ai_assistant-0.3.16 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_platform/openai.py +0 -0
  82. {jarvis_ai_assistant-0.3.16 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_platform/registry.py +0 -0
  83. {jarvis_ai_assistant-0.3.16 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_platform/tongyi.py +0 -0
  84. {jarvis_ai_assistant-0.3.16 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_platform/yuanbao.py +0 -0
  85. {jarvis_ai_assistant-0.3.16 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_platform_manager/__init__.py +0 -0
  86. {jarvis_ai_assistant-0.3.16 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_platform_manager/service.py +0 -0
  87. {jarvis_ai_assistant-0.3.16 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_rag/__init__.py +0 -0
  88. {jarvis_ai_assistant-0.3.16 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_rag/cache.py +0 -0
  89. {jarvis_ai_assistant-0.3.16 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_rag/cli.py +0 -0
  90. {jarvis_ai_assistant-0.3.16 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_rag/embedding_manager.py +0 -0
  91. {jarvis_ai_assistant-0.3.16 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_rag/llm_interface.py +0 -0
  92. {jarvis_ai_assistant-0.3.16 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_rag/query_rewriter.py +0 -0
  93. {jarvis_ai_assistant-0.3.16 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_rag/rag_pipeline.py +0 -0
  94. {jarvis_ai_assistant-0.3.16 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_rag/reranker.py +0 -0
  95. {jarvis_ai_assistant-0.3.16 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_rag/retriever.py +0 -0
  96. {jarvis_ai_assistant-0.3.16 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_smart_shell/__init__.py +0 -0
  97. {jarvis_ai_assistant-0.3.16 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_smart_shell/main.py +0 -0
  98. {jarvis_ai_assistant-0.3.16 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_stats/__init__.py +0 -0
  99. {jarvis_ai_assistant-0.3.16 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_stats/cli.py +0 -0
  100. {jarvis_ai_assistant-0.3.16 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_stats/stats.py +0 -0
  101. {jarvis_ai_assistant-0.3.16 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_stats/storage.py +0 -0
  102. {jarvis_ai_assistant-0.3.16 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_stats/visualizer.py +0 -0
  103. {jarvis_ai_assistant-0.3.16 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_tools/__init__.py +0 -0
  104. {jarvis_ai_assistant-0.3.16 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_tools/ask_user.py +0 -0
  105. {jarvis_ai_assistant-0.3.16 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_tools/base.py +0 -0
  106. {jarvis_ai_assistant-0.3.16 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_tools/clear_memory.py +0 -0
  107. {jarvis_ai_assistant-0.3.16 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_tools/cli/__init__.py +0 -0
  108. {jarvis_ai_assistant-0.3.16 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_tools/cli/main.py +0 -0
  109. {jarvis_ai_assistant-0.3.16 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_tools/edit_file.py +0 -0
  110. {jarvis_ai_assistant-0.3.16 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_tools/execute_script.py +0 -0
  111. {jarvis_ai_assistant-0.3.16 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_tools/file_analyzer.py +0 -0
  112. {jarvis_ai_assistant-0.3.16 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_tools/generate_new_tool.py +0 -0
  113. {jarvis_ai_assistant-0.3.16 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_tools/methodology.py +0 -0
  114. {jarvis_ai_assistant-0.3.16 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_tools/read_code.py +0 -0
  115. {jarvis_ai_assistant-0.3.16 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_tools/registry.py +0 -0
  116. {jarvis_ai_assistant-0.3.16 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_tools/retrieve_memory.py +0 -0
  117. {jarvis_ai_assistant-0.3.16 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_tools/rewrite_file.py +0 -0
  118. {jarvis_ai_assistant-0.3.16 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_tools/save_memory.py +0 -0
  119. {jarvis_ai_assistant-0.3.16 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_tools/search_web.py +0 -0
  120. {jarvis_ai_assistant-0.3.16 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_tools/virtual_tty.py +0 -0
  121. {jarvis_ai_assistant-0.3.16 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_utils/__init__.py +0 -0
  122. {jarvis_ai_assistant-0.3.16 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_utils/builtin_replace_map.py +0 -0
  123. {jarvis_ai_assistant-0.3.16 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_utils/clipboard.py +0 -0
  124. {jarvis_ai_assistant-0.3.16 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_utils/embedding.py +0 -0
  125. {jarvis_ai_assistant-0.3.16 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_utils/file_processors.py +0 -0
  126. {jarvis_ai_assistant-0.3.16 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_utils/git_utils.py +0 -0
  127. {jarvis_ai_assistant-0.3.16 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_utils/globals.py +0 -0
  128. {jarvis_ai_assistant-0.3.16 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_utils/http.py +0 -0
  129. {jarvis_ai_assistant-0.3.16 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_utils/methodology.py +0 -0
  130. {jarvis_ai_assistant-0.3.16 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_utils/output.py +0 -0
  131. {jarvis_ai_assistant-0.3.16 → jarvis_ai_assistant-0.3.18}/src/jarvis/jarvis_utils/tag.py +0 -0
  132. {jarvis_ai_assistant-0.3.16 → jarvis_ai_assistant-0.3.18}/src/jarvis_ai_assistant.egg-info/SOURCES.txt +0 -0
  133. {jarvis_ai_assistant-0.3.16 → jarvis_ai_assistant-0.3.18}/src/jarvis_ai_assistant.egg-info/dependency_links.txt +0 -0
  134. {jarvis_ai_assistant-0.3.16 → jarvis_ai_assistant-0.3.18}/src/jarvis_ai_assistant.egg-info/entry_points.txt +0 -0
  135. {jarvis_ai_assistant-0.3.16 → jarvis_ai_assistant-0.3.18}/src/jarvis_ai_assistant.egg-info/requires.txt +0 -0
  136. {jarvis_ai_assistant-0.3.16 → jarvis_ai_assistant-0.3.18}/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.3.16
3
+ Version: 0.3.18
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.3.16"
7
+ version = "0.3.18"
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.3.16",
6
+ version="0.3.18",
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.3.16"
4
+ __version__ = "0.3.18"
@@ -791,6 +791,8 @@ class Agent:
791
791
  set_interrupt(False)
792
792
  user_input = self.multiline_inputer(f"模型交互期间被中断,请输入用户干预信息:")
793
793
 
794
+ self.run_input_handlers_next_turn = True
795
+
794
796
  if not user_input:
795
797
  # 用户输入为空,完成任务
796
798
  return self._complete_task(auto_completed=False)
@@ -0,0 +1,466 @@
1
+ # -*- coding: utf-8 -*-
2
+ """Jarvis AI 助手主入口模块"""
3
+ from typing import Optional
4
+
5
+ import typer
6
+
7
+ from jarvis.jarvis_agent import OutputType, PrettyOutput
8
+ from jarvis.jarvis_agent.agent_manager import AgentManager
9
+ from jarvis.jarvis_agent.config_editor import ConfigEditor
10
+ from jarvis.jarvis_agent.methodology_share_manager import MethodologyShareManager
11
+ from jarvis.jarvis_agent.tool_share_manager import ToolShareManager
12
+ from jarvis.jarvis_utils.utils import init_env
13
+ from jarvis.jarvis_utils.config import (
14
+ is_enable_git_repo_jca_switch,
15
+ is_enable_builtin_config_selector,
16
+ get_agent_definition_dirs,
17
+ get_multi_agent_dirs,
18
+ get_roles_dirs,
19
+ )
20
+ import jarvis.jarvis_utils.utils as jutils
21
+ from jarvis.jarvis_utils.input import user_confirm, get_single_line_input
22
+ import os
23
+ import sys
24
+ import subprocess
25
+ from pathlib import Path
26
+ import yaml # type: ignore
27
+ from rich.table import Table
28
+ from rich.console import Console
29
+
30
+ app = typer.Typer(help="Jarvis AI 助手")
31
+
32
+
33
+ def print_commands_overview() -> None:
34
+ """打印命令与快捷方式总览表。"""
35
+ try:
36
+ cmd_table = Table(show_header=True, header_style="bold magenta")
37
+ cmd_table.add_column("命令", style="bold")
38
+ cmd_table.add_column("快捷方式", style="cyan")
39
+ cmd_table.add_column("功能描述", style="white")
40
+
41
+ cmd_table.add_row("jarvis", "jvs", "通用AI代理,适用于多种任务")
42
+ cmd_table.add_row("jarvis-agent", "ja", "AI代理基础功能,处理会话和任务")
43
+ cmd_table.add_row(
44
+ "jarvis-code-agent",
45
+ "jca",
46
+ "专注于代码分析、修改和生成的代码代理",
47
+ )
48
+ cmd_table.add_row("jarvis-code-review", "jcr", "智能代码审查工具")
49
+ cmd_table.add_row(
50
+ "jarvis-git-commit",
51
+ "jgc",
52
+ "自动化分析代码变更并生成规范的Git提交信息",
53
+ )
54
+ cmd_table.add_row("jarvis-git-squash", "jgs", "Git提交历史整理工具")
55
+ cmd_table.add_row(
56
+ "jarvis-platform-manager",
57
+ "jpm",
58
+ "管理和测试不同的大语言模型平台",
59
+ )
60
+ cmd_table.add_row("jarvis-multi-agent", "jma", "多智能体协作系统")
61
+ cmd_table.add_row("jarvis-tool", "jt", "工具管理与调用系统")
62
+ cmd_table.add_row("jarvis-methodology", "jm", "方法论知识库管理")
63
+ cmd_table.add_row(
64
+ "jarvis-rag",
65
+ "jrg",
66
+ "构建和查询本地化的RAG知识库",
67
+ )
68
+ cmd_table.add_row("jarvis-smart-shell", "jss", "实验性的智能Shell功能")
69
+ cmd_table.add_row(
70
+ "jarvis-stats",
71
+ "jst",
72
+ "通用统计模块,支持记录和可视化任意指标数据",
73
+ )
74
+ cmd_table.add_row(
75
+ "jarvis-memory-organizer",
76
+ "jmo",
77
+ "记忆管理工具,支持整理、合并、导入导出记忆",
78
+ )
79
+
80
+ Console().print(cmd_table)
81
+ except Exception:
82
+ # 静默忽略渲染异常,避免影响主流程
83
+ pass
84
+
85
+ def handle_edit_option(edit: bool, config_file: Optional[str]) -> bool:
86
+ """处理配置文件编辑选项,返回是否已处理并需提前结束。"""
87
+ if edit:
88
+ ConfigEditor.edit_config(config_file)
89
+ return True
90
+ return False
91
+
92
+
93
+ def handle_share_methodology_option(
94
+ share_methodology: bool, config_file: Optional[str]
95
+ ) -> bool:
96
+ """处理方法论分享选项,返回是否已处理并需提前结束。"""
97
+ if share_methodology:
98
+ init_env("", config_file=config_file) # 初始化配置但不显示欢迎信息
99
+ methodology_manager = MethodologyShareManager()
100
+ methodology_manager.run()
101
+ return True
102
+ return False
103
+
104
+
105
+ def handle_share_tool_option(share_tool: bool, config_file: Optional[str]) -> bool:
106
+ """处理工具分享选项,返回是否已处理并需提前结束。"""
107
+ if share_tool:
108
+ init_env("", config_file=config_file) # 初始化配置但不显示欢迎信息
109
+ tool_manager = ToolShareManager()
110
+ tool_manager.run()
111
+ return True
112
+ return False
113
+
114
+
115
+ def preload_config_for_flags(config_file: Optional[str]) -> None:
116
+ """预加载配置(仅用于读取功能开关),不会显示欢迎信息或影响后续 init_env。"""
117
+ try:
118
+ jutils.g_config_file = config_file
119
+ jutils.load_config()
120
+ except Exception:
121
+ # 静默忽略配置加载异常
122
+ pass
123
+
124
+
125
+ def try_switch_to_jca_if_git_repo(
126
+ llm_type: str,
127
+ model_group: Optional[str],
128
+ tool_group: Optional[str],
129
+ config_file: Optional[str],
130
+ restore_session: bool,
131
+ task: Optional[str],
132
+ ) -> None:
133
+ """在初始化环境前检测Git仓库,并可选择自动切换到代码开发模式(jca)。"""
134
+ if is_enable_git_repo_jca_switch():
135
+ try:
136
+ res = subprocess.run(
137
+ ["git", "rev-parse", "--show-toplevel"],
138
+ capture_output=True,
139
+ text=True,
140
+ )
141
+ if res.returncode == 0:
142
+ git_root = res.stdout.strip()
143
+ if git_root and os.path.isdir(git_root):
144
+ PrettyOutput.print(
145
+ f"检测到当前位于 Git 仓库: {git_root}", OutputType.INFO
146
+ )
147
+ if user_confirm(
148
+ "检测到Git仓库,是否切换到代码开发模式(jca)?", default=False
149
+ ):
150
+ # 构建并切换到 jarvis-code-agent 命令,传递兼容参数
151
+ args = ["jarvis-code-agent"]
152
+ if llm_type:
153
+ args += ["-t", llm_type]
154
+ if model_group:
155
+ args += ["-g", model_group]
156
+ if tool_group:
157
+ args += ["-G", tool_group]
158
+ if config_file:
159
+ args += ["-f", config_file]
160
+ if restore_session:
161
+ args += ["--restore-session"]
162
+ if task:
163
+ args += ["-r", task]
164
+ PrettyOutput.print(
165
+ "正在切换到 'jca'(jarvis-code-agent)以进入代码开发模式...",
166
+ OutputType.INFO,
167
+ )
168
+ os.execvp(args[0], args)
169
+ except Exception:
170
+ # 静默忽略检测异常,不影响主流程
171
+ pass
172
+
173
+
174
+ def handle_builtin_config_selector(
175
+ llm_type: str,
176
+ model_group: Optional[str],
177
+ tool_group: Optional[str],
178
+ config_file: Optional[str],
179
+ task: Optional[str],
180
+ ) -> None:
181
+ """在进入默认通用代理前,列出内置配置供选择(agent/multi_agent/roles)。"""
182
+ if is_enable_builtin_config_selector():
183
+ try:
184
+ # 优先使用项目内置目录,若不存在则回退到指定的绝对路径
185
+ builtin_root = Path(__file__).resolve().parents[3] / "builtin"
186
+ if not builtin_root.exists():
187
+ builtin_root = Path("/home/skyfire/code/Jarvis/builtin")
188
+
189
+ categories = [
190
+ ("agent", "jarvis-agent", "*.yaml"),
191
+ ("multi_agent", "jarvis-multi-agent", "*.yaml"),
192
+ ("roles", "jarvis-platform-manager", "*.yaml"),
193
+ ]
194
+
195
+ options = []
196
+ for cat, cmd, pattern in categories:
197
+ # 构建待扫描目录列表:优先使用配置中的目录,其次回退到内置目录
198
+ search_dirs = []
199
+ try:
200
+ if cat == "agent":
201
+ search_dirs.extend(
202
+ [Path(p) for p in get_agent_definition_dirs() if p]
203
+ )
204
+ elif cat == "multi_agent":
205
+ search_dirs.extend(
206
+ [Path(p) for p in get_multi_agent_dirs() if p]
207
+ )
208
+ elif cat == "roles":
209
+ search_dirs.extend([Path(p) for p in get_roles_dirs() if p])
210
+ except Exception:
211
+ # 忽略配置读取异常
212
+ pass
213
+
214
+ # 追加内置目录
215
+ search_dirs.append(builtin_root / cat)
216
+
217
+ # 去重并保留顺序
218
+ unique_dirs = []
219
+ seen = set()
220
+ for d in search_dirs:
221
+ try:
222
+ key = str(Path(d).resolve())
223
+ except Exception:
224
+ key = str(d)
225
+ if key not in seen:
226
+ seen.add(key)
227
+ unique_dirs.append(Path(d))
228
+
229
+ # 每日自动更新配置目录(如目录为Git仓库则执行git pull,每日仅一次)
230
+ try:
231
+ jutils.daily_check_git_updates([str(p) for p in unique_dirs], cat)
232
+ except Exception:
233
+ # 忽略更新过程中的所有异常,避免影响主流程
234
+ pass
235
+
236
+ for dir_path in unique_dirs:
237
+ if not dir_path.exists():
238
+ continue
239
+ for fpath in sorted(dir_path.glob(pattern)):
240
+ # 解析YAML以获取可读名称/描述(失败时静默降级为文件名)
241
+ name = fpath.stem
242
+ desc = ""
243
+ roles_count = 0
244
+ try:
245
+ with open(
246
+ fpath, "r", encoding="utf-8", errors="ignore"
247
+ ) as fh:
248
+ data = yaml.safe_load(fh) or {}
249
+ if isinstance(data, dict):
250
+ name = data.get("name") or data.get("title") or name
251
+ desc = data.get("description") or data.get("desc") or ""
252
+ if cat == "roles" and isinstance(
253
+ data.get("roles"), list
254
+ ):
255
+ roles_count = len(data["roles"])
256
+ if not desc:
257
+ desc = f"{roles_count} 个角色"
258
+ except Exception:
259
+ # 忽略解析错误,使用默认显示
260
+ pass
261
+
262
+ # 为 roles 构建详细信息(每个角色的名称与描述)
263
+ details = ""
264
+ if cat == "roles":
265
+ roles = (data or {}).get("roles", [])
266
+ if isinstance(roles, list):
267
+ lines = []
268
+ for role in roles:
269
+ if isinstance(role, dict):
270
+ rname = str(role.get("name", "") or "")
271
+ rdesc = str(role.get("description", "") or "")
272
+ lines.append(
273
+ f"{rname} - {rdesc}" if rdesc else rname
274
+ )
275
+ details = "\n".join([ln for ln in lines if ln])
276
+ # 如果没有角色详情,退回到统计信息
277
+ if not details and isinstance(
278
+ (data or {}).get("roles"), list
279
+ ):
280
+ details = f"{len(data['roles'])} 个角色"
281
+
282
+ options.append(
283
+ {
284
+ "category": cat,
285
+ "cmd": cmd,
286
+ "file": str(fpath),
287
+ "name": str(name),
288
+ "desc": str(desc),
289
+ "details": str(details),
290
+ "roles_count": int(roles_count),
291
+ }
292
+ )
293
+
294
+ if options:
295
+ PrettyOutput.section("可用的内置配置", OutputType.SUCCESS)
296
+ # 使用 rich Table 呈现
297
+ table = Table(show_header=True, header_style="bold magenta")
298
+ table.add_column("No.", style="cyan", no_wrap=True)
299
+ table.add_column("类型", style="green", no_wrap=True)
300
+ table.add_column("名称", style="bold")
301
+ table.add_column("文件", style="dim")
302
+ table.add_column("描述", style="white")
303
+
304
+ for idx, opt in enumerate(options, 1):
305
+ category = opt.get("category", "")
306
+ name = opt.get("name", "")
307
+ file_path = opt.get("file", "")
308
+ # 描述列显示配置描述;若为 roles 同时显示角色数量与列表
309
+ if category == "roles":
310
+ count = opt.get("roles_count")
311
+ details = opt.get("details", "")
312
+ parts = []
313
+ if isinstance(count, int) and count > 0:
314
+ parts.append(f"{count} 个角色")
315
+ if details:
316
+ parts.append(details)
317
+ desc_display = "\n".join(parts) if parts else ""
318
+ else:
319
+ desc_display = opt.get("desc", "")
320
+ table.add_row(str(idx), category, name, file_path, desc_display)
321
+
322
+ Console().print(table)
323
+
324
+ choice = get_single_line_input(
325
+ "选择要启动的配置编号,直接回车使用默认通用代理(jvs): ", default=""
326
+ )
327
+
328
+ if choice.strip():
329
+ try:
330
+ index = int(choice.strip())
331
+ if 1 <= index <= len(options):
332
+ sel = options[index - 1]
333
+ args = []
334
+
335
+ if sel["category"] == "agent":
336
+ # jarvis-agent 支持 -f/--config(全局配置)与 -c/--agent-definition
337
+ args = [sel["cmd"], "-c", sel["file"]]
338
+ if llm_type:
339
+ args += ["--llm-type", llm_type]
340
+ if model_group:
341
+ args += ["-g", model_group]
342
+ if config_file:
343
+ args += ["-f", config_file]
344
+ if task:
345
+ args += ["--task", task]
346
+
347
+ elif sel["category"] == "multi_agent":
348
+ # jarvis-multi-agent 需要 -c/--config,用户输入通过 -i/--input 传递
349
+ args = [sel["cmd"], "-c", sel["file"]]
350
+ if task:
351
+ args += ["-i", task]
352
+
353
+ elif sel["category"] == "roles":
354
+ # jarvis-platform-manager role 子命令,支持 -c/-t/-g
355
+ args = [sel["cmd"], "role", "-c", sel["file"]]
356
+ if llm_type:
357
+ args += ["-t", llm_type]
358
+ if model_group:
359
+ args += ["-g", model_group]
360
+
361
+ if args:
362
+ PrettyOutput.print(
363
+ f"正在启动: {' '.join(args)}", OutputType.INFO
364
+ )
365
+ os.execvp(args[0], args)
366
+ except Exception:
367
+ # 任何异常都不影响默认流程
368
+ pass
369
+ except Exception:
370
+ # 静默忽略内置配置扫描错误,不影响主流程
371
+ pass
372
+
373
+
374
+ @app.callback(invoke_without_command=True)
375
+ def run_cli(
376
+ ctx: typer.Context,
377
+ llm_type: str = typer.Option(
378
+ "normal",
379
+ "-t",
380
+ "--llm-type",
381
+ help="使用的LLM类型,可选值:'normal'(普通)或 'thinking'(思考模式)",
382
+ ),
383
+ task: Optional[str] = typer.Option(
384
+ None, "-T", "--task", help="从命令行直接输入任务内容"
385
+ ),
386
+ model_group: Optional[str] = typer.Option(
387
+ None, "-g", "--llm-group", help="使用的模型组,覆盖配置文件中的设置"
388
+ ),
389
+ tool_group: Optional[str] = typer.Option(
390
+ None, "-G", "--tool-group", help="使用的工具组,覆盖配置文件中的设置"
391
+ ),
392
+ config_file: Optional[str] = typer.Option(
393
+ None, "-f", "--config", help="自定义配置文件路径"
394
+ ),
395
+ restore_session: bool = typer.Option(
396
+ False,
397
+ "--restore-session",
398
+ help="从 .jarvis/saved_session.json 恢复会话",
399
+ ),
400
+ edit: bool = typer.Option(False, "-e", "--edit", help="编辑配置文件"),
401
+ share_methodology: bool = typer.Option(
402
+ False, "--share-methodology", help="分享本地方法论到中心方法论仓库"
403
+ ),
404
+ share_tool: bool = typer.Option(
405
+ False, "--share-tool", help="分享本地工具到中心工具仓库"
406
+ ),
407
+ ) -> None:
408
+ """Jarvis AI assistant command-line interface."""
409
+ if ctx.invoked_subcommand is not None:
410
+ return
411
+
412
+ # 使用 rich 输出命令与快捷方式总览
413
+ print_commands_overview()
414
+
415
+ # 处理配置文件编辑
416
+ if handle_edit_option(edit, config_file):
417
+ return
418
+
419
+ # 处理方法论分享
420
+ if handle_share_methodology_option(share_methodology, config_file):
421
+ return
422
+
423
+ # 处理工具分享
424
+ if handle_share_tool_option(share_tool, config_file):
425
+ return
426
+
427
+ # 预加载配置(仅用于读取功能开关),不会显示欢迎信息或影响后续 init_env
428
+ preload_config_for_flags(config_file)
429
+
430
+ # 在初始化环境前检测Git仓库,并可选择自动切换到代码开发模式(jca)
431
+ try_switch_to_jca_if_git_repo(
432
+ llm_type, model_group, tool_group, config_file, restore_session, task
433
+ )
434
+
435
+ # 在进入默认通用代理前,列出内置配置供选择(agent/multi_agent/roles)
436
+ handle_builtin_config_selector(llm_type, model_group, tool_group, config_file, task)
437
+
438
+ # 初始化环境
439
+ init_env(
440
+ "欢迎使用 Jarvis AI 助手,您的智能助理已准备就绪!", config_file=config_file
441
+ )
442
+
443
+ # 运行主流程
444
+ try:
445
+ agent_manager = AgentManager(
446
+ llm_type=llm_type,
447
+ model_group=model_group,
448
+ tool_group=tool_group,
449
+ restore_session=restore_session,
450
+ )
451
+ agent_manager.initialize()
452
+ agent_manager.run_task(task)
453
+ except typer.Exit:
454
+ raise
455
+ except Exception as err: # pylint: disable=broad-except
456
+ PrettyOutput.print(f"初始化错误: {str(err)}", OutputType.ERROR)
457
+ raise typer.Exit(code=1)
458
+
459
+
460
+ def main() -> None:
461
+ """Application entry point."""
462
+ app()
463
+
464
+
465
+ if __name__ == "__main__":
466
+ main()
@@ -151,12 +151,12 @@ class MethodologyShareManager(ShareManager):
151
151
  "没有找到新的方法论文件(所有方法论可能已存在于中心仓库)",
152
152
  OutputType.WARNING,
153
153
  )
154
- raise typer.Exit(code=0)
154
+ return
155
155
 
156
156
  # 选择要分享的资源
157
157
  selected_resources = self.select_resources(local_resources)
158
158
  if not selected_resources:
159
- raise typer.Exit(code=0)
159
+ return
160
160
 
161
161
  # 分享资源
162
162
  copied_list = self.share_resources(selected_resources)
@@ -67,10 +67,18 @@ class SessionManager:
67
67
  return True
68
68
  return False
69
69
 
70
- def clear_history(self):
70
+ def clear_history(self) -> None:
71
71
  """
72
72
  Clears conversation history but keeps the system prompt by resetting the model state.
73
73
  """
74
74
  self.prompt = ""
75
75
  self.model.reset()
76
76
  self.conversation_length = 0
77
+
78
+ def clear(self) -> None:
79
+ """
80
+ Clears the session state, resetting prompt and conversation length while
81
+ preserving user_data. This method is an alias of clear_history for backward
82
+ compatibility with existing tests and callers.
83
+ """
84
+ self.clear_history()
@@ -3,8 +3,10 @@
3
3
  import os
4
4
  from typing import Dict
5
5
 
6
- import yaml
6
+ import yaml # type: ignore
7
7
  from prompt_toolkit import prompt
8
+ from rich.table import Table
9
+ from rich.console import Console
8
10
 
9
11
  from jarvis.jarvis_agent import (
10
12
  OutputType,
@@ -68,16 +70,19 @@ class TaskManager:
68
70
  return ""
69
71
 
70
72
  task_names = list(tasks.keys())
71
- task_list = ["可用任务:"]
73
+ # 使用 rich.Table 展示预定义任务
74
+ table = Table(show_header=True, header_style="bold magenta")
75
+ table.add_column("No.", style="cyan", no_wrap=True)
76
+ table.add_column("任务名", style="bold")
72
77
  for i, name in enumerate(task_names, 1):
73
- task_list.append(f"[{i}] {name}")
74
- task_list.append("[0] 跳过预定义任务")
75
- PrettyOutput.print("\n".join(task_list), OutputType.INFO)
78
+ table.add_row(str(i), name)
79
+ Console().print(table)
80
+ PrettyOutput.print("[0] 跳过预定义任务", OutputType.INFO)
76
81
 
77
82
  while True:
78
83
  try:
79
84
  choice_str = prompt(
80
- "\n请选择一个任务编号(0 跳过预定义任务):"
85
+ "\n请选择一个任务编号(0 或者直接回车跳过预定义任务):"
81
86
  ).strip()
82
87
  if not choice_str:
83
88
  return ""
@@ -112,12 +112,12 @@ class ToolShareManager(ShareManager):
112
112
  "没有找到新的工具文件(所有工具可能已存在于中心仓库)",
113
113
  OutputType.WARNING,
114
114
  )
115
- raise typer.Exit(code=0)
115
+ return
116
116
 
117
117
  # 选择要分享的资源
118
118
  selected_resources = self.select_resources(local_resources)
119
119
  if not selected_resources:
120
- raise typer.Exit(code=0)
120
+ return
121
121
 
122
122
  # 分享资源
123
123
  moved_list = self.share_resources(selected_resources)
@@ -235,6 +235,30 @@
235
235
  },
236
236
  "default": []
237
237
  },
238
+ "JARVIS_AGENT_DEFINITION_DIRS": {
239
+ "type": "array",
240
+ "description": "agent 定义加载目录",
241
+ "items": {
242
+ "type": "string"
243
+ },
244
+ "default": []
245
+ },
246
+ "JARVIS_MULTI_AGENT_DIRS": {
247
+ "type": "array",
248
+ "description": "multi_agent 加载目录",
249
+ "items": {
250
+ "type": "string"
251
+ },
252
+ "default": []
253
+ },
254
+ "JARVIS_ROLES_DIRS": {
255
+ "type": "array",
256
+ "description": "roles 加载目录",
257
+ "items": {
258
+ "type": "string"
259
+ },
260
+ "default": []
261
+ },
238
262
  "JARVIS_CENTRAL_METHODOLOGY_REPO": {
239
263
  "type": "string",
240
264
  "description": "中心方法论Git仓库地址,该仓库会自动添加到方法论加载路径中",
@@ -260,6 +284,21 @@
260
284
  "description": "是否强制保存记忆",
261
285
  "default": true
262
286
  },
287
+ "JARVIS_ENABLE_GIT_JCA_SWITCH": {
288
+ "type": "boolean",
289
+ "description": "在初始化环境前检测Git仓库并提示可切换到代码开发模式(jca)",
290
+ "default": false
291
+ },
292
+ "JARVIS_ENABLE_STARTUP_CONFIG_SELECTOR": {
293
+ "type": "boolean",
294
+ "description": "在进入默认通用代理前,列出可用配置(agent/multi_agent/roles)供选择",
295
+ "default": false
296
+ },
297
+ "JARVIS_IMMEDIATE_ABORT": {
298
+ "type": "boolean",
299
+ "description": "是否启用立即中断:在对话迭代中检测到中断信号时立即返回",
300
+ "default": false
301
+ },
263
302
  "JARVIS_TOOL_GROUP": {
264
303
  "type": "string",
265
304
  "description": "选择一个预定义的工具配置组",