@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,277 @@
1
+ //! History processors for managing conversation history
2
+ //!
3
+ //! These processors transform the conversation history before it's sent to the model.
4
+
5
+ use crate::types::{Content, History};
6
+ use regex::Regex;
7
+ use serde::{Deserialize, Serialize};
8
+
9
+ /// Trait for history processors
10
+ pub trait HistoryProcessor: Send + Sync {
11
+ fn process(&self, history: History) -> History;
12
+ }
13
+
14
+ /// Default history processor that passes through unchanged
15
+ pub struct DefaultHistoryProcessor;
16
+
17
+ impl HistoryProcessor for DefaultHistoryProcessor {
18
+ fn process(&self, history: History) -> History {
19
+ history
20
+ }
21
+ }
22
+
23
+ /// Processor that keeps only the last N observations
24
+ pub struct LastNObservations {
25
+ n: usize,
26
+ }
27
+
28
+ impl LastNObservations {
29
+ pub fn new(n: usize) -> Self {
30
+ Self { n }
31
+ }
32
+ }
33
+
34
+ impl HistoryProcessor for LastNObservations {
35
+ fn process(&self, history: History) -> History {
36
+ if self.n == 0 {
37
+ return history;
38
+ }
39
+
40
+ let mut result = Vec::new();
41
+ let mut observation_count = 0;
42
+
43
+ // Iterate in reverse to count observations from the end
44
+ for item in history.iter().rev() {
45
+ let is_observation = item
46
+ .message_type
47
+ .as_ref()
48
+ .map(|t| matches!(t, crate::types::MessageType::Observation))
49
+ .unwrap_or(false);
50
+
51
+ if is_observation {
52
+ observation_count += 1;
53
+ }
54
+
55
+ if observation_count <= self.n || !is_observation {
56
+ result.push(item.clone());
57
+ }
58
+ }
59
+
60
+ result.reverse();
61
+ result
62
+ }
63
+ }
64
+
65
+ /// Processor that wraps tool call observations in tags
66
+ pub struct TagToolCallObservations {
67
+ tag: String,
68
+ }
69
+
70
+ impl TagToolCallObservations {
71
+ pub fn new(tag: impl Into<String>) -> Self {
72
+ Self { tag: tag.into() }
73
+ }
74
+ }
75
+
76
+ impl HistoryProcessor for TagToolCallObservations {
77
+ fn process(&self, history: History) -> History {
78
+ history
79
+ .into_iter()
80
+ .map(|mut item| {
81
+ if item.tool_call_ids.is_some() {
82
+ let content = item.content.as_str();
83
+ item.content =
84
+ Content::Text(format!("<{}>\n{}\n</{}>", self.tag, content, self.tag));
85
+ }
86
+ item
87
+ })
88
+ .collect()
89
+ }
90
+ }
91
+
92
+ /// Processor that handles closed window files
93
+ pub struct ClosedWindowHistoryProcessor;
94
+
95
+ impl HistoryProcessor for ClosedWindowHistoryProcessor {
96
+ fn process(&self, history: History) -> History {
97
+ // Implementation would track open/closed files and adjust history
98
+ history
99
+ }
100
+ }
101
+
102
+ /// Processor that adds cache control headers for Anthropic
103
+ pub struct CacheControlHistoryProcessor;
104
+
105
+ impl HistoryProcessor for CacheControlHistoryProcessor {
106
+ fn process(&self, history: History) -> History {
107
+ // Add cache control for last few messages
108
+ history
109
+ }
110
+ }
111
+
112
+ /// Processor that removes content matching a regex pattern
113
+ pub struct RemoveRegex {
114
+ pattern: Regex,
115
+ }
116
+
117
+ impl RemoveRegex {
118
+ pub fn new(pattern: &str) -> Option<Self> {
119
+ Regex::new(pattern).ok().map(|pattern| Self { pattern })
120
+ }
121
+ }
122
+
123
+ impl HistoryProcessor for RemoveRegex {
124
+ fn process(&self, history: History) -> History {
125
+ history
126
+ .into_iter()
127
+ .map(|mut item| {
128
+ let content = item.content.as_str();
129
+ let cleaned = self.pattern.replace_all(&content, "").to_string();
130
+ item.content = Content::Text(cleaned);
131
+ item
132
+ })
133
+ .collect()
134
+ }
135
+ }
136
+
137
+ /// Processor that handles image parsing in history
138
+ pub struct ImageParsingHistoryProcessor {
139
+ disable_images: bool,
140
+ }
141
+
142
+ impl ImageParsingHistoryProcessor {
143
+ pub fn new(disable_images: bool) -> Self {
144
+ Self { disable_images }
145
+ }
146
+ }
147
+
148
+ impl HistoryProcessor for ImageParsingHistoryProcessor {
149
+ fn process(&self, history: History) -> History {
150
+ if !self.disable_images {
151
+ return history;
152
+ }
153
+
154
+ // Remove image content parts
155
+ history
156
+ .into_iter()
157
+ .map(|mut item| {
158
+ if let Content::Structured(parts) = &item.content {
159
+ let filtered: Vec<_> = parts
160
+ .iter()
161
+ .filter(|p| !matches!(p, crate::types::ContentPart::Image { .. }))
162
+ .cloned()
163
+ .collect();
164
+ item.content = Content::Structured(filtered);
165
+ }
166
+ item
167
+ })
168
+ .collect()
169
+ }
170
+ }
171
+
172
+ /// Chain multiple history processors together
173
+ pub struct ChainedHistoryProcessor {
174
+ processors: Vec<Box<dyn HistoryProcessor>>,
175
+ }
176
+
177
+ impl ChainedHistoryProcessor {
178
+ pub fn new(processors: Vec<Box<dyn HistoryProcessor>>) -> Self {
179
+ Self { processors }
180
+ }
181
+ }
182
+
183
+ impl HistoryProcessor for ChainedHistoryProcessor {
184
+ fn process(&self, mut history: History) -> History {
185
+ for processor in &self.processors {
186
+ history = processor.process(history);
187
+ }
188
+ history
189
+ }
190
+ }
191
+
192
+ /// Configuration for history processors
193
+ #[derive(Debug, Clone, Default, Serialize, Deserialize)]
194
+ #[serde(tag = "type", rename_all = "snake_case")]
195
+ pub enum HistoryProcessorConfig {
196
+ #[default]
197
+ Default,
198
+ LastNObservations { n: usize },
199
+ TagToolCallObservations { tag: String },
200
+ ClosedWindow,
201
+ CacheControl,
202
+ RemoveRegex { pattern: String },
203
+ ImageParsing { disable_images: bool },
204
+ }
205
+
206
+ /// Create a history processor from configuration
207
+ pub fn create_history_processor(config: &HistoryProcessorConfig) -> Box<dyn HistoryProcessor> {
208
+ match config {
209
+ HistoryProcessorConfig::Default => Box::new(DefaultHistoryProcessor),
210
+ HistoryProcessorConfig::LastNObservations { n } => Box::new(LastNObservations::new(*n)),
211
+ HistoryProcessorConfig::TagToolCallObservations { tag } => {
212
+ Box::new(TagToolCallObservations::new(tag))
213
+ }
214
+ HistoryProcessorConfig::ClosedWindow => Box::new(ClosedWindowHistoryProcessor),
215
+ HistoryProcessorConfig::CacheControl => Box::new(CacheControlHistoryProcessor),
216
+ HistoryProcessorConfig::RemoveRegex { pattern } => RemoveRegex::new(pattern)
217
+ .map(|p| Box::new(p) as Box<dyn HistoryProcessor>)
218
+ .unwrap_or_else(|| Box::new(DefaultHistoryProcessor)),
219
+ HistoryProcessorConfig::ImageParsing { disable_images } => {
220
+ Box::new(ImageParsingHistoryProcessor::new(*disable_images))
221
+ }
222
+ }
223
+ }
224
+
225
+ #[cfg(test)]
226
+ mod tests {
227
+ use super::*;
228
+ use crate::types::{HistoryItem, MessageType, Role};
229
+
230
+ #[test]
231
+ fn test_default_processor() {
232
+ let processor = DefaultHistoryProcessor;
233
+ let history = vec![HistoryItem::user("test")];
234
+ let result = processor.process(history.clone());
235
+ assert_eq!(result.len(), history.len());
236
+ }
237
+
238
+ #[test]
239
+ fn test_last_n_observations() {
240
+ let processor = LastNObservations::new(2);
241
+ let history = vec![
242
+ HistoryItem {
243
+ role: Role::User,
244
+ content: Content::Text("obs1".to_string()),
245
+ message_type: Some(MessageType::Observation),
246
+ ..Default::default()
247
+ },
248
+ HistoryItem {
249
+ role: Role::User,
250
+ content: Content::Text("obs2".to_string()),
251
+ message_type: Some(MessageType::Observation),
252
+ ..Default::default()
253
+ },
254
+ HistoryItem {
255
+ role: Role::User,
256
+ content: Content::Text("obs3".to_string()),
257
+ message_type: Some(MessageType::Observation),
258
+ ..Default::default()
259
+ },
260
+ ];
261
+
262
+ let result = processor.process(history);
263
+ assert_eq!(result.len(), 2);
264
+ }
265
+
266
+ #[test]
267
+ fn test_remove_regex() {
268
+ let processor = RemoveRegex::new(r"\[DEBUG\]").unwrap();
269
+ let history = vec![HistoryItem {
270
+ content: Content::Text("Hello [DEBUG] world".to_string()),
271
+ ..Default::default()
272
+ }];
273
+
274
+ let result = processor.process(history);
275
+ assert_eq!(result[0].content.as_str(), "Hello world");
276
+ }
277
+ }
@@ -0,0 +1,208 @@
1
+ //! Agent hooks for monitoring and extending agent behavior
2
+
3
+ use crate::types::{AgentInfo, History, StepOutput, Trajectory};
4
+ use async_trait::async_trait;
5
+
6
+ /// Abstract hook for agent events
7
+ #[async_trait]
8
+ pub trait AgentHook: Send + Sync {
9
+ /// Called when agent is initialized
10
+ fn on_init(&mut self, _agent: &dyn std::any::Any) {}
11
+
12
+ /// Called when tools installation starts
13
+ fn on_tools_installation_started(&mut self) {}
14
+
15
+ /// Called when setup attempt begins
16
+ fn on_setup_attempt(&mut self) {}
17
+
18
+ /// Called when setup is complete
19
+ fn on_setup_done(&mut self) {}
20
+
21
+ /// Called when a query message is added to history
22
+ fn on_query_message_added(&mut self, _message: &QueryMessageEvent) {}
23
+
24
+ /// Called when model is queried
25
+ fn on_model_query(&mut self, _history: &History, _agent_name: &str) {}
26
+
27
+ /// Called when actions are generated
28
+ fn on_actions_generated(&mut self, _step: &StepOutput) {}
29
+
30
+ /// Called when action execution starts
31
+ fn on_action_started(&mut self, _step: &StepOutput) {}
32
+
33
+ /// Called when action execution completes
34
+ fn on_action_executed(&mut self, _step: &StepOutput) {}
35
+
36
+ /// Called when a step starts
37
+ fn on_step_start(&mut self) {}
38
+
39
+ /// Called when a step completes
40
+ fn on_step_done(&mut self, _step: &StepOutput, _info: &AgentInfo) {}
41
+
42
+ /// Called when a run starts
43
+ fn on_run_start(&mut self) {}
44
+
45
+ /// Called when a run completes
46
+ fn on_run_done(&mut self, _trajectory: &Trajectory, _info: &AgentInfo) {}
47
+ }
48
+
49
+ /// Event data for query message added
50
+ #[derive(Debug, Clone)]
51
+ pub struct QueryMessageEvent {
52
+ pub agent: String,
53
+ pub role: String,
54
+ pub content: String,
55
+ pub message_type: String,
56
+ pub is_demo: Option<bool>,
57
+ pub thought: Option<String>,
58
+ pub action: Option<String>,
59
+ }
60
+
61
+ /// Combined hook that wraps multiple hooks
62
+ pub struct CombinedAgentHook {
63
+ hooks: Vec<Box<dyn AgentHook>>,
64
+ }
65
+
66
+ impl CombinedAgentHook {
67
+ pub fn new() -> Self {
68
+ Self { hooks: Vec::new() }
69
+ }
70
+
71
+ pub fn add_hook(&mut self, hook: Box<dyn AgentHook>) {
72
+ self.hooks.push(hook);
73
+ }
74
+ }
75
+
76
+ impl Default for CombinedAgentHook {
77
+ fn default() -> Self {
78
+ Self::new()
79
+ }
80
+ }
81
+
82
+ #[async_trait]
83
+ impl AgentHook for CombinedAgentHook {
84
+ fn on_init(&mut self, agent: &dyn std::any::Any) {
85
+ for hook in &mut self.hooks {
86
+ hook.on_init(agent);
87
+ }
88
+ }
89
+
90
+ fn on_tools_installation_started(&mut self) {
91
+ for hook in &mut self.hooks {
92
+ hook.on_tools_installation_started();
93
+ }
94
+ }
95
+
96
+ fn on_setup_attempt(&mut self) {
97
+ for hook in &mut self.hooks {
98
+ hook.on_setup_attempt();
99
+ }
100
+ }
101
+
102
+ fn on_setup_done(&mut self) {
103
+ for hook in &mut self.hooks {
104
+ hook.on_setup_done();
105
+ }
106
+ }
107
+
108
+ fn on_query_message_added(&mut self, message: &QueryMessageEvent) {
109
+ for hook in &mut self.hooks {
110
+ hook.on_query_message_added(message);
111
+ }
112
+ }
113
+
114
+ fn on_model_query(&mut self, history: &History, agent_name: &str) {
115
+ for hook in &mut self.hooks {
116
+ hook.on_model_query(history, agent_name);
117
+ }
118
+ }
119
+
120
+ fn on_actions_generated(&mut self, step: &StepOutput) {
121
+ for hook in &mut self.hooks {
122
+ hook.on_actions_generated(step);
123
+ }
124
+ }
125
+
126
+ fn on_action_started(&mut self, step: &StepOutput) {
127
+ for hook in &mut self.hooks {
128
+ hook.on_action_started(step);
129
+ }
130
+ }
131
+
132
+ fn on_action_executed(&mut self, step: &StepOutput) {
133
+ for hook in &mut self.hooks {
134
+ hook.on_action_executed(step);
135
+ }
136
+ }
137
+
138
+ fn on_step_start(&mut self) {
139
+ for hook in &mut self.hooks {
140
+ hook.on_step_start();
141
+ }
142
+ }
143
+
144
+ fn on_step_done(&mut self, step: &StepOutput, info: &AgentInfo) {
145
+ for hook in &mut self.hooks {
146
+ hook.on_step_done(step, info);
147
+ }
148
+ }
149
+
150
+ fn on_run_start(&mut self) {
151
+ for hook in &mut self.hooks {
152
+ hook.on_run_start();
153
+ }
154
+ }
155
+
156
+ fn on_run_done(&mut self, trajectory: &Trajectory, info: &AgentInfo) {
157
+ for hook in &mut self.hooks {
158
+ hook.on_run_done(trajectory, info);
159
+ }
160
+ }
161
+ }
162
+
163
+ /// Status hook that logs agent progress
164
+ pub struct StatusHook {
165
+ pub show_progress: bool,
166
+ }
167
+
168
+ impl StatusHook {
169
+ pub fn new(show_progress: bool) -> Self {
170
+ Self { show_progress }
171
+ }
172
+ }
173
+
174
+ impl Default for StatusHook {
175
+ fn default() -> Self {
176
+ Self::new(true)
177
+ }
178
+ }
179
+
180
+ #[async_trait]
181
+ impl AgentHook for StatusHook {
182
+ fn on_step_start(&mut self) {
183
+ if self.show_progress {
184
+ tracing::info!("Step started");
185
+ }
186
+ }
187
+
188
+ fn on_step_done(&mut self, step: &StepOutput, _info: &AgentInfo) {
189
+ if self.show_progress {
190
+ tracing::info!(
191
+ done = step.done,
192
+ exit_status = ?step.exit_status,
193
+ "Step completed"
194
+ );
195
+ }
196
+ }
197
+
198
+ fn on_run_done(&mut self, trajectory: &Trajectory, info: &AgentInfo) {
199
+ if self.show_progress {
200
+ tracing::info!(
201
+ steps = trajectory.len(),
202
+ submission = ?info.submission,
203
+ exit_status = ?info.exit_status,
204
+ "Run completed"
205
+ );
206
+ }
207
+ }
208
+ }
@@ -0,0 +1,24 @@
1
+ //! Agent module for SWE-agent
2
+ //!
3
+ //! This module contains the core agent implementations including:
4
+ //! - `DefaultAgent` - The main agent implementation
5
+ //! - `RetryAgent` - An agent that retries with different configurations
6
+ //! - Various model implementations for LLM interaction
7
+ //! - History processors for managing conversation history
8
+ //! - Problem statement handling
9
+
10
+ pub mod action_sampler;
11
+ pub mod agents;
12
+ pub mod history_processors;
13
+ pub mod hooks;
14
+ pub mod models;
15
+ pub mod problem_statement;
16
+ pub mod reviewer;
17
+
18
+ pub use action_sampler::*;
19
+ pub use agents::*;
20
+ pub use history_processors::*;
21
+ pub use hooks::*;
22
+ pub use models::*;
23
+ pub use problem_statement::*;
24
+ pub use reviewer::*;