@elizaos/sweagent-root 2.0.0-alpha

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 (323) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +270 -0
  3. package/package.json +71 -0
  4. package/python/LICENSE +21 -0
  5. package/python/config/README.md +15 -0
  6. package/python/config/bash_only.yaml +222 -0
  7. package/python/config/benchmarks/250212_sweagent_heavy_sbl.yaml +188 -0
  8. package/python/config/benchmarks/250225_anthropic_filemap_simple_review.yaml +75 -0
  9. package/python/config/benchmarks/250522_anthropic_filemap_simple_review.yaml +92 -0
  10. package/python/config/benchmarks/250526_anthropic_filemap_simple_review_sbl.yaml +93 -0
  11. package/python/config/benchmarks/anthropic_filemap_multilingual.yaml +66 -0
  12. package/python/config/coding_challenge.yaml +104 -0
  13. package/python/config/default.yaml +69 -0
  14. package/python/config/default_backticks.yaml +69 -0
  15. package/python/config/default_mm_no_images.yaml +82 -0
  16. package/python/config/default_mm_with_images.yaml +83 -0
  17. package/python/config/demo/default.yaml +80 -0
  18. package/python/config/demo/no_instructions.yaml +69 -0
  19. package/python/config/demo/only_bash.yaml +60 -0
  20. package/python/config/exotic/default_shell.yaml +52 -0
  21. package/python/config/exotic/windowed_replace.yaml +125 -0
  22. package/python/config/exotic/windowed_replace_late_repro.yaml +127 -0
  23. package/python/config/human/human.yaml +24 -0
  24. package/python/config/human/human_demo.yaml +52 -0
  25. package/python/config/sweagent_0_7/07.yaml +101 -0
  26. package/python/config/sweagent_0_7/07_fcalling.yaml +100 -0
  27. package/python/config/sweagent_0_7/07_from_url.yaml +114 -0
  28. package/python/config/sweagent_0_7/07_thought_action.yaml +102 -0
  29. package/python/config/sweagent_0_7/07_thought_action_xml.yaml +96 -0
  30. package/python/mlc_config.json +44 -0
  31. package/python/pyproject.toml +262 -0
  32. package/python/sweagent/__init__.py +114 -0
  33. package/python/sweagent/__main__.py +4 -0
  34. package/python/sweagent/agent/__init__.py +0 -0
  35. package/python/sweagent/agent/action_sampler.py +317 -0
  36. package/python/sweagent/agent/agents.py +1294 -0
  37. package/python/sweagent/agent/extra/shell_agent.py +106 -0
  38. package/python/sweagent/agent/history_processors.py +399 -0
  39. package/python/sweagent/agent/hooks/__init__.py +0 -0
  40. package/python/sweagent/agent/hooks/abstract.py +139 -0
  41. package/python/sweagent/agent/hooks/status.py +34 -0
  42. package/python/sweagent/agent/models.py +896 -0
  43. package/python/sweagent/agent/problem_statement.py +312 -0
  44. package/python/sweagent/agent/reviewer.py +664 -0
  45. package/python/sweagent/environment/__init__.py +0 -0
  46. package/python/sweagent/environment/hooks/__init__.py +0 -0
  47. package/python/sweagent/environment/hooks/abstract.py +60 -0
  48. package/python/sweagent/environment/hooks/status.py +28 -0
  49. package/python/sweagent/environment/repo.py +219 -0
  50. package/python/sweagent/environment/swe_env.py +276 -0
  51. package/python/sweagent/exceptions.py +54 -0
  52. package/python/sweagent/inspector/README.md +6 -0
  53. package/python/sweagent/inspector/__init__.py +0 -0
  54. package/python/sweagent/inspector/favicon.ico +0 -0
  55. package/python/sweagent/inspector/fileViewer.js +354 -0
  56. package/python/sweagent/inspector/icons/computer.png +0 -0
  57. package/python/sweagent/inspector/icons/edit_icon.svg +11 -0
  58. package/python/sweagent/inspector/icons/swe-agent-logo-50.png +0 -0
  59. package/python/sweagent/inspector/icons/swellama_blue.png +0 -0
  60. package/python/sweagent/inspector/icons/swellama_brown.png +0 -0
  61. package/python/sweagent/inspector/icons/swellama_grey.png +0 -0
  62. package/python/sweagent/inspector/icons/swellama_tan.png +0 -0
  63. package/python/sweagent/inspector/index.html +25 -0
  64. package/python/sweagent/inspector/server.py +354 -0
  65. package/python/sweagent/inspector/static.py +169 -0
  66. package/python/sweagent/inspector/style.css +454 -0
  67. package/python/sweagent/run/__init__.py +0 -0
  68. package/python/sweagent/run/_progress.py +158 -0
  69. package/python/sweagent/run/batch_instances.py +419 -0
  70. package/python/sweagent/run/common.py +387 -0
  71. package/python/sweagent/run/compare_runs.py +123 -0
  72. package/python/sweagent/run/extract_pred.py +19 -0
  73. package/python/sweagent/run/hooks/__init__.py +0 -0
  74. package/python/sweagent/run/hooks/abstract.py +67 -0
  75. package/python/sweagent/run/hooks/apply_patch.py +106 -0
  76. package/python/sweagent/run/hooks/open_pr.py +244 -0
  77. package/python/sweagent/run/hooks/swe_bench_evaluate.py +113 -0
  78. package/python/sweagent/run/inspector_cli.py +493 -0
  79. package/python/sweagent/run/merge_predictions.py +64 -0
  80. package/python/sweagent/run/quick_stats.py +96 -0
  81. package/python/sweagent/run/remove_unfinished.py +63 -0
  82. package/python/sweagent/run/rich_test.py +91 -0
  83. package/python/sweagent/run/run.py +147 -0
  84. package/python/sweagent/run/run_batch.py +442 -0
  85. package/python/sweagent/run/run_replay.py +219 -0
  86. package/python/sweagent/run/run_shell.py +155 -0
  87. package/python/sweagent/run/run_single.py +225 -0
  88. package/python/sweagent/run/run_traj_to_demo.py +85 -0
  89. package/python/sweagent/tools/__init__.py +0 -0
  90. package/python/sweagent/tools/bundle.py +57 -0
  91. package/python/sweagent/tools/commands.py +220 -0
  92. package/python/sweagent/tools/parsing.py +619 -0
  93. package/python/sweagent/tools/tools.py +430 -0
  94. package/python/sweagent/tools/utils.py +108 -0
  95. package/python/sweagent/types.py +102 -0
  96. package/python/sweagent/utils/__init__.py +0 -0
  97. package/python/sweagent/utils/config.py +80 -0
  98. package/python/sweagent/utils/files.py +27 -0
  99. package/python/sweagent/utils/github.py +118 -0
  100. package/python/sweagent/utils/jinja_warnings.py +14 -0
  101. package/python/sweagent/utils/log.py +175 -0
  102. package/python/sweagent/utils/patch_formatter.py +152 -0
  103. package/python/sweagent/utils/serialization.py +45 -0
  104. package/python/tests/__init__.py +0 -0
  105. package/python/tests/conftest.py +191 -0
  106. package/python/tests/test_agent.py +258 -0
  107. package/python/tests/test_batch_instance.py +43 -0
  108. package/python/tests/test_commands/_interactive_dummy.py +35 -0
  109. package/python/tests/test_commands/interactive_dummy_wrapper.sh +29 -0
  110. package/python/tests/test_data/config_files/dummy_interactive.yaml +62 -0
  111. package/python/tests/test_data/data_sources/ctf/crypto/Katy/Dockerfile +20 -0
  112. package/python/tests/test_data/data_sources/ctf/crypto/Katy/README.md +13 -0
  113. package/python/tests/test_data/data_sources/ctf/crypto/Katy/challenge.json +12 -0
  114. package/python/tests/test_data/data_sources/ctf/crypto/Katy/customrandom.c +50 -0
  115. package/python/tests/test_data/data_sources/ctf/crypto/Katy/docker-compose.yml +14 -0
  116. package/python/tests/test_data/data_sources/ctf/crypto/Katy/release +0 -0
  117. package/python/tests/test_data/data_sources/ctf/crypto/Katy/server +0 -0
  118. package/python/tests/test_data/data_sources/ctf/crypto/Katy/solver.py +12 -0
  119. package/python/tests/test_data/data_sources/ctf/forensics/flash/README.md +16 -0
  120. package/python/tests/test_data/data_sources/ctf/forensics/flash/challenge.json +9 -0
  121. package/python/tests/test_data/data_sources/ctf/forensics/flash/flash_c8429a430278283c0e571baebca3d139.zip +0 -0
  122. package/python/tests/test_data/data_sources/ctf/misc/networking_1/README.md +15 -0
  123. package/python/tests/test_data/data_sources/ctf/misc/networking_1/challenge.json +10 -0
  124. package/python/tests/test_data/data_sources/ctf/misc/networking_1/networking.pcap +0 -0
  125. package/python/tests/test_data/data_sources/ctf/pwn/warmup/Dockerfile +28 -0
  126. package/python/tests/test_data/data_sources/ctf/pwn/warmup/README.md +14 -0
  127. package/python/tests/test_data/data_sources/ctf/pwn/warmup/challenge.json +14 -0
  128. package/python/tests/test_data/data_sources/ctf/pwn/warmup/docker-compose.yml +14 -0
  129. package/python/tests/test_data/data_sources/ctf/pwn/warmup/flag.txt +1 -0
  130. package/python/tests/test_data/data_sources/ctf/pwn/warmup/warmup +0 -0
  131. package/python/tests/test_data/data_sources/ctf/pwn/warmup/warmup.c +26 -0
  132. package/python/tests/test_data/data_sources/ctf/pwn/warmup/warmup.py +9 -0
  133. package/python/tests/test_data/data_sources/ctf/rev/rock/README.md +14 -0
  134. package/python/tests/test_data/data_sources/ctf/rev/rock/challenge.json +8 -0
  135. package/python/tests/test_data/data_sources/ctf/rev/rock/rock +0 -0
  136. package/python/tests/test_data/data_sources/ctf/rev/rock/rock.cpp +167 -0
  137. package/python/tests/test_data/data_sources/ctf/rev/rock/solution.cpp +24 -0
  138. package/python/tests/test_data/data_sources/ctf/rev/rock/test_solver/solution.py +6 -0
  139. package/python/tests/test_data/data_sources/ctf/rev/rock/test_solver/test.sh +10 -0
  140. package/python/tests/test_data/data_sources/ctf/web/i_got_id_demo/000-default.conf +18 -0
  141. package/python/tests/test_data/data_sources/ctf/web/i_got_id_demo/Dockerfile +20 -0
  142. package/python/tests/test_data/data_sources/ctf/web/i_got_id_demo/cgi/file.pl +38 -0
  143. package/python/tests/test_data/data_sources/ctf/web/i_got_id_demo/cgi/forms.pl +40 -0
  144. package/python/tests/test_data/data_sources/ctf/web/i_got_id_demo/cgi/hello.pl +11 -0
  145. package/python/tests/test_data/data_sources/ctf/web/i_got_id_demo/challenge.json +12 -0
  146. package/python/tests/test_data/data_sources/ctf/web/i_got_id_demo/docker-compose.yml +14 -0
  147. package/python/tests/test_data/data_sources/ctf/web/i_got_id_demo/flag +1 -0
  148. package/python/tests/test_data/data_sources/ctf/web/i_got_id_demo/index.html +11 -0
  149. package/python/tests/test_data/data_sources/ctf/web/i_got_id_demo/solution.txt +1 -0
  150. package/python/tests/test_data/data_sources/debug_20240322.json +1 -0
  151. package/python/tests/test_data/data_sources/expert_instances.yaml +16 -0
  152. package/python/tests/test_data/data_sources/human_eval.json +1 -0
  153. package/python/tests/test_data/data_sources/simple_instances.yaml +3 -0
  154. package/python/tests/test_data/data_sources/simple_instances_long.yaml +30 -0
  155. package/python/tests/test_data/data_sources/swe-bench-dev-easy.json +1 -0
  156. package/python/tests/test_data/data_sources/swe-bench-dev-easy_first_only.json +1 -0
  157. package/python/tests/test_data/data_sources/swe-bench-lite-test.json +1 -0
  158. package/python/tests/test_data/trajectories/gpt4__swe-agent-test-repo__default_from_url__t-0.00__p-0.95__c-3.00__install-1/6e44b9__sweagenttestrepo-1c2844.traj +342 -0
  159. package/python/tests/test_data/trajectories/gpt4__swe-agent-test-repo__default_from_url__t-0.00__p-0.95__c-3.00__install-1/solution_missing_colon.py +15 -0
  160. package/python/tests/test_data/trajectories/gpt4__swe-agent__test-repo__default_from_url__t-0.00__p-0.95__c-3.00__install-1/args.yaml +518 -0
  161. package/python/tests/test_data/trajectories/gpt4__swe-agent__test-repo__default_from_url__t-0.00__p-0.95__c-3.00__install-1/swe-agent__test-repo-i1.traj +124 -0
  162. package/python/tests/test_data/trajectories/gpt4__swe-bench-dev-easy_first_only__default__t-0.00__p-0.95__c-3.00__install-1/all_preds.jsonl +1 -0
  163. package/python/tests/test_data/trajectories/gpt4__swe-bench-dev-easy_first_only__default__t-0.00__p-0.95__c-3.00__install-1/args.yaml +520 -0
  164. package/python/tests/test_data/trajectories/gpt4__swe-bench-dev-easy_first_only__default__t-0.00__p-0.95__c-3.00__install-1/patches/pydicom__pydicom-1458.patch +18 -0
  165. package/python/tests/test_data/trajectories/gpt4__swe-bench-dev-easy_first_only__default__t-0.00__p-0.95__c-3.00__install-1/pydicom__pydicom-1458.traj +257 -0
  166. package/python/tests/test_env.py +66 -0
  167. package/python/tests/test_env_utils.py +129 -0
  168. package/python/tests/test_history_processors.py +40 -0
  169. package/python/tests/test_models.py +23 -0
  170. package/python/tests/test_openai_live.py +164 -0
  171. package/python/tests/test_packaging.py +7 -0
  172. package/python/tests/test_parsing.py +131 -0
  173. package/python/tests/test_problem_statement_multimodal.py +111 -0
  174. package/python/tests/test_quick_stats.py +42 -0
  175. package/python/tests/test_run.py +37 -0
  176. package/python/tests/test_run_batch.py +110 -0
  177. package/python/tests/test_run_hooks.py +114 -0
  178. package/python/tests/test_run_replay.py +33 -0
  179. package/python/tests/test_run_single.py +125 -0
  180. package/python/tests/test_tools_command_parsing.py +193 -0
  181. package/python/tests/test_utils.py +15 -0
  182. package/python/tests/tools/__init__.py +0 -0
  183. package/python/tests/tools/conftest.py +12 -0
  184. package/python/tests/tools/test_default_utils.py +153 -0
  185. package/python/tests/tools/test_edit_replace.py +0 -0
  186. package/python/tests/tools/test_split_string.py +82 -0
  187. package/python/tests/utils.py +29 -0
  188. package/python/tools/diff_state/bin/_state_diff_state +52 -0
  189. package/python/tools/diff_state/config.yaml +2 -0
  190. package/python/tools/edit_anthropic/bin/_state_anthropic +21 -0
  191. package/python/tools/edit_anthropic/bin/str_replace_editor +710 -0
  192. package/python/tools/edit_anthropic/config.yaml +56 -0
  193. package/python/tools/edit_anthropic/install.sh +3 -0
  194. package/python/tools/filemap/bin/filemap +45 -0
  195. package/python/tools/filemap/config.yaml +9 -0
  196. package/python/tools/filemap/install.sh +2 -0
  197. package/python/tools/forfeit/bin/exit_forfeit +5 -0
  198. package/python/tools/forfeit/config.yaml +5 -0
  199. package/python/tools/image_tools/bin/view_image +36 -0
  200. package/python/tools/image_tools/config.yaml +9 -0
  201. package/python/tools/multilingual_setup/bin/do_nothing +2 -0
  202. package/python/tools/multilingual_setup/config.yaml +1 -0
  203. package/python/tools/multilingual_setup/install.sh +45 -0
  204. package/python/tools/registry/bin/_read_env +10 -0
  205. package/python/tools/registry/bin/_write_env +10 -0
  206. package/python/tools/registry/config.yaml +1 -0
  207. package/python/tools/registry/install.sh +6 -0
  208. package/python/tools/registry/lib/__init__.py +0 -0
  209. package/python/tools/registry/lib/registry.py +56 -0
  210. package/python/tools/review_on_submit_m/README.md +6 -0
  211. package/python/tools/review_on_submit_m/bin/submit +54 -0
  212. package/python/tools/review_on_submit_m/config.yaml +6 -0
  213. package/python/tools/review_on_submit_m/install.sh +0 -0
  214. package/python/tools/search/bin/find_file +31 -0
  215. package/python/tools/search/bin/search_dir +39 -0
  216. package/python/tools/search/bin/search_file +55 -0
  217. package/python/tools/search/config.yaml +37 -0
  218. package/python/tools/search/install.sh +3 -0
  219. package/python/tools/submit/bin/submit +17 -0
  220. package/python/tools/submit/config.yaml +5 -0
  221. package/python/tools/web_browser/bin/click_mouse +41 -0
  222. package/python/tools/web_browser/bin/close_site +28 -0
  223. package/python/tools/web_browser/bin/double_click_mouse +37 -0
  224. package/python/tools/web_browser/bin/drag_mouse +46 -0
  225. package/python/tools/web_browser/bin/execute_script_on_page +39 -0
  226. package/python/tools/web_browser/bin/get_console_output +48 -0
  227. package/python/tools/web_browser/bin/move_mouse +35 -0
  228. package/python/tools/web_browser/bin/navigate_back +33 -0
  229. package/python/tools/web_browser/bin/navigate_forward +33 -0
  230. package/python/tools/web_browser/bin/open_site +36 -0
  231. package/python/tools/web_browser/bin/press_keys_on_page +51 -0
  232. package/python/tools/web_browser/bin/reload_page +33 -0
  233. package/python/tools/web_browser/bin/run_web_browser_server +394 -0
  234. package/python/tools/web_browser/bin/screenshot_site +38 -0
  235. package/python/tools/web_browser/bin/scroll_on_page +40 -0
  236. package/python/tools/web_browser/bin/set_browser_window_size +40 -0
  237. package/python/tools/web_browser/bin/type_text +34 -0
  238. package/python/tools/web_browser/bin/wait_time +39 -0
  239. package/python/tools/web_browser/config.yaml +155 -0
  240. package/python/tools/web_browser/install.sh +22 -0
  241. package/python/tools/web_browser/lib/browser_manager.py +404 -0
  242. package/python/tools/web_browser/lib/web_browser_config.py +33 -0
  243. package/python/tools/web_browser/lib/web_browser_utils.py +126 -0
  244. package/python/tools/web_browser/test_console.html +1 -0
  245. package/python/tools/windowed/bin/_state +25 -0
  246. package/python/tools/windowed/bin/create +29 -0
  247. package/python/tools/windowed/bin/goto +37 -0
  248. package/python/tools/windowed/bin/open +49 -0
  249. package/python/tools/windowed/bin/scroll_down +12 -0
  250. package/python/tools/windowed/bin/scroll_up +13 -0
  251. package/python/tools/windowed/config.yaml +38 -0
  252. package/python/tools/windowed/install.sh +15 -0
  253. package/python/tools/windowed/lib/__init__.py +0 -0
  254. package/python/tools/windowed/lib/flake8_utils.py +147 -0
  255. package/python/tools/windowed/lib/windowed_file.py +312 -0
  256. package/python/tools/windowed_edit_linting/bin/edit +128 -0
  257. package/python/tools/windowed_edit_linting/config.yaml +31 -0
  258. package/python/tools/windowed_edit_linting/install.sh +5 -0
  259. package/python/tools/windowed_edit_replace/bin/edit +172 -0
  260. package/python/tools/windowed_edit_replace/bin/insert +77 -0
  261. package/python/tools/windowed_edit_replace/config.yaml +60 -0
  262. package/python/tools/windowed_edit_replace/install.sh +5 -0
  263. package/python/tools/windowed_edit_rewrite/bin/edit +78 -0
  264. package/python/tools/windowed_edit_rewrite/config.yaml +11 -0
  265. package/python/tools/windowed_edit_rewrite/install.sh +5 -0
  266. package/python/trajectories/demonstrations/ctf/crypto/BabyEncryption.traj +318 -0
  267. package/python/trajectories/demonstrations/ctf/crypto/BabyTimeCapsule.traj +197 -0
  268. package/python/trajectories/demonstrations/ctf/crypto/eps.traj +289 -0
  269. package/python/trajectories/demonstrations/ctf/crypto/katy.traj +368 -0
  270. package/python/trajectories/demonstrations/ctf/forensics/flash.traj +102 -0
  271. package/python/trajectories/demonstrations/ctf/misc/networking_1.traj +102 -0
  272. package/python/trajectories/demonstrations/ctf/pwn/warmup.traj +159 -0
  273. package/python/trajectories/demonstrations/ctf/rev/rock.traj +251 -0
  274. package/python/trajectories/demonstrations/ctf/web/i_got_id_demo.traj +422 -0
  275. package/python/trajectories/demonstrations/function_calling_simple.traj +151 -0
  276. package/python/trajectories/demonstrations/human_thought__swe-bench-HumanEvalFix-python__lcb__t-0.00__p-0.95__c-4.00__install-0/humanevalfix-python-0.traj +129 -0
  277. package/python/trajectories/demonstrations/replay__marshmallow-code__marshmallow-1867__default__t-0.20__p-0.95__c-2.00__install-1___install_from_source/marshmallow-code__marshmallow-1867.traj +318 -0
  278. package/python/trajectories/demonstrations/replay__marshmallow-code__marshmallow-1867__default_sys-env_cursors_window100__t-0.20__p-0.95__c-2.00__install-1/marshmallow-code__marshmallow-1867.traj +251 -0
  279. package/python/trajectories/demonstrations/replay__marshmallow-code__marshmallow-1867__default_sys-env_window100__t-0.20__p-0.95__c-2.00__install-1/marshmallow-code__marshmallow-1867.traj +399 -0
  280. package/python/trajectories/demonstrations/replay__marshmallow-code__marshmallow-1867__function_calling__install-1/marshmallow-code__marshmallow-1867.traj +594 -0
  281. package/python/trajectories/demonstrations/replay__marshmallow-code__marshmallow-1867__function_calling_replace__install-1/marshmallow-code__marshmallow-1867.traj +592 -0
  282. package/python/trajectories/demonstrations/replay__marshmallow-code__marshmallow-1867__function_calling_replace_from_source/marshmallow-code__marshmallow-1867.traj +3316 -0
  283. package/python/trajectories/demonstrations/replay__marshmallow-code__marshmallow-1867__xml_sys-env_cursors_window100__t-0.20__p-0.95__c-2.00__install-1/marshmallow-code__marshmallow-1867.traj +251 -0
  284. package/python/trajectories/demonstrations/replay__marshmallow-code__marshmallow-1867__xml_sys-env_window100__t-0.20__p-0.95__c-2.00__install-1/marshmallow-code__marshmallow-1867.traj +399 -0
  285. package/python/trajectories/demonstrations/str_replace_anthropic_demo.yaml +432 -0
  286. package/rust/Cargo.toml +100 -0
  287. package/rust/README.md +49 -0
  288. package/rust/src/agent/action_sampler.rs +130 -0
  289. package/rust/src/agent/agents.rs +1029 -0
  290. package/rust/src/agent/history_processors.rs +277 -0
  291. package/rust/src/agent/hooks/mod.rs +208 -0
  292. package/rust/src/agent/mod.rs +24 -0
  293. package/rust/src/agent/models.rs +837 -0
  294. package/rust/src/agent/problem_statement.rs +355 -0
  295. package/rust/src/agent/reviewer.rs +505 -0
  296. package/rust/src/bin/sweagent.rs +784 -0
  297. package/rust/src/environment/deployment.rs +631 -0
  298. package/rust/src/environment/hooks/mod.rs +114 -0
  299. package/rust/src/environment/mod.rs +16 -0
  300. package/rust/src/environment/repo.rs +265 -0
  301. package/rust/src/environment/runtime.rs +237 -0
  302. package/rust/src/environment/swe_env.rs +248 -0
  303. package/rust/src/exceptions.rs +228 -0
  304. package/rust/src/lib.rs +68 -0
  305. package/rust/src/monitoring.rs +482 -0
  306. package/rust/src/run/hooks/mod.rs +134 -0
  307. package/rust/src/run/mod.rs +12 -0
  308. package/rust/src/run/run_batch.rs +563 -0
  309. package/rust/src/run/run_single.rs +196 -0
  310. package/rust/src/tools/bundle.rs +224 -0
  311. package/rust/src/tools/commands.rs +173 -0
  312. package/rust/src/tools/mod.rs +295 -0
  313. package/rust/src/tools/parsing.rs +354 -0
  314. package/rust/src/tools/registry.rs +143 -0
  315. package/rust/src/types.rs +554 -0
  316. package/rust/src/utils/config.rs +105 -0
  317. package/rust/src/utils/files.rs +137 -0
  318. package/rust/src/utils/github.rs +171 -0
  319. package/rust/src/utils/log.rs +65 -0
  320. package/rust/src/utils/mod.rs +17 -0
  321. package/rust/src/utils/serialization.rs +181 -0
  322. package/rust/src/utils/template.rs +173 -0
  323. package/typescript/README.md +335 -0
@@ -0,0 +1,56 @@
1
+ tools:
2
+ str_replace_editor:
3
+ signature: |
4
+ str_replace_editor <command> <path> [<file_text>] [<view_range>] [<old_str>] [<new_str>] [<insert_line>]
5
+ # This docstrings was taken from openhands:
6
+ # https://github.com/All-Hands-AI/OpenHands/blob/main/openhands/agenthub/codeact_agent/function_calling.py
7
+ docstring: >
8
+ Custom editing tool for viewing, creating and editing files
9
+ * State is persistent across command calls and discussions with the user
10
+ * If `path` is a file, `view` displays the result of applying `cat -n`. If `path` is a directory, `view` lists non-hidden files and directories up to 2 levels deep
11
+ * The `create` command cannot be used if the specified `path` already exists as a file
12
+ * If a `command` generates a long output, it will be truncated and marked with `<response clipped>`
13
+ * The `undo_edit` command will revert the last edit made to the file at `path`
14
+
15
+ Notes for using the `str_replace` command:
16
+ * The `old_str` parameter should match EXACTLY one or more consecutive lines from the original file. Be mindful of whitespaces!
17
+ * If the `old_str` parameter is not unique in the file, the replacement will not be performed. Make sure to include enough context in `old_str` to make it unique
18
+ * The `new_str` parameter should contain the edited lines that should replace the `old_str`
19
+ arguments:
20
+ - name: command
21
+ type: string
22
+ description: "The commands to run. Allowed options are: `view`, `create`, `str_replace`, `insert`, `undo_edit`."
23
+ required: true
24
+ enum: ["view", "create", "str_replace", "insert", "undo_edit"]
25
+ - name: path
26
+ type: string
27
+ description: "Absolute path to file or directory, e.g. `/testbed/file.py` or `/testbed`."
28
+ required: true
29
+ - name: file_text
30
+ type: string
31
+ description: "Required parameter of `create` command, with the content of the file to be created."
32
+ required: false
33
+ argument_format: "--file_text {{value}}"
34
+ - name: old_str
35
+ type: string
36
+ description: "Required parameter of `str_replace` command containing the string in `path` to replace."
37
+ required: false
38
+ argument_format: "--old_str {{value}}"
39
+ - name: new_str
40
+ type: string
41
+ description: "Optional parameter of `str_replace` command containing the new string (if not given, no string will be added). Required parameter of `insert` command containing the string to insert."
42
+ required: false
43
+ argument_format: "--new_str {{value}}"
44
+ - name: insert_line
45
+ type: integer
46
+ description: "Required parameter of `insert` command. The `new_str` will be inserted AFTER the line `insert_line` of `path`."
47
+ required: false
48
+ argument_format: "--insert_line {{value}}"
49
+ - name: view_range
50
+ type: array
51
+ items:
52
+ type: integer
53
+ description: "Optional parameter of `view` command when `path` points to a file. If none is given, the full file is shown. If provided, the file will be shown in the indicated line number range, e.g. [11, 12] will show lines 11 and 12. Indexing at 1 to start. Setting `[start_line, -1]` shows all lines from `start_line` to the end of the file."
54
+ required: false
55
+ argument_format: "--view_range {{value|join(' ')}}"
56
+ state_command: "_state_anthropic"
@@ -0,0 +1,3 @@
1
+ # Ignore failures, see https://github.com/SWE-agent/SWE-agent/issues/1179
2
+ pip install 'tree-sitter==0.21.3' || true
3
+ pip install 'tree-sitter-languages' || true
@@ -0,0 +1,45 @@
1
+ #!/root/miniconda3/bin/python
2
+
3
+ import argparse
4
+ import warnings
5
+
6
+ # tree_sitter is throwing a FutureWarning
7
+ warnings.simplefilter("ignore", category=FutureWarning)
8
+ from tree_sitter_languages import get_language, get_parser
9
+
10
+ parser = argparse.ArgumentParser(
11
+ description="Print the contents of a Python file, skipping lengthy function and method definitions."
12
+ )
13
+ parser.add_argument("file_path", type=str, help="The path to the file to be read")
14
+ args = parser.parse_args()
15
+
16
+ # We assume that all input files are Python.
17
+ parser = get_parser("python")
18
+ language = get_language("python")
19
+ file_contents = open(args.file_path).read()
20
+
21
+ # We assume that files are utf8 encoded.
22
+ tree = parser.parse(bytes(file_contents, "utf8"))
23
+
24
+ # See https://tree-sitter.github.io/tree-sitter/using-parsers#pattern-matching-with-queries.
25
+ query = language.query("""
26
+ (function_definition
27
+ body: (_) @body)
28
+ """)
29
+
30
+ # TODO: consider special casing docstrings such that they are not elided. This
31
+ # could be accomplished by checking whether `body.text.decode('utf8')` starts
32
+ # with `"""` or `'''`.
33
+ elide_line_ranges = [
34
+ (node.start_point[0], node.end_point[0])
35
+ for node, _ in query.captures(tree.root_node)
36
+ # Only elide if it's sufficiently long
37
+ if node.end_point[0] - node.start_point[0] >= 5
38
+ ]
39
+ # Note that tree-sitter line numbers are 0-indexed, but we display 1-indexed.
40
+ elide_lines = {line for start, end in elide_line_ranges for line in range(start, end + 1)}
41
+ elide_messages = [(start, f"... eliding lines {start+1}-{end+1} ...") for start, end in elide_line_ranges]
42
+ for i, line in sorted(
43
+ elide_messages + [(i, line) for i, line in enumerate(file_contents.splitlines()) if i not in elide_lines]
44
+ ):
45
+ print(f"{i+1:6d} {line}")
@@ -0,0 +1,9 @@
1
+ tools:
2
+ filemap:
3
+ signature: "filemap <file_path>"
4
+ docstring: "Print the contents of a Python file, skipping lengthy function and method definitions."
5
+ arguments:
6
+ - name: file_path
7
+ type: string
8
+ description: The path to the file to be read
9
+ required: true
@@ -0,0 +1,2 @@
1
+ pip install 'tree-sitter==0.21.3'
2
+ pip install 'tree-sitter-languages'
@@ -0,0 +1,5 @@
1
+ main() {
2
+ echo "###SWE-AGENT-EXIT-FORFEIT###"
3
+ }
4
+
5
+ main "$@"
@@ -0,0 +1,5 @@
1
+ tools:
2
+ exit_forfeit:
3
+ signature: "exit_forfeit"
4
+ docstring: "Give up on the current challenge and terminate the session."
5
+ arguments: []
@@ -0,0 +1,36 @@
1
+ #!/usr/bin/env python3
2
+ # view_image – view an image file as a base64-encoded markdown image
3
+ import base64
4
+ import mimetypes
5
+ import pathlib
6
+ import sys
7
+
8
+ VALID_MIME_TYPES = {
9
+ "image/png",
10
+ "image/jpeg",
11
+ "image/webp",
12
+ }
13
+
14
+ if len(sys.argv) != 2:
15
+ sys.exit(f"usage: {pathlib.Path(sys.argv[0]).name} <image-file>")
16
+
17
+ img_path = pathlib.Path(sys.argv[1])
18
+
19
+ if not img_path.exists():
20
+ sys.exit(f"Error: File '{img_path}' does not exist")
21
+
22
+ if not img_path.is_file():
23
+ sys.exit(f"Error: '{img_path}' is not a file")
24
+
25
+ try:
26
+ mime = mimetypes.guess_type(img_path.name)[0]
27
+ if mime not in VALID_MIME_TYPES:
28
+ sys.exit(f"Error: Unsupported image type: {mime}. Valid types are: {', '.join(VALID_MIME_TYPES)}")
29
+
30
+ # read the file, base64-encode, and convert bytes → str
31
+ b64 = base64.b64encode(img_path.read_bytes()).decode("ascii")
32
+
33
+ # write the exact markdown snippet to stdout
34
+ print(f"![{img_path.as_posix()}](data:{mime};base64,{b64})")
35
+ except Exception as e:
36
+ sys.exit(f"Error processing image: {e}")
@@ -0,0 +1,9 @@
1
+ tools:
2
+ view_image:
3
+ signature: "view_image <image_file>"
4
+ docstring: "view an image file"
5
+ arguments:
6
+ - name: image_file
7
+ type: string
8
+ description: "the path to the image file to view"
9
+ required: true
@@ -0,0 +1,2 @@
1
+ # This will never be called, but having a file here
2
+ # ensures that chmod +x commands on the bin directory don't fail
@@ -0,0 +1 @@
1
+ tools: {}
@@ -0,0 +1,45 @@
1
+ #!/usr/bin/env bash
2
+
3
+ # Define variables to exclude
4
+ EXCLUDE_VARS="PWD|LANG|PYTHONPATH|ROOT|PS0|PS1|PS2|_|OLDPWD|LC_ALL|LANG|LSCOLORS|SHLVL"
5
+
6
+
7
+ echo "Original Environment Variables:"
8
+ env | sort
9
+
10
+ # Only add Python 3.11 to PATH if no python exists
11
+ if ! command -v python &> /dev/null; then
12
+ echo -e "\nNo Python found in system, adding Python 3.11 to PATH"
13
+ export PATH="/root/python3.11/bin:$PATH"
14
+
15
+ # Create python/pip aliases
16
+ ln -s "/root/python3.11/bin/python3" "/root/python3.11/bin/python"
17
+ ln -s "/root/python3.11/bin/pip3" "/root/python3.11/bin/pip"
18
+ echo "Created symlinks: python -> python3, pip -> pip3"
19
+ else
20
+ echo -e "\nPython already exists in system, skipping Python 3.11 setup"
21
+ fi
22
+
23
+ # Attempt to read and set process 1 environment
24
+ echo -e "\nSetting environment variables from /proc/1/environ..."
25
+ if [ -r "/proc/1/environ" ]; then
26
+ while IFS= read -r -d '' var; do
27
+ # Skip excluded variables
28
+ if ! echo "$var" | grep -qE "^(${EXCLUDE_VARS})="; then
29
+ # If the variable is PATH, append and deduplicate
30
+ if [[ "$var" =~ ^PATH= ]]; then
31
+ # Combine paths and remove duplicates while preserving order
32
+ export PATH="$(echo "${PATH}:${var#PATH=}" | tr ':' '\n' | awk '!seen[$0]++' | tr '\n' ':' | sed 's/:$//')"
33
+ else
34
+ export "$var"
35
+ fi
36
+ fi
37
+ done < /proc/1/environ
38
+ echo "Successfully imported environment from /proc/1/environ"
39
+ else
40
+ echo "Cannot access /proc/1/environ - Permission denied"
41
+ fi
42
+
43
+ # Print updated environment variables
44
+ echo -e "\nUpdated Environment Variables:"
45
+ env | sort
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env python
2
+
3
+ import sys
4
+
5
+ from registry import registry # type: ignore
6
+
7
+ if __name__ == "__main__":
8
+ var_name = sys.argv[1]
9
+ default_value = sys.argv[2] if len(sys.argv) > 2 else ""
10
+ print(registry.get(var_name, default_value))
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env python
2
+
3
+ import sys
4
+
5
+ from registry import registry # type: ignore
6
+
7
+ if __name__ == "__main__":
8
+ var_name = sys.argv[1]
9
+ var_value = sys.argv[2] if len(sys.argv) > 2 else ""
10
+ registry[var_name] = var_value
@@ -0,0 +1 @@
1
+ tools: {}
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env bash
2
+
3
+ # script_dir=$(dirname "$(readlink -f "$0")")
4
+ bundle_dir=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )
5
+
6
+ export PYTHONPATH="$bundle_dir/lib":$PYTHONPATH
File without changes
@@ -0,0 +1,56 @@
1
+ import json
2
+ import os
3
+ from pathlib import Path
4
+ from typing import Any
5
+
6
+
7
+ class EnvRegistry:
8
+ """Read and write variables into a file. This is used to persist state between tool
9
+ calls without using environment variables (which are problematic because you cannot
10
+ set them in a subprocess).
11
+
12
+ The default file location is `/root/.swe-agent-env`, though this can be overridden
13
+ by the `env_file` argument or the `SWE_AGENT_ENV_FILE` environment variable.
14
+ """
15
+
16
+ def __init__(self, env_file: Path | None = None):
17
+ self._env_file = env_file
18
+
19
+ @property
20
+ def env_file(self) -> Path:
21
+ if self._env_file is None:
22
+ env_file = Path(os.environ.get("SWE_AGENT_ENV_FILE", "/root/.swe-agent-env"))
23
+ else:
24
+ env_file = self._env_file
25
+ if not env_file.exists():
26
+ env_file.write_text("{}")
27
+ return env_file
28
+
29
+ def __getitem__(self, key: str) -> str:
30
+ return json.loads(self.env_file.read_text())[key]
31
+
32
+ def get(self, key: str, default_value: Any = None, fallback_to_env: bool = True) -> Any:
33
+ """Get a value from registry:
34
+
35
+ Args:
36
+ key: The key to get the value for.
37
+ default_value: The default value to return if the key is not found in the registry.
38
+ fallback_to_env: If True, fallback to environment variables if the key is not found in the registry.
39
+ If there's no environment variable, return the default value.
40
+ """
41
+ if fallback_to_env and key in os.environ:
42
+ default_value = os.environ[key]
43
+ return json.loads(self.env_file.read_text()).get(key, default_value)
44
+
45
+ def get_if_none(self, value: Any, key: str, default_value: Any = None) -> Any:
46
+ if value is not None:
47
+ return value
48
+ return self.get(key, default_value)
49
+
50
+ def __setitem__(self, key: str, value: Any):
51
+ env = json.loads(self.env_file.read_text())
52
+ env[key] = value
53
+ self.env_file.write_text(json.dumps(env))
54
+
55
+
56
+ registry = EnvRegistry()
@@ -0,0 +1,6 @@
1
+ # Review on submit.
2
+
3
+ Provides an alternative for `submit` that does not immediately submit, but asks the
4
+ agent to perform additional reviewing steps.
5
+
6
+ Only `submit -f` will trigger the real submit.
@@ -0,0 +1,54 @@
1
+ #!/usr/bin/env python3
2
+
3
+ import argparse
4
+ from pathlib import Path
5
+ import subprocess
6
+ import sys
7
+ import os
8
+ import io
9
+
10
+ from registry import registry
11
+
12
+
13
+ def main() -> None:
14
+ parser = argparse.ArgumentParser(description="Submit changes for review")
15
+ parser.add_argument("-f", "--force", action="store_true", help="Force submit without review")
16
+ args = parser.parse_args()
17
+
18
+ repo_root = registry.get("ROOT", os.getenv("ROOT"))
19
+ assert repo_root
20
+
21
+ patch_path = Path("/root/model.patch")
22
+
23
+ subprocess.run(
24
+ f"git add -A && git diff --cached > {patch_path}",
25
+ shell=True,
26
+ stdout=subprocess.DEVNULL,
27
+ stderr=subprocess.DEVNULL,
28
+ cwd=repo_root,
29
+ )
30
+
31
+ patch = patch_path.read_text(errors="backslashreplace")
32
+
33
+ submit_review_messages = registry.get("SUBMIT_REVIEW_MESSAGES", [])
34
+ n_stages = len(submit_review_messages)
35
+ current_stage = registry.get("SUBMIT_STAGE", 0)
36
+ if not args.force and current_stage != n_stages:
37
+ message = submit_review_messages[current_stage]
38
+ message = message.replace("{{diff}}", patch)
39
+ message = message.replace("{{problem_statement}}", registry.get("PROBLEM_STATEMENT", ""))
40
+ registry["SUBMIT_STAGE"] = current_stage + 1
41
+ print(message)
42
+ sys.exit(0)
43
+
44
+ print("<<SWE_AGENT_SUBMISSION>>")
45
+ print(patch)
46
+ print("<<SWE_AGENT_SUBMISSION>>")
47
+
48
+
49
+ if __name__ == "__main__":
50
+ # There are some super strange "ascii can't decode x" errors when printing to the terminal
51
+ # that can be solved with setting the default encoding for stdout
52
+ # (note that python3.6 doesn't have the reconfigure method)
53
+ sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding="utf-8")
54
+ main()
@@ -0,0 +1,6 @@
1
+ tools:
2
+ submit:
3
+ signature: "submit"
4
+ docstring: "submits the current file"
5
+ # Do not actually show the -f argument to the model, only
6
+ # use it from the agent for submission after error
File without changes
@@ -0,0 +1,31 @@
1
+ main() {
2
+ if [ $# -eq 1 ]; then
3
+ local file_name="$1"
4
+ local dir="./"
5
+ elif [ $# -eq 2 ]; then
6
+ local file_name="$1"
7
+ if [ -d "$2" ]; then
8
+ local dir="$2"
9
+ else
10
+ echo "Directory $2 not found"
11
+ return
12
+ fi
13
+ else
14
+ echo "Usage: find_file <file_name> [<dir>]"
15
+ return
16
+ fi
17
+
18
+ dir=$(realpath "$dir")
19
+ local matches=$(find "$dir" -type f -name "$file_name")
20
+ # if no matches, return
21
+ if [ -z "$matches" ]; then
22
+ echo "No matches found for \"$file_name\" in $dir"
23
+ return
24
+ fi
25
+ # Calculate total number of matches
26
+ local num_matches=$(echo "$matches" | wc -l | awk '{$1=$1; print $0}')
27
+ echo "Found $num_matches matches for \"$file_name\" in $dir:"
28
+ echo "$matches" | awk '{print $0}'
29
+ }
30
+
31
+ main "$@"
@@ -0,0 +1,39 @@
1
+ main() {
2
+ if [ $# -eq 1 ]; then
3
+ local search_term="$1"
4
+ local dir="./"
5
+ elif [ $# -eq 2 ]; then
6
+ local search_term="$1"
7
+ if [ -d "$2" ]; then
8
+ local dir="$2"
9
+ else
10
+ echo "Directory $2 not found"
11
+ return
12
+ fi
13
+ else
14
+ echo "Usage: search_dir <search_term> [<dir>]"
15
+ return
16
+ fi
17
+ dir=$(realpath "$dir")
18
+ local matches=$(find "$dir" -type f ! -path '*/.*' -exec grep -nIH -- "$search_term" {} + | cut -d: -f1 | sort | uniq -c)
19
+ # if no matches, return
20
+ if [ -z "$matches" ]; then
21
+ echo "No matches found for \"$search_term\" in $dir"
22
+ return
23
+ fi
24
+ # Calculate total number of matches
25
+ local num_matches=$(echo "$matches" | awk '{sum+=$1} END {print sum}')
26
+ # calculate total number of files matched
27
+ local num_files=$(echo "$matches" | wc -l | awk '{$1=$1; print $0}')
28
+ # if num_files is > 100, print an error
29
+ if [ $num_files -gt 100 ]; then
30
+ echo "More than $num_files files matched for \"$search_term\" in $dir. Please narrow your search."
31
+ return
32
+ fi
33
+
34
+ echo "Found $num_matches matches for \"$search_term\" in $dir:"
35
+ echo "$matches" | awk '{$2=$2; gsub(/^\.+\/+/, "./", $2); print $2 " ("$1" matches)"}'
36
+ echo "End of matches for \"$search_term\" in $dir"
37
+ }
38
+
39
+ main "$@"
@@ -0,0 +1,55 @@
1
+ main() {
2
+ # Check if the first argument is provided
3
+ local search_term="${1:-}"
4
+ if [ -z "${search_term}" ]; then
5
+ echo "Usage: search_file <search_term> [<file>]"
6
+ return
7
+ fi
8
+ # Check if the second argument is provided
9
+ if [ $# -ge 2 ]; then
10
+ # Check if the provided argument is a valid file
11
+ if [ -f "$2" ]; then
12
+ local file="$2" # Set file if valid
13
+ else
14
+ echo "Usage: search_file <search_term> [<file>]"
15
+ echo "Error: File name $2 not found. Please provide a valid file name."
16
+ return # Exit if the file is not valid
17
+ fi
18
+ else
19
+ local CURRENT_FILE=$(_read_env CURRENT_FILE)
20
+ # Check if a file is open
21
+ if [ -z "${CURRENT_FILE:-}" ]; then
22
+ echo "No file open. Use the open command first."
23
+ return # Exit if no file is open
24
+ fi
25
+ local file="$CURRENT_FILE" # Set file to the current open file
26
+ fi
27
+ local search_term="$1"
28
+ file=$(realpath "$file")
29
+ # Use grep to directly get the desired formatted output
30
+ local matches=$(grep -nH -- "$search_term" "$file")
31
+ # Check if no matches were found
32
+ if [ -z "${matches:-}" ]; then
33
+ echo "No matches found for \"$search_term\" in $file"
34
+ return
35
+ fi
36
+ # Calculate total number of matches
37
+ local num_matches=$(echo "$matches" | wc -l | awk '{$1=$1; print $0}')
38
+
39
+ # calculate total number of lines matched
40
+ local num_lines=$(echo "$matches" | cut -d: -f1 | sort | uniq | wc -l | awk '{$1=$1; print $0}')
41
+ # if num_lines is > 100, print an error
42
+ if [ $num_lines -gt 100 ]; then
43
+ echo "More than $num_lines lines matched for \"$search_term\" in $file. Please narrow your search."
44
+ return
45
+ fi
46
+
47
+ # Print the total number of matches and the matches themselves
48
+ echo "Found $num_matches matches for \"$search_term\" in $file:"
49
+ echo "$matches" | cut -d: -f1-2 | sort -u -t: -k2,2n | while IFS=: read -r filename line_number; do
50
+ echo "Line $line_number:$(sed -n "${line_number}p" "$file")"
51
+ done
52
+ echo "End of matches for \"$search_term\" in $file"
53
+ }
54
+
55
+ main "$@"
@@ -0,0 +1,37 @@
1
+ tools:
2
+ find_file:
3
+ signature: "find_file <file_name> [<dir>]"
4
+ docstring: "finds all files with the given name or pattern in dir. If dir is not provided, searches in the current directory"
5
+ arguments:
6
+ - name: file_name
7
+ type: string
8
+ description: "the name of the file or pattern to search for. supports shell-style wildcards (e.g. *.py)"
9
+ required: true
10
+ - name: dir
11
+ type: string
12
+ description: "the directory to search in (if not provided, searches in the current directory)"
13
+ required: false
14
+ search_dir:
15
+ signature: "search_dir <search_term> [<dir>]"
16
+ docstring: "searches for search_term in all files in dir. If dir is not provided, searches in the current directory"
17
+ arguments:
18
+ - name: search_term
19
+ type: string
20
+ description: "the term to search for"
21
+ required: true
22
+ - name: dir
23
+ type: string
24
+ description: "the directory to search in (if not provided, searches in the current directory)"
25
+ required: false
26
+ search_file:
27
+ signature: "search_file <search_term> [<file>]"
28
+ docstring: "searches for search_term in file. If file is not provided, searches in the current open file"
29
+ arguments:
30
+ - name: search_term
31
+ type: string
32
+ description: "the term to search for"
33
+ required: true
34
+ - name: file
35
+ type: string
36
+ description: "the file to search in (if not provided, searches in the current open file)"
37
+ required: false
@@ -0,0 +1,3 @@
1
+ _write_env SEARCH_RESULTS "()"
2
+ _write_env SEARCH_FILES "()"
3
+ _write_env SEARCH_INDEX 0
@@ -0,0 +1,17 @@
1
+ main() {
2
+ cd $ROOT
3
+
4
+ # Check if the patch file exists and is non-empty
5
+ if [ -s "/root/test.patch" ]; then
6
+ # Apply the patch in reverse
7
+ git apply -R < "/root/test.patch"
8
+ fi
9
+
10
+ git add -A
11
+ git diff --cached > /root/model.patch
12
+ echo "<<SWE_AGENT_SUBMISSION>>"
13
+ cat /root/model.patch
14
+ echo "<<SWE_AGENT_SUBMISSION>>"
15
+ }
16
+
17
+ main "$@"
@@ -0,0 +1,5 @@
1
+ tools:
2
+ submit:
3
+ signature: "submit"
4
+ docstring: "submits the current file"
5
+ arguments: []
@@ -0,0 +1,41 @@
1
+ #!/root/python3.11/bin/python3
2
+ from __future__ import annotations
3
+
4
+ import sys
5
+ from argparse import ArgumentParser
6
+ from pathlib import Path
7
+
8
+ lib_path = str(Path(__file__).resolve().parent.parent / "lib")
9
+ sys.path.insert(0, lib_path)
10
+
11
+ from web_browser_config import ClientConfig
12
+ from web_browser_utils import (
13
+ _autosave_screenshot_from_response,
14
+ _print_response_with_metadata,
15
+ send_request,
16
+ )
17
+
18
+ config = ClientConfig()
19
+
20
+
21
+ def click(x, y, button):
22
+ """Click at the specified coordinates (x, y)."""
23
+ response = send_request(
24
+ config.port,
25
+ "click",
26
+ "POST",
27
+ {"x": x, "y": y, "button": button, "return_screenshot": config.autoscreenshot},
28
+ )
29
+ if response is None:
30
+ return
31
+ _print_response_with_metadata(response)
32
+ _autosave_screenshot_from_response(response, config.screenshot_mode)
33
+
34
+
35
+ if __name__ == "__main__":
36
+ parser = ArgumentParser()
37
+ parser.add_argument("x", type=int)
38
+ parser.add_argument("y", type=int)
39
+ parser.add_argument("button", nargs="?", default="left", choices=["left", "right"])
40
+ args = parser.parse_args()
41
+ click(args.x, args.y, args.button)