jarvis-ai-assistant 0.3.32__tar.gz → 0.3.34__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {jarvis_ai_assistant-0.3.32/src/jarvis_ai_assistant.egg-info → jarvis_ai_assistant-0.3.34}/PKG-INFO +1 -1
- {jarvis_ai_assistant-0.3.32 → jarvis_ai_assistant-0.3.34}/pyproject.toml +1 -1
- {jarvis_ai_assistant-0.3.32 → jarvis_ai_assistant-0.3.34}/setup.py +1 -1
- {jarvis_ai_assistant-0.3.32 → jarvis_ai_assistant-0.3.34}/src/jarvis/__init__.py +1 -1
- {jarvis_ai_assistant-0.3.32 → jarvis_ai_assistant-0.3.34}/src/jarvis/jarvis_agent/__init__.py +2 -0
- {jarvis_ai_assistant-0.3.32 → jarvis_ai_assistant-0.3.34}/src/jarvis/jarvis_agent/agent_manager.py +9 -3
- {jarvis_ai_assistant-0.3.32 → jarvis_ai_assistant-0.3.34}/src/jarvis/jarvis_agent/config.py +7 -0
- jarvis_ai_assistant-0.3.34/src/jarvis/jarvis_agent/file_context_handler.py +69 -0
- {jarvis_ai_assistant-0.3.32 → jarvis_ai_assistant-0.3.34}/src/jarvis/jarvis_agent/jarvis.py +177 -44
- {jarvis_ai_assistant-0.3.32 → jarvis_ai_assistant-0.3.34}/src/jarvis/jarvis_agent/main.py +32 -2
- {jarvis_ai_assistant-0.3.32 → jarvis_ai_assistant-0.3.34}/src/jarvis/jarvis_agent/run_loop.py +9 -0
- {jarvis_ai_assistant-0.3.32 → jarvis_ai_assistant-0.3.34}/src/jarvis/jarvis_code_agent/code_agent.py +38 -2
- {jarvis_ai_assistant-0.3.32 → jarvis_ai_assistant-0.3.34}/src/jarvis/jarvis_data/config_schema.json +10 -0
- {jarvis_ai_assistant-0.3.32 → jarvis_ai_assistant-0.3.34}/src/jarvis/jarvis_multi_agent/__init__.py +21 -0
- {jarvis_ai_assistant-0.3.32 → jarvis_ai_assistant-0.3.34}/src/jarvis/jarvis_multi_agent/main.py +28 -0
- {jarvis_ai_assistant-0.3.32 → jarvis_ai_assistant-0.3.34}/src/jarvis/jarvis_platform/base.py +57 -0
- {jarvis_ai_assistant-0.3.32 → jarvis_ai_assistant-0.3.34}/src/jarvis/jarvis_tools/execute_script.py +45 -8
- {jarvis_ai_assistant-0.3.32 → jarvis_ai_assistant-0.3.34}/src/jarvis/jarvis_tools/read_webpage.py +4 -2
- {jarvis_ai_assistant-0.3.32 → jarvis_ai_assistant-0.3.34}/src/jarvis/jarvis_tools/search_web.py +14 -10
- {jarvis_ai_assistant-0.3.32 → jarvis_ai_assistant-0.3.34}/src/jarvis/jarvis_utils/config.py +43 -0
- {jarvis_ai_assistant-0.3.32 → jarvis_ai_assistant-0.3.34}/src/jarvis/jarvis_utils/input.py +6 -0
- {jarvis_ai_assistant-0.3.32 → jarvis_ai_assistant-0.3.34/src/jarvis_ai_assistant.egg-info}/PKG-INFO +1 -1
- {jarvis_ai_assistant-0.3.32 → jarvis_ai_assistant-0.3.34}/src/jarvis_ai_assistant.egg-info/SOURCES.txt +1 -0
- {jarvis_ai_assistant-0.3.32 → jarvis_ai_assistant-0.3.34}/LICENSE +0 -0
- {jarvis_ai_assistant-0.3.32 → jarvis_ai_assistant-0.3.34}/MANIFEST.in +0 -0
- {jarvis_ai_assistant-0.3.32 → jarvis_ai_assistant-0.3.34}/README.md +0 -0
- {jarvis_ai_assistant-0.3.32 → jarvis_ai_assistant-0.3.34}/setup.cfg +0 -0
- {jarvis_ai_assistant-0.3.32 → jarvis_ai_assistant-0.3.34}/src/jarvis/jarvis_agent/builtin_input_handler.py +0 -0
- {jarvis_ai_assistant-0.3.32 → jarvis_ai_assistant-0.3.34}/src/jarvis/jarvis_agent/config_editor.py +0 -0
- {jarvis_ai_assistant-0.3.32 → jarvis_ai_assistant-0.3.34}/src/jarvis/jarvis_agent/edit_file_handler.py +0 -0
- {jarvis_ai_assistant-0.3.32 → jarvis_ai_assistant-0.3.34}/src/jarvis/jarvis_agent/event_bus.py +0 -0
- {jarvis_ai_assistant-0.3.32 → jarvis_ai_assistant-0.3.34}/src/jarvis/jarvis_agent/events.py +0 -0
- {jarvis_ai_assistant-0.3.32 → jarvis_ai_assistant-0.3.34}/src/jarvis/jarvis_agent/file_methodology_manager.py +0 -0
- {jarvis_ai_assistant-0.3.32 → jarvis_ai_assistant-0.3.34}/src/jarvis/jarvis_agent/memory_manager.py +0 -0
- {jarvis_ai_assistant-0.3.32 → jarvis_ai_assistant-0.3.34}/src/jarvis/jarvis_agent/methodology_share_manager.py +0 -0
- {jarvis_ai_assistant-0.3.32 → jarvis_ai_assistant-0.3.34}/src/jarvis/jarvis_agent/output_handler.py +0 -0
- {jarvis_ai_assistant-0.3.32 → jarvis_ai_assistant-0.3.34}/src/jarvis/jarvis_agent/prompt_builder.py +0 -0
- {jarvis_ai_assistant-0.3.32 → jarvis_ai_assistant-0.3.34}/src/jarvis/jarvis_agent/prompt_manager.py +0 -0
- {jarvis_ai_assistant-0.3.32 → jarvis_ai_assistant-0.3.34}/src/jarvis/jarvis_agent/prompts.py +0 -0
- {jarvis_ai_assistant-0.3.32 → jarvis_ai_assistant-0.3.34}/src/jarvis/jarvis_agent/protocols.py +0 -0
- {jarvis_ai_assistant-0.3.32 → jarvis_ai_assistant-0.3.34}/src/jarvis/jarvis_agent/session_manager.py +0 -0
- {jarvis_ai_assistant-0.3.32 → jarvis_ai_assistant-0.3.34}/src/jarvis/jarvis_agent/share_manager.py +0 -0
- {jarvis_ai_assistant-0.3.32 → jarvis_ai_assistant-0.3.34}/src/jarvis/jarvis_agent/shell_input_handler.py +0 -0
- {jarvis_ai_assistant-0.3.32 → jarvis_ai_assistant-0.3.34}/src/jarvis/jarvis_agent/task_analyzer.py +0 -0
- {jarvis_ai_assistant-0.3.32 → jarvis_ai_assistant-0.3.34}/src/jarvis/jarvis_agent/task_manager.py +0 -0
- {jarvis_ai_assistant-0.3.32 → jarvis_ai_assistant-0.3.34}/src/jarvis/jarvis_agent/tool_executor.py +0 -0
- {jarvis_ai_assistant-0.3.32 → jarvis_ai_assistant-0.3.34}/src/jarvis/jarvis_agent/tool_share_manager.py +0 -0
- {jarvis_ai_assistant-0.3.32 → jarvis_ai_assistant-0.3.34}/src/jarvis/jarvis_agent/user_interaction.py +0 -0
- {jarvis_ai_assistant-0.3.32 → jarvis_ai_assistant-0.3.34}/src/jarvis/jarvis_agent/utils.py +0 -0
- {jarvis_ai_assistant-0.3.32 → jarvis_ai_assistant-0.3.34}/src/jarvis/jarvis_code_agent/__init__.py +0 -0
- {jarvis_ai_assistant-0.3.32 → jarvis_ai_assistant-0.3.34}/src/jarvis/jarvis_code_agent/lint.py +0 -0
- {jarvis_ai_assistant-0.3.32 → jarvis_ai_assistant-0.3.34}/src/jarvis/jarvis_code_analysis/checklists/__init__.py +0 -0
- {jarvis_ai_assistant-0.3.32 → jarvis_ai_assistant-0.3.34}/src/jarvis/jarvis_code_analysis/checklists/c_cpp.py +0 -0
- {jarvis_ai_assistant-0.3.32 → jarvis_ai_assistant-0.3.34}/src/jarvis/jarvis_code_analysis/checklists/csharp.py +0 -0
- {jarvis_ai_assistant-0.3.32 → jarvis_ai_assistant-0.3.34}/src/jarvis/jarvis_code_analysis/checklists/data_format.py +0 -0
- {jarvis_ai_assistant-0.3.32 → jarvis_ai_assistant-0.3.34}/src/jarvis/jarvis_code_analysis/checklists/devops.py +0 -0
- {jarvis_ai_assistant-0.3.32 → jarvis_ai_assistant-0.3.34}/src/jarvis/jarvis_code_analysis/checklists/docs.py +0 -0
- {jarvis_ai_assistant-0.3.32 → jarvis_ai_assistant-0.3.34}/src/jarvis/jarvis_code_analysis/checklists/go.py +0 -0
- {jarvis_ai_assistant-0.3.32 → jarvis_ai_assistant-0.3.34}/src/jarvis/jarvis_code_analysis/checklists/infrastructure.py +0 -0
- {jarvis_ai_assistant-0.3.32 → jarvis_ai_assistant-0.3.34}/src/jarvis/jarvis_code_analysis/checklists/java.py +0 -0
- {jarvis_ai_assistant-0.3.32 → jarvis_ai_assistant-0.3.34}/src/jarvis/jarvis_code_analysis/checklists/javascript.py +0 -0
- {jarvis_ai_assistant-0.3.32 → jarvis_ai_assistant-0.3.34}/src/jarvis/jarvis_code_analysis/checklists/kotlin.py +0 -0
- {jarvis_ai_assistant-0.3.32 → jarvis_ai_assistant-0.3.34}/src/jarvis/jarvis_code_analysis/checklists/loader.py +0 -0
- {jarvis_ai_assistant-0.3.32 → jarvis_ai_assistant-0.3.34}/src/jarvis/jarvis_code_analysis/checklists/php.py +0 -0
- {jarvis_ai_assistant-0.3.32 → jarvis_ai_assistant-0.3.34}/src/jarvis/jarvis_code_analysis/checklists/python.py +0 -0
- {jarvis_ai_assistant-0.3.32 → jarvis_ai_assistant-0.3.34}/src/jarvis/jarvis_code_analysis/checklists/ruby.py +0 -0
- {jarvis_ai_assistant-0.3.32 → jarvis_ai_assistant-0.3.34}/src/jarvis/jarvis_code_analysis/checklists/rust.py +0 -0
- {jarvis_ai_assistant-0.3.32 → jarvis_ai_assistant-0.3.34}/src/jarvis/jarvis_code_analysis/checklists/shell.py +0 -0
- {jarvis_ai_assistant-0.3.32 → jarvis_ai_assistant-0.3.34}/src/jarvis/jarvis_code_analysis/checklists/sql.py +0 -0
- {jarvis_ai_assistant-0.3.32 → jarvis_ai_assistant-0.3.34}/src/jarvis/jarvis_code_analysis/checklists/swift.py +0 -0
- {jarvis_ai_assistant-0.3.32 → jarvis_ai_assistant-0.3.34}/src/jarvis/jarvis_code_analysis/checklists/web.py +0 -0
- {jarvis_ai_assistant-0.3.32 → jarvis_ai_assistant-0.3.34}/src/jarvis/jarvis_code_analysis/code_review.py +0 -0
- {jarvis_ai_assistant-0.3.32 → jarvis_ai_assistant-0.3.34}/src/jarvis/jarvis_data/tiktoken/9b5ad71b2ce5302211f9c61530b329a4922fc6a4 +0 -0
- {jarvis_ai_assistant-0.3.32 → jarvis_ai_assistant-0.3.34}/src/jarvis/jarvis_git_squash/__init__.py +0 -0
- {jarvis_ai_assistant-0.3.32 → jarvis_ai_assistant-0.3.34}/src/jarvis/jarvis_git_squash/main.py +0 -0
- {jarvis_ai_assistant-0.3.32 → jarvis_ai_assistant-0.3.34}/src/jarvis/jarvis_git_utils/git_commiter.py +0 -0
- {jarvis_ai_assistant-0.3.32 → jarvis_ai_assistant-0.3.34}/src/jarvis/jarvis_mcp/__init__.py +0 -0
- {jarvis_ai_assistant-0.3.32 → jarvis_ai_assistant-0.3.34}/src/jarvis/jarvis_mcp/sse_mcp_client.py +0 -0
- {jarvis_ai_assistant-0.3.32 → jarvis_ai_assistant-0.3.34}/src/jarvis/jarvis_mcp/stdio_mcp_client.py +0 -0
- {jarvis_ai_assistant-0.3.32 → jarvis_ai_assistant-0.3.34}/src/jarvis/jarvis_mcp/streamable_mcp_client.py +0 -0
- {jarvis_ai_assistant-0.3.32 → jarvis_ai_assistant-0.3.34}/src/jarvis/jarvis_memory_organizer/__init__.py +0 -0
- {jarvis_ai_assistant-0.3.32 → jarvis_ai_assistant-0.3.34}/src/jarvis/jarvis_memory_organizer/memory_organizer.py +0 -0
- {jarvis_ai_assistant-0.3.32 → jarvis_ai_assistant-0.3.34}/src/jarvis/jarvis_methodology/main.py +0 -0
- {jarvis_ai_assistant-0.3.32 → jarvis_ai_assistant-0.3.34}/src/jarvis/jarvis_platform/__init__.py +0 -0
- {jarvis_ai_assistant-0.3.32 → jarvis_ai_assistant-0.3.34}/src/jarvis/jarvis_platform/ai8.py +0 -0
- {jarvis_ai_assistant-0.3.32 → jarvis_ai_assistant-0.3.34}/src/jarvis/jarvis_platform/human.py +0 -0
- {jarvis_ai_assistant-0.3.32 → jarvis_ai_assistant-0.3.34}/src/jarvis/jarvis_platform/kimi.py +0 -0
- {jarvis_ai_assistant-0.3.32 → jarvis_ai_assistant-0.3.34}/src/jarvis/jarvis_platform/openai.py +0 -0
- {jarvis_ai_assistant-0.3.32 → jarvis_ai_assistant-0.3.34}/src/jarvis/jarvis_platform/registry.py +0 -0
- {jarvis_ai_assistant-0.3.32 → jarvis_ai_assistant-0.3.34}/src/jarvis/jarvis_platform/tongyi.py +0 -0
- {jarvis_ai_assistant-0.3.32 → jarvis_ai_assistant-0.3.34}/src/jarvis/jarvis_platform/yuanbao.py +0 -0
- {jarvis_ai_assistant-0.3.32 → jarvis_ai_assistant-0.3.34}/src/jarvis/jarvis_platform_manager/__init__.py +0 -0
- {jarvis_ai_assistant-0.3.32 → jarvis_ai_assistant-0.3.34}/src/jarvis/jarvis_platform_manager/main.py +0 -0
- {jarvis_ai_assistant-0.3.32 → jarvis_ai_assistant-0.3.34}/src/jarvis/jarvis_platform_manager/service.py +0 -0
- {jarvis_ai_assistant-0.3.32 → jarvis_ai_assistant-0.3.34}/src/jarvis/jarvis_rag/__init__.py +0 -0
- {jarvis_ai_assistant-0.3.32 → jarvis_ai_assistant-0.3.34}/src/jarvis/jarvis_rag/cache.py +0 -0
- {jarvis_ai_assistant-0.3.32 → jarvis_ai_assistant-0.3.34}/src/jarvis/jarvis_rag/cli.py +0 -0
- {jarvis_ai_assistant-0.3.32 → jarvis_ai_assistant-0.3.34}/src/jarvis/jarvis_rag/embedding_manager.py +0 -0
- {jarvis_ai_assistant-0.3.32 → jarvis_ai_assistant-0.3.34}/src/jarvis/jarvis_rag/llm_interface.py +0 -0
- {jarvis_ai_assistant-0.3.32 → jarvis_ai_assistant-0.3.34}/src/jarvis/jarvis_rag/query_rewriter.py +0 -0
- {jarvis_ai_assistant-0.3.32 → jarvis_ai_assistant-0.3.34}/src/jarvis/jarvis_rag/rag_pipeline.py +0 -0
- {jarvis_ai_assistant-0.3.32 → jarvis_ai_assistant-0.3.34}/src/jarvis/jarvis_rag/reranker.py +0 -0
- {jarvis_ai_assistant-0.3.32 → jarvis_ai_assistant-0.3.34}/src/jarvis/jarvis_rag/retriever.py +0 -0
- {jarvis_ai_assistant-0.3.32 → jarvis_ai_assistant-0.3.34}/src/jarvis/jarvis_smart_shell/__init__.py +0 -0
- {jarvis_ai_assistant-0.3.32 → jarvis_ai_assistant-0.3.34}/src/jarvis/jarvis_smart_shell/main.py +0 -0
- {jarvis_ai_assistant-0.3.32 → jarvis_ai_assistant-0.3.34}/src/jarvis/jarvis_stats/__init__.py +0 -0
- {jarvis_ai_assistant-0.3.32 → jarvis_ai_assistant-0.3.34}/src/jarvis/jarvis_stats/cli.py +0 -0
- {jarvis_ai_assistant-0.3.32 → jarvis_ai_assistant-0.3.34}/src/jarvis/jarvis_stats/stats.py +0 -0
- {jarvis_ai_assistant-0.3.32 → jarvis_ai_assistant-0.3.34}/src/jarvis/jarvis_stats/storage.py +0 -0
- {jarvis_ai_assistant-0.3.32 → jarvis_ai_assistant-0.3.34}/src/jarvis/jarvis_stats/visualizer.py +0 -0
- {jarvis_ai_assistant-0.3.32 → jarvis_ai_assistant-0.3.34}/src/jarvis/jarvis_tools/__init__.py +0 -0
- {jarvis_ai_assistant-0.3.32 → jarvis_ai_assistant-0.3.34}/src/jarvis/jarvis_tools/ask_user.py +0 -0
- {jarvis_ai_assistant-0.3.32 → jarvis_ai_assistant-0.3.34}/src/jarvis/jarvis_tools/base.py +0 -0
- {jarvis_ai_assistant-0.3.32 → jarvis_ai_assistant-0.3.34}/src/jarvis/jarvis_tools/clear_memory.py +0 -0
- {jarvis_ai_assistant-0.3.32 → jarvis_ai_assistant-0.3.34}/src/jarvis/jarvis_tools/cli/__init__.py +0 -0
- {jarvis_ai_assistant-0.3.32 → jarvis_ai_assistant-0.3.34}/src/jarvis/jarvis_tools/cli/main.py +0 -0
- {jarvis_ai_assistant-0.3.32 → jarvis_ai_assistant-0.3.34}/src/jarvis/jarvis_tools/edit_file.py +0 -0
- {jarvis_ai_assistant-0.3.32 → jarvis_ai_assistant-0.3.34}/src/jarvis/jarvis_tools/file_analyzer.py +0 -0
- {jarvis_ai_assistant-0.3.32 → jarvis_ai_assistant-0.3.34}/src/jarvis/jarvis_tools/generate_new_tool.py +0 -0
- {jarvis_ai_assistant-0.3.32 → jarvis_ai_assistant-0.3.34}/src/jarvis/jarvis_tools/methodology.py +0 -0
- {jarvis_ai_assistant-0.3.32 → jarvis_ai_assistant-0.3.34}/src/jarvis/jarvis_tools/read_code.py +0 -0
- {jarvis_ai_assistant-0.3.32 → jarvis_ai_assistant-0.3.34}/src/jarvis/jarvis_tools/registry.py +0 -0
- {jarvis_ai_assistant-0.3.32 → jarvis_ai_assistant-0.3.34}/src/jarvis/jarvis_tools/retrieve_memory.py +0 -0
- {jarvis_ai_assistant-0.3.32 → jarvis_ai_assistant-0.3.34}/src/jarvis/jarvis_tools/rewrite_file.py +0 -0
- {jarvis_ai_assistant-0.3.32 → jarvis_ai_assistant-0.3.34}/src/jarvis/jarvis_tools/save_memory.py +0 -0
- {jarvis_ai_assistant-0.3.32 → jarvis_ai_assistant-0.3.34}/src/jarvis/jarvis_tools/sub_agent.py +0 -0
- {jarvis_ai_assistant-0.3.32 → jarvis_ai_assistant-0.3.34}/src/jarvis/jarvis_tools/sub_code_agent.py +0 -0
- {jarvis_ai_assistant-0.3.32 → jarvis_ai_assistant-0.3.34}/src/jarvis/jarvis_tools/virtual_tty.py +0 -0
- {jarvis_ai_assistant-0.3.32 → jarvis_ai_assistant-0.3.34}/src/jarvis/jarvis_utils/__init__.py +0 -0
- {jarvis_ai_assistant-0.3.32 → jarvis_ai_assistant-0.3.34}/src/jarvis/jarvis_utils/builtin_replace_map.py +0 -0
- {jarvis_ai_assistant-0.3.32 → jarvis_ai_assistant-0.3.34}/src/jarvis/jarvis_utils/clipboard.py +0 -0
- {jarvis_ai_assistant-0.3.32 → jarvis_ai_assistant-0.3.34}/src/jarvis/jarvis_utils/embedding.py +0 -0
- {jarvis_ai_assistant-0.3.32 → jarvis_ai_assistant-0.3.34}/src/jarvis/jarvis_utils/file_processors.py +0 -0
- {jarvis_ai_assistant-0.3.32 → jarvis_ai_assistant-0.3.34}/src/jarvis/jarvis_utils/fzf.py +0 -0
- {jarvis_ai_assistant-0.3.32 → jarvis_ai_assistant-0.3.34}/src/jarvis/jarvis_utils/git_utils.py +0 -0
- {jarvis_ai_assistant-0.3.32 → jarvis_ai_assistant-0.3.34}/src/jarvis/jarvis_utils/globals.py +0 -0
- {jarvis_ai_assistant-0.3.32 → jarvis_ai_assistant-0.3.34}/src/jarvis/jarvis_utils/http.py +0 -0
- {jarvis_ai_assistant-0.3.32 → jarvis_ai_assistant-0.3.34}/src/jarvis/jarvis_utils/methodology.py +0 -0
- {jarvis_ai_assistant-0.3.32 → jarvis_ai_assistant-0.3.34}/src/jarvis/jarvis_utils/output.py +0 -0
- {jarvis_ai_assistant-0.3.32 → jarvis_ai_assistant-0.3.34}/src/jarvis/jarvis_utils/tag.py +0 -0
- {jarvis_ai_assistant-0.3.32 → jarvis_ai_assistant-0.3.34}/src/jarvis/jarvis_utils/utils.py +0 -0
- {jarvis_ai_assistant-0.3.32 → jarvis_ai_assistant-0.3.34}/src/jarvis_ai_assistant.egg-info/dependency_links.txt +0 -0
- {jarvis_ai_assistant-0.3.32 → jarvis_ai_assistant-0.3.34}/src/jarvis_ai_assistant.egg-info/entry_points.txt +0 -0
- {jarvis_ai_assistant-0.3.32 → jarvis_ai_assistant-0.3.34}/src/jarvis_ai_assistant.egg-info/requires.txt +0 -0
- {jarvis_ai_assistant-0.3.32 → jarvis_ai_assistant-0.3.34}/src/jarvis_ai_assistant.egg-info/top_level.txt +0 -0
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
4
4
|
|
5
5
|
[project]
|
6
6
|
name = "jarvis-ai-assistant"
|
7
|
-
version = "0.3.
|
7
|
+
version = "0.3.34"
|
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.
|
6
|
+
version="0.3.34",
|
7
7
|
author="skyfire",
|
8
8
|
author_email="skyfireitdiy@hotmail.com",
|
9
9
|
description="An AI assistant that uses various tools to interact with the system",
|
{jarvis_ai_assistant-0.3.32 → jarvis_ai_assistant-0.3.34}/src/jarvis/jarvis_agent/__init__.py
RENAMED
@@ -439,6 +439,8 @@ class Agent:
|
|
439
439
|
self.summary_prompt = cfg.summary_prompt or DEFAULT_SUMMARY_PROMPT
|
440
440
|
self.max_token_count = int(cfg.max_token_count or get_max_token_count(model_group))
|
441
441
|
self.force_save_memory = bool(cfg.force_save_memory)
|
442
|
+
# 非交互模式下自动完成标志需要同步到 Agent 实例,避免循环
|
443
|
+
self.auto_complete = bool(cfg.auto_complete)
|
442
444
|
|
443
445
|
# 聚合配置到 AgentConfig,作为后续单一事实来源(保持兼容,不改变既有属性使用)
|
444
446
|
self.config = cfg
|
{jarvis_ai_assistant-0.3.32 → jarvis_ai_assistant-0.3.34}/src/jarvis/jarvis_agent/agent_manager.py
RENAMED
@@ -12,9 +12,11 @@ from jarvis.jarvis_agent import (
|
|
12
12
|
origin_agent_system_prompt,
|
13
13
|
)
|
14
14
|
from jarvis.jarvis_agent.builtin_input_handler import builtin_input_handler
|
15
|
+
from jarvis.jarvis_agent.file_context_handler import file_context_handler
|
15
16
|
from jarvis.jarvis_agent.shell_input_handler import shell_input_handler
|
16
17
|
from jarvis.jarvis_agent.task_manager import TaskManager
|
17
18
|
from jarvis.jarvis_tools.registry import ToolRegistry
|
19
|
+
from jarvis.jarvis_utils.config import is_non_interactive
|
18
20
|
|
19
21
|
|
20
22
|
class AgentManager:
|
@@ -46,7 +48,11 @@ class AgentManager:
|
|
46
48
|
self.agent = Agent(
|
47
49
|
system_prompt=origin_agent_system_prompt,
|
48
50
|
model_group=self.model_group,
|
49
|
-
input_handler=[
|
51
|
+
input_handler=[
|
52
|
+
shell_input_handler,
|
53
|
+
file_context_handler,
|
54
|
+
builtin_input_handler,
|
55
|
+
],
|
50
56
|
output_handler=[ToolRegistry()], # type: ignore
|
51
57
|
need_summary=False,
|
52
58
|
use_methodology=self.use_methodology,
|
@@ -72,8 +78,8 @@ class AgentManager:
|
|
72
78
|
self.agent.run(task_content)
|
73
79
|
raise typer.Exit(code=0)
|
74
80
|
|
75
|
-
#
|
76
|
-
if self.agent.first:
|
81
|
+
# 处理预定义任务(非交互模式下跳过)
|
82
|
+
if not is_non_interactive() and self.agent.first:
|
77
83
|
task_manager = TaskManager()
|
78
84
|
tasks = task_manager.load_tasks()
|
79
85
|
if tasks and (selected_task := task_manager.select_task(tasks)):
|
@@ -17,6 +17,7 @@ from jarvis.jarvis_utils.config import (
|
|
17
17
|
is_force_save_memory,
|
18
18
|
is_use_analysis,
|
19
19
|
is_use_methodology,
|
20
|
+
is_non_interactive,
|
20
21
|
)
|
21
22
|
|
22
23
|
|
@@ -30,6 +31,7 @@ class AgentConfig:
|
|
30
31
|
|
31
32
|
# 运行行为
|
32
33
|
auto_complete: bool = False
|
34
|
+
non_interactive: bool = False
|
33
35
|
need_summary: bool = True
|
34
36
|
|
35
37
|
# 可选配置(None 表示使用默认策略解析)
|
@@ -53,6 +55,7 @@ class AgentConfig:
|
|
53
55
|
description=self.description,
|
54
56
|
model_group=self.model_group,
|
55
57
|
auto_complete=self.auto_complete,
|
58
|
+
non_interactive=self.non_interactive,
|
56
59
|
need_summary=self.need_summary,
|
57
60
|
summary_prompt=self.summary_prompt,
|
58
61
|
execute_tool_confirm=self.execute_tool_confirm,
|
@@ -89,4 +92,8 @@ class AgentConfig:
|
|
89
92
|
if cfg.force_save_memory is None:
|
90
93
|
cfg.force_save_memory = is_force_save_memory()
|
91
94
|
|
95
|
+
# 非交互模式下默认开启自动完成
|
96
|
+
if is_non_interactive():
|
97
|
+
cfg.auto_complete = True
|
98
|
+
|
92
99
|
return cfg
|
@@ -0,0 +1,69 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
import re
|
3
|
+
import os
|
4
|
+
from typing import Any, Tuple
|
5
|
+
|
6
|
+
from jarvis.jarvis_tools.read_code import ReadCodeTool
|
7
|
+
|
8
|
+
|
9
|
+
def is_text_file(filepath: str) -> bool:
|
10
|
+
"""
|
11
|
+
Check if a file is a text file.
|
12
|
+
"""
|
13
|
+
try:
|
14
|
+
with open(filepath, "r", encoding="utf-8") as f:
|
15
|
+
f.read(1024) # Try to read a small chunk
|
16
|
+
return True
|
17
|
+
except (UnicodeDecodeError, IOError):
|
18
|
+
return False
|
19
|
+
|
20
|
+
|
21
|
+
def count_lines(filepath: str) -> int:
|
22
|
+
"""
|
23
|
+
Count the number of lines in a file.
|
24
|
+
"""
|
25
|
+
try:
|
26
|
+
with open(filepath, "r", encoding="utf-8", errors="ignore") as f:
|
27
|
+
return sum(1 for _ in f)
|
28
|
+
except IOError:
|
29
|
+
return 0
|
30
|
+
|
31
|
+
|
32
|
+
def file_context_handler(user_input: str, agent_: Any) -> Tuple[str, bool]:
|
33
|
+
"""
|
34
|
+
Extracts file paths from the input, reads their content if they are valid text files
|
35
|
+
and appends the content to the input.
|
36
|
+
|
37
|
+
Args:
|
38
|
+
user_input: The user's input string.
|
39
|
+
agent_: The agent instance.
|
40
|
+
|
41
|
+
Returns:
|
42
|
+
A tuple containing the modified user input and a boolean indicating if
|
43
|
+
further processing should be skipped.
|
44
|
+
"""
|
45
|
+
# Regex to find paths in single quotes
|
46
|
+
file_paths = re.findall(r"'([^']+)'", user_input)
|
47
|
+
|
48
|
+
if not file_paths:
|
49
|
+
return user_input, False
|
50
|
+
|
51
|
+
added_context = ""
|
52
|
+
read_code_tool = ReadCodeTool()
|
53
|
+
|
54
|
+
for path in file_paths:
|
55
|
+
if os.path.isfile(path) and is_text_file(path):
|
56
|
+
line_count = count_lines(path)
|
57
|
+
if line_count > 0:
|
58
|
+
# Use ReadCodeTool to get formatted content
|
59
|
+
result = read_code_tool._handle_single_file(path)
|
60
|
+
if result["success"]:
|
61
|
+
# Remove the file path from the original input to avoid redundancy
|
62
|
+
user_input = user_input.replace(f"'{path}'", "")
|
63
|
+
# Append the full, formatted output from the tool, which includes headers and line numbers
|
64
|
+
added_context += "\n" + result["stdout"]
|
65
|
+
|
66
|
+
if added_context:
|
67
|
+
user_input = user_input.strip() + added_context
|
68
|
+
|
69
|
+
return user_input, False
|
@@ -19,6 +19,8 @@ from jarvis.jarvis_utils.config import (
|
|
19
19
|
get_multi_agent_dirs,
|
20
20
|
get_roles_dirs,
|
21
21
|
get_data_dir,
|
22
|
+
set_config,
|
23
|
+
is_non_interactive,
|
22
24
|
)
|
23
25
|
import jarvis.jarvis_utils.utils as jutils
|
24
26
|
from jarvis.jarvis_utils.input import user_confirm, get_single_line_input
|
@@ -30,6 +32,32 @@ import yaml # type: ignore
|
|
30
32
|
from rich.table import Table
|
31
33
|
from rich.console import Console
|
32
34
|
|
35
|
+
import sys
|
36
|
+
|
37
|
+
|
38
|
+
def _normalize_backup_data_argv(argv: List[str]) -> None:
|
39
|
+
"""
|
40
|
+
兼容旧版 Click/Typer 对可选参数的解析差异:
|
41
|
+
若用户仅提供 --backup-data 而不跟参数,则在解析前注入默认目录。
|
42
|
+
"""
|
43
|
+
try:
|
44
|
+
i = 0
|
45
|
+
while i < len(argv):
|
46
|
+
tok = argv[i]
|
47
|
+
if tok == "--backup-data":
|
48
|
+
# 情况1:位于末尾,无参数
|
49
|
+
# 情况2:后续是下一个选项(以 '-' 开头),表示未提供参数
|
50
|
+
if i == len(argv) - 1 or (i + 1 < len(argv) and argv[i + 1].startswith("-")):
|
51
|
+
argv.insert(i + 1, "~/jarvis_backups")
|
52
|
+
i += 1 # 跳过我们插入的默认值,避免重复插入
|
53
|
+
i += 1
|
54
|
+
except Exception:
|
55
|
+
# 静默忽略任何异常,避免影响主流程
|
56
|
+
pass
|
57
|
+
|
58
|
+
|
59
|
+
_normalize_backup_data_argv(sys.argv)
|
60
|
+
|
33
61
|
app = typer.Typer(help="Jarvis AI 助手")
|
34
62
|
|
35
63
|
|
@@ -187,9 +215,9 @@ def handle_interactive_config_option(
|
|
187
215
|
return True
|
188
216
|
|
189
217
|
|
190
|
-
def handle_backup_option(
|
218
|
+
def handle_backup_option(backup_dir_path: Optional[str]) -> bool:
|
191
219
|
"""处理数据备份选项,返回是否已处理并需提前结束。"""
|
192
|
-
if
|
220
|
+
if backup_dir_path is None:
|
193
221
|
return False
|
194
222
|
|
195
223
|
init_env("", config_file=None)
|
@@ -198,7 +226,8 @@ def handle_backup_option(backup: bool) -> bool:
|
|
198
226
|
PrettyOutput.print(f"数据目录不存在: {data_dir}", OutputType.ERROR)
|
199
227
|
return True
|
200
228
|
|
201
|
-
|
229
|
+
backup_dir_str = backup_dir_path if backup_dir_path.strip() else "~/jarvis_backups"
|
230
|
+
backup_dir = Path(os.path.expanduser(backup_dir_str))
|
202
231
|
backup_dir.mkdir(exist_ok=True)
|
203
232
|
|
204
233
|
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
|
@@ -215,18 +244,37 @@ def handle_backup_option(backup: bool) -> bool:
|
|
215
244
|
return True
|
216
245
|
|
217
246
|
|
218
|
-
def handle_restore_option(restore_path: Optional[str]) -> bool:
|
247
|
+
def handle_restore_option(restore_path: Optional[str], config_file: Optional[str]) -> bool:
|
219
248
|
"""处理数据恢复选项,返回是否已处理并需提前结束。"""
|
220
249
|
if not restore_path:
|
221
250
|
return False
|
222
251
|
|
223
|
-
restore_file = Path(restore_path)
|
252
|
+
restore_file = Path(os.path.expanduser(os.path.expandvars(restore_path)))
|
253
|
+
# 兼容 ~ 与环境变量,避免用户输入未展开路径导致找不到文件
|
224
254
|
if not restore_file.is_file():
|
225
|
-
PrettyOutput.print(f"指定的恢复文件不存在: {
|
255
|
+
PrettyOutput.print(f"指定的恢复文件不存在: {restore_file}", OutputType.ERROR)
|
226
256
|
return True
|
227
257
|
|
228
|
-
|
229
|
-
|
258
|
+
# 在恢复数据时不要触发完整环境初始化,避免引导流程或网络请求
|
259
|
+
# 优先从配置文件解析 JARVIS_DATA_PATH,否则回退到默认数据目录
|
260
|
+
data_dir_str: Optional[str] = None
|
261
|
+
try:
|
262
|
+
if config_file:
|
263
|
+
cfg_path = Path(os.path.expanduser(os.path.expandvars(config_file)))
|
264
|
+
if cfg_path.is_file():
|
265
|
+
with open(cfg_path, "r", encoding="utf-8", errors="ignore") as cf:
|
266
|
+
cfg_data = yaml.safe_load(cf) or {}
|
267
|
+
if isinstance(cfg_data, dict):
|
268
|
+
val = cfg_data.get("JARVIS_DATA_PATH")
|
269
|
+
if isinstance(val, str) and val.strip():
|
270
|
+
data_dir_str = val.strip()
|
271
|
+
except Exception:
|
272
|
+
data_dir_str = None
|
273
|
+
|
274
|
+
if not data_dir_str:
|
275
|
+
data_dir_str = get_data_dir()
|
276
|
+
|
277
|
+
data_dir = Path(os.path.expanduser(os.path.expandvars(str(data_dir_str))))
|
230
278
|
|
231
279
|
if data_dir.exists():
|
232
280
|
if not user_confirm(
|
@@ -271,6 +319,9 @@ def try_switch_to_jca_if_git_repo(
|
|
271
319
|
task: Optional[str],
|
272
320
|
) -> None:
|
273
321
|
"""在初始化环境前检测Git仓库,并可选择自动切换到代码开发模式(jca)。"""
|
322
|
+
# 非交互模式下跳过代码模式切换提示与相关输出
|
323
|
+
if is_non_interactive():
|
324
|
+
return
|
274
325
|
if is_enable_git_repo_jca_switch():
|
275
326
|
try:
|
276
327
|
res = subprocess.run(
|
@@ -443,6 +494,20 @@ def handle_builtin_config_selector(
|
|
443
494
|
)
|
444
495
|
|
445
496
|
if options:
|
497
|
+
# Add a default option to skip selection
|
498
|
+
options.insert(
|
499
|
+
0,
|
500
|
+
{
|
501
|
+
"category": "skip",
|
502
|
+
"cmd": "",
|
503
|
+
"file": "",
|
504
|
+
"name": "跳过选择 (使用默认通用代理)",
|
505
|
+
"desc": "直接按回车或ESC也可跳过",
|
506
|
+
"details": "",
|
507
|
+
"roles_count": 0,
|
508
|
+
},
|
509
|
+
)
|
510
|
+
|
446
511
|
PrettyOutput.section("可用的内置配置", OutputType.SUCCESS)
|
447
512
|
# 使用 rich Table 呈现
|
448
513
|
table = Table(show_header=True, header_style="bold magenta")
|
@@ -511,35 +576,44 @@ def handle_builtin_config_selector(
|
|
511
576
|
if choice_index != -1:
|
512
577
|
try:
|
513
578
|
sel = options[choice_index]
|
514
|
-
|
515
|
-
|
516
|
-
|
517
|
-
|
518
|
-
args
|
519
|
-
|
520
|
-
|
521
|
-
|
522
|
-
args
|
523
|
-
|
524
|
-
|
525
|
-
|
526
|
-
|
527
|
-
|
528
|
-
|
529
|
-
|
530
|
-
|
531
|
-
|
532
|
-
|
533
|
-
|
534
|
-
|
535
|
-
|
536
|
-
|
537
|
-
|
538
|
-
|
539
|
-
|
540
|
-
|
541
|
-
|
542
|
-
|
579
|
+
# If the "skip" option is chosen, do nothing and proceed to default agent
|
580
|
+
if sel["category"] == "skip":
|
581
|
+
pass
|
582
|
+
else:
|
583
|
+
args: List[str] = []
|
584
|
+
|
585
|
+
if sel["category"] == "agent":
|
586
|
+
# jarvis-agent 支持 -f/--config(全局配置)与 -c/--agent-definition
|
587
|
+
args = [str(sel["cmd"]), "-c", str(sel["file"])]
|
588
|
+
if model_group:
|
589
|
+
args += ["-g", str(model_group)]
|
590
|
+
if config_file:
|
591
|
+
args += ["-f", str(config_file)]
|
592
|
+
if task:
|
593
|
+
args += ["--task", str(task)]
|
594
|
+
|
595
|
+
elif sel["category"] == "multi_agent":
|
596
|
+
# jarvis-multi-agent 需要 -c/--config,用户输入通过 -i/--input 传递
|
597
|
+
args = [str(sel["cmd"]), "-c", str(sel["file"])]
|
598
|
+
if task:
|
599
|
+
args += ["-i", str(task)]
|
600
|
+
|
601
|
+
elif sel["category"] == "roles":
|
602
|
+
# jarvis-platform-manager role 子命令,支持 -c/-t/-g
|
603
|
+
args = [
|
604
|
+
str(sel["cmd"]),
|
605
|
+
"role",
|
606
|
+
"-c",
|
607
|
+
str(sel["file"]),
|
608
|
+
]
|
609
|
+
if model_group:
|
610
|
+
args += ["-g", str(model_group)]
|
611
|
+
|
612
|
+
if args:
|
613
|
+
PrettyOutput.print(
|
614
|
+
f"正在启动: {' '.join(args)}", OutputType.INFO
|
615
|
+
)
|
616
|
+
os.execvp(args[0], args)
|
543
617
|
except Exception:
|
544
618
|
# 任何异常都不影响默认流程
|
545
619
|
pass
|
@@ -590,12 +664,19 @@ def run_cli(
|
|
590
664
|
"--disable-methodology-analysis",
|
591
665
|
help="禁用方法论和任务分析(覆盖配置文件设置)",
|
592
666
|
),
|
593
|
-
backup_data:
|
594
|
-
|
667
|
+
backup_data: Optional[str] = typer.Option(
|
668
|
+
None,
|
669
|
+
"--backup-data",
|
670
|
+
help="备份 Jarvis 数据目录. 可选地传入备份目录. 默认为 '~/jarvis_backups'",
|
671
|
+
show_default=False,
|
672
|
+
flag_value="~/jarvis_backups",
|
595
673
|
),
|
596
674
|
restore_data: Optional[str] = typer.Option(
|
597
675
|
None, "--restore-data", help="从指定的压缩包恢复 Jarvis 数据"
|
598
676
|
),
|
677
|
+
non_interactive: bool = typer.Option(
|
678
|
+
False, "-n", "--non-interactive", help="启用非交互模式:用户无法与命令交互,脚本执行超时限制为5分钟"
|
679
|
+
),
|
599
680
|
) -> None:
|
600
681
|
"""Jarvis AI assistant command-line interface."""
|
601
682
|
if ctx.invoked_subcommand is not None:
|
@@ -604,12 +685,43 @@ def run_cli(
|
|
604
685
|
# 使用 rich 输出命令与快捷方式总览
|
605
686
|
print_commands_overview()
|
606
687
|
|
688
|
+
# CLI 标志:非交互模式(不依赖配置文件)
|
689
|
+
if non_interactive:
|
690
|
+
try:
|
691
|
+
os.environ["JARVIS_NON_INTERACTIVE"] = "true"
|
692
|
+
except Exception:
|
693
|
+
pass
|
694
|
+
# 注意:全局配置同步在 init_env 之后执行,避免被覆盖
|
695
|
+
|
696
|
+
# 同步其他 CLI 选项到全局配置,确保后续模块读取一致
|
697
|
+
try:
|
698
|
+
if model_group:
|
699
|
+
set_config("JARVIS_LLM_GROUP", str(model_group))
|
700
|
+
if tool_group:
|
701
|
+
set_config("JARVIS_TOOL_GROUP", str(tool_group))
|
702
|
+
if disable_methodology_analysis:
|
703
|
+
set_config("JARVIS_USE_METHODOLOGY", False)
|
704
|
+
set_config("JARVIS_USE_ANALYSIS", False)
|
705
|
+
if restore_session:
|
706
|
+
set_config("JARVIS_RESTORE_SESSION", True)
|
707
|
+
except Exception:
|
708
|
+
# 静默忽略同步异常,不影响主流程
|
709
|
+
pass
|
710
|
+
|
711
|
+
# 非交互模式要求从命令行传入任务
|
712
|
+
if non_interactive and not (task and str(task).strip()):
|
713
|
+
PrettyOutput.print(
|
714
|
+
"非交互模式已启用:必须使用 --task 传入任务内容,因多行输入不可用。",
|
715
|
+
OutputType.ERROR,
|
716
|
+
)
|
717
|
+
raise typer.Exit(code=2)
|
718
|
+
|
607
719
|
# 处理数据备份
|
608
720
|
if handle_backup_option(backup_data):
|
609
721
|
return
|
610
722
|
|
611
723
|
# 处理数据恢复
|
612
|
-
if handle_restore_option(restore_data):
|
724
|
+
if handle_restore_option(restore_data, config_file):
|
613
725
|
return
|
614
726
|
|
615
727
|
# 处理配置文件编辑
|
@@ -632,18 +744,39 @@ def run_cli(
|
|
632
744
|
preload_config_for_flags(config_file)
|
633
745
|
|
634
746
|
# 在初始化环境前检测Git仓库,并可选择自动切换到代码开发模式(jca)
|
635
|
-
|
636
|
-
|
637
|
-
|
747
|
+
if not non_interactive:
|
748
|
+
try_switch_to_jca_if_git_repo(
|
749
|
+
model_group, tool_group, config_file, restore_session, task
|
750
|
+
)
|
638
751
|
|
639
752
|
# 在进入默认通用代理前,列出内置配置供选择(agent/multi_agent/roles)
|
640
|
-
|
753
|
+
# 非交互模式下跳过内置角色/配置选择
|
754
|
+
if not non_interactive:
|
755
|
+
handle_builtin_config_selector(model_group, tool_group, config_file, task)
|
641
756
|
|
642
757
|
# 初始化环境
|
643
758
|
init_env(
|
644
759
|
"欢迎使用 Jarvis AI 助手,您的智能助理已准备就绪!", config_file=config_file
|
645
760
|
)
|
646
761
|
|
762
|
+
# 在初始化环境后同步 CLI 选项到全局配置,避免被 init_env 覆盖
|
763
|
+
try:
|
764
|
+
if model_group:
|
765
|
+
set_config("JARVIS_LLM_GROUP", str(model_group))
|
766
|
+
if tool_group:
|
767
|
+
set_config("JARVIS_TOOL_GROUP", str(tool_group))
|
768
|
+
if disable_methodology_analysis:
|
769
|
+
set_config("JARVIS_USE_METHODOLOGY", False)
|
770
|
+
set_config("JARVIS_USE_ANALYSIS", False)
|
771
|
+
if restore_session:
|
772
|
+
set_config("JARVIS_RESTORE_SESSION", True)
|
773
|
+
if non_interactive:
|
774
|
+
# 保持运行期非交互标志
|
775
|
+
set_config("JARVIS_NON_INTERACTIVE", True)
|
776
|
+
except Exception:
|
777
|
+
# 静默忽略同步异常,不影响主流程
|
778
|
+
pass
|
779
|
+
|
647
780
|
# 运行主流程
|
648
781
|
try:
|
649
782
|
agent_manager = AgentManager(
|
@@ -9,6 +9,7 @@ from jarvis.jarvis_agent import Agent
|
|
9
9
|
from jarvis.jarvis_utils.input import get_multiline_input
|
10
10
|
from jarvis.jarvis_utils.output import OutputType, PrettyOutput
|
11
11
|
from jarvis.jarvis_utils.utils import init_env
|
12
|
+
from jarvis.jarvis_utils.config import set_config
|
12
13
|
|
13
14
|
app = typer.Typer(help="Jarvis AI 助手")
|
14
15
|
|
@@ -46,16 +47,45 @@ def cli(
|
|
46
47
|
None, "-c", "--agent-definition", help="代理定义文件路径"
|
47
48
|
),
|
48
49
|
task: Optional[str] = typer.Option(None, "-T", "--task", help="初始任务内容"),
|
49
|
-
|
50
|
+
|
50
51
|
model_group: Optional[str] = typer.Option(
|
51
52
|
None, "-g", "--llm-group", help="使用的模型组,覆盖配置文件中的设置"
|
52
53
|
),
|
54
|
+
non_interactive: bool = typer.Option(
|
55
|
+
False, "-n", "--non-interactive", help="启用非交互模式:用户无法与命令交互,脚本执行超时限制为5分钟"
|
56
|
+
),
|
53
57
|
):
|
54
58
|
"""Main entry point for Jarvis agent"""
|
55
|
-
#
|
59
|
+
# CLI 标志:非交互模式(不依赖配置文件)
|
60
|
+
if non_interactive:
|
61
|
+
try:
|
62
|
+
os.environ["JARVIS_NON_INTERACTIVE"] = "true"
|
63
|
+
except Exception:
|
64
|
+
pass
|
65
|
+
try:
|
66
|
+
set_config("JARVIS_NON_INTERACTIVE", True)
|
67
|
+
except Exception:
|
68
|
+
pass
|
69
|
+
# 非交互模式要求从命令行传入任务
|
70
|
+
if non_interactive and not (task and str(task).strip()):
|
71
|
+
PrettyOutput.print(
|
72
|
+
"非交互模式已启用:必须使用 --task 传入任务内容,因多行输入不可用。",
|
73
|
+
OutputType.ERROR,
|
74
|
+
)
|
75
|
+
raise typer.Exit(code=2)
|
76
|
+
# Initialize环境
|
56
77
|
init_env(
|
57
78
|
"欢迎使用 Jarvis AI 助手,您的智能助理已准备就绪!", config_file=config_file
|
58
79
|
)
|
80
|
+
# 在初始化环境后同步 CLI 选项到全局配置,避免被 init_env 覆盖
|
81
|
+
try:
|
82
|
+
if model_group:
|
83
|
+
set_config("JARVIS_LLM_GROUP", str(model_group))
|
84
|
+
if non_interactive:
|
85
|
+
set_config("JARVIS_NON_INTERACTIVE", True)
|
86
|
+
except Exception:
|
87
|
+
# 静默忽略同步异常,不影响主流程
|
88
|
+
pass
|
59
89
|
|
60
90
|
# Load configuration
|
61
91
|
config = load_config(agent_definition) if agent_definition else {}
|
{jarvis_ai_assistant-0.3.32 → jarvis_ai_assistant-0.3.34}/src/jarvis/jarvis_agent/run_loop.py
RENAMED
@@ -7,6 +7,7 @@ AgentRunLoop: 承载 Agent 的主运行循环逻辑。
|
|
7
7
|
- 暂不变更外部调用入口,后续在 Agent._main_loop 中委派到该类
|
8
8
|
- 保持与现有异常处理、工具调用、用户交互完全一致
|
9
9
|
"""
|
10
|
+
import os
|
10
11
|
from enum import Enum
|
11
12
|
from typing import Any, TYPE_CHECKING
|
12
13
|
|
@@ -22,6 +23,8 @@ if TYPE_CHECKING:
|
|
22
23
|
class AgentRunLoop:
|
23
24
|
def __init__(self, agent: "Agent") -> None:
|
24
25
|
self.agent = agent
|
26
|
+
self.conversation_rounds = 0
|
27
|
+
self.tool_reminder_rounds = int(os.environ.get("JARVIS_TOOL_REMINDER_ROUNDS", 20))
|
25
28
|
|
26
29
|
def run(self) -> Any:
|
27
30
|
"""主运行循环(委派到传入的 agent 实例的方法与属性)"""
|
@@ -29,6 +32,12 @@ class AgentRunLoop:
|
|
29
32
|
|
30
33
|
while True:
|
31
34
|
try:
|
35
|
+
self.conversation_rounds += 1
|
36
|
+
if self.conversation_rounds % self.tool_reminder_rounds == 0:
|
37
|
+
self.agent.session.addon_prompt = join_prompts(
|
38
|
+
[self.agent.session.addon_prompt, self.agent.get_tool_usage_prompt()]
|
39
|
+
)
|
40
|
+
|
32
41
|
ag = self.agent
|
33
42
|
|
34
43
|
# 更新输入处理器标志
|
{jarvis_ai_assistant-0.3.32 → jarvis_ai_assistant-0.3.34}/src/jarvis/jarvis_code_agent/code_agent.py
RENAMED
@@ -14,6 +14,7 @@ import typer
|
|
14
14
|
from jarvis.jarvis_agent import Agent
|
15
15
|
from jarvis.jarvis_agent.events import AFTER_TOOL_CALL
|
16
16
|
from jarvis.jarvis_agent.builtin_input_handler import builtin_input_handler
|
17
|
+
from jarvis.jarvis_agent.file_context_handler import file_context_handler
|
17
18
|
from jarvis.jarvis_agent.edit_file_handler import EditFileHandler
|
18
19
|
from jarvis.jarvis_agent.shell_input_handler import shell_input_handler
|
19
20
|
from jarvis.jarvis_code_agent.lint import get_lint_tools
|
@@ -23,6 +24,7 @@ from jarvis.jarvis_utils.config import (
|
|
23
24
|
is_confirm_before_apply_patch,
|
24
25
|
is_enable_static_analysis,
|
25
26
|
get_git_check_mode,
|
27
|
+
set_config,
|
26
28
|
)
|
27
29
|
from jarvis.jarvis_utils.git_utils import (
|
28
30
|
confirm_add_new_files,
|
@@ -89,7 +91,11 @@ class CodeAgent:
|
|
89
91
|
auto_complete=False,
|
90
92
|
output_handler=[tool_registry, EditFileHandler()], # type: ignore
|
91
93
|
model_group=model_group,
|
92
|
-
input_handler=[
|
94
|
+
input_handler=[
|
95
|
+
shell_input_handler,
|
96
|
+
file_context_handler,
|
97
|
+
builtin_input_handler,
|
98
|
+
],
|
93
99
|
need_summary=need_summary,
|
94
100
|
use_methodology=False, # 禁用方法论
|
95
101
|
use_analysis=False, # 禁用分析
|
@@ -770,7 +776,6 @@ class CodeAgent:
|
|
770
776
|
|
771
777
|
@app.command()
|
772
778
|
def cli(
|
773
|
-
|
774
779
|
model_group: Optional[str] = typer.Option(
|
775
780
|
None, "-g", "--llm-group", help="使用的模型组,覆盖配置文件中的设置"
|
776
781
|
),
|
@@ -801,13 +806,44 @@ def cli(
|
|
801
806
|
"--suffix",
|
802
807
|
help="提交信息后缀(用换行分隔)",
|
803
808
|
),
|
809
|
+
non_interactive: bool = typer.Option(
|
810
|
+
False, "-n", "--non-interactive", help="启用非交互模式:用户无法与命令交互,脚本执行超时限制为5分钟"
|
811
|
+
),
|
804
812
|
) -> None:
|
805
813
|
"""Jarvis主入口点。"""
|
814
|
+
# CLI 标志:非交互模式(不依赖配置文件)
|
815
|
+
if non_interactive:
|
816
|
+
try:
|
817
|
+
os.environ["JARVIS_NON_INTERACTIVE"] = "true"
|
818
|
+
except Exception:
|
819
|
+
pass
|
820
|
+
# 注意:全局配置同步放在 init_env 之后执行,避免被 init_env 覆盖
|
821
|
+
# 非交互模式要求从命令行传入任务
|
822
|
+
if non_interactive and not (requirement and str(requirement).strip()):
|
823
|
+
PrettyOutput.print(
|
824
|
+
"非交互模式已启用:必须使用 --requirement 传入任务内容,因多行输入不可用。",
|
825
|
+
OutputType.ERROR,
|
826
|
+
)
|
827
|
+
raise typer.Exit(code=2)
|
806
828
|
init_env(
|
807
829
|
"欢迎使用 Jarvis-CodeAgent,您的代码工程助手已准备就绪!",
|
808
830
|
config_file=config_file,
|
809
831
|
)
|
810
832
|
|
833
|
+
# 在初始化环境后同步 CLI 选项到全局配置,避免被 init_env 覆盖
|
834
|
+
try:
|
835
|
+
if model_group:
|
836
|
+
set_config("JARVIS_LLM_GROUP", str(model_group))
|
837
|
+
if tool_group:
|
838
|
+
set_config("JARVIS_TOOL_GROUP", str(tool_group))
|
839
|
+
if restore_session:
|
840
|
+
set_config("JARVIS_RESTORE_SESSION", True)
|
841
|
+
if non_interactive:
|
842
|
+
set_config("JARVIS_NON_INTERACTIVE", True)
|
843
|
+
except Exception:
|
844
|
+
# 静默忽略同步异常,不影响主流程
|
845
|
+
pass
|
846
|
+
|
811
847
|
try:
|
812
848
|
subprocess.run(
|
813
849
|
["git", "rev-parse", "--git-dir"],
|