@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.
- package/LICENSE +21 -0
- package/README.md +270 -0
- package/package.json +71 -0
- package/python/LICENSE +21 -0
- package/python/config/README.md +15 -0
- package/python/config/bash_only.yaml +222 -0
- package/python/config/benchmarks/250212_sweagent_heavy_sbl.yaml +188 -0
- package/python/config/benchmarks/250225_anthropic_filemap_simple_review.yaml +75 -0
- package/python/config/benchmarks/250522_anthropic_filemap_simple_review.yaml +92 -0
- package/python/config/benchmarks/250526_anthropic_filemap_simple_review_sbl.yaml +93 -0
- package/python/config/benchmarks/anthropic_filemap_multilingual.yaml +66 -0
- package/python/config/coding_challenge.yaml +104 -0
- package/python/config/default.yaml +69 -0
- package/python/config/default_backticks.yaml +69 -0
- package/python/config/default_mm_no_images.yaml +82 -0
- package/python/config/default_mm_with_images.yaml +83 -0
- package/python/config/demo/default.yaml +80 -0
- package/python/config/demo/no_instructions.yaml +69 -0
- package/python/config/demo/only_bash.yaml +60 -0
- package/python/config/exotic/default_shell.yaml +52 -0
- package/python/config/exotic/windowed_replace.yaml +125 -0
- package/python/config/exotic/windowed_replace_late_repro.yaml +127 -0
- package/python/config/human/human.yaml +24 -0
- package/python/config/human/human_demo.yaml +52 -0
- package/python/config/sweagent_0_7/07.yaml +101 -0
- package/python/config/sweagent_0_7/07_fcalling.yaml +100 -0
- package/python/config/sweagent_0_7/07_from_url.yaml +114 -0
- package/python/config/sweagent_0_7/07_thought_action.yaml +102 -0
- package/python/config/sweagent_0_7/07_thought_action_xml.yaml +96 -0
- package/python/mlc_config.json +44 -0
- package/python/pyproject.toml +262 -0
- package/python/sweagent/__init__.py +114 -0
- package/python/sweagent/__main__.py +4 -0
- package/python/sweagent/agent/__init__.py +0 -0
- package/python/sweagent/agent/action_sampler.py +317 -0
- package/python/sweagent/agent/agents.py +1294 -0
- package/python/sweagent/agent/extra/shell_agent.py +106 -0
- package/python/sweagent/agent/history_processors.py +399 -0
- package/python/sweagent/agent/hooks/__init__.py +0 -0
- package/python/sweagent/agent/hooks/abstract.py +139 -0
- package/python/sweagent/agent/hooks/status.py +34 -0
- package/python/sweagent/agent/models.py +896 -0
- package/python/sweagent/agent/problem_statement.py +312 -0
- package/python/sweagent/agent/reviewer.py +664 -0
- package/python/sweagent/environment/__init__.py +0 -0
- package/python/sweagent/environment/hooks/__init__.py +0 -0
- package/python/sweagent/environment/hooks/abstract.py +60 -0
- package/python/sweagent/environment/hooks/status.py +28 -0
- package/python/sweagent/environment/repo.py +219 -0
- package/python/sweagent/environment/swe_env.py +276 -0
- package/python/sweagent/exceptions.py +54 -0
- package/python/sweagent/inspector/README.md +6 -0
- package/python/sweagent/inspector/__init__.py +0 -0
- package/python/sweagent/inspector/favicon.ico +0 -0
- package/python/sweagent/inspector/fileViewer.js +354 -0
- package/python/sweagent/inspector/icons/computer.png +0 -0
- package/python/sweagent/inspector/icons/edit_icon.svg +11 -0
- package/python/sweagent/inspector/icons/swe-agent-logo-50.png +0 -0
- package/python/sweagent/inspector/icons/swellama_blue.png +0 -0
- package/python/sweagent/inspector/icons/swellama_brown.png +0 -0
- package/python/sweagent/inspector/icons/swellama_grey.png +0 -0
- package/python/sweagent/inspector/icons/swellama_tan.png +0 -0
- package/python/sweagent/inspector/index.html +25 -0
- package/python/sweagent/inspector/server.py +354 -0
- package/python/sweagent/inspector/static.py +169 -0
- package/python/sweagent/inspector/style.css +454 -0
- package/python/sweagent/run/__init__.py +0 -0
- package/python/sweagent/run/_progress.py +158 -0
- package/python/sweagent/run/batch_instances.py +419 -0
- package/python/sweagent/run/common.py +387 -0
- package/python/sweagent/run/compare_runs.py +123 -0
- package/python/sweagent/run/extract_pred.py +19 -0
- package/python/sweagent/run/hooks/__init__.py +0 -0
- package/python/sweagent/run/hooks/abstract.py +67 -0
- package/python/sweagent/run/hooks/apply_patch.py +106 -0
- package/python/sweagent/run/hooks/open_pr.py +244 -0
- package/python/sweagent/run/hooks/swe_bench_evaluate.py +113 -0
- package/python/sweagent/run/inspector_cli.py +493 -0
- package/python/sweagent/run/merge_predictions.py +64 -0
- package/python/sweagent/run/quick_stats.py +96 -0
- package/python/sweagent/run/remove_unfinished.py +63 -0
- package/python/sweagent/run/rich_test.py +91 -0
- package/python/sweagent/run/run.py +147 -0
- package/python/sweagent/run/run_batch.py +442 -0
- package/python/sweagent/run/run_replay.py +219 -0
- package/python/sweagent/run/run_shell.py +155 -0
- package/python/sweagent/run/run_single.py +225 -0
- package/python/sweagent/run/run_traj_to_demo.py +85 -0
- package/python/sweagent/tools/__init__.py +0 -0
- package/python/sweagent/tools/bundle.py +57 -0
- package/python/sweagent/tools/commands.py +220 -0
- package/python/sweagent/tools/parsing.py +619 -0
- package/python/sweagent/tools/tools.py +430 -0
- package/python/sweagent/tools/utils.py +108 -0
- package/python/sweagent/types.py +102 -0
- package/python/sweagent/utils/__init__.py +0 -0
- package/python/sweagent/utils/config.py +80 -0
- package/python/sweagent/utils/files.py +27 -0
- package/python/sweagent/utils/github.py +118 -0
- package/python/sweagent/utils/jinja_warnings.py +14 -0
- package/python/sweagent/utils/log.py +175 -0
- package/python/sweagent/utils/patch_formatter.py +152 -0
- package/python/sweagent/utils/serialization.py +45 -0
- package/python/tests/__init__.py +0 -0
- package/python/tests/conftest.py +191 -0
- package/python/tests/test_agent.py +258 -0
- package/python/tests/test_batch_instance.py +43 -0
- package/python/tests/test_commands/_interactive_dummy.py +35 -0
- package/python/tests/test_commands/interactive_dummy_wrapper.sh +29 -0
- package/python/tests/test_data/config_files/dummy_interactive.yaml +62 -0
- package/python/tests/test_data/data_sources/ctf/crypto/Katy/Dockerfile +20 -0
- package/python/tests/test_data/data_sources/ctf/crypto/Katy/README.md +13 -0
- package/python/tests/test_data/data_sources/ctf/crypto/Katy/challenge.json +12 -0
- package/python/tests/test_data/data_sources/ctf/crypto/Katy/customrandom.c +50 -0
- package/python/tests/test_data/data_sources/ctf/crypto/Katy/docker-compose.yml +14 -0
- package/python/tests/test_data/data_sources/ctf/crypto/Katy/release +0 -0
- package/python/tests/test_data/data_sources/ctf/crypto/Katy/server +0 -0
- package/python/tests/test_data/data_sources/ctf/crypto/Katy/solver.py +12 -0
- package/python/tests/test_data/data_sources/ctf/forensics/flash/README.md +16 -0
- package/python/tests/test_data/data_sources/ctf/forensics/flash/challenge.json +9 -0
- package/python/tests/test_data/data_sources/ctf/forensics/flash/flash_c8429a430278283c0e571baebca3d139.zip +0 -0
- package/python/tests/test_data/data_sources/ctf/misc/networking_1/README.md +15 -0
- package/python/tests/test_data/data_sources/ctf/misc/networking_1/challenge.json +10 -0
- package/python/tests/test_data/data_sources/ctf/misc/networking_1/networking.pcap +0 -0
- package/python/tests/test_data/data_sources/ctf/pwn/warmup/Dockerfile +28 -0
- package/python/tests/test_data/data_sources/ctf/pwn/warmup/README.md +14 -0
- package/python/tests/test_data/data_sources/ctf/pwn/warmup/challenge.json +14 -0
- package/python/tests/test_data/data_sources/ctf/pwn/warmup/docker-compose.yml +14 -0
- package/python/tests/test_data/data_sources/ctf/pwn/warmup/flag.txt +1 -0
- package/python/tests/test_data/data_sources/ctf/pwn/warmup/warmup +0 -0
- package/python/tests/test_data/data_sources/ctf/pwn/warmup/warmup.c +26 -0
- package/python/tests/test_data/data_sources/ctf/pwn/warmup/warmup.py +9 -0
- package/python/tests/test_data/data_sources/ctf/rev/rock/README.md +14 -0
- package/python/tests/test_data/data_sources/ctf/rev/rock/challenge.json +8 -0
- package/python/tests/test_data/data_sources/ctf/rev/rock/rock +0 -0
- package/python/tests/test_data/data_sources/ctf/rev/rock/rock.cpp +167 -0
- package/python/tests/test_data/data_sources/ctf/rev/rock/solution.cpp +24 -0
- package/python/tests/test_data/data_sources/ctf/rev/rock/test_solver/solution.py +6 -0
- package/python/tests/test_data/data_sources/ctf/rev/rock/test_solver/test.sh +10 -0
- package/python/tests/test_data/data_sources/ctf/web/i_got_id_demo/000-default.conf +18 -0
- package/python/tests/test_data/data_sources/ctf/web/i_got_id_demo/Dockerfile +20 -0
- package/python/tests/test_data/data_sources/ctf/web/i_got_id_demo/cgi/file.pl +38 -0
- package/python/tests/test_data/data_sources/ctf/web/i_got_id_demo/cgi/forms.pl +40 -0
- package/python/tests/test_data/data_sources/ctf/web/i_got_id_demo/cgi/hello.pl +11 -0
- package/python/tests/test_data/data_sources/ctf/web/i_got_id_demo/challenge.json +12 -0
- package/python/tests/test_data/data_sources/ctf/web/i_got_id_demo/docker-compose.yml +14 -0
- package/python/tests/test_data/data_sources/ctf/web/i_got_id_demo/flag +1 -0
- package/python/tests/test_data/data_sources/ctf/web/i_got_id_demo/index.html +11 -0
- package/python/tests/test_data/data_sources/ctf/web/i_got_id_demo/solution.txt +1 -0
- package/python/tests/test_data/data_sources/debug_20240322.json +1 -0
- package/python/tests/test_data/data_sources/expert_instances.yaml +16 -0
- package/python/tests/test_data/data_sources/human_eval.json +1 -0
- package/python/tests/test_data/data_sources/simple_instances.yaml +3 -0
- package/python/tests/test_data/data_sources/simple_instances_long.yaml +30 -0
- package/python/tests/test_data/data_sources/swe-bench-dev-easy.json +1 -0
- package/python/tests/test_data/data_sources/swe-bench-dev-easy_first_only.json +1 -0
- package/python/tests/test_data/data_sources/swe-bench-lite-test.json +1 -0
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- package/python/tests/test_env.py +66 -0
- package/python/tests/test_env_utils.py +129 -0
- package/python/tests/test_history_processors.py +40 -0
- package/python/tests/test_models.py +23 -0
- package/python/tests/test_openai_live.py +164 -0
- package/python/tests/test_packaging.py +7 -0
- package/python/tests/test_parsing.py +131 -0
- package/python/tests/test_problem_statement_multimodal.py +111 -0
- package/python/tests/test_quick_stats.py +42 -0
- package/python/tests/test_run.py +37 -0
- package/python/tests/test_run_batch.py +110 -0
- package/python/tests/test_run_hooks.py +114 -0
- package/python/tests/test_run_replay.py +33 -0
- package/python/tests/test_run_single.py +125 -0
- package/python/tests/test_tools_command_parsing.py +193 -0
- package/python/tests/test_utils.py +15 -0
- package/python/tests/tools/__init__.py +0 -0
- package/python/tests/tools/conftest.py +12 -0
- package/python/tests/tools/test_default_utils.py +153 -0
- package/python/tests/tools/test_edit_replace.py +0 -0
- package/python/tests/tools/test_split_string.py +82 -0
- package/python/tests/utils.py +29 -0
- package/python/tools/diff_state/bin/_state_diff_state +52 -0
- package/python/tools/diff_state/config.yaml +2 -0
- package/python/tools/edit_anthropic/bin/_state_anthropic +21 -0
- package/python/tools/edit_anthropic/bin/str_replace_editor +710 -0
- package/python/tools/edit_anthropic/config.yaml +56 -0
- package/python/tools/edit_anthropic/install.sh +3 -0
- package/python/tools/filemap/bin/filemap +45 -0
- package/python/tools/filemap/config.yaml +9 -0
- package/python/tools/filemap/install.sh +2 -0
- package/python/tools/forfeit/bin/exit_forfeit +5 -0
- package/python/tools/forfeit/config.yaml +5 -0
- package/python/tools/image_tools/bin/view_image +36 -0
- package/python/tools/image_tools/config.yaml +9 -0
- package/python/tools/multilingual_setup/bin/do_nothing +2 -0
- package/python/tools/multilingual_setup/config.yaml +1 -0
- package/python/tools/multilingual_setup/install.sh +45 -0
- package/python/tools/registry/bin/_read_env +10 -0
- package/python/tools/registry/bin/_write_env +10 -0
- package/python/tools/registry/config.yaml +1 -0
- package/python/tools/registry/install.sh +6 -0
- package/python/tools/registry/lib/__init__.py +0 -0
- package/python/tools/registry/lib/registry.py +56 -0
- package/python/tools/review_on_submit_m/README.md +6 -0
- package/python/tools/review_on_submit_m/bin/submit +54 -0
- package/python/tools/review_on_submit_m/config.yaml +6 -0
- package/python/tools/review_on_submit_m/install.sh +0 -0
- package/python/tools/search/bin/find_file +31 -0
- package/python/tools/search/bin/search_dir +39 -0
- package/python/tools/search/bin/search_file +55 -0
- package/python/tools/search/config.yaml +37 -0
- package/python/tools/search/install.sh +3 -0
- package/python/tools/submit/bin/submit +17 -0
- package/python/tools/submit/config.yaml +5 -0
- package/python/tools/web_browser/bin/click_mouse +41 -0
- package/python/tools/web_browser/bin/close_site +28 -0
- package/python/tools/web_browser/bin/double_click_mouse +37 -0
- package/python/tools/web_browser/bin/drag_mouse +46 -0
- package/python/tools/web_browser/bin/execute_script_on_page +39 -0
- package/python/tools/web_browser/bin/get_console_output +48 -0
- package/python/tools/web_browser/bin/move_mouse +35 -0
- package/python/tools/web_browser/bin/navigate_back +33 -0
- package/python/tools/web_browser/bin/navigate_forward +33 -0
- package/python/tools/web_browser/bin/open_site +36 -0
- package/python/tools/web_browser/bin/press_keys_on_page +51 -0
- package/python/tools/web_browser/bin/reload_page +33 -0
- package/python/tools/web_browser/bin/run_web_browser_server +394 -0
- package/python/tools/web_browser/bin/screenshot_site +38 -0
- package/python/tools/web_browser/bin/scroll_on_page +40 -0
- package/python/tools/web_browser/bin/set_browser_window_size +40 -0
- package/python/tools/web_browser/bin/type_text +34 -0
- package/python/tools/web_browser/bin/wait_time +39 -0
- package/python/tools/web_browser/config.yaml +155 -0
- package/python/tools/web_browser/install.sh +22 -0
- package/python/tools/web_browser/lib/browser_manager.py +404 -0
- package/python/tools/web_browser/lib/web_browser_config.py +33 -0
- package/python/tools/web_browser/lib/web_browser_utils.py +126 -0
- package/python/tools/web_browser/test_console.html +1 -0
- package/python/tools/windowed/bin/_state +25 -0
- package/python/tools/windowed/bin/create +29 -0
- package/python/tools/windowed/bin/goto +37 -0
- package/python/tools/windowed/bin/open +49 -0
- package/python/tools/windowed/bin/scroll_down +12 -0
- package/python/tools/windowed/bin/scroll_up +13 -0
- package/python/tools/windowed/config.yaml +38 -0
- package/python/tools/windowed/install.sh +15 -0
- package/python/tools/windowed/lib/__init__.py +0 -0
- package/python/tools/windowed/lib/flake8_utils.py +147 -0
- package/python/tools/windowed/lib/windowed_file.py +312 -0
- package/python/tools/windowed_edit_linting/bin/edit +128 -0
- package/python/tools/windowed_edit_linting/config.yaml +31 -0
- package/python/tools/windowed_edit_linting/install.sh +5 -0
- package/python/tools/windowed_edit_replace/bin/edit +172 -0
- package/python/tools/windowed_edit_replace/bin/insert +77 -0
- package/python/tools/windowed_edit_replace/config.yaml +60 -0
- package/python/tools/windowed_edit_replace/install.sh +5 -0
- package/python/tools/windowed_edit_rewrite/bin/edit +78 -0
- package/python/tools/windowed_edit_rewrite/config.yaml +11 -0
- package/python/tools/windowed_edit_rewrite/install.sh +5 -0
- package/python/trajectories/demonstrations/ctf/crypto/BabyEncryption.traj +318 -0
- package/python/trajectories/demonstrations/ctf/crypto/BabyTimeCapsule.traj +197 -0
- package/python/trajectories/demonstrations/ctf/crypto/eps.traj +289 -0
- package/python/trajectories/demonstrations/ctf/crypto/katy.traj +368 -0
- package/python/trajectories/demonstrations/ctf/forensics/flash.traj +102 -0
- package/python/trajectories/demonstrations/ctf/misc/networking_1.traj +102 -0
- package/python/trajectories/demonstrations/ctf/pwn/warmup.traj +159 -0
- package/python/trajectories/demonstrations/ctf/rev/rock.traj +251 -0
- package/python/trajectories/demonstrations/ctf/web/i_got_id_demo.traj +422 -0
- package/python/trajectories/demonstrations/function_calling_simple.traj +151 -0
- 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
- 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
- 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
- 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
- package/python/trajectories/demonstrations/replay__marshmallow-code__marshmallow-1867__function_calling__install-1/marshmallow-code__marshmallow-1867.traj +594 -0
- package/python/trajectories/demonstrations/replay__marshmallow-code__marshmallow-1867__function_calling_replace__install-1/marshmallow-code__marshmallow-1867.traj +592 -0
- package/python/trajectories/demonstrations/replay__marshmallow-code__marshmallow-1867__function_calling_replace_from_source/marshmallow-code__marshmallow-1867.traj +3316 -0
- 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
- 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
- package/python/trajectories/demonstrations/str_replace_anthropic_demo.yaml +432 -0
- package/rust/Cargo.toml +100 -0
- package/rust/README.md +49 -0
- package/rust/src/agent/action_sampler.rs +130 -0
- package/rust/src/agent/agents.rs +1029 -0
- package/rust/src/agent/history_processors.rs +277 -0
- package/rust/src/agent/hooks/mod.rs +208 -0
- package/rust/src/agent/mod.rs +24 -0
- package/rust/src/agent/models.rs +837 -0
- package/rust/src/agent/problem_statement.rs +355 -0
- package/rust/src/agent/reviewer.rs +505 -0
- package/rust/src/bin/sweagent.rs +784 -0
- package/rust/src/environment/deployment.rs +631 -0
- package/rust/src/environment/hooks/mod.rs +114 -0
- package/rust/src/environment/mod.rs +16 -0
- package/rust/src/environment/repo.rs +265 -0
- package/rust/src/environment/runtime.rs +237 -0
- package/rust/src/environment/swe_env.rs +248 -0
- package/rust/src/exceptions.rs +228 -0
- package/rust/src/lib.rs +68 -0
- package/rust/src/monitoring.rs +482 -0
- package/rust/src/run/hooks/mod.rs +134 -0
- package/rust/src/run/mod.rs +12 -0
- package/rust/src/run/run_batch.rs +563 -0
- package/rust/src/run/run_single.rs +196 -0
- package/rust/src/tools/bundle.rs +224 -0
- package/rust/src/tools/commands.rs +173 -0
- package/rust/src/tools/mod.rs +295 -0
- package/rust/src/tools/parsing.rs +354 -0
- package/rust/src/tools/registry.rs +143 -0
- package/rust/src/types.rs +554 -0
- package/rust/src/utils/config.rs +105 -0
- package/rust/src/utils/files.rs +137 -0
- package/rust/src/utils/github.rs +171 -0
- package/rust/src/utils/log.rs +65 -0
- package/rust/src/utils/mod.rs +17 -0
- package/rust/src/utils/serialization.rs +181 -0
- package/rust/src/utils/template.rs +173 -0
- package/typescript/README.md +335 -0
|
@@ -0,0 +1,248 @@
|
|
|
1
|
+
//! SWE-agent environment implementation
|
|
2
|
+
|
|
3
|
+
use super::deployment::{get_deployment, Deployment, DeploymentConfig};
|
|
4
|
+
use super::hooks::{CombinedEnvironmentHook, EnvironmentHook};
|
|
5
|
+
use super::repo::{create_repo, Repo, RepoConfig};
|
|
6
|
+
use crate::exceptions::Result;
|
|
7
|
+
use serde::{Deserialize, Serialize};
|
|
8
|
+
use std::collections::HashMap;
|
|
9
|
+
|
|
10
|
+
/// Configuration for the SWE environment
|
|
11
|
+
#[derive(Debug, Clone, Serialize, Deserialize)]
|
|
12
|
+
pub struct EnvironmentConfig {
|
|
13
|
+
#[serde(default)]
|
|
14
|
+
pub deployment: DeploymentConfig,
|
|
15
|
+
#[serde(default)]
|
|
16
|
+
pub post_startup_commands: Vec<String>,
|
|
17
|
+
#[serde(default = "default_post_startup_timeout")]
|
|
18
|
+
pub post_startup_command_timeout: u64,
|
|
19
|
+
#[serde(default)]
|
|
20
|
+
pub name: String,
|
|
21
|
+
#[serde(skip_serializing_if = "Option::is_none")]
|
|
22
|
+
pub repo: Option<RepoConfig>,
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
fn default_post_startup_timeout() -> u64 {
|
|
26
|
+
120
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
impl Default for EnvironmentConfig {
|
|
30
|
+
fn default() -> Self {
|
|
31
|
+
Self {
|
|
32
|
+
deployment: DeploymentConfig::default(),
|
|
33
|
+
post_startup_commands: Vec::new(),
|
|
34
|
+
post_startup_command_timeout: default_post_startup_timeout(),
|
|
35
|
+
name: "swe-env".to_string(),
|
|
36
|
+
repo: None,
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/// The main SWE-agent environment
|
|
42
|
+
pub struct SWEEnv {
|
|
43
|
+
pub name: String,
|
|
44
|
+
deployment: Box<dyn Deployment>,
|
|
45
|
+
repo: Option<Box<dyn Repo>>,
|
|
46
|
+
post_startup_commands: Vec<String>,
|
|
47
|
+
post_startup_command_timeout: u64,
|
|
48
|
+
hooks: CombinedEnvironmentHook,
|
|
49
|
+
env_variables: HashMap<String, String>,
|
|
50
|
+
open_files: Vec<String>,
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
impl Default for SWEEnv {
|
|
54
|
+
fn default() -> Self {
|
|
55
|
+
Self {
|
|
56
|
+
name: "swe-env".to_string(),
|
|
57
|
+
deployment: get_deployment(DeploymentConfig::default()),
|
|
58
|
+
repo: None,
|
|
59
|
+
post_startup_commands: Vec::new(),
|
|
60
|
+
post_startup_command_timeout: default_post_startup_timeout(),
|
|
61
|
+
hooks: CombinedEnvironmentHook::new(),
|
|
62
|
+
env_variables: HashMap::new(),
|
|
63
|
+
open_files: Vec::new(),
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
impl SWEEnv {
|
|
69
|
+
pub fn new(config: EnvironmentConfig) -> Result<Self> {
|
|
70
|
+
let deployment = get_deployment(config.deployment);
|
|
71
|
+
let repo = config.repo.as_ref().map(create_repo).transpose()?;
|
|
72
|
+
|
|
73
|
+
Ok(Self {
|
|
74
|
+
name: config.name,
|
|
75
|
+
deployment,
|
|
76
|
+
repo,
|
|
77
|
+
post_startup_commands: config.post_startup_commands,
|
|
78
|
+
post_startup_command_timeout: config.post_startup_command_timeout,
|
|
79
|
+
hooks: CombinedEnvironmentHook::new(),
|
|
80
|
+
env_variables: HashMap::new(),
|
|
81
|
+
open_files: Vec::new(),
|
|
82
|
+
})
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
pub fn from_config(config: EnvironmentConfig) -> Result<Self> {
|
|
86
|
+
Self::new(config)
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/// Add a hook to the environment
|
|
90
|
+
pub fn add_hook(&mut self, hook: Box<dyn EnvironmentHook>) {
|
|
91
|
+
self.hooks.add_hook(hook);
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/// Start the environment
|
|
95
|
+
pub async fn start(&mut self) -> Result<()> {
|
|
96
|
+
self.hooks.on_start();
|
|
97
|
+
self.deployment.start().await?;
|
|
98
|
+
|
|
99
|
+
// Run post-startup commands
|
|
100
|
+
for cmd in &self.post_startup_commands.clone() {
|
|
101
|
+
self.communicate(cmd, Some(self.post_startup_command_timeout))
|
|
102
|
+
.await?;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
Ok(())
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/// Stop the environment
|
|
109
|
+
pub async fn stop(&mut self) -> Result<()> {
|
|
110
|
+
self.hooks.on_stop();
|
|
111
|
+
self.deployment.stop().await
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/// Check if the environment is running
|
|
115
|
+
pub fn is_running(&self) -> bool {
|
|
116
|
+
self.deployment.is_running()
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
/// Execute a command in the environment
|
|
120
|
+
pub async fn communicate(&self, command: &str, timeout: Option<u64>) -> Result<String> {
|
|
121
|
+
let output = self.deployment.execute(command, timeout).await?;
|
|
122
|
+
// Note: hooks require mut self, but we're in a shared context
|
|
123
|
+
// In production, use Arc<Mutex<CombinedEnvironmentHook>> for proper mutability
|
|
124
|
+
Ok(output)
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
/// Read a file from the environment
|
|
128
|
+
pub async fn read_file(&self, path: &str) -> Result<String> {
|
|
129
|
+
self.deployment.read_file(path).await
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
/// Write a file to the environment
|
|
133
|
+
pub async fn write_file(&self, path: &str, content: &str) -> Result<()> {
|
|
134
|
+
self.deployment.write_file(path, content).await
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
/// Set environment variables
|
|
138
|
+
pub async fn set_env_variables(&mut self, vars: HashMap<String, String>) -> Result<()> {
|
|
139
|
+
self.env_variables.extend(vars.clone());
|
|
140
|
+
|
|
141
|
+
// Export variables in the shell
|
|
142
|
+
for (key, value) in vars {
|
|
143
|
+
let cmd = format!("export {}='{}'", key, value);
|
|
144
|
+
self.communicate(&cmd, Some(5)).await?;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
Ok(())
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
/// Interrupt the current session
|
|
151
|
+
pub async fn interrupt_session(&self) -> Result<()> {
|
|
152
|
+
self.deployment.interrupt().await
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
/// Get the current working directory
|
|
156
|
+
pub fn get_cwd(&self) -> Option<String> {
|
|
157
|
+
self.deployment.get_cwd()
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
/// Get the list of open files
|
|
161
|
+
pub fn get_open_files(&self) -> &[String] {
|
|
162
|
+
&self.open_files
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
/// Add a file to the open files list
|
|
166
|
+
pub fn add_open_file(&mut self, file: impl Into<String>) {
|
|
167
|
+
let f = file.into();
|
|
168
|
+
if !self.open_files.contains(&f) {
|
|
169
|
+
self.open_files.push(f);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
/// Remove a file from the open files list
|
|
174
|
+
pub fn remove_open_file(&mut self, file: &str) {
|
|
175
|
+
self.open_files.retain(|f| f != file);
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
/// Get git status
|
|
179
|
+
pub async fn get_git_status(&self) -> Result<String> {
|
|
180
|
+
self.communicate("git status --porcelain", Some(30)).await
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
/// Get git diff
|
|
184
|
+
pub async fn get_git_diff(&self) -> Result<String> {
|
|
185
|
+
self.communicate("git diff", Some(60)).await
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
/// Hard reset the environment
|
|
189
|
+
pub async fn hard_reset(&mut self) -> Result<()> {
|
|
190
|
+
self.hooks.on_reset();
|
|
191
|
+
|
|
192
|
+
// Reset git state if in a repo
|
|
193
|
+
if self.repo.is_some() {
|
|
194
|
+
self.communicate("git checkout .", Some(30)).await?;
|
|
195
|
+
self.communicate("git clean -fd", Some(30)).await?;
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
// Clear open files
|
|
199
|
+
self.open_files.clear();
|
|
200
|
+
|
|
201
|
+
Ok(())
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
/// Get repository name if available
|
|
205
|
+
pub fn repo_name(&self) -> Option<&str> {
|
|
206
|
+
self.repo.as_ref().map(|r| r.repo_name())
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
/// Check if environment is alive
|
|
210
|
+
pub fn is_alive(&self) -> bool {
|
|
211
|
+
self.deployment.is_running()
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
#[cfg(test)]
|
|
216
|
+
mod tests {
|
|
217
|
+
use super::*;
|
|
218
|
+
|
|
219
|
+
#[tokio::test]
|
|
220
|
+
async fn test_swe_env_creation() {
|
|
221
|
+
let config = EnvironmentConfig {
|
|
222
|
+
deployment: DeploymentConfig::Mock,
|
|
223
|
+
..Default::default()
|
|
224
|
+
};
|
|
225
|
+
|
|
226
|
+
let mut env = SWEEnv::new(config).unwrap();
|
|
227
|
+
env.start().await.unwrap();
|
|
228
|
+
|
|
229
|
+
assert!(env.is_running());
|
|
230
|
+
|
|
231
|
+
env.stop().await.unwrap();
|
|
232
|
+
assert!(!env.is_running());
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
#[tokio::test]
|
|
236
|
+
async fn test_swe_env_communicate() {
|
|
237
|
+
let config = EnvironmentConfig {
|
|
238
|
+
deployment: DeploymentConfig::Mock,
|
|
239
|
+
..Default::default()
|
|
240
|
+
};
|
|
241
|
+
|
|
242
|
+
let mut env = SWEEnv::new(config).unwrap();
|
|
243
|
+
env.start().await.unwrap();
|
|
244
|
+
|
|
245
|
+
let output = env.communicate("pwd", Some(5)).await.unwrap();
|
|
246
|
+
assert!(!output.is_empty());
|
|
247
|
+
}
|
|
248
|
+
}
|
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
//! Error types for SWE-agent
|
|
2
|
+
//!
|
|
3
|
+
//! This module defines all error types used throughout the SWE-agent implementation.
|
|
4
|
+
|
|
5
|
+
use thiserror::Error;
|
|
6
|
+
|
|
7
|
+
/// Main error type for SWE-agent operations
|
|
8
|
+
#[derive(Error, Debug)]
|
|
9
|
+
pub enum SWEAgentError {
|
|
10
|
+
// Cost and limit errors
|
|
11
|
+
#[error("Instance cost limit exceeded: {0}")]
|
|
12
|
+
InstanceCostLimitExceeded(String),
|
|
13
|
+
|
|
14
|
+
#[error("Total cost limit exceeded: {0}")]
|
|
15
|
+
TotalCostLimitExceeded(String),
|
|
16
|
+
|
|
17
|
+
#[error("Instance call limit exceeded: {0}")]
|
|
18
|
+
InstanceCallLimitExceeded(String),
|
|
19
|
+
|
|
20
|
+
#[error("Context window exceeded: {0}")]
|
|
21
|
+
ContextWindowExceeded(String),
|
|
22
|
+
|
|
23
|
+
// Format and parsing errors
|
|
24
|
+
#[error("Format error: {0}")]
|
|
25
|
+
FormatError(String),
|
|
26
|
+
|
|
27
|
+
#[error("Invalid action format: {0}")]
|
|
28
|
+
InvalidActionFormat(String),
|
|
29
|
+
|
|
30
|
+
#[error("Blocked action: {0}")]
|
|
31
|
+
BlockedAction(String),
|
|
32
|
+
|
|
33
|
+
#[error("Bash syntax error: {0}")]
|
|
34
|
+
BashIncorrectSyntax(String),
|
|
35
|
+
|
|
36
|
+
// Execution errors
|
|
37
|
+
#[error("Command timeout after {timeout}s: {command}")]
|
|
38
|
+
CommandTimeout { timeout: u64, command: String },
|
|
39
|
+
|
|
40
|
+
#[error("Total execution time exceeded")]
|
|
41
|
+
TotalExecutionTimeExceeded,
|
|
42
|
+
|
|
43
|
+
#[error("Environment error: {0}")]
|
|
44
|
+
EnvironmentError(String),
|
|
45
|
+
|
|
46
|
+
#[error("Docker error: {0}")]
|
|
47
|
+
DockerError(String),
|
|
48
|
+
|
|
49
|
+
#[error("Runtime error: {0}")]
|
|
50
|
+
RuntimeError(String),
|
|
51
|
+
|
|
52
|
+
// Agent control flow
|
|
53
|
+
#[error("Retry with output")]
|
|
54
|
+
RetryWithOutput,
|
|
55
|
+
|
|
56
|
+
#[error("Retry without output")]
|
|
57
|
+
RetryWithoutOutput,
|
|
58
|
+
|
|
59
|
+
#[error("Exit forfeit")]
|
|
60
|
+
ExitForfeit,
|
|
61
|
+
|
|
62
|
+
#[error("End of file")]
|
|
63
|
+
EOF,
|
|
64
|
+
|
|
65
|
+
// API and network errors
|
|
66
|
+
#[error("API error: {0}")]
|
|
67
|
+
ApiError(String),
|
|
68
|
+
|
|
69
|
+
#[error("Content policy violation: {0}")]
|
|
70
|
+
ContentPolicyViolation(String),
|
|
71
|
+
|
|
72
|
+
#[error("Network error: {0}")]
|
|
73
|
+
NetworkError(String),
|
|
74
|
+
|
|
75
|
+
// Configuration errors
|
|
76
|
+
#[error("Configuration error: {0}")]
|
|
77
|
+
ConfigurationError(String),
|
|
78
|
+
|
|
79
|
+
#[error("Invalid configuration: {0}")]
|
|
80
|
+
InvalidConfiguration(String),
|
|
81
|
+
|
|
82
|
+
#[error("Missing required field: {0}")]
|
|
83
|
+
MissingField(String),
|
|
84
|
+
|
|
85
|
+
// File and IO errors
|
|
86
|
+
#[error("File not found: {0}")]
|
|
87
|
+
FileNotFound(String),
|
|
88
|
+
|
|
89
|
+
#[error("IO error: {0}")]
|
|
90
|
+
IoError(String),
|
|
91
|
+
|
|
92
|
+
#[error("Serialization error: {0}")]
|
|
93
|
+
SerializationError(String),
|
|
94
|
+
|
|
95
|
+
// Git errors
|
|
96
|
+
#[error("Git error: {0}")]
|
|
97
|
+
GitError(String),
|
|
98
|
+
|
|
99
|
+
#[error("Invalid GitHub URL: {0}")]
|
|
100
|
+
InvalidGithubUrl(String),
|
|
101
|
+
|
|
102
|
+
// Template errors
|
|
103
|
+
#[error("Template error: {0}")]
|
|
104
|
+
TemplateError(String),
|
|
105
|
+
|
|
106
|
+
// Generic errors
|
|
107
|
+
#[error("Unknown error: {0}")]
|
|
108
|
+
Unknown(String),
|
|
109
|
+
|
|
110
|
+
#[error(transparent)]
|
|
111
|
+
Other(#[from] anyhow::Error),
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
impl SWEAgentError {
|
|
115
|
+
/// Check if this error should trigger a retry
|
|
116
|
+
pub fn should_retry(&self) -> bool {
|
|
117
|
+
matches!(
|
|
118
|
+
self,
|
|
119
|
+
SWEAgentError::RetryWithOutput
|
|
120
|
+
| SWEAgentError::RetryWithoutOutput
|
|
121
|
+
| SWEAgentError::FormatError(_)
|
|
122
|
+
| SWEAgentError::BlockedAction(_)
|
|
123
|
+
| SWEAgentError::BashIncorrectSyntax(_)
|
|
124
|
+
)
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
/// Check if this error should cause immediate exit
|
|
128
|
+
pub fn should_exit(&self) -> bool {
|
|
129
|
+
matches!(
|
|
130
|
+
self,
|
|
131
|
+
SWEAgentError::ExitForfeit
|
|
132
|
+
| SWEAgentError::TotalExecutionTimeExceeded
|
|
133
|
+
| SWEAgentError::InstanceCostLimitExceeded(_)
|
|
134
|
+
| SWEAgentError::TotalCostLimitExceeded(_)
|
|
135
|
+
| SWEAgentError::InstanceCallLimitExceeded(_)
|
|
136
|
+
| SWEAgentError::ContextWindowExceeded(_)
|
|
137
|
+
)
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
/// Get exit status string for this error
|
|
141
|
+
pub fn exit_status(&self) -> &'static str {
|
|
142
|
+
match self {
|
|
143
|
+
SWEAgentError::ExitForfeit => "exit_forfeit",
|
|
144
|
+
SWEAgentError::TotalExecutionTimeExceeded => "exit_total_execution_time",
|
|
145
|
+
SWEAgentError::CommandTimeout { .. } => "exit_command_timeout",
|
|
146
|
+
SWEAgentError::ContextWindowExceeded(_) => "exit_context",
|
|
147
|
+
SWEAgentError::InstanceCostLimitExceeded(_)
|
|
148
|
+
| SWEAgentError::TotalCostLimitExceeded(_)
|
|
149
|
+
| SWEAgentError::InstanceCallLimitExceeded(_) => "exit_cost",
|
|
150
|
+
SWEAgentError::RuntimeError(_) | SWEAgentError::EnvironmentError(_) => {
|
|
151
|
+
"exit_environment_error"
|
|
152
|
+
}
|
|
153
|
+
SWEAgentError::FormatError(_)
|
|
154
|
+
| SWEAgentError::InvalidActionFormat(_)
|
|
155
|
+
| SWEAgentError::BashIncorrectSyntax(_) => "exit_format",
|
|
156
|
+
_ => "exit_error",
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
impl From<std::io::Error> for SWEAgentError {
|
|
162
|
+
fn from(err: std::io::Error) -> Self {
|
|
163
|
+
SWEAgentError::IoError(err.to_string())
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
impl From<serde_json::Error> for SWEAgentError {
|
|
168
|
+
fn from(err: serde_json::Error) -> Self {
|
|
169
|
+
SWEAgentError::SerializationError(err.to_string())
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
impl From<serde_yaml::Error> for SWEAgentError {
|
|
174
|
+
fn from(err: serde_yaml::Error) -> Self {
|
|
175
|
+
SWEAgentError::SerializationError(err.to_string())
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
impl From<reqwest::Error> for SWEAgentError {
|
|
180
|
+
fn from(err: reqwest::Error) -> Self {
|
|
181
|
+
SWEAgentError::NetworkError(err.to_string())
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
impl From<handlebars::RenderError> for SWEAgentError {
|
|
186
|
+
fn from(err: handlebars::RenderError) -> Self {
|
|
187
|
+
SWEAgentError::TemplateError(err.to_string())
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
/// Result type alias for SWE-agent operations
|
|
192
|
+
pub type Result<T> = std::result::Result<T, SWEAgentError>;
|
|
193
|
+
|
|
194
|
+
/// Special tokens used in observations to signal control flow
|
|
195
|
+
pub mod tokens {
|
|
196
|
+
pub const RETRY_WITH_OUTPUT: &str = "###SWE-AGENT-RETRY-WITH-OUTPUT###";
|
|
197
|
+
pub const RETRY_WITHOUT_OUTPUT: &str = "###SWE-AGENT-RETRY-WITHOUT-OUTPUT###";
|
|
198
|
+
pub const EXIT_FORFEIT: &str = "###SWE-AGENT-EXIT-FORFEIT###";
|
|
199
|
+
pub const SUBMISSION_MARKER: &str = "<<SWE_AGENT_SUBMISSION>>";
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
#[cfg(test)]
|
|
203
|
+
mod tests {
|
|
204
|
+
use super::*;
|
|
205
|
+
|
|
206
|
+
#[test]
|
|
207
|
+
fn test_should_retry() {
|
|
208
|
+
assert!(SWEAgentError::RetryWithOutput.should_retry());
|
|
209
|
+
assert!(SWEAgentError::FormatError("test".to_string()).should_retry());
|
|
210
|
+
assert!(!SWEAgentError::ExitForfeit.should_retry());
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
#[test]
|
|
214
|
+
fn test_should_exit() {
|
|
215
|
+
assert!(SWEAgentError::ExitForfeit.should_exit());
|
|
216
|
+
assert!(SWEAgentError::TotalExecutionTimeExceeded.should_exit());
|
|
217
|
+
assert!(!SWEAgentError::FormatError("test".to_string()).should_exit());
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
#[test]
|
|
221
|
+
fn test_exit_status() {
|
|
222
|
+
assert_eq!(SWEAgentError::ExitForfeit.exit_status(), "exit_forfeit");
|
|
223
|
+
assert_eq!(
|
|
224
|
+
SWEAgentError::ContextWindowExceeded("test".to_string()).exit_status(),
|
|
225
|
+
"exit_context"
|
|
226
|
+
);
|
|
227
|
+
}
|
|
228
|
+
}
|
package/rust/src/lib.rs
ADDED
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
//! SWE-agent: Software Engineering Agent
|
|
2
|
+
//!
|
|
3
|
+
//! This crate provides a Rust implementation of SWE-agent, an AI-powered
|
|
4
|
+
//! software engineering agent that can autonomously solve coding tasks.
|
|
5
|
+
//!
|
|
6
|
+
//! # Features
|
|
7
|
+
//!
|
|
8
|
+
//! - `native` - Native runtime with full async support (default)
|
|
9
|
+
//! - `wasm` - WebAssembly support for browser environments
|
|
10
|
+
//!
|
|
11
|
+
//! # Example
|
|
12
|
+
//!
|
|
13
|
+
//! ```rust,no_run
|
|
14
|
+
//! use elizaos_sweagent::run::{RunSingle, RunSingleConfig};
|
|
15
|
+
//!
|
|
16
|
+
//! #[tokio::main]
|
|
17
|
+
//! async fn main() -> anyhow::Result<()> {
|
|
18
|
+
//! // Configure and run the agent
|
|
19
|
+
//! let config = RunSingleConfig::default();
|
|
20
|
+
//! let mut runner = RunSingle::from_config(config)?;
|
|
21
|
+
//! runner.run().await?;
|
|
22
|
+
//! Ok(())
|
|
23
|
+
//! }
|
|
24
|
+
//! ```
|
|
25
|
+
|
|
26
|
+
pub mod agent;
|
|
27
|
+
pub mod environment;
|
|
28
|
+
pub mod exceptions;
|
|
29
|
+
pub mod monitoring;
|
|
30
|
+
pub mod run;
|
|
31
|
+
pub mod tools;
|
|
32
|
+
pub mod types;
|
|
33
|
+
pub mod utils;
|
|
34
|
+
|
|
35
|
+
// Re-export main types for convenience
|
|
36
|
+
pub use agent::{
|
|
37
|
+
AbstractAgentHook, AgentConfig, DefaultAgent, DefaultAgentConfig, RetryAgent, RetryAgentConfig,
|
|
38
|
+
};
|
|
39
|
+
pub use environment::{
|
|
40
|
+
Deployment, DeploymentConfig, DockerDeployment, DockerDeploymentConfig, EnvironmentConfig,
|
|
41
|
+
LocalDeployment, LocalDeploymentConfig, RepoConfig, SWEEnv,
|
|
42
|
+
};
|
|
43
|
+
pub use exceptions::SWEAgentError;
|
|
44
|
+
pub use monitoring::{
|
|
45
|
+
health_check, AgentMetrics, Alert, AlertHandler, AlertSeverity, AlertThresholds, HealthStatus,
|
|
46
|
+
MetricsMonitor, MetricsSnapshot,
|
|
47
|
+
};
|
|
48
|
+
pub use run::{RunBatch, RunBatchConfig, RunSingle, RunSingleConfig};
|
|
49
|
+
pub use tools::{Bundle, BundleConfig, ParseFunction, ToolConfig, ToolHandler};
|
|
50
|
+
pub use types::AgentRunResult;
|
|
51
|
+
pub use types::{History, HistoryItem, StepOutput, Trajectory, TrajectoryStep};
|
|
52
|
+
|
|
53
|
+
/// Version of the SWE-agent library
|
|
54
|
+
pub const VERSION: &str = "1.1.0";
|
|
55
|
+
|
|
56
|
+
/// Get the agent version information string
|
|
57
|
+
pub fn get_agent_version_info() -> String {
|
|
58
|
+
format!("SWE-agent Rust implementation version {}", VERSION)
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
#[cfg(feature = "wasm")]
|
|
62
|
+
use wasm_bindgen::prelude::*;
|
|
63
|
+
|
|
64
|
+
#[cfg(feature = "wasm")]
|
|
65
|
+
#[wasm_bindgen]
|
|
66
|
+
pub fn wasm_version() -> String {
|
|
67
|
+
VERSION.to_string()
|
|
68
|
+
}
|