jarvis-ai-assistant 0.3.34__py3-none-any.whl → 0.4.1__py3-none-any.whl
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/__init__.py +1 -1
- jarvis/jarvis_agent/__init__.py +44 -12
- jarvis/jarvis_agent/agent_manager.py +14 -10
- jarvis/jarvis_agent/config.py +2 -1
- jarvis/jarvis_agent/edit_file_handler.py +2 -2
- jarvis/jarvis_agent/jarvis.py +305 -1
- jarvis/jarvis_agent/rewrite_file_handler.py +143 -0
- jarvis/jarvis_agent/run_loop.py +5 -4
- jarvis/jarvis_agent/stdio_redirect.py +296 -0
- jarvis/jarvis_agent/utils.py +5 -1
- jarvis/jarvis_agent/web_bridge.py +189 -0
- jarvis/jarvis_agent/web_output_sink.py +53 -0
- jarvis/jarvis_agent/web_server.py +745 -0
- jarvis/jarvis_code_agent/code_agent.py +10 -12
- jarvis/jarvis_code_analysis/code_review.py +0 -1
- jarvis/jarvis_data/config_schema.json +5 -0
- jarvis/jarvis_multi_agent/__init__.py +205 -25
- jarvis/jarvis_multi_agent/main.py +10 -2
- jarvis/jarvis_platform/base.py +16 -6
- jarvis/jarvis_tools/sub_agent.py +11 -38
- jarvis/jarvis_tools/sub_code_agent.py +3 -1
- jarvis/jarvis_utils/config.py +12 -2
- {jarvis_ai_assistant-0.3.34.dist-info → jarvis_ai_assistant-0.4.1.dist-info}/METADATA +1 -1
- {jarvis_ai_assistant-0.3.34.dist-info → jarvis_ai_assistant-0.4.1.dist-info}/RECORD +28 -25
- jarvis/jarvis_tools/edit_file.py +0 -208
- jarvis/jarvis_tools/rewrite_file.py +0 -191
- {jarvis_ai_assistant-0.3.34.dist-info → jarvis_ai_assistant-0.4.1.dist-info}/WHEEL +0 -0
- {jarvis_ai_assistant-0.3.34.dist-info → jarvis_ai_assistant-0.4.1.dist-info}/entry_points.txt +0 -0
- {jarvis_ai_assistant-0.3.34.dist-info → jarvis_ai_assistant-0.4.1.dist-info}/licenses/LICENSE +0 -0
- {jarvis_ai_assistant-0.3.34.dist-info → jarvis_ai_assistant-0.4.1.dist-info}/top_level.txt +0 -0
@@ -1,15 +1,15 @@
|
|
1
|
-
jarvis/__init__.py,sha256=
|
2
|
-
jarvis/jarvis_agent/__init__.py,sha256=
|
3
|
-
jarvis/jarvis_agent/agent_manager.py,sha256=
|
1
|
+
jarvis/__init__.py,sha256=AruQMrAiWbon9fxEdGwHgikJfqVwLLpY-3aXhycGePc,73
|
2
|
+
jarvis/jarvis_agent/__init__.py,sha256=NzMMY4H73aPvRAsK-1G7iNN8beEH1RCkkXK6A9NSAts,51029
|
3
|
+
jarvis/jarvis_agent/agent_manager.py,sha256=Q0S-mYTPt8Xd7RKGoLWoWU_RP_wEXFWxCjve8_t2f2A,3807
|
4
4
|
jarvis/jarvis_agent/builtin_input_handler.py,sha256=wS-FqpT3pIXwHn1dfL3SpXonUKWgVThbQueUIeyRc2U,2917
|
5
|
-
jarvis/jarvis_agent/config.py,sha256=
|
5
|
+
jarvis/jarvis_agent/config.py,sha256=f_VmSfdEtl4a32y-fVxhcZYkni4RznBAUKjv6kET1LU,3517
|
6
6
|
jarvis/jarvis_agent/config_editor.py,sha256=hlb9EYxKWcR_qdW2O89CgNDdciR9Isi743JU_1gD8j4,1927
|
7
|
-
jarvis/jarvis_agent/edit_file_handler.py,sha256=
|
7
|
+
jarvis/jarvis_agent/edit_file_handler.py,sha256=8j7SRSWTw468fTuR-ueNKFK_0pR1GwDxTvsGGmm3zlA,24714
|
8
8
|
jarvis/jarvis_agent/event_bus.py,sha256=pRdfk7d0OG18K6yNfWlCvAh_dW5p9sBtT2Yc3jGmzgo,1519
|
9
9
|
jarvis/jarvis_agent/events.py,sha256=rmFQ37PasImCh7OCdCzNBvubk-kHwcUiYLgzmL0t0_4,3689
|
10
10
|
jarvis/jarvis_agent/file_context_handler.py,sha256=2MPn_O_2llX39meFg272Cjk3wMPn5nmgbGMUyX06YQo,2113
|
11
11
|
jarvis/jarvis_agent/file_methodology_manager.py,sha256=LnhgTx5xQXCBK8esjCkFbgFm9iEyFX7TryUlC40Kzpw,4428
|
12
|
-
jarvis/jarvis_agent/jarvis.py,sha256=
|
12
|
+
jarvis/jarvis_agent/jarvis.py,sha256=4HlG4Wfs0HRqLq3mLHx3kt5MV--yjLpAkK7KtIhskwQ,48591
|
13
13
|
jarvis/jarvis_agent/main.py,sha256=IgS7d3rng2vFlu983OUeCkOAosKjFAn1sFCk3gT9J9Q,4563
|
14
14
|
jarvis/jarvis_agent/memory_manager.py,sha256=WSyUffx9xTmkcj4QrSLEfsjI3sTMUwZmkkC9_N_gTjo,8042
|
15
15
|
jarvis/jarvis_agent/methodology_share_manager.py,sha256=AB_J9BwRgaeENQfL6bH83FOLeLrgHhppMb7psJNevKs,6874
|
@@ -18,20 +18,25 @@ jarvis/jarvis_agent/prompt_builder.py,sha256=PH1fPDVa8z_RXkoXHJFNDf8PQjUoLNLYwkh
|
|
18
18
|
jarvis/jarvis_agent/prompt_manager.py,sha256=_1qLBSA3yn4nT_N3X2npTpW40Cp-pMeyvnzu-pnG0iU,2720
|
19
19
|
jarvis/jarvis_agent/prompts.py,sha256=CvbPYx_klEz6OQrxVReZAnC2uQNo53rWkkucmh30uKg,9531
|
20
20
|
jarvis/jarvis_agent/protocols.py,sha256=YFJaC9MHi7JfLzmvlyotJDjiCO4Z07XJXy1gKhVdUy4,956
|
21
|
-
jarvis/jarvis_agent/
|
21
|
+
jarvis/jarvis_agent/rewrite_file_handler.py,sha256=FVSrfrC115_cGvdPW9RIn3A-gQAhok7GyyBfnOFdpXs,5276
|
22
|
+
jarvis/jarvis_agent/run_loop.py,sha256=kxVwFdzhzP7ZY5_aWl4-HvoQtGr4eYr8SytzvJDEDnU,5006
|
22
23
|
jarvis/jarvis_agent/session_manager.py,sha256=5wVcaZGwJ9cEKTQglSbqyxUDJ2fI5KxYN8C8L16UWLw,3024
|
23
24
|
jarvis/jarvis_agent/share_manager.py,sha256=MF2RlomcgPxF8nVUk28DP6IRddZ_tot5l_YRvy0qXSQ,8726
|
24
25
|
jarvis/jarvis_agent/shell_input_handler.py,sha256=wiAPjB-9uTkcLszbO5dlOUwIfaeR39RgRcZhahIGqoA,2018
|
26
|
+
jarvis/jarvis_agent/stdio_redirect.py,sha256=xqF-sENitpefCT3TA9oRwATFqbDrU2dvqM-UiMZRhbE,9944
|
25
27
|
jarvis/jarvis_agent/task_analyzer.py,sha256=JXc-63hnTD7oSX-nIfRcgxqCMhh4fM4QYVc7C1gp--M,7813
|
26
28
|
jarvis/jarvis_agent/task_manager.py,sha256=lme_aN8vaF_a4Tvv2kaSEnWATy8RPSjogTxeLnEYZdg,6504
|
27
29
|
jarvis/jarvis_agent/tool_executor.py,sha256=k73cKhZEZpljvui4ZxALlFEIE-iLzJ32Softsmiwzqk,1896
|
28
30
|
jarvis/jarvis_agent/tool_share_manager.py,sha256=Do08FRxis0ynwR2a6iRoa6Yq0qCP8NkuhMbPrimaxMA,5169
|
29
31
|
jarvis/jarvis_agent/user_interaction.py,sha256=tifFN49GkO_Q80sqOTVmhxwbNWTazF3K0cr8AnnvzdU,1453
|
30
|
-
jarvis/jarvis_agent/utils.py,sha256=
|
32
|
+
jarvis/jarvis_agent/utils.py,sha256=WJmKys_ceDALL73GdMCOgmjGHBzeRSPj7rmc8Pkrvzc,1784
|
33
|
+
jarvis/jarvis_agent/web_bridge.py,sha256=h15PXuPWWfZynWt8bPW4BDeCpIVoIOlRXfO0je6HDx4,6673
|
34
|
+
jarvis/jarvis_agent/web_output_sink.py,sha256=sZ6WbLZnuCdT5dS9d8msHY_g-pnj-dvML-I6uJ7-sbc,1733
|
35
|
+
jarvis/jarvis_agent/web_server.py,sha256=oZZy4nAOPhRWJn7K8VjBlho1F9AsvLEYiusKgipjO94,28204
|
31
36
|
jarvis/jarvis_code_agent/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
32
|
-
jarvis/jarvis_code_agent/code_agent.py,sha256=
|
37
|
+
jarvis/jarvis_code_agent/code_agent.py,sha256=UaYppteSUzwni-ZUDAKDrGTDijBrXU1Ia91OoLdfYLs,38072
|
33
38
|
jarvis/jarvis_code_agent/lint.py,sha256=_qLJB_bC3PuoHG-j4EGOnYzNGO26jHlKLbkysfyQW1c,3954
|
34
|
-
jarvis/jarvis_code_analysis/code_review.py,sha256=
|
39
|
+
jarvis/jarvis_code_analysis/code_review.py,sha256=A3LaxFAlIH5qCfMajIr02ExG6YiolIVpjl9blsLh4SY,34402
|
35
40
|
jarvis/jarvis_code_analysis/checklists/__init__.py,sha256=LIXAYa1sW3l7foP6kohLWnE98I_EQ0T7z5bYKHq6rJA,78
|
36
41
|
jarvis/jarvis_code_analysis/checklists/c_cpp.py,sha256=9t62bMqs6qTkFSio4SKkj88qyb5ZubWrw3MxJBQ4X1A,1317
|
37
42
|
jarvis/jarvis_code_analysis/checklists/csharp.py,sha256=ShPXrl2_UPAnGaCHAG2wLl90COG3HK2XCSr1UK2dxN4,2420
|
@@ -52,7 +57,7 @@ jarvis/jarvis_code_analysis/checklists/shell.py,sha256=aRFYhQQvTgbYd-uY5pc8UHIUA
|
|
52
57
|
jarvis/jarvis_code_analysis/checklists/sql.py,sha256=vR0T6qC7b4dURjJVAd7kSVxyvZEQXPG1Jqc2sNTGp5c,2355
|
53
58
|
jarvis/jarvis_code_analysis/checklists/swift.py,sha256=TPx4I6Gupvs6tSerRKmTSKEPQpOLEbH2Y7LXg1uBgxc,2566
|
54
59
|
jarvis/jarvis_code_analysis/checklists/web.py,sha256=25gGD7pDadZQybNFvALYxWvK0VRjGQb1NVJQElwjyk0,3943
|
55
|
-
jarvis/jarvis_data/config_schema.json,sha256=
|
60
|
+
jarvis/jarvis_data/config_schema.json,sha256=zfQni3t9KjfFd4gb6shJA0bqaVDSqBA72VMokMFQJ9c,14682
|
56
61
|
jarvis/jarvis_data/tiktoken/9b5ad71b2ce5302211f9c61530b329a4922fc6a4,sha256=Ijkht27pm96ZW3_3OFE-7xAPtR0YyTWXoRO8_-hlsqc,1681126
|
57
62
|
jarvis/jarvis_git_squash/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
58
63
|
jarvis/jarvis_git_squash/main.py,sha256=BRbsEQVXwseVFKliVqV8_JPh1om6QT6dLTHw0jQ7OE0,2474
|
@@ -64,11 +69,11 @@ jarvis/jarvis_mcp/streamable_mcp_client.py,sha256=BenOeZGNHdUOJT5Z3cc5MhS6aOeKQg
|
|
64
69
|
jarvis/jarvis_memory_organizer/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
65
70
|
jarvis/jarvis_memory_organizer/memory_organizer.py,sha256=CMFL46vvtpcTI6oS3CAlYteR6xAlwCkvVJmMT22uDRw,26295
|
66
71
|
jarvis/jarvis_methodology/main.py,sha256=uiNzk5b5O6xdvRhsOuD7ubxdd2tPcDsFFnvmes8uH8I,11370
|
67
|
-
jarvis/jarvis_multi_agent/__init__.py,sha256=
|
68
|
-
jarvis/jarvis_multi_agent/main.py,sha256=
|
72
|
+
jarvis/jarvis_multi_agent/__init__.py,sha256=Hr3AHSrxKGJjbq2r9wrK1eONiIn1Pu-4Q9rROLBW4HQ,15886
|
73
|
+
jarvis/jarvis_multi_agent/main.py,sha256=vqLzHesgQkpScVvbgOSyi6X7XoEDQYq3dJ9gZfGiPZw,3351
|
69
74
|
jarvis/jarvis_platform/__init__.py,sha256=WLQHSiE87PPket2M50_hHzjdMIgPIBx2VF8JfB_NNRk,105
|
70
75
|
jarvis/jarvis_platform/ai8.py,sha256=g8JkqPGs9SEbqstNMCc5rCHO0QcPHX9LNvb7HMWwB-Q,11471
|
71
|
-
jarvis/jarvis_platform/base.py,sha256=
|
76
|
+
jarvis/jarvis_platform/base.py,sha256=ngaQXMMHYYALrrq1Llk7WryjGR67tEtZzOTr6TQfp-k,16620
|
72
77
|
jarvis/jarvis_platform/human.py,sha256=jWjW8prEag79e6ddqTPV4nz_Gz6zFBfO4a1EbvP8QWA,4908
|
73
78
|
jarvis/jarvis_platform/kimi.py,sha256=KLsf9udAsPRMbQ2JkBeiAlXkupCBwdtMaJ-hpH4Jdkc,15711
|
74
79
|
jarvis/jarvis_platform/openai.py,sha256=4YapmkmJmPGfrjktORcIejlB98b83Wsi_48zjBymHAc,9500
|
@@ -98,7 +103,6 @@ jarvis/jarvis_tools/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSu
|
|
98
103
|
jarvis/jarvis_tools/ask_user.py,sha256=M6DdLNryCE8y1JcdZHEifUgZkPUEPNKc-zDW5p0Mb1k,2029
|
99
104
|
jarvis/jarvis_tools/base.py,sha256=tFZkRlbV_a-pbjM-ci9AYmXVJm__FXuzVWKbQEyz4Ao,1639
|
100
105
|
jarvis/jarvis_tools/clear_memory.py,sha256=8DOq6dHLemfKTJqu227PWBIp8Iu5K7EXwINzL8DYk8M,8205
|
101
|
-
jarvis/jarvis_tools/edit_file.py,sha256=UcJNTVCDEmRaQsN_7_Ip2LjrTDm4wWzj2deuZHiBvLI,9026
|
102
106
|
jarvis/jarvis_tools/execute_script.py,sha256=kjl-c6OmQPEeGqEjbuEGoGhb2nAiQoYzz2_2_Y3tIlY,8277
|
103
107
|
jarvis/jarvis_tools/file_analyzer.py,sha256=jzVb8fAJn3dWwpCiYH-Wuxva4kpHqBB2_V3x3mzY0Gs,4158
|
104
108
|
jarvis/jarvis_tools/generate_new_tool.py,sha256=tJz0YtfDwyH9y00VEWw3Btqr9JCNhvtI8BN9i5hYk_M,8560
|
@@ -107,18 +111,17 @@ jarvis/jarvis_tools/read_code.py,sha256=F1RuO0c69t0h7CvrUGqrTyNcOCcUrFQPACc61O_Y
|
|
107
111
|
jarvis/jarvis_tools/read_webpage.py,sha256=dfyXJ9vaX-ZRbua1P5ZlaU_SlSzKkeNw-1kI_3-gxFE,5433
|
108
112
|
jarvis/jarvis_tools/registry.py,sha256=yVXBrJ7plyn7Dr3dD6mPmgd6eiBftmd19Cc84-PwVN8,33312
|
109
113
|
jarvis/jarvis_tools/retrieve_memory.py,sha256=hhhGSr7jebPHICY9oEKICyI8mfqsRtKjh58qZNZApKc,8624
|
110
|
-
jarvis/jarvis_tools/rewrite_file.py,sha256=CuvjWPTbUaPbex9FKSmw_Ru4r6R-CX_3vqTqCTp8nHA,6959
|
111
114
|
jarvis/jarvis_tools/save_memory.py,sha256=RQtNxcpU53FFv_EBjH0i0oyQ7jWubm-trD1BHuqaGjI,6985
|
112
115
|
jarvis/jarvis_tools/search_web.py,sha256=Hi8WBxcRH02qjOF1qcJP2qSqs3kVOKGFAARfh548Ii4,6370
|
113
|
-
jarvis/jarvis_tools/sub_agent.py,sha256=
|
114
|
-
jarvis/jarvis_tools/sub_code_agent.py,sha256=
|
116
|
+
jarvis/jarvis_tools/sub_agent.py,sha256=Qjr5Ikul0gmtwGehCjy1yOSsbwE9hWiGQvwrOWPef_g,8028
|
117
|
+
jarvis/jarvis_tools/sub_code_agent.py,sha256=KpwTCU89kq_RGNpfyA1C0bTl-f0dTvsCyDKplU-hrds,9600
|
115
118
|
jarvis/jarvis_tools/virtual_tty.py,sha256=L7-J00ARQvIa25T45Hhqg2eCBl6W2LFgqDlWMWf-7dk,25275
|
116
119
|
jarvis/jarvis_tools/cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
117
120
|
jarvis/jarvis_tools/cli/main.py,sha256=WL2GNV7WqYl7G1-btRGvCkzDCMk4fPfNvzCrnUFVPxs,9323
|
118
121
|
jarvis/jarvis_utils/__init__.py,sha256=67h0ldisGlh3oK4DAeNEL2Bl_VsI3tSmfclasyVlueM,850
|
119
122
|
jarvis/jarvis_utils/builtin_replace_map.py,sha256=z8iAqsbZUiGFaozxG1xSu128op8udqHOeEw-GxNt4bU,1708
|
120
123
|
jarvis/jarvis_utils/clipboard.py,sha256=D3wzQeqg_yiH7Axs4d6MRxyNa9XxdnenH-ND2uj2WVQ,2967
|
121
|
-
jarvis/jarvis_utils/config.py,sha256=
|
124
|
+
jarvis/jarvis_utils/config.py,sha256=Pk-ddQELZ5-vJgRdkwrBbstJJghhGsD_5BtNk5-UO3k,22638
|
122
125
|
jarvis/jarvis_utils/embedding.py,sha256=x6mrkL7Bc3qgfuBDsjc4fg4nKG8ofGxVLVVydbsb8PY,2838
|
123
126
|
jarvis/jarvis_utils/file_processors.py,sha256=XiM248SHS7lLgQDCbORVFWqinbVDUawYxWDOsLXDxP8,3043
|
124
127
|
jarvis/jarvis_utils/fzf.py,sha256=vCs0Uh5dUqGbWzXn2JCtLLCOYE2B39ZNdNveR9PK4DA,1681
|
@@ -130,9 +133,9 @@ jarvis/jarvis_utils/methodology.py,sha256=z_renvRGgHiC-XTQPuN6rvrJ_ffHlwxK_b1BU_
|
|
130
133
|
jarvis/jarvis_utils/output.py,sha256=y2fVcao_2ZowFl0IxUrJZCi8T6ZM0z-iPzpk8T8eLxc,13623
|
131
134
|
jarvis/jarvis_utils/tag.py,sha256=f211opbbbTcSyzCDwuIK_oCnKhXPNK-RknYyGzY1yD0,431
|
132
135
|
jarvis/jarvis_utils/utils.py,sha256=uMtfaStxDtp2i9AFIxwtPKgSxLwQxw8Z2rXsX-ZGlis,72728
|
133
|
-
jarvis_ai_assistant-0.
|
134
|
-
jarvis_ai_assistant-0.
|
135
|
-
jarvis_ai_assistant-0.
|
136
|
-
jarvis_ai_assistant-0.
|
137
|
-
jarvis_ai_assistant-0.
|
138
|
-
jarvis_ai_assistant-0.
|
136
|
+
jarvis_ai_assistant-0.4.1.dist-info/licenses/LICENSE,sha256=AGgVgQmTqFvaztRtCAXsAMryUymB18gZif7_l2e1XOg,1063
|
137
|
+
jarvis_ai_assistant-0.4.1.dist-info/METADATA,sha256=DR0N8vMawLJe7n5NdIYeeuE-cFC2xBqxXiBvVcUT148,18751
|
138
|
+
jarvis_ai_assistant-0.4.1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
139
|
+
jarvis_ai_assistant-0.4.1.dist-info/entry_points.txt,sha256=4GcWKFxRJD-QU14gw_3ZaW4KuEVxOcZK9i270rwPdjA,1395
|
140
|
+
jarvis_ai_assistant-0.4.1.dist-info/top_level.txt,sha256=1BOxyWfzOP_ZXj8rVTDnNCJ92bBGB0rwq8N1PCpoMIs,7
|
141
|
+
jarvis_ai_assistant-0.4.1.dist-info/RECORD,,
|
jarvis/jarvis_tools/edit_file.py
DELETED
@@ -1,208 +0,0 @@
|
|
1
|
-
# -*- coding: utf-8 -*-
|
2
|
-
"""
|
3
|
-
文件编辑工具类
|
4
|
-
|
5
|
-
功能概述:
|
6
|
-
1. 提供精确的文件内容搜索和替换功能,支持多组修改
|
7
|
-
2. 支持单个文件的编辑操作,包括创建新文件
|
8
|
-
3. 实现原子操作:所有修改要么全部成功,要么全部回滚
|
9
|
-
4. 严格匹配控制:每个搜索文本必须且只能匹配一次
|
10
|
-
|
11
|
-
核心特性:
|
12
|
-
- 支持不存在的文件和空文件处理
|
13
|
-
- 自动创建所需目录结构
|
14
|
-
- 完善的错误处理和回滚机制
|
15
|
-
- 严格的格式保持要求
|
16
|
-
"""
|
17
|
-
from typing import Any, Dict, List
|
18
|
-
|
19
|
-
from jarvis.jarvis_agent.edit_file_handler import EditFileHandler
|
20
|
-
|
21
|
-
|
22
|
-
class FileSearchReplaceTool:
|
23
|
-
name = "edit_file"
|
24
|
-
description = """代码编辑工具,用于精确修改一个或多个文件
|
25
|
-
|
26
|
-
# 文件编辑工具使用指南
|
27
|
-
|
28
|
-
## 基本使用
|
29
|
-
1. 指定需要修改的文件路径(单个或多个)
|
30
|
-
2. 提供一组或多组修改,每个修改支持两种格式:
|
31
|
-
- 单点替换:
|
32
|
-
- reason: 修改原因描述
|
33
|
-
- SEARCH: 需要查找的原始代码(必须包含足够上下文)
|
34
|
-
- REPLACE: 替换后的新代码
|
35
|
-
- 区间替换:
|
36
|
-
- reason: 修改原因描述
|
37
|
-
- SEARCH_START: 起始标记
|
38
|
-
- SEARCH_END: 结束标记
|
39
|
-
- REPLACE: 替换后的新代码
|
40
|
-
- RANGE: 可选的行号范围 'start-end' (1-based, 闭区间), 用于限定匹配范围
|
41
|
-
- **说明**: 区间替换会从包含 SEARCH_START 的行首开始,到包含 SEARCH_END 的行尾结束,替换整个区域
|
42
|
-
|
43
|
-
## 核心原则
|
44
|
-
1. **精准修改**: 只修改必要的代码部分,保持其他部分不变
|
45
|
-
2. **最小补丁原则**: 生成最小范围的补丁,包含必要的上下文
|
46
|
-
3. **唯一匹配**:
|
47
|
-
- 单点替换:确保 SEARCH 在文件中唯一匹配
|
48
|
-
- 区间替换:确保在指定范围内,第一个 SEARCH_START 之后能找到 SEARCH_END
|
49
|
-
4. **格式保持**: 严格保持原始代码的格式风格
|
50
|
-
5. **部分成功**: 支持多个文件编辑,允许部分文件编辑成功
|
51
|
-
|
52
|
-
"""
|
53
|
-
parameters = {
|
54
|
-
"type": "object",
|
55
|
-
"properties": {
|
56
|
-
"files": {
|
57
|
-
"type": "array",
|
58
|
-
"description": "需要修改的文件路径列表",
|
59
|
-
"items": {
|
60
|
-
"type": "object",
|
61
|
-
"properties": {
|
62
|
-
"path": {"type": "string", "description": "文件路径"},
|
63
|
-
"changes": {
|
64
|
-
"type": "array",
|
65
|
-
"description": "一组或多组修改,每个修改必须包含1-2行上下文用于精确定位",
|
66
|
-
"items": {
|
67
|
-
"type": "object",
|
68
|
-
"properties": {
|
69
|
-
"reason": {
|
70
|
-
"type": "string",
|
71
|
-
"description": "修改的原因",
|
72
|
-
},
|
73
|
-
"SEARCH": {
|
74
|
-
"type": "string",
|
75
|
-
"description": "需要查找的原始代码(单点替换模式)",
|
76
|
-
},
|
77
|
-
"SEARCH_START": {
|
78
|
-
"type": "string",
|
79
|
-
"description": "区间替换的起始标记(包含在替换范围内)",
|
80
|
-
},
|
81
|
-
"SEARCH_END": {
|
82
|
-
"type": "string",
|
83
|
-
"description": "区间替换的结束标记(包含在替换范围内)",
|
84
|
-
},
|
85
|
-
"REPLACE": {
|
86
|
-
"type": "string",
|
87
|
-
"description": "替换后的新代码",
|
88
|
-
},
|
89
|
-
"RANGE": {
|
90
|
-
"type": "string",
|
91
|
-
"description": "行号范围 'start-end'(1-based,闭区间),可选,仅用于区间替换模式,用于限定匹配与替换的行号范围",
|
92
|
-
},
|
93
|
-
},
|
94
|
-
},
|
95
|
-
},
|
96
|
-
},
|
97
|
-
"required": ["path", "changes"],
|
98
|
-
},
|
99
|
-
},
|
100
|
-
},
|
101
|
-
"required": ["files"],
|
102
|
-
}
|
103
|
-
|
104
|
-
def execute(self, args: Dict) -> Dict[str, Any]:
|
105
|
-
"""执行文件编辑操作,支持快速编辑和AI辅助编辑两种模式。
|
106
|
-
|
107
|
-
主要功能:
|
108
|
-
1. 处理多个文件的创建或修改,支持不存在的文件
|
109
|
-
2. 每个文件独立处理,允许部分文件编辑成功
|
110
|
-
3. 自动选择编辑模式(fast_edit或slow_edit)
|
111
|
-
4. 保存修改前后的文件状态以便回滚
|
112
|
-
5. 提供详细的执行状态输出
|
113
|
-
|
114
|
-
参数:
|
115
|
-
args: 包含以下键的字典:
|
116
|
-
- files: 文件列表,每个文件包含(必填):
|
117
|
-
- path: 要修改的文件路径
|
118
|
-
- changes: 修改列表,每个修改支持两种格式:
|
119
|
-
1) 单点替换:
|
120
|
-
- reason: 修改原因描述
|
121
|
-
- SEARCH: 需要查找的原始代码(必须包含足够上下文)
|
122
|
-
- REPLACE: 替换后的新代码
|
123
|
-
2) 区间替换:
|
124
|
-
- reason: 修改原因描述
|
125
|
-
- SEARCH_START: 起始标记
|
126
|
-
- SEARCH_END: 结束标记
|
127
|
-
- REPLACE: 替换后的新代码
|
128
|
-
- **说明**: 区间替换会从包含 SEARCH_START 的行首开始,到包含 SEARCH_END 的行尾结束,替换整个区域
|
129
|
-
|
130
|
-
返回:
|
131
|
-
Dict[str, Any] 包含:
|
132
|
-
- success: 是否至少有一个文件编辑成功(True/False)
|
133
|
-
- stdout: 成功时的输出消息
|
134
|
-
- stderr: 失败时的错误消息
|
135
|
-
- results: 每个文件的处理结果列表
|
136
|
-
|
137
|
-
异常处理:
|
138
|
-
1. 捕获并记录文件操作异常
|
139
|
-
2. 失败的修改尝试回滚到原始状态
|
140
|
-
3. 新创建的文件在失败时会被删除
|
141
|
-
4. 提供3次重试机制确保操作可靠性
|
142
|
-
5. 支持大文件处理(自动上传到模型平台)
|
143
|
-
|
144
|
-
实现细节:
|
145
|
-
1. 优先尝试fast_edit模式
|
146
|
-
2. 如果fast_edit失败,则尝试slow_edit模式
|
147
|
-
3. 严格检查搜索文本的唯一匹配性
|
148
|
-
4. 保持原始代码的格式风格
|
149
|
-
"""
|
150
|
-
import os
|
151
|
-
|
152
|
-
from jarvis.jarvis_utils.output import OutputType, PrettyOutput
|
153
|
-
|
154
|
-
stdout_messages: List[str] = []
|
155
|
-
overall_success = False
|
156
|
-
file_results = []
|
157
|
-
|
158
|
-
for file_info in args["files"]:
|
159
|
-
file_path = os.path.abspath(file_info["path"])
|
160
|
-
changes = file_info["changes"]
|
161
|
-
|
162
|
-
try:
|
163
|
-
success, result = EditFileHandler._fast_edit(file_path, changes)
|
164
|
-
if success:
|
165
|
-
stdout_message = f"文件 {file_path} 修改完成"
|
166
|
-
stdout_messages.append(stdout_message)
|
167
|
-
overall_success = True
|
168
|
-
file_results.append(
|
169
|
-
{
|
170
|
-
"file": file_path,
|
171
|
-
"success": True,
|
172
|
-
"stdout": stdout_message,
|
173
|
-
"stderr": "",
|
174
|
-
}
|
175
|
-
)
|
176
|
-
else:
|
177
|
-
PrettyOutput.print(f"文件 {file_path} 处理失败", OutputType.ERROR)
|
178
|
-
file_results.append(
|
179
|
-
{
|
180
|
-
"file": file_path,
|
181
|
-
"success": False,
|
182
|
-
"stdout": "",
|
183
|
-
"stderr": result,
|
184
|
-
}
|
185
|
-
)
|
186
|
-
except Exception as e:
|
187
|
-
error_msg = f"文件搜索替换操作失败: {str(e)}"
|
188
|
-
PrettyOutput.print(error_msg, OutputType.WARNING)
|
189
|
-
file_results.append(
|
190
|
-
{
|
191
|
-
"file": file_path,
|
192
|
-
"success": False,
|
193
|
-
"stdout": "",
|
194
|
-
"stderr": error_msg,
|
195
|
-
}
|
196
|
-
)
|
197
|
-
|
198
|
-
# 整合所有错误信息到stderr
|
199
|
-
all_stderr: List[str] = []
|
200
|
-
for file_result in file_results:
|
201
|
-
if not file_result["success"]:
|
202
|
-
all_stderr.append(f"文件 {file_result['file']} 处理失败: {file_result['stderr']}")
|
203
|
-
|
204
|
-
return {
|
205
|
-
"success": overall_success,
|
206
|
-
"stdout": "\n".join(stdout_messages) if overall_success else "",
|
207
|
-
"stderr": "\n".join(all_stderr) if not overall_success else "",
|
208
|
-
}
|
@@ -1,191 +0,0 @@
|
|
1
|
-
# -*- coding: utf-8 -*-
|
2
|
-
"""
|
3
|
-
文件重写工具类
|
4
|
-
|
5
|
-
功能概述:
|
6
|
-
1. 提供完整的文件重写功能
|
7
|
-
2. 支持创建新文件或完全重写现有文件
|
8
|
-
3. 实现原子操作:所有修改要么全部成功,要么全部回滚
|
9
|
-
4. 自动创建所需目录结构
|
10
|
-
|
11
|
-
核心特性:
|
12
|
-
- 支持不存在的文件和空文件处理
|
13
|
-
- 自动创建所需目录结构
|
14
|
-
- 完善的错误处理和回滚机制
|
15
|
-
- 保持文件格式和编码
|
16
|
-
"""
|
17
|
-
from typing import Any, Dict
|
18
|
-
|
19
|
-
|
20
|
-
class FileRewriteTool:
|
21
|
-
name = "rewrite_file"
|
22
|
-
description = """文件重写工具,用于完全重写或创建文件
|
23
|
-
|
24
|
-
# 文件重写规范
|
25
|
-
|
26
|
-
## 重要提示
|
27
|
-
此工具用于完全重写文件内容或创建新文件。与edit_file不同,此工具会替换文件的全部内容。
|
28
|
-
|
29
|
-
## 基本使用
|
30
|
-
1. 指定需要重写的文件路径
|
31
|
-
2. 提供新的文件内容
|
32
|
-
3. 所有操作要么全部成功,要么全部失败并回滚
|
33
|
-
|
34
|
-
## 核心原则
|
35
|
-
1. **完整重写**:提供完整的文件内容,将替换原文件的所有内容
|
36
|
-
2. **格式保持**:
|
37
|
-
- 保持原始代码的缩进方式(空格或制表符)
|
38
|
-
- 保持原始代码的空行数量和位置
|
39
|
-
- 保持原始代码的行尾空格处理方式
|
40
|
-
- 不改变原始代码的换行风格
|
41
|
-
|
42
|
-
## 最佳实践
|
43
|
-
1. 确保提供格式良好的完整文件内容
|
44
|
-
2. 创建新文件时提供完整、格式良好的内容
|
45
|
-
3. 不要出现未实现的代码,如:TODO
|
46
|
-
"""
|
47
|
-
parameters = {
|
48
|
-
"type": "object",
|
49
|
-
"properties": {
|
50
|
-
"file": {"type": "string", "description": "需要重写的文件路径"},
|
51
|
-
"content": {
|
52
|
-
"type": "string",
|
53
|
-
"description": "新的文件内容,将完全替换原文件内容",
|
54
|
-
},
|
55
|
-
},
|
56
|
-
"required": ["file", "content"],
|
57
|
-
}
|
58
|
-
|
59
|
-
def __init__(self):
|
60
|
-
"""初始化文件重写工具"""
|
61
|
-
pass
|
62
|
-
|
63
|
-
def execute(self, args: Dict) -> Dict[str, Any]:
|
64
|
-
"""
|
65
|
-
执行文件重写操作,完全替换文件内容
|
66
|
-
|
67
|
-
参数:
|
68
|
-
file (str): 文件路径
|
69
|
-
content (str): 新的文件内容
|
70
|
-
|
71
|
-
返回:
|
72
|
-
dict: 包含执行结果的字典
|
73
|
-
{
|
74
|
-
"success": bool, # 是否成功完成重写
|
75
|
-
"stdout": str, # 标准输出信息
|
76
|
-
"stderr": str # 错误信息
|
77
|
-
}
|
78
|
-
"""
|
79
|
-
import os
|
80
|
-
|
81
|
-
from jarvis.jarvis_utils.output import OutputType, PrettyOutput
|
82
|
-
|
83
|
-
stdout_messages = []
|
84
|
-
stderr_messages = []
|
85
|
-
success = True
|
86
|
-
|
87
|
-
file_path = args["file"]
|
88
|
-
new_content = args["content"]
|
89
|
-
agent = args.get("agent", None)
|
90
|
-
abs_path = os.path.abspath(file_path)
|
91
|
-
|
92
|
-
# 创建已处理文件变量,用于失败时回滚
|
93
|
-
original_content = None
|
94
|
-
processed = False
|
95
|
-
|
96
|
-
try:
|
97
|
-
file_exists = os.path.exists(file_path)
|
98
|
-
|
99
|
-
try:
|
100
|
-
# 如果文件存在,则读取原内容用于回滚
|
101
|
-
if file_exists:
|
102
|
-
with open(abs_path, "r", encoding="utf-8") as f:
|
103
|
-
original_content = f.read()
|
104
|
-
|
105
|
-
# 确保目录存在
|
106
|
-
os.makedirs(os.path.dirname(abs_path), exist_ok=True)
|
107
|
-
|
108
|
-
# 写入新内容
|
109
|
-
with open(abs_path, "w", encoding="utf-8") as f:
|
110
|
-
f.write(new_content)
|
111
|
-
|
112
|
-
processed = True
|
113
|
-
|
114
|
-
action = "创建并写入" if not file_exists else "成功重写"
|
115
|
-
stdout_message = f"文件 {abs_path} {action}"
|
116
|
-
stdout_messages.append(stdout_message)
|
117
|
-
|
118
|
-
except Exception as e:
|
119
|
-
stderr_message = f"处理文件 {file_path} 时出错: {str(e)}"
|
120
|
-
stderr_messages.append(stderr_message)
|
121
|
-
PrettyOutput.print(stderr_message, OutputType.WARNING)
|
122
|
-
success = False
|
123
|
-
|
124
|
-
# 如果操作失败,回滚已修改的文件
|
125
|
-
if not success and processed:
|
126
|
-
rollback_message = "操作失败,正在回滚修改..."
|
127
|
-
stderr_messages.append(rollback_message)
|
128
|
-
|
129
|
-
try:
|
130
|
-
if original_content is None:
|
131
|
-
# 如果是新创建的文件,则删除
|
132
|
-
if os.path.exists(abs_path):
|
133
|
-
os.remove(abs_path)
|
134
|
-
rollback_file_message = f"已删除新创建的文件: {abs_path}"
|
135
|
-
else:
|
136
|
-
# 如果是修改的文件,则恢复原内容
|
137
|
-
with open(abs_path, "w", encoding="utf-8") as f:
|
138
|
-
f.write(original_content)
|
139
|
-
rollback_file_message = f"已回滚文件: {abs_path}"
|
140
|
-
|
141
|
-
stderr_messages.append(rollback_file_message)
|
142
|
-
except Exception as e:
|
143
|
-
rollback_error = f"回滚文件 {file_path} 失败: {str(e)}"
|
144
|
-
stderr_messages.append(rollback_error)
|
145
|
-
PrettyOutput.print(rollback_error, OutputType.WARNING)
|
146
|
-
|
147
|
-
# 记录成功处理的文件(使用绝对路径)
|
148
|
-
if success and agent:
|
149
|
-
abs_path = os.path.abspath(file_path)
|
150
|
-
files = agent.get_user_data("files")
|
151
|
-
if files:
|
152
|
-
if abs_path not in files:
|
153
|
-
files.append(abs_path)
|
154
|
-
else:
|
155
|
-
files = [abs_path]
|
156
|
-
agent.set_user_data("files", files)
|
157
|
-
|
158
|
-
return {
|
159
|
-
"success": success,
|
160
|
-
"stdout": "\n".join(stdout_messages),
|
161
|
-
"stderr": "\n".join(stderr_messages),
|
162
|
-
}
|
163
|
-
|
164
|
-
except Exception as e:
|
165
|
-
error_msg = f"文件重写操作失败: {str(e)}"
|
166
|
-
PrettyOutput.print(error_msg, OutputType.WARNING)
|
167
|
-
|
168
|
-
# 如果有已修改的文件,尝试回滚
|
169
|
-
if processed:
|
170
|
-
rollback_message = "操作失败,正在回滚修改..."
|
171
|
-
stderr_messages.append(rollback_message)
|
172
|
-
|
173
|
-
try:
|
174
|
-
if original_content is None:
|
175
|
-
# 如果是新创建的文件,则删除
|
176
|
-
if os.path.exists(file_path):
|
177
|
-
os.remove(file_path)
|
178
|
-
stderr_messages.append(f"已删除新创建的文件: {file_path}")
|
179
|
-
else:
|
180
|
-
# 如果是修改的文件,则恢复原内容
|
181
|
-
with open(file_path, "w", encoding="utf-8") as f:
|
182
|
-
f.write(original_content)
|
183
|
-
stderr_messages.append(f"已回滚文件: {file_path}")
|
184
|
-
except:
|
185
|
-
stderr_messages.append(f"回滚文件失败: {file_path}")
|
186
|
-
|
187
|
-
return {
|
188
|
-
"success": False,
|
189
|
-
"stdout": "",
|
190
|
-
"stderr": error_msg + "\n" + "\n".join(stderr_messages),
|
191
|
-
}
|
File without changes
|
{jarvis_ai_assistant-0.3.34.dist-info → jarvis_ai_assistant-0.4.1.dist-info}/entry_points.txt
RENAMED
File without changes
|
{jarvis_ai_assistant-0.3.34.dist-info → jarvis_ai_assistant-0.4.1.dist-info}/licenses/LICENSE
RENAMED
File without changes
|
File without changes
|