@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,248 @@
1
+ //! SWE-agent environment implementation
2
+
3
+ use super::deployment::{get_deployment, Deployment, DeploymentConfig};
4
+ use super::hooks::{CombinedEnvironmentHook, EnvironmentHook};
5
+ use super::repo::{create_repo, Repo, RepoConfig};
6
+ use crate::exceptions::Result;
7
+ use serde::{Deserialize, Serialize};
8
+ use std::collections::HashMap;
9
+
10
+ /// Configuration for the SWE environment
11
+ #[derive(Debug, Clone, Serialize, Deserialize)]
12
+ pub struct EnvironmentConfig {
13
+ #[serde(default)]
14
+ pub deployment: DeploymentConfig,
15
+ #[serde(default)]
16
+ pub post_startup_commands: Vec<String>,
17
+ #[serde(default = "default_post_startup_timeout")]
18
+ pub post_startup_command_timeout: u64,
19
+ #[serde(default)]
20
+ pub name: String,
21
+ #[serde(skip_serializing_if = "Option::is_none")]
22
+ pub repo: Option<RepoConfig>,
23
+ }
24
+
25
+ fn default_post_startup_timeout() -> u64 {
26
+ 120
27
+ }
28
+
29
+ impl Default for EnvironmentConfig {
30
+ fn default() -> Self {
31
+ Self {
32
+ deployment: DeploymentConfig::default(),
33
+ post_startup_commands: Vec::new(),
34
+ post_startup_command_timeout: default_post_startup_timeout(),
35
+ name: "swe-env".to_string(),
36
+ repo: None,
37
+ }
38
+ }
39
+ }
40
+
41
+ /// The main SWE-agent environment
42
+ pub struct SWEEnv {
43
+ pub name: String,
44
+ deployment: Box<dyn Deployment>,
45
+ repo: Option<Box<dyn Repo>>,
46
+ post_startup_commands: Vec<String>,
47
+ post_startup_command_timeout: u64,
48
+ hooks: CombinedEnvironmentHook,
49
+ env_variables: HashMap<String, String>,
50
+ open_files: Vec<String>,
51
+ }
52
+
53
+ impl Default for SWEEnv {
54
+ fn default() -> Self {
55
+ Self {
56
+ name: "swe-env".to_string(),
57
+ deployment: get_deployment(DeploymentConfig::default()),
58
+ repo: None,
59
+ post_startup_commands: Vec::new(),
60
+ post_startup_command_timeout: default_post_startup_timeout(),
61
+ hooks: CombinedEnvironmentHook::new(),
62
+ env_variables: HashMap::new(),
63
+ open_files: Vec::new(),
64
+ }
65
+ }
66
+ }
67
+
68
+ impl SWEEnv {
69
+ pub fn new(config: EnvironmentConfig) -> Result<Self> {
70
+ let deployment = get_deployment(config.deployment);
71
+ let repo = config.repo.as_ref().map(create_repo).transpose()?;
72
+
73
+ Ok(Self {
74
+ name: config.name,
75
+ deployment,
76
+ repo,
77
+ post_startup_commands: config.post_startup_commands,
78
+ post_startup_command_timeout: config.post_startup_command_timeout,
79
+ hooks: CombinedEnvironmentHook::new(),
80
+ env_variables: HashMap::new(),
81
+ open_files: Vec::new(),
82
+ })
83
+ }
84
+
85
+ pub fn from_config(config: EnvironmentConfig) -> Result<Self> {
86
+ Self::new(config)
87
+ }
88
+
89
+ /// Add a hook to the environment
90
+ pub fn add_hook(&mut self, hook: Box<dyn EnvironmentHook>) {
91
+ self.hooks.add_hook(hook);
92
+ }
93
+
94
+ /// Start the environment
95
+ pub async fn start(&mut self) -> Result<()> {
96
+ self.hooks.on_start();
97
+ self.deployment.start().await?;
98
+
99
+ // Run post-startup commands
100
+ for cmd in &self.post_startup_commands.clone() {
101
+ self.communicate(cmd, Some(self.post_startup_command_timeout))
102
+ .await?;
103
+ }
104
+
105
+ Ok(())
106
+ }
107
+
108
+ /// Stop the environment
109
+ pub async fn stop(&mut self) -> Result<()> {
110
+ self.hooks.on_stop();
111
+ self.deployment.stop().await
112
+ }
113
+
114
+ /// Check if the environment is running
115
+ pub fn is_running(&self) -> bool {
116
+ self.deployment.is_running()
117
+ }
118
+
119
+ /// Execute a command in the environment
120
+ pub async fn communicate(&self, command: &str, timeout: Option<u64>) -> Result<String> {
121
+ let output = self.deployment.execute(command, timeout).await?;
122
+ // Note: hooks require mut self, but we're in a shared context
123
+ // In production, use Arc<Mutex<CombinedEnvironmentHook>> for proper mutability
124
+ Ok(output)
125
+ }
126
+
127
+ /// Read a file from the environment
128
+ pub async fn read_file(&self, path: &str) -> Result<String> {
129
+ self.deployment.read_file(path).await
130
+ }
131
+
132
+ /// Write a file to the environment
133
+ pub async fn write_file(&self, path: &str, content: &str) -> Result<()> {
134
+ self.deployment.write_file(path, content).await
135
+ }
136
+
137
+ /// Set environment variables
138
+ pub async fn set_env_variables(&mut self, vars: HashMap<String, String>) -> Result<()> {
139
+ self.env_variables.extend(vars.clone());
140
+
141
+ // Export variables in the shell
142
+ for (key, value) in vars {
143
+ let cmd = format!("export {}='{}'", key, value);
144
+ self.communicate(&cmd, Some(5)).await?;
145
+ }
146
+
147
+ Ok(())
148
+ }
149
+
150
+ /// Interrupt the current session
151
+ pub async fn interrupt_session(&self) -> Result<()> {
152
+ self.deployment.interrupt().await
153
+ }
154
+
155
+ /// Get the current working directory
156
+ pub fn get_cwd(&self) -> Option<String> {
157
+ self.deployment.get_cwd()
158
+ }
159
+
160
+ /// Get the list of open files
161
+ pub fn get_open_files(&self) -> &[String] {
162
+ &self.open_files
163
+ }
164
+
165
+ /// Add a file to the open files list
166
+ pub fn add_open_file(&mut self, file: impl Into<String>) {
167
+ let f = file.into();
168
+ if !self.open_files.contains(&f) {
169
+ self.open_files.push(f);
170
+ }
171
+ }
172
+
173
+ /// Remove a file from the open files list
174
+ pub fn remove_open_file(&mut self, file: &str) {
175
+ self.open_files.retain(|f| f != file);
176
+ }
177
+
178
+ /// Get git status
179
+ pub async fn get_git_status(&self) -> Result<String> {
180
+ self.communicate("git status --porcelain", Some(30)).await
181
+ }
182
+
183
+ /// Get git diff
184
+ pub async fn get_git_diff(&self) -> Result<String> {
185
+ self.communicate("git diff", Some(60)).await
186
+ }
187
+
188
+ /// Hard reset the environment
189
+ pub async fn hard_reset(&mut self) -> Result<()> {
190
+ self.hooks.on_reset();
191
+
192
+ // Reset git state if in a repo
193
+ if self.repo.is_some() {
194
+ self.communicate("git checkout .", Some(30)).await?;
195
+ self.communicate("git clean -fd", Some(30)).await?;
196
+ }
197
+
198
+ // Clear open files
199
+ self.open_files.clear();
200
+
201
+ Ok(())
202
+ }
203
+
204
+ /// Get repository name if available
205
+ pub fn repo_name(&self) -> Option<&str> {
206
+ self.repo.as_ref().map(|r| r.repo_name())
207
+ }
208
+
209
+ /// Check if environment is alive
210
+ pub fn is_alive(&self) -> bool {
211
+ self.deployment.is_running()
212
+ }
213
+ }
214
+
215
+ #[cfg(test)]
216
+ mod tests {
217
+ use super::*;
218
+
219
+ #[tokio::test]
220
+ async fn test_swe_env_creation() {
221
+ let config = EnvironmentConfig {
222
+ deployment: DeploymentConfig::Mock,
223
+ ..Default::default()
224
+ };
225
+
226
+ let mut env = SWEEnv::new(config).unwrap();
227
+ env.start().await.unwrap();
228
+
229
+ assert!(env.is_running());
230
+
231
+ env.stop().await.unwrap();
232
+ assert!(!env.is_running());
233
+ }
234
+
235
+ #[tokio::test]
236
+ async fn test_swe_env_communicate() {
237
+ let config = EnvironmentConfig {
238
+ deployment: DeploymentConfig::Mock,
239
+ ..Default::default()
240
+ };
241
+
242
+ let mut env = SWEEnv::new(config).unwrap();
243
+ env.start().await.unwrap();
244
+
245
+ let output = env.communicate("pwd", Some(5)).await.unwrap();
246
+ assert!(!output.is_empty());
247
+ }
248
+ }
@@ -0,0 +1,228 @@
1
+ //! Error types for SWE-agent
2
+ //!
3
+ //! This module defines all error types used throughout the SWE-agent implementation.
4
+
5
+ use thiserror::Error;
6
+
7
+ /// Main error type for SWE-agent operations
8
+ #[derive(Error, Debug)]
9
+ pub enum SWEAgentError {
10
+ // Cost and limit errors
11
+ #[error("Instance cost limit exceeded: {0}")]
12
+ InstanceCostLimitExceeded(String),
13
+
14
+ #[error("Total cost limit exceeded: {0}")]
15
+ TotalCostLimitExceeded(String),
16
+
17
+ #[error("Instance call limit exceeded: {0}")]
18
+ InstanceCallLimitExceeded(String),
19
+
20
+ #[error("Context window exceeded: {0}")]
21
+ ContextWindowExceeded(String),
22
+
23
+ // Format and parsing errors
24
+ #[error("Format error: {0}")]
25
+ FormatError(String),
26
+
27
+ #[error("Invalid action format: {0}")]
28
+ InvalidActionFormat(String),
29
+
30
+ #[error("Blocked action: {0}")]
31
+ BlockedAction(String),
32
+
33
+ #[error("Bash syntax error: {0}")]
34
+ BashIncorrectSyntax(String),
35
+
36
+ // Execution errors
37
+ #[error("Command timeout after {timeout}s: {command}")]
38
+ CommandTimeout { timeout: u64, command: String },
39
+
40
+ #[error("Total execution time exceeded")]
41
+ TotalExecutionTimeExceeded,
42
+
43
+ #[error("Environment error: {0}")]
44
+ EnvironmentError(String),
45
+
46
+ #[error("Docker error: {0}")]
47
+ DockerError(String),
48
+
49
+ #[error("Runtime error: {0}")]
50
+ RuntimeError(String),
51
+
52
+ // Agent control flow
53
+ #[error("Retry with output")]
54
+ RetryWithOutput,
55
+
56
+ #[error("Retry without output")]
57
+ RetryWithoutOutput,
58
+
59
+ #[error("Exit forfeit")]
60
+ ExitForfeit,
61
+
62
+ #[error("End of file")]
63
+ EOF,
64
+
65
+ // API and network errors
66
+ #[error("API error: {0}")]
67
+ ApiError(String),
68
+
69
+ #[error("Content policy violation: {0}")]
70
+ ContentPolicyViolation(String),
71
+
72
+ #[error("Network error: {0}")]
73
+ NetworkError(String),
74
+
75
+ // Configuration errors
76
+ #[error("Configuration error: {0}")]
77
+ ConfigurationError(String),
78
+
79
+ #[error("Invalid configuration: {0}")]
80
+ InvalidConfiguration(String),
81
+
82
+ #[error("Missing required field: {0}")]
83
+ MissingField(String),
84
+
85
+ // File and IO errors
86
+ #[error("File not found: {0}")]
87
+ FileNotFound(String),
88
+
89
+ #[error("IO error: {0}")]
90
+ IoError(String),
91
+
92
+ #[error("Serialization error: {0}")]
93
+ SerializationError(String),
94
+
95
+ // Git errors
96
+ #[error("Git error: {0}")]
97
+ GitError(String),
98
+
99
+ #[error("Invalid GitHub URL: {0}")]
100
+ InvalidGithubUrl(String),
101
+
102
+ // Template errors
103
+ #[error("Template error: {0}")]
104
+ TemplateError(String),
105
+
106
+ // Generic errors
107
+ #[error("Unknown error: {0}")]
108
+ Unknown(String),
109
+
110
+ #[error(transparent)]
111
+ Other(#[from] anyhow::Error),
112
+ }
113
+
114
+ impl SWEAgentError {
115
+ /// Check if this error should trigger a retry
116
+ pub fn should_retry(&self) -> bool {
117
+ matches!(
118
+ self,
119
+ SWEAgentError::RetryWithOutput
120
+ | SWEAgentError::RetryWithoutOutput
121
+ | SWEAgentError::FormatError(_)
122
+ | SWEAgentError::BlockedAction(_)
123
+ | SWEAgentError::BashIncorrectSyntax(_)
124
+ )
125
+ }
126
+
127
+ /// Check if this error should cause immediate exit
128
+ pub fn should_exit(&self) -> bool {
129
+ matches!(
130
+ self,
131
+ SWEAgentError::ExitForfeit
132
+ | SWEAgentError::TotalExecutionTimeExceeded
133
+ | SWEAgentError::InstanceCostLimitExceeded(_)
134
+ | SWEAgentError::TotalCostLimitExceeded(_)
135
+ | SWEAgentError::InstanceCallLimitExceeded(_)
136
+ | SWEAgentError::ContextWindowExceeded(_)
137
+ )
138
+ }
139
+
140
+ /// Get exit status string for this error
141
+ pub fn exit_status(&self) -> &'static str {
142
+ match self {
143
+ SWEAgentError::ExitForfeit => "exit_forfeit",
144
+ SWEAgentError::TotalExecutionTimeExceeded => "exit_total_execution_time",
145
+ SWEAgentError::CommandTimeout { .. } => "exit_command_timeout",
146
+ SWEAgentError::ContextWindowExceeded(_) => "exit_context",
147
+ SWEAgentError::InstanceCostLimitExceeded(_)
148
+ | SWEAgentError::TotalCostLimitExceeded(_)
149
+ | SWEAgentError::InstanceCallLimitExceeded(_) => "exit_cost",
150
+ SWEAgentError::RuntimeError(_) | SWEAgentError::EnvironmentError(_) => {
151
+ "exit_environment_error"
152
+ }
153
+ SWEAgentError::FormatError(_)
154
+ | SWEAgentError::InvalidActionFormat(_)
155
+ | SWEAgentError::BashIncorrectSyntax(_) => "exit_format",
156
+ _ => "exit_error",
157
+ }
158
+ }
159
+ }
160
+
161
+ impl From<std::io::Error> for SWEAgentError {
162
+ fn from(err: std::io::Error) -> Self {
163
+ SWEAgentError::IoError(err.to_string())
164
+ }
165
+ }
166
+
167
+ impl From<serde_json::Error> for SWEAgentError {
168
+ fn from(err: serde_json::Error) -> Self {
169
+ SWEAgentError::SerializationError(err.to_string())
170
+ }
171
+ }
172
+
173
+ impl From<serde_yaml::Error> for SWEAgentError {
174
+ fn from(err: serde_yaml::Error) -> Self {
175
+ SWEAgentError::SerializationError(err.to_string())
176
+ }
177
+ }
178
+
179
+ impl From<reqwest::Error> for SWEAgentError {
180
+ fn from(err: reqwest::Error) -> Self {
181
+ SWEAgentError::NetworkError(err.to_string())
182
+ }
183
+ }
184
+
185
+ impl From<handlebars::RenderError> for SWEAgentError {
186
+ fn from(err: handlebars::RenderError) -> Self {
187
+ SWEAgentError::TemplateError(err.to_string())
188
+ }
189
+ }
190
+
191
+ /// Result type alias for SWE-agent operations
192
+ pub type Result<T> = std::result::Result<T, SWEAgentError>;
193
+
194
+ /// Special tokens used in observations to signal control flow
195
+ pub mod tokens {
196
+ pub const RETRY_WITH_OUTPUT: &str = "###SWE-AGENT-RETRY-WITH-OUTPUT###";
197
+ pub const RETRY_WITHOUT_OUTPUT: &str = "###SWE-AGENT-RETRY-WITHOUT-OUTPUT###";
198
+ pub const EXIT_FORFEIT: &str = "###SWE-AGENT-EXIT-FORFEIT###";
199
+ pub const SUBMISSION_MARKER: &str = "<<SWE_AGENT_SUBMISSION>>";
200
+ }
201
+
202
+ #[cfg(test)]
203
+ mod tests {
204
+ use super::*;
205
+
206
+ #[test]
207
+ fn test_should_retry() {
208
+ assert!(SWEAgentError::RetryWithOutput.should_retry());
209
+ assert!(SWEAgentError::FormatError("test".to_string()).should_retry());
210
+ assert!(!SWEAgentError::ExitForfeit.should_retry());
211
+ }
212
+
213
+ #[test]
214
+ fn test_should_exit() {
215
+ assert!(SWEAgentError::ExitForfeit.should_exit());
216
+ assert!(SWEAgentError::TotalExecutionTimeExceeded.should_exit());
217
+ assert!(!SWEAgentError::FormatError("test".to_string()).should_exit());
218
+ }
219
+
220
+ #[test]
221
+ fn test_exit_status() {
222
+ assert_eq!(SWEAgentError::ExitForfeit.exit_status(), "exit_forfeit");
223
+ assert_eq!(
224
+ SWEAgentError::ContextWindowExceeded("test".to_string()).exit_status(),
225
+ "exit_context"
226
+ );
227
+ }
228
+ }
@@ -0,0 +1,68 @@
1
+ //! SWE-agent: Software Engineering Agent
2
+ //!
3
+ //! This crate provides a Rust implementation of SWE-agent, an AI-powered
4
+ //! software engineering agent that can autonomously solve coding tasks.
5
+ //!
6
+ //! # Features
7
+ //!
8
+ //! - `native` - Native runtime with full async support (default)
9
+ //! - `wasm` - WebAssembly support for browser environments
10
+ //!
11
+ //! # Example
12
+ //!
13
+ //! ```rust,no_run
14
+ //! use elizaos_sweagent::run::{RunSingle, RunSingleConfig};
15
+ //!
16
+ //! #[tokio::main]
17
+ //! async fn main() -> anyhow::Result<()> {
18
+ //! // Configure and run the agent
19
+ //! let config = RunSingleConfig::default();
20
+ //! let mut runner = RunSingle::from_config(config)?;
21
+ //! runner.run().await?;
22
+ //! Ok(())
23
+ //! }
24
+ //! ```
25
+
26
+ pub mod agent;
27
+ pub mod environment;
28
+ pub mod exceptions;
29
+ pub mod monitoring;
30
+ pub mod run;
31
+ pub mod tools;
32
+ pub mod types;
33
+ pub mod utils;
34
+
35
+ // Re-export main types for convenience
36
+ pub use agent::{
37
+ AbstractAgentHook, AgentConfig, DefaultAgent, DefaultAgentConfig, RetryAgent, RetryAgentConfig,
38
+ };
39
+ pub use environment::{
40
+ Deployment, DeploymentConfig, DockerDeployment, DockerDeploymentConfig, EnvironmentConfig,
41
+ LocalDeployment, LocalDeploymentConfig, RepoConfig, SWEEnv,
42
+ };
43
+ pub use exceptions::SWEAgentError;
44
+ pub use monitoring::{
45
+ health_check, AgentMetrics, Alert, AlertHandler, AlertSeverity, AlertThresholds, HealthStatus,
46
+ MetricsMonitor, MetricsSnapshot,
47
+ };
48
+ pub use run::{RunBatch, RunBatchConfig, RunSingle, RunSingleConfig};
49
+ pub use tools::{Bundle, BundleConfig, ParseFunction, ToolConfig, ToolHandler};
50
+ pub use types::AgentRunResult;
51
+ pub use types::{History, HistoryItem, StepOutput, Trajectory, TrajectoryStep};
52
+
53
+ /// Version of the SWE-agent library
54
+ pub const VERSION: &str = "1.1.0";
55
+
56
+ /// Get the agent version information string
57
+ pub fn get_agent_version_info() -> String {
58
+ format!("SWE-agent Rust implementation version {}", VERSION)
59
+ }
60
+
61
+ #[cfg(feature = "wasm")]
62
+ use wasm_bindgen::prelude::*;
63
+
64
+ #[cfg(feature = "wasm")]
65
+ #[wasm_bindgen]
66
+ pub fn wasm_version() -> String {
67
+ VERSION.to_string()
68
+ }