auto-coder 0.1.341__py3-none-any.whl → 0.1.343__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.

Potentially problematic release.


This version of auto-coder might be problematic. Click here for more details.

@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: auto-coder
3
- Version: 0.1.341
3
+ Version: 0.1.343
4
4
  Summary: AutoCoder: AutoCoder
5
5
  Author: allwefantasy
6
6
  Classifier: Programming Language :: Python :: 3.10
@@ -14,7 +14,7 @@ autocoder/command_parser.py,sha256=fx1g9E6GaM273lGTcJqaFQ-hoksS_Ik2glBMnVltPCE,1
14
14
  autocoder/lang.py,sha256=PFtATuOhHRnfpqHQkXr6p4C893JvpsgwTMif3l-GEi0,14321
15
15
  autocoder/models.py,sha256=_SCar82QIeBFTZZBdM2jPS6atKVhHnvE0gX3V0CsxD4,11590
16
16
  autocoder/run_context.py,sha256=IUfSO6_gp2Wt1blFWAmOpN0b0nDrTTk4LmtCYUBIoro,1643
17
- autocoder/version.py,sha256=LegJaIowJMsa5uThYESSu9bRr94ij_6zuPr7GfWvb-4,23
17
+ autocoder/version.py,sha256=74rg5Dx1XgbjJnY4e4JBHBAF8e-ViGvp4zlQJAiMaxw,23
18
18
  autocoder/agent/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
19
19
  autocoder/agent/agentic_edit.py,sha256=XsfePZ-t6M-uBSdG1VLZXk1goqXk2HPeJ_A8IYyBuWQ,58896
20
20
  autocoder/agent/agentic_edit_types.py,sha256=oFcDd_cxJ2yH9Ed1uTpD3BipudgoIEWDMPb5pAkq4gI,3288
@@ -44,9 +44,9 @@ autocoder/agent/agentic_edit_tools/use_mcp_tool_resolver.py,sha256=5WWH8-lEZO29d
44
44
  autocoder/agent/agentic_edit_tools/write_to_file_tool_resolver.py,sha256=HPX1g7Nh7H8I3P2MNmIK4HXLh8IZYaedQgRZAeGxNdc,5135
45
45
  autocoder/chat/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
46
46
  autocoder/commands/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
47
- autocoder/commands/auto_command.py,sha256=jz_I1nuELIDM7-hFPQt_9DBS0R8N7IxmE79BL3AHGBY,64216
47
+ autocoder/commands/auto_command.py,sha256=Ogg-mj7lnGBnBzebnYjszvZ8-cxgdl3qJSW9niidhiY,64678
48
48
  autocoder/commands/auto_web.py,sha256=Cc0eb6JN3SvFy3GD_lpSLvIqj7F1eFDTcwg1t-zDcKg,39024
49
- autocoder/commands/tools.py,sha256=BqQaHVgOJfS1uWRw_hgSldMc44qnEjxVNk8JI0OiMCg,33762
49
+ autocoder/commands/tools.py,sha256=iET_nL8Zn0oK-vIZLZT8y3Zh4ljCTuoJlaOOYVEaKvY,33693
50
50
  autocoder/common/JupyterClient.py,sha256=O-wi6pXeAEYhAY24kDa0BINrLYvKS6rKyWe98pDClS0,2816
51
51
  autocoder/common/ShellClient.py,sha256=fM1q8t_XMSbLBl2zkCNC2J9xuyKN3eXzGm6hHhqL2WY,2286
52
52
  autocoder/common/__init__.py,sha256=U6oImbo5n_sLcFLS7ZAMZqnCc-3DYeVYD9K6r1V7mSk,14601
@@ -126,18 +126,18 @@ autocoder/common/v2/code_editblock_manager.py,sha256=G0CIuV9Ki0FqMLnpA8nBT4pnkCN
126
126
  autocoder/common/v2/code_manager.py,sha256=C403bS-f6urixwitlKHcml-J03hci-UyNwHJOqBiY6Q,9182
127
127
  autocoder/common/v2/code_strict_diff_manager.py,sha256=v-J1kDyLg7tLGg_6_lbO9S4fNkx7M_L8Xr2G7fPptiU,9347
128
128
  autocoder/common/v2/agent/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
129
- autocoder/common/v2/agent/agentic_edit.py,sha256=e35KhV0hTz973RcF98qylVFCaBoWtC0EufmEZgHrHD4,91123
129
+ autocoder/common/v2/agent/agentic_edit.py,sha256=Nw2rXRMhiPzrd69eRuZOzbHYY_Qk9Ph4WiERU2Zqwec,91585
130
130
  autocoder/common/v2/agent/agentic_edit_conversation.py,sha256=qLLhTegH619JQTp3s1bj5FVn2hAcoV-DlhGO3UyIOMc,7338
131
131
  autocoder/common/v2/agent/agentic_edit_types.py,sha256=6qBLLmvdlcsbzrpMHsYQVIHqbOWubMXOnmkqTs1pBWQ,4629
132
132
  autocoder/common/v2/agent/agentic_tool_display.py,sha256=WKirt-2V346KLnbHgH3NVJiK3xvriD9oaCWj2IdvzLU,7309
133
133
  autocoder/common/v2/agent/agentic_edit_tools/__init__.py,sha256=wGICCc1dYh07osB21j62zOQ9Ws0PyyOQ12UYRHmHrtI,1229
134
- autocoder/common/v2/agent/agentic_edit_tools/ask_followup_question_tool_resolver.py,sha256=pjrukXjWXMIfUAUzoHzr7j2Onf1L7bxmjsUR1gGaFoA,2809
134
+ autocoder/common/v2/agent/agentic_edit_tools/ask_followup_question_tool_resolver.py,sha256=YktmocUR0ygth8CVq9gXdUzIhX3FicULhwmnA_DTfik,3099
135
135
  autocoder/common/v2/agent/agentic_edit_tools/attempt_completion_tool_resolver.py,sha256=82ZGKeRBSDKeead_XVBW4FxpiE-5dS7tBOk_3RZ6B5s,1511
136
136
  autocoder/common/v2/agent/agentic_edit_tools/base_tool_resolver.py,sha256=Zid2m1uZd-2wVFGc_n_KAViXZyNjbdLSpI5n7ut1RUQ,1036
137
137
  autocoder/common/v2/agent/agentic_edit_tools/execute_command_tool_resolver.py,sha256=GueQfIY2hVu2R5j9R5rBtn2znl5MlmEdGtsa6snsMHs,4112
138
138
  autocoder/common/v2/agent/agentic_edit_tools/list_code_definition_names_tool_resolver.py,sha256=8QoMsADUDWliqiDt_dpguz31403syB8eeW0Pcw-qfb8,3842
139
139
  autocoder/common/v2/agent/agentic_edit_tools/list_files_tool_resolver.py,sha256=ERM5E7s2azQ8vcvogan4A_LZci8Pmhmxw1uQaNQhon4,5469
140
- autocoder/common/v2/agent/agentic_edit_tools/plan_mode_respond_tool_resolver.py,sha256=SZwFUxK6d2BaKWqQXi_c3IVe2iffviF6VUXJA9T9sx0,1492
140
+ autocoder/common/v2/agent/agentic_edit_tools/plan_mode_respond_tool_resolver.py,sha256=lGT4_QYJK6Fa9f6HVSGo0cSsGK7qCsDYgJGUowNxPzk,1499
141
141
  autocoder/common/v2/agent/agentic_edit_tools/read_file_tool_resolver.py,sha256=9Bh0KVbL0qiIqwChlb77biiBiETQ3zekxGe5Fj7hXAg,2800
142
142
  autocoder/common/v2/agent/agentic_edit_tools/replace_in_file_tool_resolver.py,sha256=lpD4fCbVR8GTrynqXON69IjM94nPy3nuUL62Ashm5O4,7988
143
143
  autocoder/common/v2/agent/agentic_edit_tools/search_files_tool_resolver.py,sha256=ew0RwJ4oGjnpBOyYYtfxbFqU5W_kclT6FrCkpOB-tgs,6058
@@ -168,8 +168,8 @@ autocoder/dispacher/actions/plugins/action_regex_project.py,sha256=sbK9yFRaq8Ryt
168
168
  autocoder/dispacher/actions/plugins/action_translate.py,sha256=GEn7dZA22jy5WyzINomjmzzB795p2Olg-CJla97lRF8,7744
169
169
  autocoder/events/__init__.py,sha256=1x_juwr9Ows2RADDa2LyI4QlmPxOVOXZeLO1cht-slM,1443
170
170
  autocoder/events/event_content.py,sha256=eLHf5M1BifSqhzzEBgAWKn3JD5_z_1mWeNdZ53TpMqk,12240
171
- autocoder/events/event_manager.py,sha256=VLHrMGlCmuhi0bhLwKyHOQNZrm3ZlB9yfN2lH_phcYQ,11839
172
- autocoder/events/event_manager_singleton.py,sha256=8aBp97fgbas0KYrpHbljTg2n4RcWd85SOgQITu47ZWA,8809
171
+ autocoder/events/event_manager.py,sha256=ObbvPfNrrhC85w5VvsnLS9oy92oHEwqMN08qGPReNNA,11884
172
+ autocoder/events/event_manager_singleton.py,sha256=UubD6HQSDBmA0nBQyo6zr8ctzAPYTiA87ykOoNUCPZk,8895
173
173
  autocoder/events/event_store.py,sha256=y6tT3P-o3yhDptrKi-UmqI_ZBNg7v21FriI3f7lo_ME,12709
174
174
  autocoder/events/event_types.py,sha256=W_S6PTDIBdufcuPosgz64iITzQy79flL8s3hWB-vZ9o,3638
175
175
  autocoder/helper/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -276,9 +276,9 @@ autocoder/utils/types.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
276
276
  autocoder/utils/auto_coder_utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
277
277
  autocoder/utils/auto_coder_utils/chat_stream_out.py,sha256=KW0mlmcHlStXi8-_6fXZ2-ifeJ5mgP0OV7DQFzCtIsw,14008
278
278
  autocoder/utils/chat_auto_coder_utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
279
- auto_coder-0.1.341.dist-info/LICENSE,sha256=HrhfyXIkWY2tGFK11kg7vPCqhgh5DcxleloqdhrpyMY,11558
280
- auto_coder-0.1.341.dist-info/METADATA,sha256=nXClzn15uBj3sXwn4stOcwYHoOwt52vJTA1_uE9Xa0o,2728
281
- auto_coder-0.1.341.dist-info/WHEEL,sha256=GV9aMThwP_4oNCtvEC2ec3qUYutgWeAzklro_0m4WJQ,91
282
- auto_coder-0.1.341.dist-info/entry_points.txt,sha256=0nzHtHH4pNcM7xq4EBA2toS28Qelrvcbrr59GqD_0Ak,350
283
- auto_coder-0.1.341.dist-info/top_level.txt,sha256=Jqc0_uJSw2GwoFQAa9iJxYns-2mWla-9ok_Y3Gcznjk,10
284
- auto_coder-0.1.341.dist-info/RECORD,,
279
+ auto_coder-0.1.343.dist-info/LICENSE,sha256=HrhfyXIkWY2tGFK11kg7vPCqhgh5DcxleloqdhrpyMY,11558
280
+ auto_coder-0.1.343.dist-info/METADATA,sha256=vQNFAmhmuXjWYt_T3JkP_hlhT54YzVBNbgBVSXDdp7w,2728
281
+ auto_coder-0.1.343.dist-info/WHEEL,sha256=GV9aMThwP_4oNCtvEC2ec3qUYutgWeAzklro_0m4WJQ,91
282
+ auto_coder-0.1.343.dist-info/entry_points.txt,sha256=0nzHtHH4pNcM7xq4EBA2toS28Qelrvcbrr59GqD_0Ak,350
283
+ auto_coder-0.1.343.dist-info/top_level.txt,sha256=Jqc0_uJSw2GwoFQAa9iJxYns-2mWla-9ok_Y3Gcznjk,10
284
+ auto_coder-0.1.343.dist-info/RECORD,,
@@ -787,11 +787,10 @@ class CommandAutoTuner:
787
787
  <name>list_files</name>
788
788
  <description>list_files 查看某个目录下的所有文件</description>
789
789
  <usage>
790
- 该命令不需要任何参数,直接使用即可。
791
- 使用例子:
792
-
793
- list_files()
794
-
790
+ 该工具用于列出指定目录下的所有文件(不包括子目录中的文件)。
791
+ 输入参数 path: 要列出文件的目录路径
792
+ 返回值是目录下所有文件的列表,以换行符分隔
793
+ list_files(path="/tmp")
795
794
  </usage>
796
795
  </command>
797
796
 
@@ -1529,3 +1528,10 @@ class CommandAutoTuner:
1529
1528
  query=f"Command: {command} Parameters: {json.dumps(parameters) if parameters else 'None'}",
1530
1529
  response=f"Command execution failed: {error_msg}"
1531
1530
  )
1531
+
1532
+ self.result_manager = ResultManager()
1533
+ result = f"command {command} with parameters {parameters} execution failed with error {error_msg}"
1534
+ self.result_manager.add_result(content=result, meta={
1535
+ "action": command,
1536
+ "input": parameters
1537
+ })
@@ -655,7 +655,7 @@ class AutoCommandTools:
655
655
  该工具用于列出指定目录下的所有文件(不包括子目录中的文件)。
656
656
  输入参数 path: 要列出文件的目录路径
657
657
  返回值是目录下所有文件的列表,以逗号分隔。
658
- """
658
+ """
659
659
  # 处理绝对路径和相对路径
660
660
  target_path = path
661
661
  if not os.path.isabs(path):
@@ -687,12 +687,10 @@ class AutoCommandTools:
687
687
  file_list = []
688
688
  for item in os.listdir(target_path):
689
689
  item_path = os.path.join(target_path, item)
690
- # 只添加文件,不添加目录
691
- if os.path.isfile(item_path):
692
- file_list.append(item_path)
690
+ file_list.append(item_path)
693
691
 
694
692
  # 生成以逗号分隔的文件列表
695
- result = ",".join(file_list)
693
+ result = "\n".join(file_list)
696
694
 
697
695
  # 记录结果
698
696
  self.result_manager.add_result(content=result, meta={
@@ -938,16 +938,23 @@ class AgenticEdit:
938
938
  if 'requires_approval' in params:
939
939
  params['requires_approval'] = params['requires_approval'].lower(
940
940
  ) == 'true'
941
- # Attempt to handle JSON parsing for arguments in use_mcp_tool
942
- # if tool_tag == 'use_mcp_tool' and 'query' in params:
943
- # try:
944
- # params['arguments'] = json.loads(
945
- # params['arguments'])
946
- # except json.JSONDecodeError:
947
- # logger.warning(
948
- # f"Could not decode JSON arguments for use_mcp_tool: {params['arguments']}")
949
- # # Keep as string or handle error? Let's keep as string for now.
950
- # pass
941
+ # Attempt to handle JSON parsing for ask_followup_question_tool
942
+ if tool_tag == 'ask_followup_question' and 'options' in params:
943
+ try:
944
+ params['options'] = json.loads(
945
+ params['options'])
946
+ except json.JSONDecodeError:
947
+ logger.warning(
948
+ f"Could not decode JSON options for ask_followup_question_tool: {params['options']}")
949
+ # Keep as string or handle error? Let's keep as string for now.
950
+ pass
951
+ if tool_tag == 'plan_mode_respond' and 'options' in params:
952
+ try:
953
+ params['options'] = json.loads(
954
+ params['options'])
955
+ except json.JSONDecodeError:
956
+ logger.warning(
957
+ f"Could not decode JSON options for plan_mode_respond_tool: {params['options']}")
951
958
  # Handle recursive for list_files
952
959
  if tool_tag == 'list_files' and 'recursive' in params:
953
960
  params['recursive'] = params['recursive'].lower() == 'true'
@@ -12,6 +12,7 @@ from prompt_toolkit.styles import Style
12
12
  from rich.console import Console
13
13
  from rich.panel import Panel
14
14
  from rich.text import Text
15
+ from autocoder.common.result_manager import ResultManager
15
16
 
16
17
  if typing.TYPE_CHECKING:
17
18
  from autocoder.common.v2.agent.agentic_edit import AgenticEdit
@@ -20,6 +21,7 @@ class AskFollowupQuestionToolResolver(BaseToolResolver):
20
21
  def __init__(self, agent: Optional['AgenticEdit'], tool: AskFollowupQuestionTool, args: AutoCoderArgs):
21
22
  super().__init__(agent, tool, args)
22
23
  self.tool: AskFollowupQuestionTool = tool # For type hinting
24
+ self.result_manager = ResultManager()
23
25
 
24
26
  def resolve(self) -> ToolResult:
25
27
  """
@@ -28,17 +30,17 @@ class AskFollowupQuestionToolResolver(BaseToolResolver):
28
30
  """
29
31
  question = self.tool.question
30
32
  options = self.tool.options
31
-
33
+ options_text = "\n".join([f"{i+1}. {option}" for i, option in enumerate(options)])
32
34
  if get_run_context().is_web():
33
35
  answer = get_event_manager(
34
36
  self.args.event_file).ask_user(prompt=question)
35
- self.result_manager.append(content=answer, meta={
37
+ self.result_manager.append(content=answer + "\n" + options_text, meta={
36
38
  "action": "ask_user",
37
39
  "input": {
38
40
  "question": question
39
41
  }
40
42
  })
41
- return answer
43
+ return ToolResult(success=True, message="Follow-up question prepared.", content=answer)
42
44
 
43
45
  console = Console()
44
46
 
@@ -18,8 +18,7 @@ class PlanModeRespondToolResolver(BaseToolResolver):
18
18
  Packages the response and options for Plan Mode interaction.
19
19
  """
20
20
  response_text = self.tool.response
21
- options = self.tool.options
22
-
21
+ options = self.tool.options
23
22
  logger.info(f"Resolving PlanModeRespondTool: Response='{response_text[:100]}...', Options={options}")
24
23
 
25
24
  if not response_text:
@@ -138,7 +138,7 @@ class EventManager:
138
138
  blocker = threading.Event()
139
139
  self.event_store.append_event(event)
140
140
  self._blocking_events[event.event_id] = blocker
141
- logger.debug(f"self._blocking_events: {self._blocking_events}")
141
+ logger.info(f"ASK_USER: {self} {self.event_store.file_path} self._blocking_events: {self._blocking_events}")
142
142
  if callback:
143
143
  self._response_callbacks[event.event_id] = callback
144
144
  logger.debug(f"Registered callback for event: {event.event_id}")
@@ -194,7 +194,7 @@ class EventManager:
194
194
  Returns:
195
195
  The created response event
196
196
  """
197
- logger.debug(f"respond_to_user called for event: {ask_event_id} with response: '{response}'")
197
+ logger.info(f"respond_to_user called for event: {ask_event_id} with response: '{response}'")
198
198
 
199
199
  # 创建响应事件
200
200
  event = ResponseEvent(
@@ -205,7 +205,7 @@ class EventManager:
205
205
 
206
206
  # 存储响应事件
207
207
  self.event_store.append_event(event)
208
- logger.debug(f"Response event created and stored with ID: {event.event_id}")
208
+ logger.info(f"Response event created and stored with ID: {event.event_id}")
209
209
 
210
210
  # 获取回调和阻塞器
211
211
  callback = None
@@ -214,29 +214,28 @@ class EventManager:
214
214
  if ask_event_id in self._response_callbacks:
215
215
  callback = self._response_callbacks[ask_event_id]
216
216
  # 暂时不删除回调,确保不会丢失
217
- logger.debug(f"Retrieved callback for event: {ask_event_id}")
217
+ logger.info(f"Retrieved callback for event: {ask_event_id}")
218
218
  else:
219
- logger.debug(f"No callback found for event: {ask_event_id}")
219
+ logger.info(f"No callback found for event: {ask_event_id}")
220
220
 
221
221
 
222
222
  # 如果找到了回调,执行它
223
223
  if callback:
224
224
  try:
225
- logger.debug(f"Executing callback for event: {ask_event_id}")
225
+ logger.info(f"Executing callback for event: {ask_event_id}")
226
226
  callback(response)
227
- logger.debug(f"Callback execution completed for event: {ask_event_id}")
228
-
229
- # 回调执行后再移除它
227
+ logger.info(f"Callback execution completed for event: {ask_event_id}")
228
+
230
229
  if ask_event_id in self._response_callbacks:
231
230
  del self._response_callbacks[ask_event_id]
232
231
  except Exception as e:
233
232
  logger.error(f"Error in response callback: {e}")
234
233
 
235
234
  # 检查是否存在对应的阻塞事件
236
- logger.debug(f"self._blocking_events: {self._blocking_events}")
235
+ logger.info(f"RESPONSD_TO_USER: {self} {self.event_store.file_path} self._blocking_events: {self._blocking_events}")
237
236
  if ask_event_id in self._blocking_events:
238
237
  self._blocking_events[ask_event_id].set()
239
- logger.debug(f"Unblocked event: {ask_event_id}")
238
+ logger.info(f"Unblocked event: {ask_event_id}")
240
239
  else:
241
240
  logger.warning(f"No blocking event found for event_id: {ask_event_id}")
242
241
 
@@ -93,8 +93,9 @@ def gengerate_event_file_path(project_path: Optional[str] = None) -> Tuple[str,s
93
93
  # 组合文件名
94
94
  file_name = f"{file_id}.jsonl"
95
95
 
96
+ # 要使用绝对路径,否则会被认为产生两个event_manager
96
97
  if project_path is None:
97
- return os.path.join(".auto-coder", "events", file_name),file_id
98
+ return os.path.join(os.getcwd(),".auto-coder", "events", file_name),file_id
98
99
  else:
99
100
  return os.path.join(project_path, ".auto-coder", "events", file_name),file_id
100
101
 
autocoder/version.py CHANGED
@@ -1 +1 @@
1
- __version__ = "0.1.341"
1
+ __version__ = "0.1.343"