@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,173 @@
1
+ //! Template rendering utilities for SWE-agent
2
+
3
+ use crate::exceptions::{Result, SWEAgentError};
4
+ use handlebars::Handlebars;
5
+ use serde::Serialize;
6
+ use std::collections::HashMap;
7
+
8
+ /// Render a simple template with variable substitution
9
+ pub fn render_template(template: &str, vars: &HashMap<String, String>) -> Result<String> {
10
+ let mut result = template.to_string();
11
+
12
+ for (key, value) in vars {
13
+ // Replace {{key}} with value
14
+ let pattern = format!("{{{{{}}}}}", key);
15
+ result = result.replace(&pattern, value);
16
+
17
+ // Also replace {{ key }} (with spaces)
18
+ let pattern_spaced = format!("{{{{ {} }}}}", key);
19
+ result = result.replace(&pattern_spaced, value);
20
+ }
21
+
22
+ Ok(result)
23
+ }
24
+
25
+ /// Render an advanced template using Handlebars
26
+ pub fn render_advanced_template<T: Serialize>(template: &str, data: &T) -> Result<String> {
27
+ let mut handlebars = Handlebars::new();
28
+ handlebars.set_strict_mode(false);
29
+
30
+ // Register custom helpers
31
+ register_custom_helpers(&mut handlebars);
32
+
33
+ handlebars
34
+ .render_template(template, data)
35
+ .map_err(|e| SWEAgentError::TemplateError(e.to_string()))
36
+ }
37
+
38
+ /// Register custom Handlebars helpers
39
+ fn register_custom_helpers(handlebars: &mut Handlebars) {
40
+ // Helper for slicing strings: {{slice observation 0 100}}
41
+ handlebars.register_helper(
42
+ "slice",
43
+ Box::new(
44
+ |h: &handlebars::Helper,
45
+ _: &Handlebars,
46
+ _: &handlebars::Context,
47
+ _: &mut handlebars::RenderContext,
48
+ out: &mut dyn handlebars::Output|
49
+ -> handlebars::HelperResult {
50
+ let value = h.param(0).and_then(|v| v.value().as_str()).unwrap_or("");
51
+ let start: usize =
52
+ h.param(1).and_then(|v| v.value().as_u64()).unwrap_or(0) as usize;
53
+ let end: usize = h
54
+ .param(2)
55
+ .and_then(|v| v.value().as_u64())
56
+ .map(|v| v as usize)
57
+ .unwrap_or(value.len());
58
+
59
+ let sliced = &value[start.min(value.len())..end.min(value.len())];
60
+ out.write(sliced)?;
61
+ Ok(())
62
+ },
63
+ ),
64
+ );
65
+
66
+ // Helper for length: {{len observation}}
67
+ handlebars.register_helper(
68
+ "len",
69
+ Box::new(
70
+ |h: &handlebars::Helper,
71
+ _: &Handlebars,
72
+ _: &handlebars::Context,
73
+ _: &mut handlebars::RenderContext,
74
+ out: &mut dyn handlebars::Output|
75
+ -> handlebars::HelperResult {
76
+ let value = h.param(0).and_then(|v| v.value().as_str()).unwrap_or("");
77
+ out.write(&value.len().to_string())?;
78
+ Ok(())
79
+ },
80
+ ),
81
+ );
82
+
83
+ // Helper for subtraction: {{sub a b}}
84
+ handlebars.register_helper(
85
+ "sub",
86
+ Box::new(
87
+ |h: &handlebars::Helper,
88
+ _: &Handlebars,
89
+ _: &handlebars::Context,
90
+ _: &mut handlebars::RenderContext,
91
+ out: &mut dyn handlebars::Output|
92
+ -> handlebars::HelperResult {
93
+ let a: i64 = h.param(0).and_then(|v| v.value().as_i64()).unwrap_or(0);
94
+ let b: i64 = h.param(1).and_then(|v| v.value().as_i64()).unwrap_or(0);
95
+ out.write(&(a - b).to_string())?;
96
+ Ok(())
97
+ },
98
+ ),
99
+ );
100
+ }
101
+
102
+ /// Create a Handlebars instance with all registered helpers
103
+ pub fn create_handlebars() -> Handlebars<'static> {
104
+ let mut handlebars = Handlebars::new();
105
+ handlebars.set_strict_mode(false);
106
+ register_custom_helpers(&mut handlebars);
107
+ handlebars
108
+ }
109
+
110
+ /// Warn about probably wrong Jinja syntax in template
111
+ pub fn warn_probably_wrong_jinja_syntax(template: &str) -> Vec<String> {
112
+ let mut warnings = Vec::new();
113
+
114
+ // Check for Python-style string formatting
115
+ if template.contains("{{") && template.contains("[:") {
116
+ warnings.push(
117
+ "Template contains Python-style slicing syntax. Use Handlebars slice helper instead."
118
+ .to_string(),
119
+ );
120
+ }
121
+
122
+ // Check for % formatting
123
+ if template.contains("%(") && template.contains(")s") {
124
+ warnings.push(
125
+ "Template contains Python-style % formatting. Use Handlebars syntax.".to_string(),
126
+ );
127
+ }
128
+
129
+ // Check for .format() style
130
+ if template.contains("{0}") || template.contains("{1}") {
131
+ warnings.push("Template contains Python .format() style placeholders.".to_string());
132
+ }
133
+
134
+ warnings
135
+ }
136
+
137
+ #[cfg(test)]
138
+ mod tests {
139
+ use super::*;
140
+
141
+ #[test]
142
+ fn test_render_template() {
143
+ let mut vars = HashMap::new();
144
+ vars.insert("name".to_string(), "world".to_string());
145
+
146
+ let result = render_template("Hello, {{name}}!", &vars).unwrap();
147
+ assert_eq!(result, "Hello, world!");
148
+ }
149
+
150
+ #[test]
151
+ fn test_render_advanced_template() {
152
+ #[derive(Serialize)]
153
+ struct Data {
154
+ observation: String,
155
+ }
156
+
157
+ let data = Data {
158
+ observation: "test output".to_string(),
159
+ };
160
+
161
+ let result = render_advanced_template("Result: {{observation}}", &data).unwrap();
162
+ assert_eq!(result, "Result: test output");
163
+ }
164
+
165
+ #[test]
166
+ fn test_warn_jinja_syntax() {
167
+ let warnings = warn_probably_wrong_jinja_syntax("{{observation[:100]}}");
168
+ assert!(!warnings.is_empty());
169
+
170
+ let no_warnings = warn_probably_wrong_jinja_syntax("{{observation}}");
171
+ assert!(no_warnings.is_empty());
172
+ }
173
+ }
@@ -0,0 +1,335 @@
1
+ # 🤖 swe-agent-ts
2
+
3
+ A fully-featured autonomous software engineer, written in typescript.
4
+
5
+ ## ✨ Features
6
+
7
+ - 🚀 **Autonomous problem solving** - Give it a GitHub issue, bug report, or feature request
8
+ - 🔧 **Automatic code generation** - Writes, tests, and submits complete solutions
9
+ - 📊 **Full SWE-bench support** - Benchmark on thousands of real GitHub issues
10
+ - 🌐 **Multi-model support** - Works with OpenAI, Anthropic, and open-source models
11
+ - ⚡ **Parallel execution** - Run multiple instances simultaneously
12
+ - 🎯 **Interactive shell mode** - Step through solutions interactively
13
+ - 📈 **Complete parity** with Python SWE-agent functionality
14
+
15
+ ## 📦 Installation
16
+
17
+ ### Prerequisites
18
+ - Node.js 18+ and npm
19
+ - Docker (for sandboxed execution)
20
+ - Git
21
+
22
+ ### Quick Install
23
+
24
+ ```bash
25
+ # Clone the repository
26
+ git clone https://github.com/elizaos/swe-agent-ts.git
27
+ cd swe-agent-ts
28
+
29
+ # Install dependencies
30
+ npm install
31
+
32
+ # Build the project
33
+ npm run build
34
+
35
+ # Set up API keys (choose one)
36
+ export OPENAI_API_KEY=your_key
37
+ # OR
38
+ export ANTHROPIC_API_KEY=your_key
39
+ ```
40
+
41
+ ### Global Installation (Optional)
42
+
43
+ ```bash
44
+ # Install globally for system-wide access
45
+ npm install -g .
46
+
47
+ # Now you can use 'sweagent' command anywhere
48
+ sweagent --help
49
+ ```
50
+
51
+ ## 🚀 Quick Start
52
+
53
+ ### 1. Solve a GitHub Issue Automatically
54
+
55
+ ```bash
56
+ # Have SWE-agent automatically fix a GitHub issue
57
+ npx sweagent run \
58
+ --agent.model.name gpt-4o \
59
+ --env.repo.github_url https://github.com/user/repo \
60
+ --problem_statement.github_url https://github.com/user/repo/issues/123
61
+ ```
62
+
63
+ The agent will:
64
+ 1. Clone the repository
65
+ 2. Understand the issue
66
+ 3. Write and test a solution
67
+ 4. Create a patch file with the fix
68
+
69
+ ### 2. Write Code from a Description
70
+
71
+ ```bash
72
+ # Create a new feature from a text description
73
+ echo "Create a REST API with CRUD operations for a todo list app" > task.md
74
+
75
+ npx sweagent run \
76
+ --agent.model.name gpt-4o \
77
+ --env.repo.path ./my-project \
78
+ --problem_statement.path task.md
79
+ ```
80
+
81
+ ### 3. Interactive Shell Mode
82
+
83
+ ```bash
84
+ # Work interactively with the agent
85
+ npx sweagent shell \
86
+ --repo ./my-project \
87
+ --config config/default.yaml
88
+
89
+ # In the shell, you can:
90
+ # - Ask it to implement features
91
+ # - Debug issues together
92
+ # - Review its proposed changes
93
+ ```
94
+
95
+ ## 📊 Running Benchmarks
96
+
97
+ ### SWE-bench Benchmarking
98
+
99
+ Test the agent on real-world GitHub issues:
100
+
101
+ ```bash
102
+ # Quick test on 3 instances
103
+ npx sweagent run-batch \
104
+ --instances.type swe_bench \
105
+ --instances.subset lite \
106
+ --instances.split dev \
107
+ --instances.slice :3 \
108
+ --agent.model.name gpt-4o
109
+
110
+ # Full benchmark with parallel execution
111
+ npx sweagent run-batch \
112
+ --instances.type swe_bench \
113
+ --instances.subset lite \
114
+ --instances.slice :50 \
115
+ --num_workers 5 \
116
+ --agent.model.name gpt-4o \
117
+ --instances.evaluate
118
+ ```
119
+
120
+ ### Custom Benchmarks
121
+
122
+ ```bash
123
+ # Run on your own test cases
124
+ cat > my_tests.json << EOF
125
+ [
126
+ {
127
+ "imageName": "python:3.11",
128
+ "problemStatement": "Fix the authentication bug in login.py",
129
+ "instanceId": "auth-001",
130
+ "repoName": "my-app",
131
+ "baseCommit": "main"
132
+ }
133
+ ]
134
+ EOF
135
+
136
+ npx sweagent run-batch \
137
+ --instances.type file \
138
+ --instances.path my_tests.json \
139
+ --agent.model.name gpt-4o
140
+ ```
141
+
142
+ ## 🧪 Running Tests
143
+
144
+ ```bash
145
+ # Run all tests
146
+ npm test
147
+
148
+ # Run specific test suites
149
+ npm test -- test-agent
150
+ npm test -- test-swe-bench
151
+ npm test -- test-environment
152
+
153
+ # Run with coverage
154
+ npm test -- --coverage
155
+
156
+ # Run linting
157
+ npm run lint
158
+
159
+ # Format code
160
+ npm run format
161
+ ```
162
+
163
+ ## 💡 Examples and Demos
164
+
165
+ ### Run Example Scripts
166
+
167
+ ```bash
168
+ # Demo SWE-bench capabilities
169
+ node examples/demo_swe_bench.js
170
+
171
+ # Run comprehensive benchmark examples
172
+ ./examples/run_swe_bench.sh
173
+
174
+ # Test basic functionality
175
+ node examples/test_swe_bench_simple.js
176
+ ```
177
+
178
+ ### Common Use Cases
179
+
180
+ #### Fix a Bug
181
+ ```bash
182
+ npx sweagent run \
183
+ --agent.model.name gpt-4o \
184
+ --env.repo.path ./my-app \
185
+ --problem_statement.text "The login form throws an error when email contains special characters"
186
+ ```
187
+
188
+ #### Add a Feature
189
+ ```bash
190
+ npx sweagent run \
191
+ --agent.model.name claude-3-sonnet-20241022 \
192
+ --env.repo.github_url https://github.com/user/repo \
193
+ --problem_statement.text "Add dark mode support to the settings page"
194
+ ```
195
+
196
+ #### Refactor Code
197
+ ```bash
198
+ npx sweagent run \
199
+ --agent.model.name gpt-4o \
200
+ --env.repo.path ./legacy-app \
201
+ --problem_statement.text "Refactor the user service to use async/await instead of callbacks"
202
+ ```
203
+
204
+ ## 🏗️ Project Structure
205
+
206
+ ```
207
+ swe-agent-ts/
208
+ ├── src/
209
+ │ ├── agent/ # Core agent logic
210
+ │ ├── environment/ # Execution environment
211
+ │ ├── run/ # CLI and batch execution
212
+ │ ├── tools/ # Agent tools and commands
213
+ │ └── utils/ # Utilities
214
+ ├── config/ # Configuration files
215
+ ├── examples/ # Example scripts and demos
216
+ ├── tests/ # Test suite
217
+ └── docs/ # Documentation
218
+ ```
219
+
220
+ ## ⚙️ Configuration
221
+
222
+ ### Model Configuration
223
+
224
+ ```yaml
225
+ # config/my_config.yaml
226
+ agent:
227
+ model:
228
+ name: gpt-4o
229
+ per_instance_cost_limit: 2.00
230
+ temperature: 0.7
231
+
232
+ tools:
233
+ execution_timeout: 30
234
+ max_consecutive_execution_timeouts: 3
235
+ ```
236
+
237
+ ### Using Different Models
238
+
239
+ ```bash
240
+ # OpenAI GPT-4
241
+ export OPENAI_API_KEY=your_key
242
+ npx sweagent run --agent.model.name gpt-5 ...
243
+
244
+ # Anthropic Claude
245
+ export ANTHROPIC_API_KEY=your_key
246
+ npx sweagent run --agent.model.name claude-4-sonnet ...
247
+
248
+ # Local/Open-source models via LiteLLM
249
+ npx sweagent run --agent.model.name ollama/codellama ...
250
+ ```
251
+
252
+ ## 🔧 Advanced Usage
253
+
254
+ ### Custom Tools and Commands
255
+
256
+ ```typescript
257
+ // Create custom tools for the agent
258
+ import { Bundle } from 'swe-agent-ts';
259
+
260
+ const customBundle = new Bundle({
261
+ name: 'my-tools',
262
+ commands: [
263
+ {
264
+ name: 'analyze',
265
+ description: 'Analyze code quality',
266
+ script: 'npm run analyze'
267
+ }
268
+ ]
269
+ });
270
+ ```
271
+
272
+ ### Hooks and Extensions
273
+
274
+ ```typescript
275
+ // Add custom hooks to monitor agent behavior
276
+ import { AbstractAgentHook } from 'swe-agent-ts';
277
+
278
+ class MyHook extends AbstractAgentHook {
279
+ onStepStart() {
280
+ console.log('Agent is thinking...');
281
+ }
282
+
283
+ onActionExecuted(step) {
284
+ console.log(`Executed: ${step.action}`);
285
+ }
286
+ }
287
+ ```
288
+
289
+ ## 🐛 Troubleshooting
290
+
291
+ ### Common Issues
292
+
293
+ 1. **Node Version**: Ensure Node.js 18+
294
+ ```bash
295
+ node --version # Should be v18.0.0 or higher
296
+ ```
297
+
298
+ 2. **Build Errors**: Clean and rebuild
299
+ ```bash
300
+ npm run clean
301
+ npm install
302
+ npm run build
303
+ ```
304
+
305
+ 3. **Docker Issues**: Ensure Docker is running
306
+ ```bash
307
+ docker ps # Should show running containers
308
+ ```
309
+
310
+ 4. **API Keys**: Verify environment variables
311
+ ```bash
312
+ echo $OPENAI_API_KEY
313
+ echo $ANTHROPIC_API_KEY
314
+ ```
315
+
316
+ ```bash
317
+ # Fork and clone the repository
318
+ git clone https://github.com/elizaos/swe-agent-ts.git
319
+
320
+ # Create a feature branch
321
+ git checkout -b feature/amazing-feature
322
+
323
+ # Make changes and test
324
+ npm test
325
+
326
+ # Submit a pull request
327
+ ```
328
+
329
+ ## 📄 License
330
+
331
+ MIT License - see [LICENSE](LICENSE) file for details.
332
+
333
+ ## 🙏 Acknowledgments
334
+
335
+ This TypeScript port is based on the original [SWE-agent](https://github.com/princeton-nlp/SWE-agent) by Princeton University and Stanford University researchers.