jarvis-ai-assistant 0.3.29__tar.gz → 0.3.30__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 (144) hide show
  1. {jarvis_ai_assistant-0.3.29/src/jarvis_ai_assistant.egg-info → jarvis_ai_assistant-0.3.30}/PKG-INFO +1 -1
  2. {jarvis_ai_assistant-0.3.29 → jarvis_ai_assistant-0.3.30}/pyproject.toml +1 -1
  3. {jarvis_ai_assistant-0.3.29 → jarvis_ai_assistant-0.3.30}/setup.py +1 -1
  4. {jarvis_ai_assistant-0.3.29 → jarvis_ai_assistant-0.3.30}/src/jarvis/__init__.py +1 -1
  5. {jarvis_ai_assistant-0.3.29 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_agent/__init__.py +94 -7
  6. {jarvis_ai_assistant-0.3.29 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_agent/run_loop.py +1 -3
  7. {jarvis_ai_assistant-0.3.29 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_code_agent/code_agent.py +3 -2
  8. {jarvis_ai_assistant-0.3.29 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_data/config_schema.json +8 -0
  9. {jarvis_ai_assistant-0.3.29 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_tools/generate_new_tool.py +13 -2
  10. {jarvis_ai_assistant-0.3.29 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_utils/config.py +14 -0
  11. {jarvis_ai_assistant-0.3.29 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_utils/git_utils.py +20 -16
  12. {jarvis_ai_assistant-0.3.29 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_utils/utils.py +13 -11
  13. {jarvis_ai_assistant-0.3.29 → jarvis_ai_assistant-0.3.30/src/jarvis_ai_assistant.egg-info}/PKG-INFO +1 -1
  14. {jarvis_ai_assistant-0.3.29 → jarvis_ai_assistant-0.3.30}/LICENSE +0 -0
  15. {jarvis_ai_assistant-0.3.29 → jarvis_ai_assistant-0.3.30}/MANIFEST.in +0 -0
  16. {jarvis_ai_assistant-0.3.29 → jarvis_ai_assistant-0.3.30}/README.md +0 -0
  17. {jarvis_ai_assistant-0.3.29 → jarvis_ai_assistant-0.3.30}/setup.cfg +0 -0
  18. {jarvis_ai_assistant-0.3.29 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_agent/agent_manager.py +0 -0
  19. {jarvis_ai_assistant-0.3.29 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_agent/builtin_input_handler.py +0 -0
  20. {jarvis_ai_assistant-0.3.29 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_agent/config.py +0 -0
  21. {jarvis_ai_assistant-0.3.29 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_agent/config_editor.py +0 -0
  22. {jarvis_ai_assistant-0.3.29 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_agent/edit_file_handler.py +0 -0
  23. {jarvis_ai_assistant-0.3.29 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_agent/event_bus.py +0 -0
  24. {jarvis_ai_assistant-0.3.29 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_agent/events.py +0 -0
  25. {jarvis_ai_assistant-0.3.29 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_agent/file_methodology_manager.py +0 -0
  26. {jarvis_ai_assistant-0.3.29 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_agent/jarvis.py +0 -0
  27. {jarvis_ai_assistant-0.3.29 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_agent/main.py +0 -0
  28. {jarvis_ai_assistant-0.3.29 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_agent/memory_manager.py +0 -0
  29. {jarvis_ai_assistant-0.3.29 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_agent/methodology_share_manager.py +0 -0
  30. {jarvis_ai_assistant-0.3.29 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_agent/output_handler.py +0 -0
  31. {jarvis_ai_assistant-0.3.29 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_agent/prompt_builder.py +0 -0
  32. {jarvis_ai_assistant-0.3.29 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_agent/prompt_manager.py +0 -0
  33. {jarvis_ai_assistant-0.3.29 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_agent/prompts.py +0 -0
  34. {jarvis_ai_assistant-0.3.29 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_agent/protocols.py +0 -0
  35. {jarvis_ai_assistant-0.3.29 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_agent/session_manager.py +0 -0
  36. {jarvis_ai_assistant-0.3.29 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_agent/share_manager.py +0 -0
  37. {jarvis_ai_assistant-0.3.29 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_agent/shell_input_handler.py +0 -0
  38. {jarvis_ai_assistant-0.3.29 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_agent/task_analyzer.py +0 -0
  39. {jarvis_ai_assistant-0.3.29 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_agent/task_manager.py +0 -0
  40. {jarvis_ai_assistant-0.3.29 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_agent/tool_executor.py +0 -0
  41. {jarvis_ai_assistant-0.3.29 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_agent/tool_share_manager.py +0 -0
  42. {jarvis_ai_assistant-0.3.29 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_agent/user_interaction.py +0 -0
  43. {jarvis_ai_assistant-0.3.29 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_agent/utils.py +0 -0
  44. {jarvis_ai_assistant-0.3.29 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_code_agent/__init__.py +0 -0
  45. {jarvis_ai_assistant-0.3.29 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_code_agent/lint.py +0 -0
  46. {jarvis_ai_assistant-0.3.29 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_code_analysis/checklists/__init__.py +0 -0
  47. {jarvis_ai_assistant-0.3.29 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_code_analysis/checklists/c_cpp.py +0 -0
  48. {jarvis_ai_assistant-0.3.29 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_code_analysis/checklists/csharp.py +0 -0
  49. {jarvis_ai_assistant-0.3.29 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_code_analysis/checklists/data_format.py +0 -0
  50. {jarvis_ai_assistant-0.3.29 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_code_analysis/checklists/devops.py +0 -0
  51. {jarvis_ai_assistant-0.3.29 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_code_analysis/checklists/docs.py +0 -0
  52. {jarvis_ai_assistant-0.3.29 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_code_analysis/checklists/go.py +0 -0
  53. {jarvis_ai_assistant-0.3.29 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_code_analysis/checklists/infrastructure.py +0 -0
  54. {jarvis_ai_assistant-0.3.29 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_code_analysis/checklists/java.py +0 -0
  55. {jarvis_ai_assistant-0.3.29 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_code_analysis/checklists/javascript.py +0 -0
  56. {jarvis_ai_assistant-0.3.29 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_code_analysis/checklists/kotlin.py +0 -0
  57. {jarvis_ai_assistant-0.3.29 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_code_analysis/checklists/loader.py +0 -0
  58. {jarvis_ai_assistant-0.3.29 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_code_analysis/checklists/php.py +0 -0
  59. {jarvis_ai_assistant-0.3.29 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_code_analysis/checklists/python.py +0 -0
  60. {jarvis_ai_assistant-0.3.29 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_code_analysis/checklists/ruby.py +0 -0
  61. {jarvis_ai_assistant-0.3.29 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_code_analysis/checklists/rust.py +0 -0
  62. {jarvis_ai_assistant-0.3.29 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_code_analysis/checklists/shell.py +0 -0
  63. {jarvis_ai_assistant-0.3.29 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_code_analysis/checklists/sql.py +0 -0
  64. {jarvis_ai_assistant-0.3.29 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_code_analysis/checklists/swift.py +0 -0
  65. {jarvis_ai_assistant-0.3.29 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_code_analysis/checklists/web.py +0 -0
  66. {jarvis_ai_assistant-0.3.29 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_code_analysis/code_review.py +0 -0
  67. {jarvis_ai_assistant-0.3.29 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_data/tiktoken/9b5ad71b2ce5302211f9c61530b329a4922fc6a4 +0 -0
  68. {jarvis_ai_assistant-0.3.29 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_git_squash/__init__.py +0 -0
  69. {jarvis_ai_assistant-0.3.29 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_git_squash/main.py +0 -0
  70. {jarvis_ai_assistant-0.3.29 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_git_utils/git_commiter.py +0 -0
  71. {jarvis_ai_assistant-0.3.29 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_mcp/__init__.py +0 -0
  72. {jarvis_ai_assistant-0.3.29 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_mcp/sse_mcp_client.py +0 -0
  73. {jarvis_ai_assistant-0.3.29 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_mcp/stdio_mcp_client.py +0 -0
  74. {jarvis_ai_assistant-0.3.29 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_mcp/streamable_mcp_client.py +0 -0
  75. {jarvis_ai_assistant-0.3.29 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_memory_organizer/__init__.py +0 -0
  76. {jarvis_ai_assistant-0.3.29 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_memory_organizer/memory_organizer.py +0 -0
  77. {jarvis_ai_assistant-0.3.29 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_methodology/main.py +0 -0
  78. {jarvis_ai_assistant-0.3.29 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_multi_agent/__init__.py +0 -0
  79. {jarvis_ai_assistant-0.3.29 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_multi_agent/main.py +0 -0
  80. {jarvis_ai_assistant-0.3.29 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_platform/__init__.py +0 -0
  81. {jarvis_ai_assistant-0.3.29 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_platform/ai8.py +0 -0
  82. {jarvis_ai_assistant-0.3.29 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_platform/base.py +0 -0
  83. {jarvis_ai_assistant-0.3.29 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_platform/human.py +0 -0
  84. {jarvis_ai_assistant-0.3.29 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_platform/kimi.py +0 -0
  85. {jarvis_ai_assistant-0.3.29 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_platform/openai.py +0 -0
  86. {jarvis_ai_assistant-0.3.29 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_platform/registry.py +0 -0
  87. {jarvis_ai_assistant-0.3.29 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_platform/tongyi.py +0 -0
  88. {jarvis_ai_assistant-0.3.29 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_platform/yuanbao.py +0 -0
  89. {jarvis_ai_assistant-0.3.29 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_platform_manager/__init__.py +0 -0
  90. {jarvis_ai_assistant-0.3.29 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_platform_manager/main.py +0 -0
  91. {jarvis_ai_assistant-0.3.29 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_platform_manager/service.py +0 -0
  92. {jarvis_ai_assistant-0.3.29 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_rag/__init__.py +0 -0
  93. {jarvis_ai_assistant-0.3.29 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_rag/cache.py +0 -0
  94. {jarvis_ai_assistant-0.3.29 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_rag/cli.py +0 -0
  95. {jarvis_ai_assistant-0.3.29 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_rag/embedding_manager.py +0 -0
  96. {jarvis_ai_assistant-0.3.29 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_rag/llm_interface.py +0 -0
  97. {jarvis_ai_assistant-0.3.29 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_rag/query_rewriter.py +0 -0
  98. {jarvis_ai_assistant-0.3.29 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_rag/rag_pipeline.py +0 -0
  99. {jarvis_ai_assistant-0.3.29 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_rag/reranker.py +0 -0
  100. {jarvis_ai_assistant-0.3.29 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_rag/retriever.py +0 -0
  101. {jarvis_ai_assistant-0.3.29 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_smart_shell/__init__.py +0 -0
  102. {jarvis_ai_assistant-0.3.29 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_smart_shell/main.py +0 -0
  103. {jarvis_ai_assistant-0.3.29 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_stats/__init__.py +0 -0
  104. {jarvis_ai_assistant-0.3.29 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_stats/cli.py +0 -0
  105. {jarvis_ai_assistant-0.3.29 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_stats/stats.py +0 -0
  106. {jarvis_ai_assistant-0.3.29 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_stats/storage.py +0 -0
  107. {jarvis_ai_assistant-0.3.29 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_stats/visualizer.py +0 -0
  108. {jarvis_ai_assistant-0.3.29 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_tools/__init__.py +0 -0
  109. {jarvis_ai_assistant-0.3.29 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_tools/ask_user.py +0 -0
  110. {jarvis_ai_assistant-0.3.29 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_tools/base.py +0 -0
  111. {jarvis_ai_assistant-0.3.29 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_tools/clear_memory.py +0 -0
  112. {jarvis_ai_assistant-0.3.29 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_tools/cli/__init__.py +0 -0
  113. {jarvis_ai_assistant-0.3.29 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_tools/cli/main.py +0 -0
  114. {jarvis_ai_assistant-0.3.29 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_tools/edit_file.py +0 -0
  115. {jarvis_ai_assistant-0.3.29 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_tools/execute_script.py +0 -0
  116. {jarvis_ai_assistant-0.3.29 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_tools/file_analyzer.py +0 -0
  117. {jarvis_ai_assistant-0.3.29 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_tools/methodology.py +0 -0
  118. {jarvis_ai_assistant-0.3.29 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_tools/read_code.py +0 -0
  119. {jarvis_ai_assistant-0.3.29 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_tools/read_webpage.py +0 -0
  120. {jarvis_ai_assistant-0.3.29 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_tools/registry.py +0 -0
  121. {jarvis_ai_assistant-0.3.29 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_tools/retrieve_memory.py +0 -0
  122. {jarvis_ai_assistant-0.3.29 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_tools/rewrite_file.py +0 -0
  123. {jarvis_ai_assistant-0.3.29 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_tools/save_memory.py +0 -0
  124. {jarvis_ai_assistant-0.3.29 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_tools/search_web.py +0 -0
  125. {jarvis_ai_assistant-0.3.29 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_tools/sub_agent.py +0 -0
  126. {jarvis_ai_assistant-0.3.29 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_tools/sub_code_agent.py +0 -0
  127. {jarvis_ai_assistant-0.3.29 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_tools/virtual_tty.py +0 -0
  128. {jarvis_ai_assistant-0.3.29 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_utils/__init__.py +0 -0
  129. {jarvis_ai_assistant-0.3.29 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_utils/builtin_replace_map.py +0 -0
  130. {jarvis_ai_assistant-0.3.29 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_utils/clipboard.py +0 -0
  131. {jarvis_ai_assistant-0.3.29 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_utils/embedding.py +0 -0
  132. {jarvis_ai_assistant-0.3.29 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_utils/file_processors.py +0 -0
  133. {jarvis_ai_assistant-0.3.29 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_utils/fzf.py +0 -0
  134. {jarvis_ai_assistant-0.3.29 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_utils/globals.py +0 -0
  135. {jarvis_ai_assistant-0.3.29 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_utils/http.py +0 -0
  136. {jarvis_ai_assistant-0.3.29 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_utils/input.py +0 -0
  137. {jarvis_ai_assistant-0.3.29 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_utils/methodology.py +0 -0
  138. {jarvis_ai_assistant-0.3.29 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_utils/output.py +0 -0
  139. {jarvis_ai_assistant-0.3.29 → jarvis_ai_assistant-0.3.30}/src/jarvis/jarvis_utils/tag.py +0 -0
  140. {jarvis_ai_assistant-0.3.29 → jarvis_ai_assistant-0.3.30}/src/jarvis_ai_assistant.egg-info/SOURCES.txt +0 -0
  141. {jarvis_ai_assistant-0.3.29 → jarvis_ai_assistant-0.3.30}/src/jarvis_ai_assistant.egg-info/dependency_links.txt +0 -0
  142. {jarvis_ai_assistant-0.3.29 → jarvis_ai_assistant-0.3.30}/src/jarvis_ai_assistant.egg-info/entry_points.txt +0 -0
  143. {jarvis_ai_assistant-0.3.29 → jarvis_ai_assistant-0.3.30}/src/jarvis_ai_assistant.egg-info/requires.txt +0 -0
  144. {jarvis_ai_assistant-0.3.29 → jarvis_ai_assistant-0.3.30}/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.29
3
+ Version: 0.3.30
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.29"
7
+ version = "0.3.30"
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.29",
6
+ version="0.3.30",
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.29"
4
+ __version__ = "0.3.30"
@@ -4,6 +4,7 @@ import datetime
4
4
  import os
5
5
  import platform
6
6
  import re
7
+ import sys
7
8
  from pathlib import Path
8
9
  from enum import Enum
9
10
  from typing import Any, Callable, Dict, List, Optional, Protocol, Tuple, Union
@@ -48,6 +49,7 @@ from jarvis.jarvis_agent.events import (
48
49
  INTERRUPT_TRIGGERED,
49
50
  BEFORE_TOOL_FILTER,
50
51
  TOOL_FILTERED,
52
+ AFTER_TOOL_CALL,
51
53
  )
52
54
  from jarvis.jarvis_agent.user_interaction import UserInteractionHandler
53
55
  from jarvis.jarvis_agent.utils import join_prompts
@@ -68,6 +70,7 @@ from jarvis.jarvis_utils.config import (
68
70
  is_use_analysis,
69
71
  is_use_methodology,
70
72
  get_tool_filter_threshold,
73
+ get_after_tool_call_cb_dirs,
71
74
  )
72
75
  from jarvis.jarvis_utils.embedding import get_context_token_count
73
76
  from jarvis.jarvis_utils.globals import (
@@ -310,7 +313,7 @@ class Agent:
310
313
  self.first = True
311
314
  self.run_input_handlers_next_turn = False
312
315
  self.user_data: Dict[str, Any] = {}
313
- self.after_tool_call_cb: Optional[Callable[[Agent], None]] = None
316
+
314
317
 
315
318
  # 用户确认回调:默认使用 CLI 的 user_confirm,可由外部注入以支持 TUI/GUI
316
319
  self.user_confirm: Callable[[str, bool], bool] = (
@@ -361,6 +364,8 @@ class Agent:
361
364
  self.get_tool_registry(), # type: ignore
362
365
  platform_name=self.model.platform_name(), # type: ignore
363
366
  )
367
+ # 动态加载工具调用后回调
368
+ self._load_after_tool_callbacks()
364
369
 
365
370
  def _init_model(self, model_group: Optional[str]):
366
371
  """初始化模型平台(统一使用 normal 平台/模型)"""
@@ -502,13 +507,95 @@ class Agent:
502
507
  # Fallback for custom handlers that only accept one argument
503
508
  return self.multiline_inputer(tip) # type: ignore
504
509
 
505
- def set_after_tool_call_cb(self, cb: Callable[[Any], None]): # type: ignore
506
- """设置工具调用后回调函数。
507
-
508
- 参数:
509
- cb: 回调函数
510
+ def _load_after_tool_callbacks(self) -> None:
510
511
  """
511
- self.after_tool_call_cb = cb
512
+ 扫描 JARVIS_AFTER_TOOL_CALL_CB_DIRS 中的 Python 文件并动态注册回调。
513
+ 约定优先级(任一命中即注册):
514
+ - 模块级可调用对象: after_tool_call_cb
515
+ - 工厂方法返回单个或多个可调用对象: get_after_tool_call_cb(), register_after_tool_call_cb()
516
+ """
517
+ try:
518
+ dirs = get_after_tool_call_cb_dirs()
519
+ if not dirs:
520
+ return
521
+ for d in dirs:
522
+ p_dir = Path(d)
523
+ if not p_dir.exists() or not p_dir.is_dir():
524
+ continue
525
+ for file_path in p_dir.glob("*.py"):
526
+ if file_path.name == "__init__.py":
527
+ continue
528
+ parent_dir = str(file_path.parent)
529
+ added_path = False
530
+ try:
531
+ if parent_dir not in sys.path:
532
+ sys.path.insert(0, parent_dir)
533
+ added_path = True
534
+ module_name = file_path.stem
535
+ module = __import__(module_name)
536
+
537
+ candidates: List[Callable[[Any], None]] = []
538
+
539
+ # 1) 直接导出的回调
540
+ if hasattr(module, "after_tool_call_cb"):
541
+ obj = getattr(module, "after_tool_call_cb")
542
+ if callable(obj):
543
+ candidates.append(obj) # type: ignore[arg-type]
544
+
545
+ # 2) 工厂方法:get_after_tool_call_cb()
546
+ if hasattr(module, "get_after_tool_call_cb"):
547
+ factory = getattr(module, "get_after_tool_call_cb")
548
+ if callable(factory):
549
+ try:
550
+ ret = factory()
551
+ if callable(ret):
552
+ candidates.append(ret)
553
+ elif isinstance(ret, (list, tuple)):
554
+ for c in ret:
555
+ if callable(c):
556
+ candidates.append(c)
557
+ except Exception:
558
+ pass
559
+
560
+ # 3) 工厂方法:register_after_tool_call_cb()
561
+ if hasattr(module, "register_after_tool_call_cb"):
562
+ factory2 = getattr(module, "register_after_tool_call_cb")
563
+ if callable(factory2):
564
+ try:
565
+ ret2 = factory2()
566
+ if callable(ret2):
567
+ candidates.append(ret2)
568
+ elif isinstance(ret2, (list, tuple)):
569
+ for c in ret2:
570
+ if callable(c):
571
+ candidates.append(c)
572
+ except Exception:
573
+ pass
574
+
575
+ for cb in candidates:
576
+ try:
577
+ def _make_wrapper(callback):
578
+ def _wrapper(**kwargs: Any) -> None:
579
+ try:
580
+ agent = kwargs.get("agent")
581
+ callback(agent)
582
+ except Exception:
583
+ pass
584
+ return _wrapper
585
+ self.event_bus.subscribe(AFTER_TOOL_CALL, _make_wrapper(cb))
586
+ except Exception:
587
+ pass
588
+
589
+ except Exception as e:
590
+ PrettyOutput.print(f"从 {file_path} 加载回调失败: {e}", OutputType.WARNING)
591
+ finally:
592
+ if added_path:
593
+ try:
594
+ sys.path.remove(parent_dir)
595
+ except ValueError:
596
+ pass
597
+ except Exception as e:
598
+ PrettyOutput.print(f"加载回调目录时发生错误: {e}", OutputType.WARNING)
512
599
 
513
600
  def save_session(self) -> bool:
514
601
  """Saves the current session state by delegating to the session manager."""
@@ -78,9 +78,7 @@ class AgentRunLoop:
78
78
  if need_return:
79
79
  return ag.session.prompt
80
80
 
81
- # 执行回调
82
- if ag.after_tool_call_cb:
83
- ag.after_tool_call_cb(ag)
81
+
84
82
  # 广播工具调用后的事件(不影响主流程)
85
83
  try:
86
84
  ag.event_bus.emit(
@@ -12,6 +12,7 @@ from typing import List, Optional, Tuple
12
12
  import typer
13
13
 
14
14
  from jarvis.jarvis_agent import Agent
15
+ from jarvis.jarvis_agent.events import AFTER_TOOL_CALL
15
16
  from jarvis.jarvis_agent.builtin_input_handler import builtin_input_handler
16
17
  from jarvis.jarvis_agent.edit_file_handler import EditFileHandler
17
18
  from jarvis.jarvis_agent.shell_input_handler import shell_input_handler
@@ -94,7 +95,7 @@ class CodeAgent:
94
95
  use_analysis=False, # 禁用分析
95
96
  )
96
97
 
97
- self.agent.set_after_tool_call_cb(self.after_tool_call_cb)
98
+ self.agent.event_bus.subscribe(AFTER_TOOL_CALL, self._on_after_tool_call)
98
99
 
99
100
  def _get_system_prompt(self) -> str:
100
101
  """获取代码工程师的系统提示词"""
@@ -598,7 +599,7 @@ class CodeAgent:
598
599
  except RuntimeError as e:
599
600
  return f"Error during execution: {str(e)}"
600
601
 
601
- def after_tool_call_cb(self, agent: Agent) -> None:
602
+ def _on_after_tool_call(self, agent: Agent, current_response=None, need_return=None, tool_prompt=None, **kwargs) -> None:
602
603
  """工具调用后回调函数。"""
603
604
  final_ret = ""
604
605
  diff = get_diff()
@@ -247,6 +247,14 @@
247
247
  },
248
248
  "default": []
249
249
  },
250
+ "JARVIS_AFTER_TOOL_CALL_CB_DIRS": {
251
+ "type": "array",
252
+ "description": "工具调用后回调函数实现目录",
253
+ "items": {
254
+ "type": "string"
255
+ },
256
+ "default": []
257
+ },
250
258
  "JARVIS_CENTRAL_METHODOLOGY_REPO": {
251
259
  "type": "string",
252
260
  "description": "中心方法论Git仓库地址,该仓库会自动添加到方法论加载路径中",
@@ -173,9 +173,20 @@ class generate_new_tool:
173
173
  __import__(pkg)
174
174
  except ImportError:
175
175
 
176
- import subprocess
176
+ import subprocess, sys, os
177
+ from shutil import which as _which
178
+ # 优先使用 uv 安装(先查 venv 内 uv,再查 PATH 中 uv),否则回退到 python -m pip
179
+ if sys.platform == "win32":
180
+ venv_uv = os.path.join(sys.prefix, "Scripts", "uv.exe")
181
+ else:
182
+ venv_uv = os.path.join(sys.prefix, "bin", "uv")
183
+ uv_executable = venv_uv if os.path.exists(venv_uv) else (_which("uv") or None)
184
+ if uv_executable:
185
+ install_cmd = [uv_executable, "pip", "install", pkg]
186
+ else:
187
+ install_cmd = [sys.executable, "-m", "pip", "install", pkg]
188
+ subprocess.run(install_cmd, check=True)
177
189
 
178
- subprocess.run(["pip", "install", pkg], check=True)
179
190
 
180
191
  except Exception as e:
181
192
  PrettyOutput.print(f"依赖检查/安装失败: {str(e)}", OutputType.WARNING)
@@ -378,6 +378,20 @@ def get_roles_dirs() -> List[str]:
378
378
  ]
379
379
 
380
380
 
381
+ def get_after_tool_call_cb_dirs() -> List[str]:
382
+ """
383
+ 获取工具调用后回调函数实现目录。
384
+
385
+ 返回:
386
+ List[str]: 工具调用后回调函数实现目录列表
387
+ """
388
+ return [
389
+ os.path.expanduser(os.path.expandvars(str(p)))
390
+ for p in GLOBAL_CONFIG_DATA.get("JARVIS_AFTER_TOOL_CALL_CB_DIRS", [])
391
+ if p
392
+ ]
393
+
394
+
381
395
  def get_central_methodology_repo() -> str:
382
396
  """
383
397
  获取中心方法论Git仓库地址。
@@ -417,25 +417,32 @@ def check_and_update_git_repo(repo_path: str) -> bool:
417
417
  hasattr(sys, "base_prefix") and sys.base_prefix != sys.prefix
418
418
  )
419
419
 
420
- is_uv_env = False
421
- if in_venv:
422
- # 检查是否在uv创建的虚拟环境内
423
- if sys.platform == "win32":
424
- uv_path = os.path.join(sys.prefix, "Scripts", "uv.exe")
425
- else:
426
- uv_path = os.path.join(sys.prefix, "bin", "uv")
427
- if os.path.exists(uv_path):
428
- is_uv_env = True
420
+ # 检测 uv 可用性:优先虚拟环境内的 uv,其次 PATH 中的 uv
421
+ from shutil import which as _which
422
+ uv_executable = None
423
+ if sys.platform == "win32":
424
+ venv_uv = os.path.join(sys.prefix, "Scripts", "uv.exe")
425
+ else:
426
+ venv_uv = os.path.join(sys.prefix, "bin", "uv")
427
+ if os.path.exists(venv_uv):
428
+ uv_executable = venv_uv
429
+ else:
430
+ path_uv = _which("uv")
431
+ if path_uv:
432
+ uv_executable = path_uv
429
433
 
430
434
  # 根据环境选择安装命令
431
435
  # 检测是否安装了 RAG 特性(更精确)
432
436
  rag_installed = is_rag_installed()
433
437
 
434
- # 根据环境和 RAG 特性选择安装命令
435
- if rag_installed:
436
- if is_uv_env:
437
- install_cmd = ["uv", "pip", "install", "-e", ".[rag]"]
438
+ # 根据 uv 可用性与 RAG 特性选择安装命令(优先使用 uv)
439
+ if uv_executable:
440
+ if rag_installed:
441
+ install_cmd = [uv_executable, "pip", "install", "-e", ".[rag]"]
438
442
  else:
443
+ install_cmd = [uv_executable, "pip", "install", "-e", "."]
444
+ else:
445
+ if rag_installed:
439
446
  install_cmd = [
440
447
  sys.executable,
441
448
  "-m",
@@ -444,9 +451,6 @@ def check_and_update_git_repo(repo_path: str) -> bool:
444
451
  "-e",
445
452
  ".[rag]",
446
453
  ]
447
- else:
448
- if is_uv_env:
449
- install_cmd = ["uv", "pip", "install", "-e", "."]
450
454
  else:
451
455
  install_cmd = [
452
456
  sys.executable,
@@ -252,17 +252,19 @@ def _check_pip_updates() -> bool:
252
252
  hasattr(sys, "base_prefix") and sys.base_prefix != sys.prefix
253
253
  )
254
254
 
255
- # 检测是否使用uv
256
- is_uv_env = False
255
+ # 检测是否可用 uv(优先使用虚拟环境内的uv,其次PATH中的uv)
256
+ from shutil import which as _which
257
257
  uv_executable: Optional[str] = None
258
- if in_venv:
259
- if sys.platform == "win32":
260
- uv_path = Path(sys.prefix) / "Scripts" / "uv.exe"
261
- else:
262
- uv_path = Path(sys.prefix) / "bin" / "uv"
263
- if uv_path.exists():
264
- is_uv_env = True
265
- uv_executable = str(uv_path)
258
+ if sys.platform == "win32":
259
+ venv_uv = Path(sys.prefix) / "Scripts" / "uv.exe"
260
+ else:
261
+ venv_uv = Path(sys.prefix) / "bin" / "uv"
262
+ if venv_uv.exists():
263
+ uv_executable = str(venv_uv)
264
+ else:
265
+ path_uv = _which("uv")
266
+ if path_uv:
267
+ uv_executable = path_uv
266
268
 
267
269
  # 检测是否安装了 RAG 特性(更精确)
268
270
  from jarvis.jarvis_utils.utils import (
@@ -274,7 +276,7 @@ def _check_pip_updates() -> bool:
274
276
  package_spec = (
275
277
  "jarvis-ai-assistant[rag]" if rag_installed else "jarvis-ai-assistant"
276
278
  )
277
- if is_uv_env and uv_executable:
279
+ if uv_executable:
278
280
  cmd_list = [uv_executable, "pip", "install", "--upgrade", package_spec]
279
281
  update_cmd = f"uv pip install --upgrade {package_spec}"
280
282
  else:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: jarvis-ai-assistant
3
- Version: 0.3.29
3
+ Version: 0.3.30
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