@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,153 @@
1
+ import json
2
+ import os
3
+ from pathlib import Path
4
+
5
+ import pytest
6
+
7
+ from sweagent import TOOLS_DIR
8
+ from tests.utils import make_python_tool_importable
9
+
10
+ DEFAULT_TOOLS_DIR = TOOLS_DIR / "windowed"
11
+ DEFAULT_TOOLS_BIN = DEFAULT_TOOLS_DIR / "bin"
12
+
13
+ make_python_tool_importable(DEFAULT_TOOLS_DIR / "lib/windowed_file.py", "windowed_file")
14
+ import windowed_file # type: ignore
15
+ from windowed_file import TextNotFound, WindowedFile # type: ignore
16
+
17
+
18
+ def test_env_file_override(with_tmp_env_file):
19
+ assert Path(os.getenv("SWE_AGENT_ENV_FILE")).name == ".swe-agent-env" # type: ignore
20
+
21
+
22
+ def create_test_file_with_content(tmp_env_file: Path, content: str) -> WindowedFile:
23
+ test_path = tmp_env_file.parent.joinpath("test.py")
24
+ registry = {
25
+ "CURRENT_FILE": str(test_path),
26
+ "FIRST_LINE": "0",
27
+ "WINDOW": "10",
28
+ }
29
+ tmp_env_file.write_text(json.dumps(registry))
30
+ test_path.write_text(content)
31
+ wf = WindowedFile(exit_on_exception=False)
32
+ wf.offset_multiplier = 1 / 4
33
+ return wf
34
+
35
+
36
+ @pytest.fixture
37
+ def windowed_file(with_tmp_env_file) -> WindowedFile:
38
+ content = "\n".join(map(str, range(100)))
39
+ return create_test_file_with_content(with_tmp_env_file, content)
40
+
41
+
42
+ def test_windowed_file(windowed_file):
43
+ wfile = windowed_file
44
+ assert wfile.first_line == 0
45
+ wfile.first_line = 10
46
+ assert wfile.first_line == 10
47
+ assert wfile.window == 10
48
+ assert wfile.n_lines == 100
49
+ a, b = wfile.line_range
50
+ assert b - a == wfile.window - 1
51
+ assert wfile.line_range == (10, 19)
52
+ wfile.print_window()
53
+ wfile.replace_in_window("10", "Hello, world!")
54
+ assert wfile.n_lines == 100
55
+ assert wfile.line_range == (7, 16)
56
+ wfile.first_line = 50
57
+ wfile.print_window()
58
+ wfile.replace_in_window("50", "Hello, world!")
59
+ wfile.print_window()
60
+ # Line 50 is now the 2nd line of the new window
61
+ assert wfile.line_range == (47, 56)
62
+ with pytest.raises(TextNotFound):
63
+ wfile.replace_in_window("asdf", "Hello, world!")
64
+
65
+
66
+ def test_windowed_file_goto(windowed_file):
67
+ wfile = windowed_file
68
+ assert wfile.first_line == 0
69
+ wfile.first_line = 10
70
+ wfile.goto(0, mode="top")
71
+ assert wfile.line_range[0] == 0
72
+ wfile.goto(50, mode="top")
73
+ # first line is 50 - 10//4 = 47
74
+ assert wfile.line_range[0] == 47
75
+ wfile.goto(100, mode="top")
76
+ assert wfile.line_range[1] == 99
77
+
78
+
79
+ def test_windowed_file_scroll(windowed_file):
80
+ wfile = windowed_file
81
+ assert wfile.first_line == 0
82
+ wfile.first_line = 10
83
+ wfile.scroll(10)
84
+ assert wfile.first_line == 20
85
+ wfile.scroll(-10)
86
+ assert wfile.first_line == 10
87
+ wfile.scroll(-100)
88
+ # Can't go lower than the middle of the lowest window
89
+ assert wfile.first_line == 0
90
+ wfile.scroll(100)
91
+ assert wfile.line_range[1] == 99
92
+
93
+
94
+ # def test_goto_command(windowed_file):
95
+ # wfile = windowed_file
96
+ # assert wfile.current_line == 10
97
+ # assert (DEFAULT_TOOLS_BIN / "goto").exists()
98
+
99
+ # # Use sys.executable to get the correct Python interpreter
100
+ # import sys
101
+ # cmd = f"{sys.executable} {DEFAULT_TOOLS_BIN}/goto 50"
102
+ # print(
103
+ # subprocess.check_output(
104
+ # cmd,
105
+ # shell=True,
106
+ # universal_newlines=True,
107
+ # stderr=subprocess.STDOUT,
108
+ # env=os.environ.copy(), # Ensure we pass the current environment
109
+ # )
110
+ # )
111
+ # assert wfile.current_line == 50
112
+
113
+
114
+ _DEFAULT_WINDOW_OUTPUT = """[File: {path} (100 lines total)]
115
+ (10 more lines above)
116
+ 11:10
117
+ 12:11
118
+ 13:12
119
+ 14:13
120
+ 15:14
121
+ 16:15
122
+ 17:16
123
+ 18:17
124
+ 19:18
125
+ 20:19
126
+ (80 more lines below)
127
+ """
128
+
129
+
130
+ def test_print_window(windowed_file, capsys):
131
+ wfile = windowed_file
132
+ wfile.first_line = 10
133
+ wfile.print_window()
134
+ captured = capsys.readouterr()
135
+ print(captured.out)
136
+ expected = _DEFAULT_WINDOW_OUTPUT.format(path=wfile.path.resolve())
137
+ assert captured.out == expected
138
+
139
+
140
+ _DEFAULT_WINDOW_OUTPUT_NEW_FILE = """[File: {path} (1 lines total)]
141
+ 1:
142
+ """
143
+
144
+
145
+ def test_print_window_new_file(with_tmp_env_file, capsys):
146
+ wfile = create_test_file_with_content(with_tmp_env_file, "\n")
147
+ assert wfile.n_lines == 1
148
+ assert wfile.line_range == (0, 0)
149
+ wfile.print_window()
150
+ captured = capsys.readouterr()
151
+ print(captured.out)
152
+ expected = _DEFAULT_WINDOW_OUTPUT_NEW_FILE.format(path=wfile.path.resolve())
153
+ assert captured.out == expected
File without changes
@@ -0,0 +1,82 @@
1
+ from __future__ import annotations
2
+
3
+ from tests.utils import make_python_tool_importable
4
+
5
+ make_python_tool_importable("tools/windowed/lib/flake8_utils.py", "flake8_utils")
6
+ from flake8_utils import Flake8Error, format_flake8_output # type: ignore
7
+
8
+
9
+ def test_partition_flake8_line():
10
+ assert Flake8Error.from_line("existing_lint error.py:12:41: E999 SyntaxError: invalid syntax") == Flake8Error(
11
+ "existing_lint error.py", 12, 41, "E999 SyntaxError: invalid syntax"
12
+ )
13
+
14
+
15
+ # def test_update_previous_errors():
16
+ # previous_errors = [
17
+ # Flake8Error("existing_lint_error.py", 12, 41, "E999 SyntaxError: invalid syntax"),
18
+ # Flake8Error("existing_lint_error.py", 15, 41, "E999 SyntaxError: invalid syntax"),
19
+ # Flake8Error("existing_lint_error.py", 20, 41, "E999 SyntaxError: invalid syntax"),
20
+ # ]
21
+ # assert _update_previous_errors(previous_errors, (15, 18), 3) == [
22
+ # Flake8Error("existing_lint_error.py", 12, 41, "E999 SyntaxError: invalid syntax"),
23
+ # Flake8Error("existing_lint_error.py", 19, 41, "E999 SyntaxError: invalid syntax"),
24
+ # ]
25
+ # assert _update_previous_errors([], (15, 18), 3) == []
26
+
27
+
28
+ def test_flake8_format_no_error_1():
29
+ assert (
30
+ format_flake8_output(
31
+ "a:12:41: e", previous_errors_string="a:12:41: e", replacement_window=(50, 51), replacement_n_lines=10
32
+ )
33
+ == ""
34
+ )
35
+
36
+
37
+ def test_flake8_format_no_error_2():
38
+ assert (
39
+ format_flake8_output(
40
+ "a:12:41: e", previous_errors_string="a:13:41: e", replacement_window=(1, 2), replacement_n_lines=1
41
+ )
42
+ == ""
43
+ )
44
+
45
+
46
+ def test_flake8_format_no_error_3():
47
+ assert (
48
+ format_flake8_output(
49
+ "a:12:41: e",
50
+ previous_errors_string="a:13:41: e",
51
+ replacement_window=(1, 2),
52
+ replacement_n_lines=1,
53
+ show_line_numbers=False,
54
+ )
55
+ == ""
56
+ )
57
+
58
+
59
+ def test_flake8_format_error_1():
60
+ assert (
61
+ format_flake8_output(
62
+ "a:12:41: e",
63
+ previous_errors_string="a:13:41: e",
64
+ replacement_window=(12, 13),
65
+ replacement_n_lines=10,
66
+ show_line_numbers=False,
67
+ )
68
+ == "- e"
69
+ )
70
+
71
+
72
+ def test_flake8_format_error_1_linenumbers():
73
+ assert (
74
+ format_flake8_output(
75
+ "a:12:41: e",
76
+ previous_errors_string="a:13:41: e",
77
+ replacement_window=(12, 13),
78
+ replacement_n_lines=10,
79
+ show_line_numbers=True,
80
+ )
81
+ == "- line 12 col 41: e"
82
+ )
@@ -0,0 +1,29 @@
1
+ import importlib.machinery
2
+ import importlib.util
3
+ import sys
4
+ from pathlib import Path
5
+
6
+
7
+ def make_python_tool_importable(file_path: str | Path, module_name: str | None = None) -> None:
8
+ """Import a Python executable script and add it to sys.modules.
9
+
10
+ Args:
11
+ file_path: Path to the executable script (relative or absolute)
12
+ module_name: Name of the module to import the script as. If None, the filename stem is used.
13
+ """
14
+ # Convert to absolute path if needed
15
+ abs_path = Path(file_path).resolve().as_posix()
16
+ module_name = Path(file_path).stem if module_name is None else module_name
17
+
18
+ if module_name in sys.modules:
19
+ return # Module already imported
20
+
21
+ loader = importlib.machinery.SourceFileLoader(module_name, abs_path)
22
+ spec = importlib.util.spec_from_file_location(module_name, abs_path, loader=loader)
23
+ if spec is None or spec.loader is None:
24
+ msg = f"Could not load module spec for {file_path}"
25
+ raise ImportError(msg)
26
+
27
+ module = importlib.util.module_from_spec(spec)
28
+ sys.modules[module_name] = module
29
+ spec.loader.exec_module(module)
@@ -0,0 +1,52 @@
1
+ #!/usr/bin/env python3
2
+
3
+ def main() -> None:
4
+ import json
5
+ import os
6
+ from pathlib import Path
7
+ import subprocess
8
+
9
+ from registry import registry
10
+
11
+ state_path = Path("/root/state.json")
12
+ if state_path.exists():
13
+ state = json.loads(state_path.read_text())
14
+ else:
15
+ state = {}
16
+
17
+ repo_root = registry.get("ROOT", os.getenv("ROOT"))
18
+
19
+ patch_path = Path("/root/model.patch")
20
+
21
+ subprocess.run(
22
+ f"git add -A && git diff --cached > {patch_path}",
23
+ shell=True,
24
+ stdout=subprocess.DEVNULL,
25
+ stderr=subprocess.DEVNULL,
26
+ cwd=repo_root,
27
+ )
28
+
29
+ patch = patch_path.read_text(errors="backslashreplace")
30
+ state["diff"] = patch.strip()
31
+
32
+ state_path.write_text(json.dumps(state))
33
+
34
+
35
+ def _del_diff():
36
+ from pathlib import Path
37
+ import json
38
+
39
+ state_path = Path("/root/state.json")
40
+ if state_path.exists():
41
+ state = json.loads(state_path.read_text())
42
+ else:
43
+ state = {}
44
+ state["diff"] = ""
45
+ state_path.write_text(json.dumps(state))
46
+
47
+
48
+ if __name__ == "__main__":
49
+ try:
50
+ main()
51
+ except Exception as e:
52
+ _del_diff()
@@ -0,0 +1,2 @@
1
+ tools: {}
2
+ state_command: "_state_diff_state"
@@ -0,0 +1,21 @@
1
+ #!/usr/bin/env python3
2
+
3
+ import json
4
+ import os
5
+ from pathlib import Path
6
+
7
+
8
+ def main():
9
+ state_path = Path("/root/state.json")
10
+ if state_path.exists():
11
+ state = json.loads(state_path.read_text())
12
+ else:
13
+ state = {}
14
+
15
+ state["working_dir"] = os.getcwd()
16
+
17
+ state_path.write_text(json.dumps(state))
18
+
19
+
20
+ if __name__ == "__main__":
21
+ main()