beswarm 0.1.2__py3-none-any.whl → 0.1.3__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.
Files changed (60) hide show
  1. beswarm/queries/tree-sitter-language-pack/README.md +7 -0
  2. beswarm/queries/tree-sitter-language-pack/arduino-tags.scm +5 -0
  3. beswarm/queries/tree-sitter-language-pack/c-tags.scm +9 -0
  4. beswarm/queries/tree-sitter-language-pack/chatito-tags.scm +16 -0
  5. beswarm/queries/tree-sitter-language-pack/commonlisp-tags.scm +122 -0
  6. beswarm/queries/tree-sitter-language-pack/cpp-tags.scm +15 -0
  7. beswarm/queries/tree-sitter-language-pack/csharp-tags.scm +26 -0
  8. beswarm/queries/tree-sitter-language-pack/d-tags.scm +26 -0
  9. beswarm/queries/tree-sitter-language-pack/dart-tags.scm +92 -0
  10. beswarm/queries/tree-sitter-language-pack/elisp-tags.scm +5 -0
  11. beswarm/queries/tree-sitter-language-pack/elixir-tags.scm +54 -0
  12. beswarm/queries/tree-sitter-language-pack/elm-tags.scm +19 -0
  13. beswarm/queries/tree-sitter-language-pack/gleam-tags.scm +41 -0
  14. beswarm/queries/tree-sitter-language-pack/go-tags.scm +42 -0
  15. beswarm/queries/tree-sitter-language-pack/java-tags.scm +20 -0
  16. beswarm/queries/tree-sitter-language-pack/javascript-tags.scm +88 -0
  17. beswarm/queries/tree-sitter-language-pack/lua-tags.scm +34 -0
  18. beswarm/queries/tree-sitter-language-pack/pony-tags.scm +39 -0
  19. beswarm/queries/tree-sitter-language-pack/properties-tags.scm +5 -0
  20. beswarm/queries/tree-sitter-language-pack/python-tags.scm +14 -0
  21. beswarm/queries/tree-sitter-language-pack/r-tags.scm +21 -0
  22. beswarm/queries/tree-sitter-language-pack/racket-tags.scm +12 -0
  23. beswarm/queries/tree-sitter-language-pack/ruby-tags.scm +64 -0
  24. beswarm/queries/tree-sitter-language-pack/rust-tags.scm +60 -0
  25. beswarm/queries/tree-sitter-language-pack/solidity-tags.scm +43 -0
  26. beswarm/queries/tree-sitter-language-pack/swift-tags.scm +51 -0
  27. beswarm/queries/tree-sitter-language-pack/udev-tags.scm +20 -0
  28. beswarm/queries/tree-sitter-languages/README.md +23 -0
  29. beswarm/queries/tree-sitter-languages/c-tags.scm +9 -0
  30. beswarm/queries/tree-sitter-languages/c_sharp-tags.scm +46 -0
  31. beswarm/queries/tree-sitter-languages/cpp-tags.scm +15 -0
  32. beswarm/queries/tree-sitter-languages/dart-tags.scm +91 -0
  33. beswarm/queries/tree-sitter-languages/elisp-tags.scm +8 -0
  34. beswarm/queries/tree-sitter-languages/elixir-tags.scm +54 -0
  35. beswarm/queries/tree-sitter-languages/elm-tags.scm +19 -0
  36. beswarm/queries/tree-sitter-languages/go-tags.scm +30 -0
  37. beswarm/queries/tree-sitter-languages/hcl-tags.scm +77 -0
  38. beswarm/queries/tree-sitter-languages/java-tags.scm +20 -0
  39. beswarm/queries/tree-sitter-languages/javascript-tags.scm +88 -0
  40. beswarm/queries/tree-sitter-languages/kotlin-tags.scm +27 -0
  41. beswarm/queries/tree-sitter-languages/ocaml-tags.scm +115 -0
  42. beswarm/queries/tree-sitter-languages/php-tags.scm +26 -0
  43. beswarm/queries/tree-sitter-languages/python-tags.scm +12 -0
  44. beswarm/queries/tree-sitter-languages/ql-tags.scm +26 -0
  45. beswarm/queries/tree-sitter-languages/ruby-tags.scm +64 -0
  46. beswarm/queries/tree-sitter-languages/rust-tags.scm +60 -0
  47. beswarm/queries/tree-sitter-languages/scala-tags.scm +65 -0
  48. beswarm/queries/tree-sitter-languages/typescript-tags.scm +41 -0
  49. beswarm/tools/__init__.py +13 -0
  50. beswarm/tools/edit_file.py +162 -0
  51. beswarm/tools/planner.py +33 -0
  52. beswarm/tools/repomap.py +1289 -0
  53. beswarm/tools/search_arxiv.py +206 -0
  54. beswarm/tools/think.py +40 -0
  55. beswarm/tools/worker.py +118 -0
  56. {beswarm-0.1.2.dist-info → beswarm-0.1.3.dist-info}/METADATA +1 -1
  57. beswarm-0.1.3.dist-info/RECORD +60 -0
  58. beswarm-0.1.2.dist-info/RECORD +0 -5
  59. {beswarm-0.1.2.dist-info → beswarm-0.1.3.dist-info}/WHEEL +0 -0
  60. {beswarm-0.1.2.dist-info → beswarm-0.1.3.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,162 @@
1
+ import os
2
+ import re
3
+ from aient.plugins import register_tool
4
+
5
+ @register_tool()
6
+ def edit_file(file_path, diff_content, match_precision=0.8):
7
+ """
8
+ 使用diff模式编辑代码文件,支持Git的diff格式和多块编辑。
9
+ 你应该清楚地表明编辑内容,同时最小化你写的未更改代码。
10
+ 你仍应倾向于尽可能少地重复原始文件的行来传达更改。
11
+ 但是,每个编辑都应包含足够的未更改行上下文,以消除你正在编辑的代码的歧义。
12
+
13
+ 参数:
14
+ file_path: 要编辑的文件路径
15
+ diff_content: diff内容,格式为:
16
+ <<<<<<< SEARCH
17
+ 原始代码
18
+ =======
19
+ 替换代码
20
+ >>>>>>> REPLACE
21
+
22
+ 可以包含多个这样的块进行多处编辑
23
+ match_precision: 匹配精度 (0.0-1.0),值越高要求匹配越精确,默认0.8
24
+
25
+ 返回:
26
+ 编辑结果的状态信息,包括成功或错误信息
27
+ """
28
+ try:
29
+ # 检查文件是否存在
30
+ if not os.path.exists(file_path):
31
+ return f"错误: 文件 '{file_path}' 不存在"
32
+
33
+ # 检查是否为文件
34
+ if not os.path.isfile(file_path):
35
+ return f"错误: '{file_path}' 不是一个文件"
36
+
37
+ # 尝试读取文件的前几个字节来检测是否为二进制文件
38
+ with open(file_path, 'rb') as file:
39
+ data = file.read(1024)
40
+ # 快速检查是否可能是二进制文件
41
+ if b'\x00' in data:
42
+ return f"错误: 文件 '{file_path}' 可能是二进制文件,编码无法解析"
43
+
44
+ # 读取原文件内容
45
+ with open(file_path, 'r', encoding='utf-8') as file:
46
+ content = file.read()
47
+
48
+ # 解析diff内容中的搜索和替换块
49
+ diff_blocks = re.findall(r'<<<<<<< SEARCH\n(.*?)\n=======\n(.*?)\n>>>>>>> REPLACE', diff_content, re.DOTALL)
50
+
51
+ if not diff_blocks:
52
+ return f"错误: 无效的diff格式,未找到搜索和替换块"
53
+
54
+ # 记录修改次数和行数变化
55
+ edits_count = 0
56
+ total_original_lines = 0
57
+ total_new_lines = 0
58
+
59
+ # 应用每个diff块
60
+ new_content = content
61
+ for search_block, replace_block in diff_blocks:
62
+ # 检查搜索块是否为空
63
+ if not search_block.strip():
64
+ return f"错误: 搜索块不能为空"
65
+
66
+ if search_block in new_content:
67
+ # 直接替换完全匹配的块
68
+ new_content = new_content.replace(search_block, replace_block, 1)
69
+ edits_count += 1
70
+
71
+ # 计算行数
72
+ original_lines = search_block.count('\n') + 1
73
+ new_lines = replace_block.count('\n') + 1
74
+ total_original_lines += original_lines
75
+ total_new_lines += new_lines
76
+ else:
77
+ # 尝试进行更宽松的匹配
78
+ search_lines = search_block.splitlines()
79
+ content_lines = new_content.splitlines()
80
+
81
+ # 避免空搜索块
82
+ if len(search_lines) == 0:
83
+ return f"错误: 搜索块不能为空"
84
+
85
+ # 尝试找到最佳匹配位置
86
+ best_match_index = -1
87
+ best_match_score = 0
88
+
89
+ for i in range(len(content_lines) - len(search_lines) + 1):
90
+ # 计算当前位置的匹配分数
91
+ match_score = 0
92
+ total_chars = 0
93
+
94
+ for j in range(len(search_lines)):
95
+ search_line = search_lines[j]
96
+ content_line = content_lines[i + j]
97
+
98
+ # 计算两行之间的相似度(使用更精确的算法)
99
+ # 1. 字符级别的比较
100
+ common_chars = sum(c1 == c2 for c1, c2 in zip(search_line, content_line))
101
+ total_line_chars = max(len(search_line), len(content_line))
102
+
103
+ if total_line_chars > 0:
104
+ line_match = common_chars / total_line_chars
105
+ match_score += line_match
106
+ total_chars += 1
107
+
108
+ # 计算整体匹配分数
109
+ if total_chars > 0:
110
+ match_score = match_score / total_chars
111
+ else:
112
+ match_score = 0
113
+
114
+ # 如果使用高精度匹配 (>0.95),我们需要更严格地检查匹配结果
115
+ if match_precision > 0.95:
116
+ # 字符串长度差异也要考虑
117
+ search_text = '\n'.join(search_lines)
118
+ potential_match_text = '\n'.join(content_lines[i:i + len(search_lines)])
119
+ length_diff_ratio = abs(len(search_text) - len(potential_match_text)) / max(len(search_text), 1)
120
+
121
+ # 如果长度差异太大,降低匹配分数
122
+ if length_diff_ratio > 0.1: # 允许10%的长度差异
123
+ match_score *= (1 - length_diff_ratio)
124
+
125
+ if match_score > best_match_score:
126
+ best_match_score = match_score
127
+ best_match_index = i
128
+
129
+ # 使用匹配精度作为阈值
130
+ if best_match_score >= match_precision and best_match_index >= 0:
131
+ # 提取找到的实际文本
132
+ matched_lines = content_lines[best_match_index:best_match_index + len(search_lines)]
133
+ actual_search_block = '\n'.join(matched_lines)
134
+
135
+ # 替换找到的匹配项
136
+ new_content = new_content.replace(actual_search_block, replace_block, 1)
137
+ edits_count += 1
138
+
139
+ # 计算行数
140
+ original_lines = len(matched_lines)
141
+ new_lines = replace_block.count('\n') + 1
142
+ total_original_lines += original_lines
143
+ total_new_lines += new_lines
144
+ else:
145
+ return f"错误: 在文件中未找到足够匹配的代码块,最佳匹配分数为 {best_match_score:.2f},但要求为 {match_precision:.2f}"
146
+
147
+ # 如果没有进行任何编辑,返回错误
148
+ if edits_count == 0:
149
+ return f"错误: 未能应用任何diff编辑"
150
+
151
+ # 写入修改后的内容
152
+ with open(file_path, 'w', encoding='utf-8') as file:
153
+ file.write(new_content)
154
+
155
+ return f"成功: 文件 '{file_path}' 已更新。应用了 {edits_count} 处编辑,替换了 {total_original_lines} 行代码为 {total_new_lines} 行。"
156
+
157
+ except PermissionError:
158
+ return f"错误: 没有权限修改文件 '{file_path}'"
159
+ except UnicodeDecodeError:
160
+ return f"错误: 文件 '{file_path}' 不是文本文件或编码不是UTF-8,无法进行编码解析"
161
+ except Exception as e:
162
+ return f"编辑文件时发生错误: {e}"
@@ -0,0 +1,33 @@
1
+ import os
2
+ from aient.plugins import register_tool, get_function_call_list
3
+
4
+ from aient.models import chatgpt
5
+ from aient.prompt import planner_system_prompt
6
+
7
+ @register_tool()
8
+ async def planner(goal, tools, work_dir):
9
+ tools_json = [value for _, value in get_function_call_list(tools).items()]
10
+ instruction_agent_config = {
11
+ "api_key": os.getenv("API_KEY"),
12
+ "api_url": os.getenv("BASE_URL"),
13
+ "engine": os.getenv("MODEL"),
14
+ "system_prompt": planner_system_prompt.format(worker_tool_use_rules=tools_json, workspace_path=work_dir),
15
+ "print_log": False,
16
+ "max_tokens": 4000,
17
+ "temperature": 0.7,
18
+ "use_plugins": True,
19
+ }
20
+
21
+ # 指令agent初始化
22
+ instruction_agent = chatgpt(**instruction_agent_config)
23
+
24
+ instruction_prompt = f"""
25
+ 任务目标: {goal}
26
+
27
+ 请生成一个详细的任务计划,包括每个步骤的详细描述、所需的工具和预期结果。然后调用worker工具来完成每个步骤。
28
+ """
29
+ # 让指令agent分析对话历史并生成新指令
30
+ next_instruction = await instruction_agent.ask_async(instruction_prompt)
31
+ print("\n🤖 指令智能体生成的下一步指令:", next_instruction)
32
+
33
+ return "任务已完成"