jarvis-ai-assistant 0.4.0__tar.gz → 0.4.1__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 (151) hide show
  1. {jarvis_ai_assistant-0.4.0/src/jarvis_ai_assistant.egg-info → jarvis_ai_assistant-0.4.1}/PKG-INFO +1 -1
  2. {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/pyproject.toml +1 -1
  3. {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/setup.py +1 -1
  4. {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/__init__.py +1 -1
  5. {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_agent/__init__.py +36 -7
  6. {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_agent/agent_manager.py +6 -4
  7. {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_agent/config.py +2 -1
  8. {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_agent/edit_file_handler.py +2 -2
  9. {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_agent/jarvis.py +40 -9
  10. jarvis_ai_assistant-0.4.1/src/jarvis/jarvis_agent/rewrite_file_handler.py +143 -0
  11. {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_agent/run_loop.py +5 -4
  12. {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_agent/utils.py +5 -1
  13. {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_agent/web_server.py +332 -234
  14. {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_code_agent/code_agent.py +10 -7
  15. {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_code_analysis/code_review.py +0 -1
  16. {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_data/config_schema.json +5 -0
  17. jarvis_ai_assistant-0.4.1/src/jarvis/jarvis_multi_agent/__init__.py +389 -0
  18. {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_multi_agent/main.py +10 -1
  19. {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_platform/base.py +15 -6
  20. {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_tools/sub_agent.py +11 -35
  21. {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_tools/sub_code_agent.py +3 -1
  22. {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_utils/config.py +10 -0
  23. {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1/src/jarvis_ai_assistant.egg-info}/PKG-INFO +1 -1
  24. {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis_ai_assistant.egg-info/SOURCES.txt +1 -2
  25. jarvis_ai_assistant-0.4.0/src/jarvis/jarvis_multi_agent/__init__.py +0 -209
  26. jarvis_ai_assistant-0.4.0/src/jarvis/jarvis_tools/edit_file.py +0 -208
  27. jarvis_ai_assistant-0.4.0/src/jarvis/jarvis_tools/rewrite_file.py +0 -191
  28. {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/LICENSE +0 -0
  29. {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/MANIFEST.in +0 -0
  30. {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/README.md +0 -0
  31. {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/setup.cfg +0 -0
  32. {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_agent/builtin_input_handler.py +0 -0
  33. {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_agent/config_editor.py +0 -0
  34. {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_agent/event_bus.py +0 -0
  35. {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_agent/events.py +0 -0
  36. {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_agent/file_context_handler.py +0 -0
  37. {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_agent/file_methodology_manager.py +0 -0
  38. {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_agent/main.py +0 -0
  39. {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_agent/memory_manager.py +0 -0
  40. {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_agent/methodology_share_manager.py +0 -0
  41. {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_agent/output_handler.py +0 -0
  42. {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_agent/prompt_builder.py +0 -0
  43. {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_agent/prompt_manager.py +0 -0
  44. {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_agent/prompts.py +0 -0
  45. {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_agent/protocols.py +0 -0
  46. {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_agent/session_manager.py +0 -0
  47. {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_agent/share_manager.py +0 -0
  48. {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_agent/shell_input_handler.py +0 -0
  49. {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_agent/stdio_redirect.py +0 -0
  50. {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_agent/task_analyzer.py +0 -0
  51. {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_agent/task_manager.py +0 -0
  52. {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_agent/tool_executor.py +0 -0
  53. {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_agent/tool_share_manager.py +0 -0
  54. {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_agent/user_interaction.py +0 -0
  55. {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_agent/web_bridge.py +0 -0
  56. {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_agent/web_output_sink.py +0 -0
  57. {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_code_agent/__init__.py +0 -0
  58. {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_code_agent/lint.py +0 -0
  59. {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_code_analysis/checklists/__init__.py +0 -0
  60. {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_code_analysis/checklists/c_cpp.py +0 -0
  61. {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_code_analysis/checklists/csharp.py +0 -0
  62. {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_code_analysis/checklists/data_format.py +0 -0
  63. {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_code_analysis/checklists/devops.py +0 -0
  64. {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_code_analysis/checklists/docs.py +0 -0
  65. {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_code_analysis/checklists/go.py +0 -0
  66. {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_code_analysis/checklists/infrastructure.py +0 -0
  67. {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_code_analysis/checklists/java.py +0 -0
  68. {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_code_analysis/checklists/javascript.py +0 -0
  69. {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_code_analysis/checklists/kotlin.py +0 -0
  70. {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_code_analysis/checklists/loader.py +0 -0
  71. {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_code_analysis/checklists/php.py +0 -0
  72. {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_code_analysis/checklists/python.py +0 -0
  73. {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_code_analysis/checklists/ruby.py +0 -0
  74. {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_code_analysis/checklists/rust.py +0 -0
  75. {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_code_analysis/checklists/shell.py +0 -0
  76. {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_code_analysis/checklists/sql.py +0 -0
  77. {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_code_analysis/checklists/swift.py +0 -0
  78. {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_code_analysis/checklists/web.py +0 -0
  79. {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_data/tiktoken/9b5ad71b2ce5302211f9c61530b329a4922fc6a4 +0 -0
  80. {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_git_squash/__init__.py +0 -0
  81. {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_git_squash/main.py +0 -0
  82. {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_git_utils/git_commiter.py +0 -0
  83. {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_mcp/__init__.py +0 -0
  84. {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_mcp/sse_mcp_client.py +0 -0
  85. {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_mcp/stdio_mcp_client.py +0 -0
  86. {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_mcp/streamable_mcp_client.py +0 -0
  87. {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_memory_organizer/__init__.py +0 -0
  88. {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_memory_organizer/memory_organizer.py +0 -0
  89. {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_methodology/main.py +0 -0
  90. {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_platform/__init__.py +0 -0
  91. {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_platform/ai8.py +0 -0
  92. {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_platform/human.py +0 -0
  93. {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_platform/kimi.py +0 -0
  94. {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_platform/openai.py +0 -0
  95. {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_platform/registry.py +0 -0
  96. {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_platform/tongyi.py +0 -0
  97. {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_platform/yuanbao.py +0 -0
  98. {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_platform_manager/__init__.py +0 -0
  99. {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_platform_manager/main.py +0 -0
  100. {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_platform_manager/service.py +0 -0
  101. {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_rag/__init__.py +0 -0
  102. {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_rag/cache.py +0 -0
  103. {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_rag/cli.py +0 -0
  104. {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_rag/embedding_manager.py +0 -0
  105. {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_rag/llm_interface.py +0 -0
  106. {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_rag/query_rewriter.py +0 -0
  107. {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_rag/rag_pipeline.py +0 -0
  108. {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_rag/reranker.py +0 -0
  109. {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_rag/retriever.py +0 -0
  110. {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_smart_shell/__init__.py +0 -0
  111. {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_smart_shell/main.py +0 -0
  112. {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_stats/__init__.py +0 -0
  113. {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_stats/cli.py +0 -0
  114. {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_stats/stats.py +0 -0
  115. {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_stats/storage.py +0 -0
  116. {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_stats/visualizer.py +0 -0
  117. {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_tools/__init__.py +0 -0
  118. {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_tools/ask_user.py +0 -0
  119. {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_tools/base.py +0 -0
  120. {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_tools/clear_memory.py +0 -0
  121. {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_tools/cli/__init__.py +0 -0
  122. {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_tools/cli/main.py +0 -0
  123. {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_tools/execute_script.py +0 -0
  124. {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_tools/file_analyzer.py +0 -0
  125. {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_tools/generate_new_tool.py +0 -0
  126. {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_tools/methodology.py +0 -0
  127. {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_tools/read_code.py +0 -0
  128. {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_tools/read_webpage.py +0 -0
  129. {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_tools/registry.py +0 -0
  130. {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_tools/retrieve_memory.py +0 -0
  131. {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_tools/save_memory.py +0 -0
  132. {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_tools/search_web.py +0 -0
  133. {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_tools/virtual_tty.py +0 -0
  134. {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_utils/__init__.py +0 -0
  135. {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_utils/builtin_replace_map.py +0 -0
  136. {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_utils/clipboard.py +0 -0
  137. {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_utils/embedding.py +0 -0
  138. {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_utils/file_processors.py +0 -0
  139. {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_utils/fzf.py +0 -0
  140. {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_utils/git_utils.py +0 -0
  141. {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_utils/globals.py +0 -0
  142. {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_utils/http.py +0 -0
  143. {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_utils/input.py +0 -0
  144. {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_utils/methodology.py +0 -0
  145. {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_utils/output.py +0 -0
  146. {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_utils/tag.py +0 -0
  147. {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis/jarvis_utils/utils.py +0 -0
  148. {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis_ai_assistant.egg-info/dependency_links.txt +0 -0
  149. {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis_ai_assistant.egg-info/entry_points.txt +0 -0
  150. {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/src/jarvis_ai_assistant.egg-info/requires.txt +0 -0
  151. {jarvis_ai_assistant-0.4.0 → jarvis_ai_assistant-0.4.1}/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.4.0
3
+ Version: 0.4.1
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.4.0"
7
+ version = "0.4.1"
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.4.0",
6
+ version="0.4.1",
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.4.0"
4
+ __version__ = "0.4.1"
@@ -31,6 +31,8 @@ from jarvis.jarvis_agent.prompts import (
31
31
  TASK_ANALYSIS_PROMPT,
32
32
  )
33
33
  from jarvis.jarvis_tools.registry import ToolRegistry
34
+ from jarvis.jarvis_agent.edit_file_handler import EditFileHandler
35
+ from jarvis.jarvis_agent.rewrite_file_handler import RewriteFileHandler
34
36
  from jarvis.jarvis_agent.prompt_manager import PromptManager
35
37
  from jarvis.jarvis_agent.event_bus import EventBus
36
38
  from jarvis.jarvis_agent.config import AgentConfig
@@ -74,6 +76,7 @@ from jarvis.jarvis_utils.config import (
74
76
  is_use_methodology,
75
77
  get_tool_filter_threshold,
76
78
  get_after_tool_call_cb_dirs,
79
+ set_config,
77
80
  )
78
81
  from jarvis.jarvis_utils.embedding import get_context_token_count
79
82
  from jarvis.jarvis_utils.globals import (
@@ -285,6 +288,8 @@ class Agent:
285
288
  force_save_memory: Optional[bool] = None,
286
289
  files: Optional[List[str]] = None,
287
290
  confirm_callback: Optional[Callable[[str, bool], bool]] = None,
291
+ non_interactive: Optional[bool] = None,
292
+ **kwargs,
288
293
  ):
289
294
  """初始化Jarvis Agent实例
290
295
 
@@ -295,7 +300,6 @@ class Agent:
295
300
 
296
301
  summary_prompt: 任务总结提示模板
297
302
  auto_complete: 是否自动完成任务
298
- output_handler: 输出处理器列表
299
303
  execute_tool_confirm: 执行工具前是否需要确认
300
304
  need_summary: 是否需要生成总结
301
305
  multiline_inputer: 多行输入处理器
@@ -303,6 +307,7 @@ class Agent:
303
307
  use_analysis: 是否使用任务分析
304
308
  force_save_memory: 是否强制保存记忆
305
309
  confirm_callback: 用户确认回调函数,签名为 (tip: str, default: bool) -> bool;默认使用CLI的user_confirm
310
+ non_interactive: 是否以非交互模式运行(优先级最高,覆盖环境变量与配置)
306
311
  """
307
312
  # 基础属性初始化
308
313
  self.files = files or []
@@ -327,14 +332,33 @@ class Agent:
327
332
 
328
333
  # 初始化处理器
329
334
  self._init_handlers(
330
- output_handler or [],
331
335
  multiline_inputer,
336
+ output_handler,
332
337
  use_tools or [],
333
338
  )
334
339
  # 初始化用户交互封装,保持向后兼容
335
340
  self.user_interaction = UserInteractionHandler(self.multiline_inputer, self.user_confirm)
336
341
  # 将确认函数指向封装后的 confirm,保持既有调用不变
337
342
  self.user_confirm = self.user_interaction.confirm # type: ignore[assignment]
343
+ # 非交互模式参数支持:允许通过构造参数显式控制,便于其他Agent调用时设置
344
+ try:
345
+ # 优先使用构造参数,其次回退到环境变量
346
+ self.non_interactive = (
347
+ bool(non_interactive)
348
+ if non_interactive is not None
349
+ else str(os.environ.get("JARVIS_NON_INTERACTIVE", "")).lower() in ("1", "true", "yes")
350
+ )
351
+ # 如果构造参数显式提供,则同步到环境变量与全局配置,供下游组件读取
352
+ if non_interactive is not None:
353
+ os.environ["JARVIS_NON_INTERACTIVE"] = "true" if self.non_interactive else "false"
354
+ try:
355
+ set_config("JARVIS_NON_INTERACTIVE", self.non_interactive)
356
+ except Exception:
357
+ # 配置同步失败不影响主流程
358
+ pass
359
+ except Exception:
360
+ # 防御式回退
361
+ self.non_interactive = False
338
362
 
339
363
  # 初始化配置
340
364
  self._init_config(
@@ -394,12 +418,12 @@ class Agent:
394
418
 
395
419
  def _init_handlers(
396
420
  self,
397
- output_handler: List[OutputHandlerProtocol],
398
421
  multiline_inputer: Optional[Callable[[str], str]],
422
+ output_handler: Optional[List[OutputHandlerProtocol]],
399
423
  use_tools: List[str],
400
424
  ):
401
425
  """初始化各种处理器"""
402
- self.output_handler = output_handler or [ToolRegistry()]
426
+ self.output_handler = output_handler or [ToolRegistry(), EditFileHandler(), RewriteFileHandler()]
403
427
  self.set_use_tools(use_tools)
404
428
  self.input_handler = [
405
429
  builtin_input_handler,
@@ -900,13 +924,17 @@ class Agent:
900
924
 
901
925
  if self.need_summary:
902
926
 
903
- self.session.prompt = self.summary_prompt
927
+ # 确保总结提示词非空:若为None或仅空白,则回退到默认提示词
928
+ safe_summary_prompt = self.summary_prompt or ""
929
+ if isinstance(safe_summary_prompt, str) and safe_summary_prompt.strip() == "":
930
+ safe_summary_prompt = DEFAULT_SUMMARY_PROMPT
931
+ # 注意:不要写回 session.prompt,避免 BEFORE_SUMMARY 事件回调修改/清空后导致使用空prompt
904
932
  # 广播将要生成总结事件
905
933
  try:
906
934
  self.event_bus.emit(
907
935
  BEFORE_SUMMARY,
908
936
  agent=self,
909
- prompt=self.session.prompt,
937
+ prompt=safe_summary_prompt,
910
938
  auto_completed=auto_completed,
911
939
  need_summary=self.need_summary,
912
940
  )
@@ -915,7 +943,8 @@ class Agent:
915
943
 
916
944
  if not self.model:
917
945
  raise RuntimeError("Model not initialized")
918
- ret = self.model.chat_until_success(self.session.prompt) # type: ignore
946
+ # 直接使用本地变量,避免受事件回调影响
947
+ ret = self.model.chat_until_success(safe_summary_prompt) # type: ignore
919
948
  # 防御: 总结阶段模型可能返回空响应(None或空字符串),统一为空字符串并告警
920
949
  if not ret:
921
950
  try:
@@ -16,7 +16,7 @@ from jarvis.jarvis_agent.file_context_handler import file_context_handler
16
16
  from jarvis.jarvis_agent.shell_input_handler import shell_input_handler
17
17
  from jarvis.jarvis_agent.task_manager import TaskManager
18
18
  from jarvis.jarvis_tools.registry import ToolRegistry
19
- from jarvis.jarvis_utils.config import is_non_interactive
19
+ from jarvis.jarvis_utils.config import is_non_interactive, is_skip_predefined_tasks
20
20
 
21
21
 
22
22
  class AgentManager:
@@ -31,6 +31,7 @@ class AgentManager:
31
31
  use_analysis: Optional[bool] = None,
32
32
  multiline_inputer: Optional[Callable[[str], str]] = None,
33
33
  confirm_callback: Optional[Callable[[str, bool], bool]] = None,
34
+ non_interactive: Optional[bool] = None,
34
35
  ):
35
36
  self.model_group = model_group
36
37
  self.tool_group = tool_group
@@ -41,6 +42,7 @@ class AgentManager:
41
42
  # 可选:注入输入与确认回调,用于Web模式等前端替代交互
42
43
  self.multiline_inputer = multiline_inputer
43
44
  self.confirm_callback = confirm_callback
45
+ self.non_interactive = non_interactive
44
46
 
45
47
  def initialize(self) -> Agent:
46
48
  """初始化Agent"""
@@ -53,12 +55,12 @@ class AgentManager:
53
55
  self.agent = Agent(
54
56
  system_prompt=origin_agent_system_prompt,
55
57
  model_group=self.model_group,
56
- output_handler=[ToolRegistry()], # type: ignore
57
58
  need_summary=False,
58
59
  use_methodology=self.use_methodology,
59
60
  use_analysis=self.use_analysis,
60
61
  multiline_inputer=self.multiline_inputer,
61
62
  confirm_callback=self.confirm_callback,
63
+ non_interactive=self.non_interactive,
62
64
  )
63
65
 
64
66
  # 尝试恢复会话
@@ -80,8 +82,8 @@ class AgentManager:
80
82
  self.agent.run(task_content)
81
83
  raise typer.Exit(code=0)
82
84
 
83
- # 处理预定义任务(非交互模式下跳过)
84
- if not is_non_interactive() and self.agent.first:
85
+ # 处理预定义任务(非交互模式下跳过;支持配置跳过加载)
86
+ if not is_non_interactive() and not is_skip_predefined_tasks() and self.agent.first:
85
87
  task_manager = TaskManager()
86
88
  tasks = task_manager.load_tasks()
87
89
  if tasks and (selected_task := task_manager.select_task(tasks)):
@@ -81,7 +81,8 @@ class AgentConfig:
81
81
  cfg.execute_tool_confirm = is_execute_tool_confirm()
82
82
 
83
83
  # summary_prompt
84
- if cfg.summary_prompt is None:
84
+ # Treat None or whitespace-only string as unset, fallback to default
85
+ if cfg.summary_prompt is None or (isinstance(cfg.summary_prompt, str) and cfg.summary_prompt.strip() == ""):
85
86
  cfg.summary_prompt = DEFAULT_SUMMARY_PROMPT
86
87
 
87
88
  # max_token_count
@@ -92,10 +92,10 @@ class EditFileHandler(OutputHandler):
92
92
  if not patches:
93
93
  return False, "未找到有效的文件编辑指令"
94
94
 
95
- # 记录 edit_file 工具调用统计
95
+ # 记录 PATCH 操作调用统计
96
96
  from jarvis.jarvis_stats.stats import StatsManager
97
97
 
98
- StatsManager.increment("edit_file", group="tool")
98
+ StatsManager.increment("patch", group="tool")
99
99
 
100
100
  results = []
101
101
 
@@ -595,7 +595,10 @@ def handle_builtin_config_selector(
595
595
 
596
596
  elif sel["category"] == "multi_agent":
597
597
  # jarvis-multi-agent 需要 -c/--config,用户输入通过 -i/--input 传递
598
+ # 同时传递 -g/--llm-group 以继承 jvs 的模型组选择
598
599
  args = [str(sel["cmd"]), "-c", str(sel["file"])]
600
+ if model_group:
601
+ args += ["-g", str(model_group)]
599
602
  if task:
600
603
  args += ["-i", str(task)]
601
604
 
@@ -967,14 +970,14 @@ def run_cli(
967
970
  return
968
971
 
969
972
  # 在初始化环境前检测Git仓库,并可选择自动切换到代码开发模式(jca)
970
- if not non_interactive and not web:
973
+ if not non_interactive:
971
974
  try_switch_to_jca_if_git_repo(
972
975
  model_group, tool_group, config_file, restore_session, task
973
976
  )
974
977
 
975
978
  # 在进入默认通用代理前,列出内置配置供选择(agent/multi_agent/roles)
976
979
  # 非交互模式下跳过内置角色/配置选择
977
- if not non_interactive and not web:
980
+ if not non_interactive:
978
981
  handle_builtin_config_selector(model_group, tool_group, config_file, task)
979
982
 
980
983
  # 初始化环境
@@ -1005,13 +1008,9 @@ def run_cli(
1005
1008
  # 在 Web 模式下注入基于 WebSocket 的输入/确认回调
1006
1009
  extra_kwargs = {}
1007
1010
  if web:
1008
- try:
1009
- from jarvis.jarvis_agent.web_bridge import web_multiline_input, web_user_confirm
1010
- extra_kwargs["multiline_inputer"] = web_multiline_input
1011
- extra_kwargs["confirm_callback"] = web_user_confirm
1012
- except Exception as e:
1013
- PrettyOutput.print(f"Web 模式初始化失败(加载 Web 桥接模块): {e}", OutputType.ERROR)
1014
- raise typer.Exit(code=1)
1011
+ # 纯 xterm 交互模式:不注入 WebBridge 的输入/确认回调,避免阻塞等待浏览器响应
1012
+ #(交互由 /terminal PTY 会话中的 jvs 进程处理)
1013
+ pass
1015
1014
 
1016
1015
  agent_manager = AgentManager(
1017
1016
  model_group=model_group,
@@ -1019,6 +1018,7 @@ def run_cli(
1019
1018
  restore_session=restore_session,
1020
1019
  use_methodology=False if disable_methodology_analysis else None,
1021
1020
  use_analysis=False if disable_methodology_analysis else None,
1021
+ non_interactive=non_interactive,
1022
1022
  **extra_kwargs,
1023
1023
  )
1024
1024
  agent = agent_manager.initialize()
@@ -1051,6 +1051,37 @@ def run_cli(
1051
1051
  enable_web_stdin_redirect()
1052
1052
  except Exception:
1053
1053
  pass
1054
+ # 记录用于交互式终端(PTY)重启的 jvs 启动命令(移除 web 相关参数)
1055
+ try:
1056
+ import sys as _sys, os as _os, json as _json
1057
+ _argv = list(_sys.argv)
1058
+ # 去掉程序名(argv[0]),并过滤 --web 相关参数
1059
+ filtered = []
1060
+ i = 1
1061
+ while i < len(_argv):
1062
+ a = _argv[i]
1063
+ if a == "--web" or a.startswith("--web="):
1064
+ i += 1
1065
+ continue
1066
+ if a == "--web-host":
1067
+ i += 2
1068
+ continue
1069
+ if a.startswith("--web-host="):
1070
+ i += 1
1071
+ continue
1072
+ if a == "--web-port":
1073
+ i += 2
1074
+ continue
1075
+ if a.startswith("--web-port="):
1076
+ i += 1
1077
+ continue
1078
+ filtered.append(a)
1079
+ i += 1
1080
+ # 使用 jvs 命令作为可执行文件,保留其余业务参数
1081
+ cmd = ["jvs"] + filtered
1082
+ _os.environ["JARVIS_WEB_LAUNCH_JSON"] = _json.dumps(cmd, ensure_ascii=False)
1083
+ except Exception:
1084
+ pass
1054
1085
  PrettyOutput.print("以 Web 模式启动,请在浏览器中打开提供的地址进行交互。", OutputType.INFO)
1055
1086
  # 启动 Web 服务(阻塞调用)
1056
1087
  start_web_server(agent_manager, host=web_host, port=web_port)
@@ -0,0 +1,143 @@
1
+ # -*- coding: utf-8 -*-
2
+ import os
3
+ import re
4
+ from typing import Any, Dict, List, Tuple
5
+
6
+ from jarvis.jarvis_agent.output_handler import OutputHandler
7
+ from jarvis.jarvis_utils.output import OutputType, PrettyOutput
8
+ from jarvis.jarvis_utils.tag import ct, ot
9
+
10
+
11
+ class RewriteFileHandler(OutputHandler):
12
+ """
13
+ 处理整文件重写指令的输出处理器。
14
+
15
+ 指令格式:
16
+ <REWRITE file=文件路径>
17
+ 新的文件完整内容
18
+ </REWRITE>
19
+
20
+ 等价支持以下写法:
21
+ <REWRITE file=文件路径>
22
+ 新的文件完整内容
23
+ </REWRITE>
24
+
25
+ 说明:
26
+ - 该处理器用于完全重写文件内容,适用于新增文件或大范围改写
27
+ - 内部直接执行写入,提供失败回滚能力
28
+ - 支持同一响应中包含多个 REWRITE/REWRITE 块
29
+ """
30
+
31
+ def __init__(self) -> None:
32
+ # 允许 file 参数为单引号、双引号或无引号
33
+ self.rewrite_pattern_file = re.compile(
34
+ ot("REWRITE file=(?:'([^']+)'|\"([^\"]+)\"|([^>]+))")
35
+ + r"\s*"
36
+ + r"(.*?)"
37
+ + r"\s*"
38
+ + r"^"
39
+ + ct("REWRITE"),
40
+ re.DOTALL | re.MULTILINE,
41
+ )
42
+
43
+ def name(self) -> str:
44
+ """获取处理器名称,用于操作列表展示"""
45
+ return "REWRITE"
46
+
47
+ def prompt(self) -> str:
48
+ """返回用户提示,描述使用方法与格式"""
49
+ return f"""文件重写指令格式:
50
+ {ot("REWRITE file=文件路径")}
51
+ 新的文件完整内容
52
+ {ct("REWRITE")}
53
+
54
+ 注意:
55
+ - {ot("REWRITE")}、{ct("REWRITE")} 必须出现在行首,否则不生效(会被忽略)
56
+ - 整文件重写会完全替换文件内容,如需局部修改请使用 PATCH 操作
57
+ - 该操作由处理器直接执行,具备失败回滚能力"""
58
+
59
+ def can_handle(self, response: str) -> bool:
60
+ """判断响应中是否包含 REWRITE/REWRITE 指令"""
61
+ return bool(self.rewrite_pattern_file.search(response))
62
+
63
+ def handle(self, response: str, agent: Any) -> Tuple[bool, str]:
64
+ """解析并执行整文件重写指令"""
65
+ rewrites = self._parse_rewrites(response)
66
+ if not rewrites:
67
+ return False, "未找到有效的文件重写指令"
68
+
69
+ # 记录 REWRITE 操作调用统计
70
+ try:
71
+ from jarvis.jarvis_stats.stats import StatsManager
72
+
73
+ StatsManager.increment("rewrite_file", group="tool")
74
+ except Exception:
75
+ # 统计失败不影响主流程
76
+ pass
77
+
78
+ results: List[str] = []
79
+ overall_success = True
80
+
81
+ for file_path, content in rewrites:
82
+ abs_path = os.path.abspath(file_path)
83
+ original_content = None
84
+ processed = False
85
+ try:
86
+ file_exists = os.path.exists(abs_path)
87
+ if file_exists:
88
+ with open(abs_path, "r", encoding="utf-8") as rf:
89
+ original_content = rf.read()
90
+ os.makedirs(os.path.dirname(abs_path), exist_ok=True)
91
+ with open(abs_path, "w", encoding="utf-8") as wf:
92
+ wf.write(content)
93
+ processed = True
94
+ results.append(f"✅ 文件 {abs_path} 重写成功")
95
+ # 记录成功处理的文件(使用绝对路径)
96
+ if agent:
97
+ files = agent.get_user_data("files")
98
+ if files:
99
+ if abs_path not in files:
100
+ files.append(abs_path)
101
+ else:
102
+ files = [abs_path]
103
+ agent.set_user_data("files", files)
104
+ except Exception as e:
105
+ overall_success = False
106
+ # 回滚已修改内容
107
+ try:
108
+ if processed:
109
+ if original_content is None:
110
+ if os.path.exists(abs_path):
111
+ os.remove(abs_path)
112
+ else:
113
+ with open(abs_path, "w", encoding="utf-8") as wf:
114
+ wf.write(original_content)
115
+ except Exception:
116
+ pass
117
+ PrettyOutput.print(f"文件重写失败: {str(e)}", OutputType.ERROR)
118
+ results.append(f"❌ 文件 {abs_path} 重写失败: {str(e)}")
119
+
120
+ summary = "\n".join(results)
121
+ # 按现有 EditFileHandler 约定,始终返回 (False, summary) 以继续主循环
122
+ return False, summary
123
+
124
+ def _parse_rewrites(self, response: str) -> List[Tuple[str, str]]:
125
+ """
126
+ 解析响应中的 REWRITE/REWRITE 指令块。
127
+ 返回列表 [(file_path, content), ...],按在响应中的出现顺序排序
128
+ """
129
+ items: List[Tuple[str, str]] = []
130
+ matches: List[Tuple[int, Any]] = []
131
+ for m in self.rewrite_pattern_file.finditer(response):
132
+ matches.append((m.start(), m))
133
+
134
+ # 按出现顺序排序
135
+ matches.sort(key=lambda x: x[0])
136
+
137
+ for _, m in matches:
138
+ file_path = m.group(1) or m.group(2) or m.group(3) or ""
139
+ file_path = file_path.strip()
140
+ content = m.group(4)
141
+ if file_path:
142
+ items.append((file_path, content))
143
+ return items
@@ -81,12 +81,13 @@ class AgentRunLoop:
81
81
  pass
82
82
  need_return, tool_prompt = ag._call_tools(current_response)
83
83
 
84
- # 将上一个提示和工具提示安全地拼接起来
85
- ag.session.prompt = join_prompts([ag.session.prompt, tool_prompt])
86
-
84
+ # 如果工具要求立即返回结果(例如 SEND_MESSAGE 需要将字典返回给上层),直接返回该结果
87
85
  if need_return:
88
- return ag.session.prompt
86
+ return tool_prompt
89
87
 
88
+ # 将上一个提示和工具提示安全地拼接起来(仅当工具结果为字符串时)
89
+ safe_tool_prompt = tool_prompt if isinstance(tool_prompt, str) else ""
90
+ ag.session.prompt = join_prompts([ag.session.prompt, safe_tool_prompt])
90
91
 
91
92
  # 广播工具调用后的事件(不影响主流程)
92
93
  try:
@@ -16,7 +16,11 @@ def join_prompts(parts: Iterable[str]) -> str:
16
16
  - 使用两个换行分隔
17
17
  - 不进行额外 strip,保持调用方原样语义
18
18
  """
19
- non_empty: List[str] = [p for p in parts if p]
19
+ try:
20
+ non_empty: List[str] = [p for p in parts if isinstance(p, str) and p]
21
+ except Exception:
22
+ # 防御性处理:若 parts 不可迭代或出现异常,直接返回空字符串
23
+ return ""
20
24
  return "\n\n".join(non_empty)
21
25
 
22
26
  def is_auto_complete(response: str) -> bool: