verifiers 0.1.15.dev386__tar.gz → 0.1.15.dev388__tar.gz

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 (405) hide show
  1. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/PKG-INFO +1 -1
  2. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/README.md +2 -3
  3. verifiers-0.1.15.dev388/verifiers/v1/harnesses/bash_edit/__init__.py +10 -0
  4. verifiers-0.1.15.dev388/verifiers/v1/harnesses/bash_edit/harness.py +84 -0
  5. verifiers-0.1.15.dev388/verifiers/v1/harnesses/bash_edit/program.py +250 -0
  6. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/tasksets/harbor/taskset.py +133 -32
  7. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/.gitignore +0 -0
  8. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/LICENSE +0 -0
  9. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/README.md +0 -0
  10. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/pyproject.toml +0 -0
  11. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/AGENTS.md +0 -0
  12. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/README.md +0 -0
  13. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/__init__.py +0 -0
  14. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/conftest.py +0 -0
  15. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/test_browser_env.py +0 -0
  16. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/test_build_script.py +0 -0
  17. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/test_cli_agent_env.py +0 -0
  18. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/test_client_auth_errors.py +0 -0
  19. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/test_client_config.py +0 -0
  20. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/test_client_multimodal_types.py +0 -0
  21. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/test_composable_env.py +0 -0
  22. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/test_context_token_metrics.py +0 -0
  23. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/test_decorator_ranks.py +0 -0
  24. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/test_endpoint_registry.py +0 -0
  25. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/test_env_group.py +0 -0
  26. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/test_env_server.py +0 -0
  27. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/test_environment.py +0 -0
  28. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/test_environment_extra.py +0 -0
  29. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/test_envs.py +0 -0
  30. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/test_error_chain.py +0 -0
  31. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/test_eval_display.py +0 -0
  32. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/test_eval_utils.py +0 -0
  33. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/test_gepa_cli.py +0 -0
  34. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/test_gepa_utils.py +0 -0
  35. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/test_gym_env.py +0 -0
  36. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/test_harbor_env_mcp.py +0 -0
  37. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/test_imports.py +0 -0
  38. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/test_init_script.py +0 -0
  39. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/test_install_utils.py +0 -0
  40. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/test_interception_utils.py +0 -0
  41. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/test_lean_task.py +0 -0
  42. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/test_logging.py +0 -0
  43. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/test_math_rubric.py +0 -0
  44. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/test_maybe_think_parser.py +0 -0
  45. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/test_message_utils.py +0 -0
  46. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/test_message_utils_multimodal.py +0 -0
  47. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/test_multiturn_env.py +0 -0
  48. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/test_nemorl_client.py +0 -0
  49. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/test_openai_chat_completions_token_client.py +0 -0
  50. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/test_openai_responses_client.py +0 -0
  51. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/test_opencode_rlm_env.py +0 -0
  52. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/test_openenv_client.py +0 -0
  53. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/test_parser.py +0 -0
  54. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/test_path_utils.py +0 -0
  55. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/test_per_turn_timing.py +0 -0
  56. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/test_pricing_utils.py +0 -0
  57. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/test_prime_plugin.py +0 -0
  58. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/test_renderer_client.py +0 -0
  59. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/test_renderer_e2e.py +0 -0
  60. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/test_rlm_composable_env.py +0 -0
  61. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/test_rubric.py +0 -0
  62. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/test_rubric_group.py +0 -0
  63. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/test_sandbox_debug_env.py +0 -0
  64. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/test_sandbox_env.py +0 -0
  65. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/test_sandbox_mixin.py +0 -0
  66. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/test_save_utils.py +0 -0
  67. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/test_setup_script.py +0 -0
  68. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/test_singleturn_env.py +0 -0
  69. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/test_stateful_tool_env.py +0 -0
  70. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/test_think_parser.py +0 -0
  71. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/test_tool_env.py +0 -0
  72. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/test_tool_utils.py +0 -0
  73. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/test_trajectory_processing.py +0 -0
  74. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/test_tui_info_formatting.py +0 -0
  75. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/test_types.py +0 -0
  76. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/test_wordle_env.py +0 -0
  77. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/test_xml_parser.py +0 -0
  78. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/v1/conftest.py +0 -0
  79. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/v1/fixtures/counter_tool_v1.py +0 -0
  80. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/v1/fixtures/echo_agentic_v1.py +0 -0
  81. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/v1/fixtures/echo_multi_v0.py +0 -0
  82. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/v1/fixtures/echo_tool_v1.py +0 -0
  83. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/v1/fixtures/echo_user_sim_v1.py +0 -0
  84. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/v1/fixtures/echo_v0.py +0 -0
  85. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/v1/fixtures/echo_v1.py +0 -0
  86. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/v1/fixtures/pyproject.toml +0 -0
  87. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/v1/fixtures/tool_response_image_v1.py +0 -0
  88. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/v1/test_color_codeword_tasks.py +0 -0
  89. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/v1/test_configs.py +0 -0
  90. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/v1/test_e2e.py +0 -0
  91. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/v1/test_envs.py +0 -0
  92. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/v1/test_graph.py +0 -0
  93. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/v1/test_legacy.py +0 -0
  94. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/tests/v1/test_trace.py +0 -0
  95. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/AGENTS.md +0 -0
  96. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/__init__.py +0 -0
  97. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/cli/__init__.py +0 -0
  98. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/cli/commands/__init__.py +0 -0
  99. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/cli/commands/build.py +0 -0
  100. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/cli/commands/eval.py +0 -0
  101. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/cli/commands/gepa.py +0 -0
  102. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/cli/commands/init.py +0 -0
  103. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/cli/commands/install.py +0 -0
  104. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/cli/commands/setup.py +0 -0
  105. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/cli/plugins/__init__.py +0 -0
  106. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/cli/plugins/prime.py +0 -0
  107. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/cli/tui.py +0 -0
  108. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/clients/__init__.py +0 -0
  109. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/clients/anthropic_messages_client.py +0 -0
  110. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/clients/client.py +0 -0
  111. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/clients/nemorl_chat_completions_client.py +0 -0
  112. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/clients/openai_chat_completions_client.py +0 -0
  113. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/clients/openai_chat_completions_token_client.py +0 -0
  114. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/clients/openai_completions_client.py +0 -0
  115. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/clients/openai_responses_client.py +0 -0
  116. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/clients/renderer_client.py +0 -0
  117. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/decorators.py +0 -0
  118. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/AGENTS.md +0 -0
  119. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/__init__.py +0 -0
  120. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/env_group.py +0 -0
  121. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/environment.py +0 -0
  122. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/README.md +0 -0
  123. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/__init__.py +0 -0
  124. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/cli_agent_env.py +0 -0
  125. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/composable/README.md +0 -0
  126. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/composable/__init__.py +0 -0
  127. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/composable/_filter.py +0 -0
  128. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/composable/composable_env.py +0 -0
  129. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/composable/harness.py +0 -0
  130. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/composable/harnesses/__init__.py +0 -0
  131. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/composable/harnesses/mini_swe_agent.py +0 -0
  132. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/composable/harnesses/opencode.py +0 -0
  133. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/composable/harnesses/prompt.txt +0 -0
  134. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/composable/harnesses/rlm.py +0 -0
  135. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/composable/sandbox_debug_env.py +0 -0
  136. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/composable/swe_debug_env.py +0 -0
  137. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/composable/task.py +0 -0
  138. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/composable/tasksets/__init__.py +0 -0
  139. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/composable/tasksets/cp/__init__.py +0 -0
  140. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/composable/tasksets/cp/cp_task.py +0 -0
  141. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/composable/tasksets/cp/test_utils.py +0 -0
  142. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/composable/tasksets/harbor/__init__.py +0 -0
  143. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/composable/tasksets/harbor/cli_gym.py +0 -0
  144. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/composable/tasksets/harbor/harbor.py +0 -0
  145. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/composable/tasksets/harbor/terminal_lego.py +0 -0
  146. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/composable/tasksets/lean/__init__.py +0 -0
  147. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/composable/tasksets/lean/lean_task.py +0 -0
  148. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/composable/tasksets/math/__init__.py +0 -0
  149. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/composable/tasksets/math/math_task.py +0 -0
  150. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/composable/tasksets/search/README.md +0 -0
  151. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/composable/tasksets/search/__init__.py +0 -0
  152. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/composable/tasksets/search/openseeker/README.md +0 -0
  153. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/composable/tasksets/search/openseeker/__init__.py +0 -0
  154. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/composable/tasksets/search/openseeker/taskset.py +0 -0
  155. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/composable/tasksets/search/quest/README.md +0 -0
  156. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/composable/tasksets/search/quest/__init__.py +0 -0
  157. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/__init__.py +0 -0
  158. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/api_tools/__init__.py +0 -0
  159. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/api_tools/tool_pdf.py +0 -0
  160. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/eval_toolkit.py +0 -0
  161. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/evaluator.py +0 -0
  162. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/llm_client/__init__.py +0 -0
  163. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/llm_client/base_client.py +0 -0
  164. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/prompts/__init__.py +0 -0
  165. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/prompts/cache_prompts.py +0 -0
  166. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/__init__.py +0 -0
  167. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/cache_filesys.py +0 -0
  168. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/load_eval_script.py +0 -0
  169. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/misc.py +0 -0
  170. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/tool_visit.py +0 -0
  171. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/url_tools.py +0 -0
  172. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/verification_tree.py +0 -0
  173. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/composable/tasksets/search/quest/open_ended.py +0 -0
  174. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/composable/tasksets/search/quest/taskset.py +0 -0
  175. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/composable/tasksets/search/redsearcher/README.md +0 -0
  176. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/composable/tasksets/search/redsearcher/__init__.py +0 -0
  177. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/composable/tasksets/search/redsearcher/taskset.py +0 -0
  178. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/composable/tasksets/search/search_tasksets.py +0 -0
  179. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/composable/tasksets/swe/README.md +0 -0
  180. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/composable/tasksets/swe/__init__.py +0 -0
  181. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/__init__.py +0 -0
  182. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/extract_fix_patch.sh +0 -0
  183. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/taskset.py +0 -0
  184. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/composable/tasksets/swe/openswe/__init__.py +0 -0
  185. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/composable/tasksets/swe/openswe/taskset.py +0 -0
  186. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/__init__.py +0 -0
  187. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/log_parser.py +0 -0
  188. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/taskset.py +0 -0
  189. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/composable/tasksets/swe/scale_swe/__init__.py +0 -0
  190. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/composable/tasksets/swe/scale_swe/taskset.py +0 -0
  191. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/composable/tasksets/swe/shared/__init__.py +0 -0
  192. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/composable/tasksets/swe/shared/test_patch.py +0 -0
  193. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/composable/tasksets/swe/swe_bench/__init__.py +0 -0
  194. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/composable/tasksets/swe/swe_bench/taskset.py +0 -0
  195. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/composable/tasksets/swe/swe_lego/__init__.py +0 -0
  196. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/composable/tasksets/swe/swe_lego/taskset.py +0 -0
  197. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/__init__.py +0 -0
  198. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/log_parsers.py +0 -0
  199. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/taskset.py +0 -0
  200. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/composable/tasksets/swe/swe_smith/__init__.py +0 -0
  201. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/composable/tasksets/swe/swe_smith/taskset.py +0 -0
  202. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/composable/tasksets/swe/swe_tasksets.py +0 -0
  203. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/gym_env.py +0 -0
  204. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/harbor_env/__init__.py +0 -0
  205. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/harbor_env/env.py +0 -0
  206. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/harbor_env/mcp.py +0 -0
  207. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/mcp_env.py +0 -0
  208. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/opencode_env.py +0 -0
  209. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/opencode_qa_env.py +0 -0
  210. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/opencode_rlm_env.py +0 -0
  211. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/sandbox_mixin.py +0 -0
  212. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/utils/__init__.py +0 -0
  213. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/utils/file_locks.py +0 -0
  214. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/experimental/utils/git_checkout_cache.py +0 -0
  215. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/integrations/README.md +0 -0
  216. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/integrations/__init__.py +0 -0
  217. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/integrations/browser_env/README.md +0 -0
  218. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/integrations/browser_env/__init__.py +0 -0
  219. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/integrations/browser_env/browser_env.py +0 -0
  220. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/integrations/browser_env/modes/__init__.py +0 -0
  221. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/integrations/browser_env/modes/base.py +0 -0
  222. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/integrations/browser_env/modes/cua_mode.py +0 -0
  223. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/integrations/browser_env/modes/dom_mode.py +0 -0
  224. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/integrations/openenv_env.py +0 -0
  225. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/integrations/reasoninggym_env.py +0 -0
  226. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/integrations/textarena_env.py +0 -0
  227. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/multiturn_env.py +0 -0
  228. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/python_env.py +0 -0
  229. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/sandbox_env.py +0 -0
  230. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/singleturn_env.py +0 -0
  231. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/stateful_tool_env.py +0 -0
  232. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/envs/tool_env.py +0 -0
  233. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/errors.py +0 -0
  234. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/gepa/__init__.py +0 -0
  235. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/gepa/adapter.py +0 -0
  236. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/gepa/config.py +0 -0
  237. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/gepa/display.py +0 -0
  238. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/gepa/gepa_utils.py +0 -0
  239. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/parsers/__init__.py +0 -0
  240. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/parsers/maybe_think_parser.py +0 -0
  241. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/parsers/parser.py +0 -0
  242. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/parsers/think_parser.py +0 -0
  243. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/parsers/xml_parser.py +0 -0
  244. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/rl/README.md +0 -0
  245. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/rl/__init__.py +0 -0
  246. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/rl/inference/__init__.py +0 -0
  247. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/rl/inference/client.py +0 -0
  248. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/rl/inference/server.py +0 -0
  249. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/rl/trainer/__init__.py +0 -0
  250. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/rl/trainer/config.py +0 -0
  251. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/rl/trainer/orchestrator.py +0 -0
  252. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/rl/trainer/trainer.py +0 -0
  253. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/rl/trainer/utils.py +0 -0
  254. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/rubrics/__init__.py +0 -0
  255. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/rubrics/experimental/hybrid_math_rubric.py +0 -0
  256. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/rubrics/judge_rubric.py +0 -0
  257. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/rubrics/math_rubric.py +0 -0
  258. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/rubrics/rubric.py +0 -0
  259. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/rubrics/rubric_group.py +0 -0
  260. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/scripts/__init__.py +0 -0
  261. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/scripts/build.py +0 -0
  262. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/scripts/eval.py +0 -0
  263. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/scripts/gepa.py +0 -0
  264. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/scripts/init.py +0 -0
  265. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/scripts/install.py +0 -0
  266. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/scripts/rl.py +0 -0
  267. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/scripts/setup.py +0 -0
  268. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/scripts/train.py +0 -0
  269. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/scripts/tui.py +0 -0
  270. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/scripts/vllm.py +0 -0
  271. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/serve/__init__.py +0 -0
  272. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/serve/client/env_client.py +0 -0
  273. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/serve/client/zmq_env_client.py +0 -0
  274. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/serve/server/__init__.py +0 -0
  275. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/serve/server/env_router.py +0 -0
  276. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/serve/server/env_server.py +0 -0
  277. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/serve/server/env_worker.py +0 -0
  278. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/serve/server/zmq_env_server.py +0 -0
  279. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/serve/types.py +0 -0
  280. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/types.py +0 -0
  281. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/utils/__init__.py +0 -0
  282. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/utils/async_utils.py +0 -0
  283. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/utils/client_utils.py +0 -0
  284. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/utils/config_utils.py +0 -0
  285. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/utils/data_utils.py +0 -0
  286. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/utils/display_utils.py +0 -0
  287. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/utils/env_config_utils.py +0 -0
  288. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/utils/env_utils.py +0 -0
  289. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/utils/error_utils.py +0 -0
  290. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/utils/eval_display.py +0 -0
  291. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/utils/eval_utils.py +0 -0
  292. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/utils/heartbeat.py +0 -0
  293. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/utils/import_utils.py +0 -0
  294. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/utils/install_utils.py +0 -0
  295. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/utils/interception_utils.py +0 -0
  296. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/utils/logging_utils.py +0 -0
  297. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/utils/message_utils.py +0 -0
  298. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/utils/metric_utils.py +0 -0
  299. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/utils/path_utils.py +0 -0
  300. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/utils/pricing_utils.py +0 -0
  301. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/utils/process_utils.py +0 -0
  302. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/utils/response_utils.py +0 -0
  303. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/utils/save_utils.py +0 -0
  304. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/utils/serve_utils.py +0 -0
  305. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/utils/thread_utils.py +0 -0
  306. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/utils/threaded_sandbox_client.py +0 -0
  307. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/utils/tool_utils.py +0 -0
  308. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/utils/usage_utils.py +0 -0
  309. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/utils/version_utils.py +0 -0
  310. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/ARCHITECTURE.md +0 -0
  311. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/GUIDE.md +0 -0
  312. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/__init__.py +0 -0
  313. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/cli/__init__.py +0 -0
  314. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/cli/dashboard/__init__.py +0 -0
  315. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/cli/dashboard/base.py +0 -0
  316. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/cli/dashboard/eval.py +0 -0
  317. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/cli/dashboard/validate.py +0 -0
  318. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/cli/eval/__init__.py +0 -0
  319. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/cli/eval/main.py +0 -0
  320. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/cli/eval/resume.py +0 -0
  321. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/cli/eval/runner.py +0 -0
  322. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/cli/init.py +0 -0
  323. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/cli/output.py +0 -0
  324. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/cli/resolve.py +0 -0
  325. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/cli/serve.py +0 -0
  326. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/cli/validate.py +0 -0
  327. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/clients/__init__.py +0 -0
  328. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/clients/client.py +0 -0
  329. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/clients/config.py +0 -0
  330. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/clients/eval.py +0 -0
  331. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/clients/train.py +0 -0
  332. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/configs/__init__.py +0 -0
  333. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/configs/eval.py +0 -0
  334. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/configs/init.py +0 -0
  335. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/configs/serve.py +0 -0
  336. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/configs/validate.py +0 -0
  337. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/decorators.py +0 -0
  338. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/dialects/__init__.py +0 -0
  339. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/dialects/anthropic.py +0 -0
  340. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/dialects/base.py +0 -0
  341. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/dialects/chat.py +0 -0
  342. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/dialects/responses.py +0 -0
  343. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/env.py +0 -0
  344. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/episode.py +0 -0
  345. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/errors.py +0 -0
  346. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/graph.py +0 -0
  347. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/harness.py +0 -0
  348. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/harnesses/__init__.py +0 -0
  349. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/harnesses/bash/__init__.py +0 -0
  350. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/harnesses/bash/harness.py +0 -0
  351. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/harnesses/bash/program.py +0 -0
  352. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/harnesses/codex/__init__.py +0 -0
  353. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/harnesses/codex/harness.py +0 -0
  354. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/harnesses/default/__init__.py +0 -0
  355. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/harnesses/default/harness.py +0 -0
  356. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/harnesses/default/program.py +0 -0
  357. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/harnesses/kimi_code/__init__.py +0 -0
  358. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/harnesses/kimi_code/harness.py +0 -0
  359. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/harnesses/mini_swe_agent/__init__.py +0 -0
  360. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/harnesses/mini_swe_agent/harness.py +0 -0
  361. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/harnesses/mini_swe_agent/program.py +0 -0
  362. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/harnesses/rlm/__init__.py +0 -0
  363. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/harnesses/rlm/harness.py +0 -0
  364. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/harnesses/terminus_2/__init__.py +0 -0
  365. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/harnesses/terminus_2/harness.py +0 -0
  366. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/harnesses/terminus_2/program.py +0 -0
  367. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/interception/__init__.py +0 -0
  368. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/interception/pool.py +0 -0
  369. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/interception/server.py +0 -0
  370. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/legacy.py +0 -0
  371. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/loaders.py +0 -0
  372. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/mcp/__init__.py +0 -0
  373. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/mcp/launch.py +0 -0
  374. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/mcp/multiplex.py +0 -0
  375. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/mcp/server.py +0 -0
  376. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/mcp/toolset.py +0 -0
  377. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/mcp/user.py +0 -0
  378. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/retries.py +0 -0
  379. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/rollout.py +0 -0
  380. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/runtimes/__init__.py +0 -0
  381. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/runtimes/base.py +0 -0
  382. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/runtimes/docker.py +0 -0
  383. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/runtimes/limiters.py +0 -0
  384. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/runtimes/modal.py +0 -0
  385. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/runtimes/prime.py +0 -0
  386. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/runtimes/subprocess.py +0 -0
  387. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/serve/__init__.py +0 -0
  388. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/serve/client.py +0 -0
  389. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/serve/pool.py +0 -0
  390. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/serve/server.py +0 -0
  391. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/serve/types.py +0 -0
  392. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/state.py +0 -0
  393. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/task.py +0 -0
  394. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/taskset.py +0 -0
  395. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/tasksets/__init__.py +0 -0
  396. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/tasksets/harbor/__init__.py +0 -0
  397. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/tasksets/textarena/__init__.py +0 -0
  398. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/tasksets/textarena/taskset.py +0 -0
  399. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/trace.py +0 -0
  400. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/types.py +0 -0
  401. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/utils/__init__.py +0 -0
  402. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/utils/format.py +0 -0
  403. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/utils/install.py +0 -0
  404. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/utils/logging.py +0 -0
  405. {verifiers-0.1.15.dev386 → verifiers-0.1.15.dev388}/verifiers/v1/utils/memory.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: verifiers
3
- Version: 0.1.15.dev386
3
+ Version: 0.1.15.dev388
4
4
  Summary: Verifiers: Environments for LLM Reinforcement Learning
5
5
  Project-URL: Homepage, https://github.com/primeintellect-ai/verifiers
6
6
  Project-URL: Documentation, https://github.com/primeintellect-ai/verifiers
@@ -228,9 +228,8 @@ uv run eval gsm8k-v1 -n 1 --retries.rollout.max-retries 3 --retries.rollout.incl
228
228
 
229
229
  Some tasksets wrap a whole benchmark family rather than a single task — shipped, installed by
230
230
  default. For example, `textarena` (TextArena games) and `harbor` (the agentic-
231
- benchmark registry). Harbor is the showcase: it pulls tasks straight from the Harbor registry
232
- via the `harbor` CLI (`uv tool install harbor`), each in its own declared, pullable container
233
- image — e.g. Terminal-Bench 2:
231
+ benchmark registry). Harbor is the showcase: it pulls tasks straight from the Harbor registry,
232
+ each in its own declared, pullable container image — e.g. Terminal-Bench 2:
234
233
 
235
234
  ```bash
236
235
  uv run eval harbor --taskset.dataset terminal-bench/terminal-bench-2 -n 10 --harness.id rlm
@@ -0,0 +1,10 @@
1
+ """bash_edit — v1's built-in agentic harness: the `bash` chat loop plus a local `edit` tool
2
+ (single-occurrence string replacement, ported from rlm). Its `harness.py` (class + config) and
3
+ the `program.py` script staged into the runtime. Resolved by id via `load_harness`."""
4
+
5
+ from verifiers.v1.harnesses.bash_edit.harness import (
6
+ BashEditHarness,
7
+ BashEditHarnessConfig,
8
+ )
9
+
10
+ __all__ = ["BashEditHarness", "BashEditHarnessConfig"]
@@ -0,0 +1,84 @@
1
+ """The built-in bash_edit harness: the `bash` chat loop plus a local `edit` tool.
2
+
3
+ Same growing-message-list chat loop as the `bash` harness — a local `bash` tool that runs shell
4
+ commands in the runtime, plus the taskset's MCP tools — with one extra local tool: `edit`, a
5
+ single-occurrence string replacement in a file (ported from the rlm `edit` skill). For agentic
6
+ tasks where targeted file edits are common and a model handles `edit` more reliably than
7
+ hand-built `sed`/heredoc shell. Its uv script (deps: openai, mcp) is prepared during setup, then
8
+ launched as the harness program.
9
+ """
10
+
11
+ import json
12
+ from pathlib import Path
13
+
14
+ from verifiers.v1.harness import Harness, HarnessConfig
15
+ from verifiers.v1.clients import RolloutContext
16
+ from verifiers.v1.dialects.chat import message_to_wire
17
+ from verifiers.v1.runtimes import ProgramResult, Runtime
18
+ from verifiers.v1.trace import Trace
19
+
20
+ PROGRAM_SOURCE = (Path(__file__).resolve().parent / "program.py").read_text()
21
+
22
+ # Frames the model as a coding agent and names its local tools (a pure-text chat loop gets no
23
+ # harness-injected prompt).
24
+ BASH_EDIT_SYSTEM_PROMPT = (
25
+ "You are a coding agent. You have access to a bash tool for running shell commands and "
26
+ "an edit tool for single-occurrence string replacement in a file."
27
+ )
28
+
29
+
30
+ class BashEditHarnessConfig(HarnessConfig):
31
+ """The built-in bash_edit harness. A uv script (deps: openai, mcp), so it runs in any runtime
32
+ that has `uv` (the harness bootstraps it) with no other setup."""
33
+
34
+
35
+ class BashEditHarness(Harness[BashEditHarnessConfig]):
36
+ APPENDS_SYSTEM_PROMPT = True
37
+ SUPPORTS_USER_SIM = True
38
+ SUPPORTS_MESSAGE_PROMPT = True
39
+
40
+ async def setup(self, runtime: Runtime) -> None:
41
+ await runtime.prepare_uv_script(PROGRAM_SOURCE, self.config.env)
42
+
43
+ async def launch(
44
+ self,
45
+ ctx: RolloutContext,
46
+ trace: Trace,
47
+ runtime: Runtime,
48
+ endpoint: str,
49
+ secret: str,
50
+ mcp_urls: dict[str, str],
51
+ ) -> ProgramResult:
52
+ system_prompt, prompt = self.resolve_prompt(trace.task)
53
+ system_prompt = "\n\n".join(
54
+ p for p in (BASH_EDIT_SYSTEM_PROMPT, system_prompt) if p
55
+ )
56
+ env = {**self.config.env}
57
+ args = [
58
+ f"--base-url={endpoint}",
59
+ f"--api-key={secret}",
60
+ f"--model={ctx.model}",
61
+ f"--system-prompt={system_prompt}",
62
+ ]
63
+ if mcp_urls:
64
+ # The program connects to the tool servers over HTTP; hand it a standard
65
+ # `mcpServers` URL config (the `mcp` client itself comes from the uv deps).
66
+ args.append(
67
+ "--mcp-config="
68
+ + json.dumps(
69
+ {
70
+ "mcpServers": {
71
+ name: {"url": url} for name, url in mcp_urls.items()
72
+ }
73
+ }
74
+ )
75
+ )
76
+ # A Messages prompt (e.g. an image-bearing prompt) seeds the chat loop directly via env
77
+ # (it can be large multimodal content that overflows argv); a plain string is the single
78
+ # first user message; None means the task has no prompt and the user simulator opens it.
79
+ if isinstance(prompt, str):
80
+ args.append(f"--prompt={prompt}")
81
+ elif prompt is not None:
82
+ env["INITIAL_MESSAGES"] = json.dumps([message_to_wire(m) for m in prompt])
83
+ program = await runtime.prepare_uv_script(PROGRAM_SOURCE, self.config.env)
84
+ return await runtime.run_program([*program, *args], env)
@@ -0,0 +1,250 @@
1
+ # /// script
2
+ # requires-python = ">=3.10"
3
+ # dependencies = ["openai", "mcp"]
4
+ # ///
5
+ """The bash_edit harness's program: a chat loop with local `bash` + `edit` tools (+ optional MCP).
6
+
7
+ A growing-message-list chat loop. It always offers a local `bash` tool that runs shell commands in
8
+ the runtime and a local `edit` tool that replaces a unique string in a file; when the harness sets
9
+ MCP_CONFIG (a standard `mcpServers` URL map) it also connects to those servers over streamable
10
+ HTTP, exposes their tools to the model as `<server>_<tool>`, and routes those calls to the server.
11
+ The loop runs until the model answers without a tool call.
12
+
13
+ It runs as a uv script (deps: openai, mcp), so the chat + tool plumbing is just the SDKs — the
14
+ harness bootstraps `uv` in the runtime. The interception endpoint, per-rollout secret, and model
15
+ arrive as argv (not env), so the local tools' subprocesses never inherit them.
16
+ """
17
+
18
+ import argparse
19
+ import asyncio
20
+ import json
21
+ import os
22
+ import subprocess
23
+ from contextlib import AsyncExitStack
24
+ from pathlib import Path
25
+
26
+ from openai import AsyncOpenAI
27
+
28
+ BASH_TOOL = {
29
+ "type": "function",
30
+ "function": {
31
+ "name": "bash",
32
+ "description": "Run a bash command and return its combined stdout and stderr.",
33
+ "parameters": {
34
+ "type": "object",
35
+ "properties": {
36
+ "command": {"type": "string", "description": "The bash command to run."}
37
+ },
38
+ "required": ["command"],
39
+ },
40
+ },
41
+ }
42
+
43
+ EDIT_TOOL = {
44
+ "type": "function",
45
+ "function": {
46
+ "name": "edit",
47
+ "description": (
48
+ "Replace a unique string in a file. old_str must appear exactly once in the file."
49
+ ),
50
+ "parameters": {
51
+ "type": "object",
52
+ "properties": {
53
+ "path": {
54
+ "type": "string",
55
+ "description": "File path (relative to cwd or absolute).",
56
+ },
57
+ "old_str": {
58
+ "type": "string",
59
+ "description": "Exact string to find (must appear exactly once).",
60
+ },
61
+ "new_str": {"type": "string", "description": "Replacement string."},
62
+ },
63
+ "required": ["path", "old_str", "new_str"],
64
+ },
65
+ },
66
+ }
67
+
68
+
69
+ def run_bash(command: str) -> str:
70
+ try:
71
+ result = subprocess.run(
72
+ ["bash", "-c", command], capture_output=True, text=True, timeout=3600
73
+ )
74
+ return result.stdout + result.stderr
75
+ except Exception as e:
76
+ return f"error: {e}"
77
+
78
+
79
+ def run_edit(path: str, old_str: str, new_str: str) -> str:
80
+ if not isinstance(path, str) or not path:
81
+ return "error: 'path' is required"
82
+ if not isinstance(old_str, str) or not isinstance(new_str, str):
83
+ return "error: 'old_str' and 'new_str' must be strings"
84
+ if not old_str:
85
+ # '' matches everywhere (''.count('') == 1 on an empty file), so it would insert
86
+ # rather than replace — reject it to keep the "exactly once" contract honest.
87
+ return "error: 'old_str' must be a non-empty string"
88
+ filepath = Path(path)
89
+ if not filepath.is_absolute():
90
+ filepath = Path.cwd() / filepath
91
+ if not filepath.exists():
92
+ return f"error: {path} not found"
93
+ # Reading/writing can fail on a directory, permissions, or non-text content; return the
94
+ # error as a tool result instead of letting it abort the chat loop.
95
+ try:
96
+ content = filepath.read_text()
97
+ except Exception as e:
98
+ return f"error: could not read {path}: {e}"
99
+ count = content.count(old_str)
100
+ if count != 1:
101
+ return f"error: old_str must appear exactly once in {path} (found {count})"
102
+ try:
103
+ filepath.write_text(content.replace(old_str, new_str, 1))
104
+ except Exception as e:
105
+ return f"error: could not write {path}: {e}"
106
+ return f"Edited {path}"
107
+
108
+
109
+ async def chat(
110
+ client: AsyncOpenAI, model: str, messages: list[dict], tools: list[dict]
111
+ ):
112
+ completion = await client.chat.completions.create(
113
+ model=model, messages=messages, tools=tools or None
114
+ )
115
+ return completion.choices[0].message
116
+
117
+
118
+ async def connect_mcp(stack: AsyncExitStack, config: dict) -> tuple[list[dict], dict]:
119
+ """Connect to each configured MCP server (a streamable-HTTP `url`); return
120
+ (tool schemas, dispatch mapping `<server>_<tool>` -> (session, raw tool name))."""
121
+ from mcp import ClientSession
122
+ from mcp.client.streamable_http import (
123
+ create_mcp_http_client,
124
+ streamable_http_client,
125
+ )
126
+
127
+ tool_schemas: list[dict] = []
128
+ dispatch: dict[str, tuple] = {}
129
+ for name, spec in config.get("mcpServers", {}).items():
130
+ http_client = await stack.enter_async_context(
131
+ create_mcp_http_client(headers=spec.get("headers") or None)
132
+ )
133
+ read, write, *_ = await stack.enter_async_context(
134
+ streamable_http_client(spec["url"], http_client=http_client)
135
+ )
136
+ session = await stack.enter_async_context(ClientSession(read, write))
137
+ await session.initialize()
138
+ for tool in (await session.list_tools()).tools:
139
+ full = f"{name}_{tool.name}"
140
+ tool_schemas.append(
141
+ {
142
+ "type": "function",
143
+ "function": {
144
+ "name": full,
145
+ "description": tool.description or "",
146
+ "parameters": tool.inputSchema,
147
+ },
148
+ }
149
+ )
150
+ dispatch[full] = (session, tool.name)
151
+ return tool_schemas, dispatch
152
+
153
+
154
+ def mcp_content_to_chat_content(blocks) -> str | list[dict]:
155
+ parts = []
156
+ for block in blocks:
157
+ if block.type == "text":
158
+ parts.append({"type": "text", "text": block.text})
159
+ elif block.type == "image":
160
+ url = f"data:{block.mimeType};base64,{block.data}"
161
+ parts.append({"type": "image_url", "image_url": {"url": url}})
162
+ else:
163
+ parts.append({"type": "text", "text": str(block)})
164
+ if not parts:
165
+ return str(blocks)
166
+ if all(part["type"] == "text" for part in parts):
167
+ return "\n".join(part["text"] for part in parts)
168
+ return parts
169
+
170
+
171
+ async def call_mcp(dispatch: dict, name: str, arguments: dict) -> str | list[dict]:
172
+ session, raw = dispatch[name]
173
+ result = await session.call_tool(raw, arguments)
174
+ return mcp_content_to_chat_content(result.content)
175
+
176
+
177
+ def parse_args() -> argparse.Namespace:
178
+ parser = argparse.ArgumentParser()
179
+ parser.add_argument("--base-url", required=True)
180
+ parser.add_argument("--api-key", required=True)
181
+ parser.add_argument("--model", required=True)
182
+ parser.add_argument("--system-prompt", default="")
183
+ parser.add_argument("--prompt", default="")
184
+ parser.add_argument("--mcp-config", default="")
185
+ return parser.parse_args()
186
+
187
+
188
+ async def main() -> None:
189
+ args = parse_args()
190
+ client = AsyncOpenAI(base_url=args.base_url, api_key=args.api_key)
191
+ config = json.loads(args.mcp_config or "{}")
192
+ async with AsyncExitStack() as stack:
193
+ mcp_tools, dispatch = (
194
+ await connect_mcp(stack, config) if config.get("mcpServers") else ([], {})
195
+ )
196
+ tools = [BASH_TOOL, EDIT_TOOL] + mcp_tools
197
+ messages = (
198
+ [{"role": "system", "content": args.system_prompt}]
199
+ if args.system_prompt
200
+ else []
201
+ )
202
+ # A Messages prompt (e.g. an image-bearing prompt) arrives pre-built as OpenAI wire dicts
203
+ # via INITIAL_MESSAGES (kept in env: it can be large multimodal content that overflows
204
+ # argv, and it's prompt content, not a credential); otherwise --prompt is the opening
205
+ # message. Both empty means the task has no prompt — the user simulator seeds the opening.
206
+ initial = json.loads(os.environ.get("INITIAL_MESSAGES", "[]"))
207
+ if initial:
208
+ messages.extend(initial)
209
+ elif args.prompt:
210
+ messages.append({"role": "user", "content": args.prompt})
211
+ while True:
212
+ message = await chat(client, args.model, messages, tools)
213
+ messages.append(message.model_dump(exclude_none=True))
214
+ if not message.tool_calls:
215
+ break
216
+ for call in message.tool_calls:
217
+ name = call.function.name
218
+ try:
219
+ tool_args = json.loads(call.function.arguments or "{}")
220
+ except json.JSONDecodeError as e:
221
+ messages.append(
222
+ {
223
+ "role": "tool",
224
+ "tool_call_id": call.id,
225
+ "content": f"error: invalid JSON in tool arguments ({e}); resend the call with valid JSON",
226
+ }
227
+ )
228
+ continue
229
+ if name in dispatch:
230
+ content = await call_mcp(dispatch, name, tool_args)
231
+ elif name == "bash":
232
+ content = await asyncio.to_thread(
233
+ run_bash, tool_args.get("command", "")
234
+ )
235
+ elif name == "edit":
236
+ content = await asyncio.to_thread(
237
+ run_edit,
238
+ tool_args.get("path"),
239
+ tool_args.get("old_str"),
240
+ tool_args.get("new_str"),
241
+ )
242
+ else:
243
+ content = f"error: unknown tool {name!r}"
244
+ messages.append(
245
+ {"role": "tool", "tool_call_id": call.id, "content": content}
246
+ )
247
+
248
+
249
+ if __name__ == "__main__":
250
+ asyncio.run(main())
@@ -1,10 +1,9 @@
1
1
  """harbor: run a Harbor (Terminal-Bench) dataset.
2
2
 
3
- `dataset` is a Harbor Hub registry id (e.g. "name", "name@version",
4
- "org/name@ref"), downloaded + cached on first use via the `harbor` CLI
5
- (fetched on demand with `uv` when needed). Each task dir ships task.toml +
6
- instruction.md (+ tests/, solution/, environment/). Defaults to the registry
7
- `hello-world` task.
3
+ `dataset` is a Harbor Hub package id (e.g. "org/name" or "org/name@ref"),
4
+ downloaded directly from the registry and cached on first use. Each task dir
5
+ ships task.toml + instruction.md (+ tests/, solution/, environment/). Defaults
6
+ to the registry `harbor/hello-world` dataset.
8
7
 
9
8
  The harness runs in a container and edits /app; then the task's verifier
10
9
  (tests/test.sh) runs in the SAME container and the reward it writes to
@@ -20,14 +19,16 @@ no environment at all also runs on that image, unless `require_image`.
20
19
  """
21
20
 
22
21
  import io
23
- import logging
24
- import shutil
25
- import subprocess
26
- import sys
22
+ import json
23
+ import os
27
24
  import tarfile
25
+ import tempfile
28
26
  import tomllib
27
+ from concurrent.futures import ThreadPoolExecutor
29
28
  from functools import lru_cache
30
29
  from pathlib import Path
30
+ from urllib.parse import urlencode
31
+ from urllib.request import Request, urlopen
31
32
 
32
33
  from pydantic import Field
33
34
 
@@ -40,14 +41,14 @@ from verifiers.v1.trace import Trace
40
41
  from verifiers.v1.types import StrictBaseModel
41
42
 
42
43
  CACHE = Path.home() / ".cache" / "harbor"
43
- HARBOR_PACKAGE = "harbor==0.14.0"
44
- logger = logging.getLogger("verifiers.v1.tasksets.harbor")
44
+ HARBOR_SUPABASE_URL = "https://ofhuhcpkvzjlejydnvyd.supabase.co"
45
+ HARBOR_SUPABASE_PUBLISHABLE_KEY = "sb_publishable_Z-vuQbpvpG-PStjbh4yE0Q_e-d3MTIH"
45
46
 
46
47
 
47
48
  class HarborConfig(TasksetConfig):
48
- dataset: str = "hello-world"
49
- """A Harbor Hub registry id ("name", "name@version", "org/name@ref"),
50
- downloaded + cached via the `harbor` CLI."""
49
+ dataset: str = "harbor/hello-world"
50
+ """A Harbor Hub package id ("org/name" or "org/name@ref"), where ref is a
51
+ tag, integer revision, or sha256 digest. Downloaded directly and cached."""
51
52
  tasks: list[str] | None = None
52
53
  """Optional subset of task names to load (None = all)."""
53
54
  timeout_multiplier: float = Field(1.0, gt=0)
@@ -87,30 +88,130 @@ class HarborTask(Task):
87
88
 
88
89
 
89
90
  def dataset_dir(dataset: str) -> Path:
90
- """Download a Harbor Hub `dataset` to a directory of task dirs via the `harbor`
91
- CLI, cached on first use."""
91
+ """Download a Harbor Hub task or dataset package, cached on first use.
92
+
93
+ Harbor refs are tags, integer revisions, or ``sha256:`` digests.
94
+ """
92
95
  out = CACHE / dataset.replace("/", "_").replace("@", "_")
93
96
  if out.is_dir():
94
97
  return out
95
98
 
96
- harbor_bin = shutil.which("harbor")
97
- if harbor_bin is not None:
98
- command = [harbor_bin]
99
+ package, _, ref = dataset.partition("@")
100
+ org, name = package.split("/", 1)
101
+ ref = ref or "latest"
102
+ url = os.getenv("HARBOR_SUPABASE_URL", HARBOR_SUPABASE_URL).rstrip("/")
103
+ key = os.getenv("HARBOR_SUPABASE_PUBLISHABLE_KEY", HARBOR_SUPABASE_PUBLISHABLE_KEY)
104
+ headers = {
105
+ "apikey": key,
106
+ "Authorization": f"Bearer {key}",
107
+ "Content-Type": "application/json",
108
+ }
109
+ # Harbor stores datasets in version tables; standalone tasks use the RPC fallback below.
110
+ version_query = {
111
+ "package.name": f"eq.{name}",
112
+ "package.type": "eq.dataset",
113
+ "package.org.name": f"eq.{org}",
114
+ "limit": 1,
115
+ }
116
+ if ref.isdigit():
117
+ table = "dataset_version"
118
+ version_query |= {
119
+ "select": "id,package:package_id!inner(name,type,org:org_id!inner(name))",
120
+ "revision": f"eq.{ref}",
121
+ }
122
+ elif ref.startswith("sha256:"):
123
+ table = "dataset_version"
124
+ version_query |= {
125
+ "select": "id,package:package_id!inner(name,type,org:org_id!inner(name))",
126
+ "content_hash": f"eq.{ref.removeprefix('sha256:')}",
127
+ }
99
128
  else:
100
- uv_bin = shutil.which("uv")
101
- if uv_bin is None:
102
- raise RuntimeError(
103
- "Harbor datasets require an installed `harbor` CLI or `uv` for automatic installation"
104
- )
105
- logger.info("harbor: installing %s with uv", HARBOR_PACKAGE)
106
- command = [uv_bin, "tool", "run"]
107
- # Harbor requires Python 3.12, while Verifiers also supports Python 3.11.
108
- if sys.version_info[:2] == (3, 11):
109
- command.extend(["--python", "3.12"])
110
- command.extend(["--from", HARBOR_PACKAGE, "harbor"])
111
- subprocess.run(
112
- [*command, "download", dataset, "--export", "-o", str(out)], check=True
129
+ table = "dataset_version_tag"
130
+ version_query |= {
131
+ "select": "dataset_version:dataset_version_id(id),package:package_id!inner(name,type,org:org_id!inner(name))",
132
+ "tag": f"eq.{ref}",
133
+ }
134
+ request = Request(
135
+ f"{url}/rest/v1/{table}?{urlencode(version_query)}", headers=headers
113
136
  )
137
+ with urlopen(request) as response:
138
+ versions = json.load(response)
139
+
140
+ if versions:
141
+ version = versions[0]
142
+ version_id = version.get("id") or version["dataset_version"]["id"]
143
+ task_query = {
144
+ "select": "task_version:task_version_id(archive_path,package:package_id(name))",
145
+ "dataset_version_id": f"eq.{version_id}",
146
+ "order": "task_version_id",
147
+ "limit": 1000,
148
+ "offset": 0,
149
+ }
150
+ request = Request(
151
+ f"{url}/rest/v1/dataset_version_task?{urlencode(task_query)}",
152
+ headers={**headers, "Prefer": "count=exact"},
153
+ )
154
+ with urlopen(request) as response:
155
+ pages = [json.load(response)]
156
+ total = int(response.headers["Content-Range"].rsplit("/", 1)[1])
157
+
158
+ for offset in range(1000, total, 1000):
159
+ task_query["offset"] = offset
160
+ request = Request(
161
+ f"{url}/rest/v1/dataset_version_task?{urlencode(task_query)}",
162
+ headers=headers,
163
+ )
164
+ with urlopen(request) as response:
165
+ pages.append(json.load(response))
166
+ downloads = [
167
+ (
168
+ Path(name) / row["task_version"]["package"]["name"],
169
+ row["task_version"]["archive_path"],
170
+ )
171
+ for page in pages
172
+ for row in page
173
+ ]
174
+ else:
175
+ body = json.dumps({"p_org": org, "p_name": name, "p_ref": ref}).encode()
176
+ request = Request(
177
+ f"{url}/rest/v1/rpc/resolve_task_version", body, headers=headers
178
+ )
179
+ with urlopen(request) as response:
180
+ task = json.load(response)
181
+ if task is None:
182
+ raise ValueError(f"Harbor package not found: {dataset}")
183
+ downloads = [(Path(name), task["archive_path"])]
184
+
185
+ if not downloads:
186
+ raise ValueError(f"Harbor dataset has no tasks: {dataset}")
187
+
188
+ CACHE.mkdir(parents=True, exist_ok=True)
189
+ # Stream archives concurrently into a temporary directory; publish only a complete cache.
190
+ with tempfile.TemporaryDirectory(dir=CACHE) as temp:
191
+
192
+ def extract(item: tuple[Path, str]) -> None:
193
+ relative_path, archive_path = item
194
+ target = Path(temp) / relative_path
195
+ target.mkdir(parents=True, exist_ok=True)
196
+ request = Request(
197
+ f"{url}/storage/v1/object/authenticated/packages/{archive_path}",
198
+ headers=headers,
199
+ )
200
+ with urlopen(request) as response:
201
+ with tarfile.open(fileobj=response, mode="r|gz") as tar:
202
+ kwargs = (
203
+ {"filter": "data"} if hasattr(tarfile, "data_filter") else {}
204
+ )
205
+ tar.extractall(target, **kwargs)
206
+
207
+ with ThreadPoolExecutor(max_workers=100) as pool:
208
+ list(pool.map(extract, downloads))
209
+ try:
210
+ Path(temp).rename(out)
211
+ except OSError:
212
+ if out.is_dir():
213
+ return out
214
+ raise
114
215
  return out
115
216
 
116
217