verifiers 0.1.15.dev178__tar.gz → 0.1.15.dev179__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 (354) hide show
  1. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/PKG-INFO +1 -1
  2. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/envs/experimental/composable/tasksets/__init__.py +6 -0
  3. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/envs/experimental/composable/tasksets/harbor/__init__.py +3 -0
  4. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/envs/experimental/composable/tasksets/harbor/harbor.py +57 -16
  5. verifiers-0.1.15.dev179/verifiers/envs/experimental/composable/tasksets/harbor/terminal_lego.py +413 -0
  6. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/.gitignore +0 -0
  7. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/LICENSE +0 -0
  8. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/README.md +0 -0
  9. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/pyproject.toml +0 -0
  10. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/tests/AGENTS.md +0 -0
  11. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/tests/README.md +0 -0
  12. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/tests/__init__.py +0 -0
  13. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/tests/conftest.py +0 -0
  14. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/tests/test_browser_env.py +0 -0
  15. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/tests/test_build_script.py +0 -0
  16. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/tests/test_cli_agent_env.py +0 -0
  17. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/tests/test_client_auth_errors.py +0 -0
  18. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/tests/test_client_config.py +0 -0
  19. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/tests/test_client_multimodal_types.py +0 -0
  20. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/tests/test_composable_env.py +0 -0
  21. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/tests/test_context_token_metrics.py +0 -0
  22. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/tests/test_decorator_ranks.py +0 -0
  23. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/tests/test_endpoint_registry.py +0 -0
  24. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/tests/test_env_group.py +0 -0
  25. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/tests/test_env_server.py +0 -0
  26. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/tests/test_environment.py +0 -0
  27. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/tests/test_environment_extra.py +0 -0
  28. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/tests/test_envs.py +0 -0
  29. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/tests/test_error_chain.py +0 -0
  30. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/tests/test_eval_cli.py +0 -0
  31. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/tests/test_eval_display.py +0 -0
  32. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/tests/test_eval_utils.py +0 -0
  33. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/tests/test_gepa_cli.py +0 -0
  34. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/tests/test_gepa_utils.py +0 -0
  35. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/tests/test_gym_env.py +0 -0
  36. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/tests/test_harbor_env_mcp.py +0 -0
  37. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/tests/test_imports.py +0 -0
  38. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/tests/test_init_script.py +0 -0
  39. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/tests/test_install_utils.py +0 -0
  40. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/tests/test_interception_utils.py +0 -0
  41. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/tests/test_langchain_deep_agents_wikispeedia.py +0 -0
  42. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/tests/test_lean_task.py +0 -0
  43. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/tests/test_logging.py +0 -0
  44. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/tests/test_math_rubric.py +0 -0
  45. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/tests/test_maybe_think_parser.py +0 -0
  46. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/tests/test_mcp_search_env.py +0 -0
  47. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/tests/test_message_utils.py +0 -0
  48. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/tests/test_message_utils_multimodal.py +0 -0
  49. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/tests/test_multiturn_env.py +0 -0
  50. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/tests/test_nemorl_client.py +0 -0
  51. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/tests/test_openai_chat_completions_token_client.py +0 -0
  52. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/tests/test_openai_responses_client.py +0 -0
  53. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/tests/test_opencode_harbor.py +0 -0
  54. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/tests/test_opencode_rlm_env.py +0 -0
  55. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/tests/test_openenv_client.py +0 -0
  56. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/tests/test_parser.py +0 -0
  57. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/tests/test_path_utils.py +0 -0
  58. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/tests/test_per_turn_timing.py +0 -0
  59. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/tests/test_pricing_utils.py +0 -0
  60. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/tests/test_prime_plugin.py +0 -0
  61. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/tests/test_renderer_client.py +0 -0
  62. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/tests/test_renderer_e2e.py +0 -0
  63. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/tests/test_rlm_composable_env.py +0 -0
  64. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/tests/test_rubric.py +0 -0
  65. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/tests/test_rubric_group.py +0 -0
  66. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/tests/test_sandbox_env.py +0 -0
  67. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/tests/test_sandbox_mixin.py +0 -0
  68. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/tests/test_save_utils.py +0 -0
  69. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/tests/test_setup_script.py +0 -0
  70. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/tests/test_singleturn_env.py +0 -0
  71. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/tests/test_stateful_tool_env.py +0 -0
  72. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/tests/test_think_parser.py +0 -0
  73. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/tests/test_tool_env.py +0 -0
  74. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/tests/test_tool_utils.py +0 -0
  75. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/tests/test_trajectory_processing.py +0 -0
  76. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/tests/test_tui_info_formatting.py +0 -0
  77. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/tests/test_types.py +0 -0
  78. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/tests/test_v1_bfcl.py +0 -0
  79. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/tests/test_v1_config_extension.py +0 -0
  80. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/tests/test_v1_empty_completions.py +0 -0
  81. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/tests/test_v1_endpoint_protocols.py +0 -0
  82. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/tests/test_v1_example_counts.py +0 -0
  83. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/tests/test_v1_group_reward_env.py +0 -0
  84. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/tests/test_v1_harbor_cli.py +0 -0
  85. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/tests/test_v1_mini_swe_agent.py +0 -0
  86. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/tests/test_v1_nemo_gym_harness.py +0 -0
  87. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/tests/test_v1_openenv_taskset.py +0 -0
  88. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/tests/test_v1_openreward_taskset.py +0 -0
  89. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/tests/test_v1_replay_harness.py +0 -0
  90. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/tests/test_v1_rlm_swe.py +0 -0
  91. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/tests/test_v1_runtime_lifecycle.py +0 -0
  92. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/tests/test_v1_scoring_functions.py +0 -0
  93. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/tests/test_v1_taskset_bindings.py +0 -0
  94. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/tests/test_v1_taskset_utils.py +0 -0
  95. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/tests/test_v1_textarena_taskset.py +0 -0
  96. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/tests/test_wiki_search_v1.py +0 -0
  97. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/tests/test_wordle_env.py +0 -0
  98. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/tests/test_wordle_v1_env.py +0 -0
  99. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/tests/test_xml_parser.py +0 -0
  100. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/AGENTS.md +0 -0
  101. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/__init__.py +0 -0
  102. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/cli/__init__.py +0 -0
  103. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/cli/commands/__init__.py +0 -0
  104. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/cli/commands/build.py +0 -0
  105. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/cli/commands/eval.py +0 -0
  106. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/cli/commands/gepa.py +0 -0
  107. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/cli/commands/init.py +0 -0
  108. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/cli/commands/install.py +0 -0
  109. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/cli/commands/setup.py +0 -0
  110. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/cli/plugins/__init__.py +0 -0
  111. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/cli/plugins/prime.py +0 -0
  112. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/cli/tui.py +0 -0
  113. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/clients/__init__.py +0 -0
  114. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/clients/anthropic_messages_client.py +0 -0
  115. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/clients/client.py +0 -0
  116. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/clients/nemorl_chat_completions_client.py +0 -0
  117. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/clients/openai_chat_completions_client.py +0 -0
  118. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/clients/openai_chat_completions_token_client.py +0 -0
  119. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/clients/openai_completions_client.py +0 -0
  120. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/clients/openai_responses_client.py +0 -0
  121. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/clients/renderer_client.py +0 -0
  122. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/decorators.py +0 -0
  123. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/envs/AGENTS.md +0 -0
  124. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/envs/__init__.py +0 -0
  125. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/envs/env_group.py +0 -0
  126. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/envs/environment.py +0 -0
  127. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/envs/experimental/README.md +0 -0
  128. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/envs/experimental/__init__.py +0 -0
  129. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/envs/experimental/cli_agent_env.py +0 -0
  130. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/envs/experimental/composable/README.md +0 -0
  131. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/envs/experimental/composable/__init__.py +0 -0
  132. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/envs/experimental/composable/_filter.py +0 -0
  133. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/envs/experimental/composable/composable_env.py +0 -0
  134. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/envs/experimental/composable/harness.py +0 -0
  135. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/envs/experimental/composable/harnesses/__init__.py +0 -0
  136. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/envs/experimental/composable/harnesses/mini_swe_agent.py +0 -0
  137. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/envs/experimental/composable/harnesses/opencode.py +0 -0
  138. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/envs/experimental/composable/harnesses/prompt.txt +0 -0
  139. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/envs/experimental/composable/harnesses/rlm.py +0 -0
  140. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/envs/experimental/composable/swe_debug_env.py +0 -0
  141. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/envs/experimental/composable/task.py +0 -0
  142. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/envs/experimental/composable/tasksets/cp/__init__.py +0 -0
  143. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/envs/experimental/composable/tasksets/cp/cp_task.py +0 -0
  144. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/envs/experimental/composable/tasksets/cp/test_utils.py +0 -0
  145. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/envs/experimental/composable/tasksets/lean/__init__.py +0 -0
  146. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/envs/experimental/composable/tasksets/lean/lean_task.py +0 -0
  147. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/envs/experimental/composable/tasksets/math/__init__.py +0 -0
  148. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/envs/experimental/composable/tasksets/math/math_task.py +0 -0
  149. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/envs/experimental/composable/tasksets/search/README.md +0 -0
  150. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/envs/experimental/composable/tasksets/search/__init__.py +0 -0
  151. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/envs/experimental/composable/tasksets/search/openseeker/README.md +0 -0
  152. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/envs/experimental/composable/tasksets/search/openseeker/__init__.py +0 -0
  153. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/envs/experimental/composable/tasksets/search/openseeker/taskset.py +0 -0
  154. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/envs/experimental/composable/tasksets/search/quest/README.md +0 -0
  155. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/envs/experimental/composable/tasksets/search/quest/__init__.py +0 -0
  156. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/__init__.py +0 -0
  157. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/api_tools/__init__.py +0 -0
  158. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/api_tools/tool_pdf.py +0 -0
  159. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/eval_toolkit.py +0 -0
  160. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/evaluator.py +0 -0
  161. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/llm_client/__init__.py +0 -0
  162. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/llm_client/base_client.py +0 -0
  163. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/prompts/__init__.py +0 -0
  164. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/prompts/cache_prompts.py +0 -0
  165. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/__init__.py +0 -0
  166. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/cache_filesys.py +0 -0
  167. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/load_eval_script.py +0 -0
  168. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/misc.py +0 -0
  169. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/tool_visit.py +0 -0
  170. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/utils/url_tools.py +0 -0
  171. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/verification_tree.py +0 -0
  172. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/envs/experimental/composable/tasksets/search/quest/open_ended.py +0 -0
  173. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/envs/experimental/composable/tasksets/search/quest/taskset.py +0 -0
  174. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/envs/experimental/composable/tasksets/search/redsearcher/README.md +0 -0
  175. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/envs/experimental/composable/tasksets/search/redsearcher/__init__.py +0 -0
  176. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/envs/experimental/composable/tasksets/search/redsearcher/taskset.py +0 -0
  177. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/envs/experimental/composable/tasksets/search/search_tasksets.py +0 -0
  178. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/envs/experimental/composable/tasksets/swe/README.md +0 -0
  179. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/envs/experimental/composable/tasksets/swe/__init__.py +0 -0
  180. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/__init__.py +0 -0
  181. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/extract_fix_patch.sh +0 -0
  182. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/taskset.py +0 -0
  183. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/envs/experimental/composable/tasksets/swe/openswe/__init__.py +0 -0
  184. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/envs/experimental/composable/tasksets/swe/openswe/taskset.py +0 -0
  185. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/__init__.py +0 -0
  186. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/log_parser.py +0 -0
  187. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/taskset.py +0 -0
  188. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/envs/experimental/composable/tasksets/swe/scale_swe/__init__.py +0 -0
  189. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/envs/experimental/composable/tasksets/swe/scale_swe/taskset.py +0 -0
  190. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/envs/experimental/composable/tasksets/swe/shared/__init__.py +0 -0
  191. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/envs/experimental/composable/tasksets/swe/shared/test_patch.py +0 -0
  192. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/envs/experimental/composable/tasksets/swe/swe_bench/__init__.py +0 -0
  193. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/envs/experimental/composable/tasksets/swe/swe_bench/taskset.py +0 -0
  194. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/envs/experimental/composable/tasksets/swe/swe_lego/__init__.py +0 -0
  195. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/envs/experimental/composable/tasksets/swe/swe_lego/taskset.py +0 -0
  196. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/__init__.py +0 -0
  197. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/log_parsers.py +0 -0
  198. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/taskset.py +0 -0
  199. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/envs/experimental/composable/tasksets/swe/swe_smith/__init__.py +0 -0
  200. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/envs/experimental/composable/tasksets/swe/swe_smith/taskset.py +0 -0
  201. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/envs/experimental/composable/tasksets/swe/swe_tasksets.py +0 -0
  202. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/envs/experimental/gym_env.py +0 -0
  203. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/envs/experimental/harbor_env/__init__.py +0 -0
  204. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/envs/experimental/harbor_env/env.py +0 -0
  205. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/envs/experimental/harbor_env/mcp.py +0 -0
  206. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/envs/experimental/mcp_env.py +0 -0
  207. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/envs/experimental/opencode_env.py +0 -0
  208. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/envs/experimental/opencode_qa_env.py +0 -0
  209. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/envs/experimental/opencode_rlm_env.py +0 -0
  210. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/envs/experimental/sandbox_mixin.py +0 -0
  211. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/envs/experimental/utils/__init__.py +0 -0
  212. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/envs/experimental/utils/file_locks.py +0 -0
  213. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/envs/experimental/utils/git_checkout_cache.py +0 -0
  214. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/envs/integrations/README.md +0 -0
  215. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/envs/integrations/__init__.py +0 -0
  216. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/envs/integrations/browser_env/README.md +0 -0
  217. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/envs/integrations/browser_env/__init__.py +0 -0
  218. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/envs/integrations/browser_env/browser_env.py +0 -0
  219. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/envs/integrations/browser_env/modes/__init__.py +0 -0
  220. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/envs/integrations/browser_env/modes/base.py +0 -0
  221. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/envs/integrations/browser_env/modes/cua_mode.py +0 -0
  222. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/envs/integrations/browser_env/modes/dom_mode.py +0 -0
  223. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/envs/integrations/openenv_env.py +0 -0
  224. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/envs/integrations/reasoninggym_env.py +0 -0
  225. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/envs/integrations/textarena_env.py +0 -0
  226. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/envs/multiturn_env.py +0 -0
  227. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/envs/python_env.py +0 -0
  228. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/envs/sandbox_env.py +0 -0
  229. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/envs/singleturn_env.py +0 -0
  230. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/envs/stateful_tool_env.py +0 -0
  231. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/envs/tool_env.py +0 -0
  232. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/errors.py +0 -0
  233. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/gepa/__init__.py +0 -0
  234. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/gepa/adapter.py +0 -0
  235. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/gepa/config.py +0 -0
  236. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/gepa/display.py +0 -0
  237. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/gepa/gepa_utils.py +0 -0
  238. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/parsers/__init__.py +0 -0
  239. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/parsers/maybe_think_parser.py +0 -0
  240. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/parsers/parser.py +0 -0
  241. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/parsers/think_parser.py +0 -0
  242. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/parsers/xml_parser.py +0 -0
  243. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/rl/README.md +0 -0
  244. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/rl/__init__.py +0 -0
  245. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/rl/inference/__init__.py +0 -0
  246. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/rl/inference/client.py +0 -0
  247. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/rl/inference/server.py +0 -0
  248. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/rl/trainer/__init__.py +0 -0
  249. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/rl/trainer/config.py +0 -0
  250. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/rl/trainer/orchestrator.py +0 -0
  251. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/rl/trainer/trainer.py +0 -0
  252. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/rl/trainer/utils.py +0 -0
  253. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/rubrics/__init__.py +0 -0
  254. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/rubrics/experimental/hybrid_math_rubric.py +0 -0
  255. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/rubrics/judge_rubric.py +0 -0
  256. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/rubrics/math_rubric.py +0 -0
  257. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/rubrics/rubric.py +0 -0
  258. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/rubrics/rubric_group.py +0 -0
  259. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/scripts/__init__.py +0 -0
  260. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/scripts/build.py +0 -0
  261. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/scripts/eval.py +0 -0
  262. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/scripts/gepa.py +0 -0
  263. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/scripts/init.py +0 -0
  264. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/scripts/install.py +0 -0
  265. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/scripts/rl.py +0 -0
  266. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/scripts/setup.py +0 -0
  267. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/scripts/train.py +0 -0
  268. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/scripts/tui.py +0 -0
  269. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/scripts/vllm.py +0 -0
  270. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/serve/__init__.py +0 -0
  271. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/serve/client/env_client.py +0 -0
  272. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/serve/client/zmq_env_client.py +0 -0
  273. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/serve/server/__init__.py +0 -0
  274. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/serve/server/env_router.py +0 -0
  275. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/serve/server/env_server.py +0 -0
  276. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/serve/server/env_worker.py +0 -0
  277. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/serve/server/zmq_env_server.py +0 -0
  278. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/serve/types.py +0 -0
  279. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/types.py +0 -0
  280. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/utils/__init__.py +0 -0
  281. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/utils/async_utils.py +0 -0
  282. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/utils/client_utils.py +0 -0
  283. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/utils/config_utils.py +0 -0
  284. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/utils/data_utils.py +0 -0
  285. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/utils/display_utils.py +0 -0
  286. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/utils/env_config_utils.py +0 -0
  287. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/utils/env_utils.py +0 -0
  288. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/utils/error_utils.py +0 -0
  289. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/utils/eval_display.py +0 -0
  290. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/utils/eval_utils.py +0 -0
  291. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/utils/heartbeat.py +0 -0
  292. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/utils/import_utils.py +0 -0
  293. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/utils/install_utils.py +0 -0
  294. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/utils/interception_utils.py +0 -0
  295. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/utils/logging_utils.py +0 -0
  296. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/utils/message_utils.py +0 -0
  297. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/utils/metric_utils.py +0 -0
  298. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/utils/path_utils.py +0 -0
  299. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/utils/pricing_utils.py +0 -0
  300. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/utils/process_utils.py +0 -0
  301. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/utils/response_utils.py +0 -0
  302. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/utils/save_utils.py +0 -0
  303. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/utils/serve_utils.py +0 -0
  304. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/utils/thread_utils.py +0 -0
  305. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/utils/threaded_sandbox_client.py +0 -0
  306. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/utils/tool_utils.py +0 -0
  307. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/utils/usage_utils.py +0 -0
  308. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/utils/version_utils.py +0 -0
  309. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/v1/ENVIRONMENT_BEST_PRACTICES.md +0 -0
  310. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/v1/README.md +0 -0
  311. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/v1/RE_MIGRATION.md +0 -0
  312. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/v1/__init__.py +0 -0
  313. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/v1/artifact.py +0 -0
  314. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/v1/config.py +0 -0
  315. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/v1/env.py +0 -0
  316. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/v1/harness.py +0 -0
  317. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/v1/model.py +0 -0
  318. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/v1/program.py +0 -0
  319. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/v1/runtime.py +0 -0
  320. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/v1/runtime_handles.py +0 -0
  321. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/v1/sandbox.py +0 -0
  322. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/v1/state.py +0 -0
  323. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/v1/task.py +0 -0
  324. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/v1/taskset.py +0 -0
  325. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/v1/toolset.py +0 -0
  326. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/v1/types.py +0 -0
  327. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/v1/user.py +0 -0
  328. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/v1/utils/__init__.py +0 -0
  329. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/v1/utils/binding_utils.py +0 -0
  330. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/v1/utils/config_callable_utils.py +0 -0
  331. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/v1/utils/config_utils.py +0 -0
  332. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/v1/utils/endpoint_utils.py +0 -0
  333. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/v1/utils/json_utils.py +0 -0
  334. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/v1/utils/judge_utils.py +0 -0
  335. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/v1/utils/lifecycle_utils.py +0 -0
  336. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/v1/utils/logging_utils.py +0 -0
  337. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/v1/utils/mcp_proxy_utils.py +0 -0
  338. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/v1/utils/mcp_utils.py +0 -0
  339. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/v1/utils/object_utils.py +0 -0
  340. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/v1/utils/program_utils.py +0 -0
  341. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/v1/utils/prompt_utils.py +0 -0
  342. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/v1/utils/runtime_owner_utils.py +0 -0
  343. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/v1/utils/runtime_registry.py +0 -0
  344. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/v1/utils/sandbox_program_utils.py +0 -0
  345. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/v1/utils/sandbox_python_utils.py +0 -0
  346. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/v1/utils/sandbox_utils.py +0 -0
  347. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/v1/utils/scoring_utils.py +0 -0
  348. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/v1/utils/serialization_utils.py +0 -0
  349. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/v1/utils/task_freeze_utils.py +0 -0
  350. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/v1/utils/taskset_utils.py +0 -0
  351. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/v1/utils/tool_utils.py +0 -0
  352. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/v1/utils/toolset_utils.py +0 -0
  353. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/v1/utils/trajectory_utils.py +0 -0
  354. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev179}/verifiers/v1/utils/usage_utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: verifiers
3
- Version: 0.1.15.dev178
3
+ Version: 0.1.15.dev179
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
@@ -32,6 +32,10 @@ from verifiers.envs.experimental.composable.tasksets.harbor.harbor import (
32
32
  HarborRubric,
33
33
  HarborTaskSet,
34
34
  )
35
+ from verifiers.envs.experimental.composable.tasksets.harbor.terminal_lego import (
36
+ TerminalLegoTaskSet,
37
+ make_terminal_lego_taskset,
38
+ )
35
39
 
36
40
  __all__ = [
37
41
  "make_swe_taskset",
@@ -60,4 +64,6 @@ __all__ = [
60
64
  "HarborDatasetTaskSet",
61
65
  "HarborRubric",
62
66
  "HarborDatasetRubric",
67
+ "TerminalLegoTaskSet",
68
+ "make_terminal_lego_taskset",
63
69
  ]
@@ -4,10 +4,13 @@ from .harbor import (
4
4
  HarborRubric,
5
5
  HarborTaskSet,
6
6
  )
7
+ from .terminal_lego import TerminalLegoTaskSet, make_terminal_lego_taskset
7
8
 
8
9
  __all__ = [
9
10
  "HarborTaskSet",
10
11
  "HarborDatasetTaskSet",
11
12
  "HarborRubric",
12
13
  "HarborDatasetRubric",
14
+ "TerminalLegoTaskSet",
15
+ "make_terminal_lego_taskset",
13
16
  ]
@@ -124,7 +124,7 @@ class HarborTaskSet(SandboxTaskSet):
124
124
  tar_path = Path(tmp_file.name)
125
125
 
126
126
  try:
127
- with tarfile.open(tar_path, "w:gz") as tar:
127
+ with tarfile.open(tar_path, "w:gz", dereference=True) as tar:
128
128
  instruction_path = task_dir / "instruction.md"
129
129
  if instruction_path.exists():
130
130
  tar.add(instruction_path, arcname="task/instruction.md")
@@ -136,7 +136,7 @@ class HarborTaskSet(SandboxTaskSet):
136
136
  await sandbox_client.upload_file(sandbox_id, remote_tar, str(tar_path))
137
137
  await sandbox_client.execute_command(
138
138
  sandbox_id,
139
- f"mkdir -p /task /logs/verifier /oracle /tests /app && tar -xzf {remote_tar} -C / && rm {remote_tar}",
139
+ f"mkdir -p /task /app && tar -xzf {remote_tar} -C / && rm {remote_tar}",
140
140
  )
141
141
  finally:
142
142
  tar_path.unlink(missing_ok=True)
@@ -147,44 +147,71 @@ class HarborTaskSet(SandboxTaskSet):
147
147
  sandbox_id: str,
148
148
  state: dict,
149
149
  test_timeout: int,
150
+ allow_existing_oracle: bool = False,
150
151
  ) -> str:
151
- """Upload tests/ and solution/ then run test.sh. Return reward string."""
152
+ """Upload tests/, run test.sh, and return the verifier reward string."""
152
153
  task_dir = Path(state["info"]["task_dir"])
153
- solution_dir = task_dir / "solution"
154
154
  tests_dir = task_dir / "tests"
155
155
 
156
156
  with tempfile.NamedTemporaryFile(suffix=".tar.gz", delete=False) as tmp_file:
157
157
  tar_path = Path(tmp_file.name)
158
158
 
159
159
  try:
160
- with tarfile.open(tar_path, "w:gz") as tar:
161
- if solution_dir.exists():
162
- for item in solution_dir.iterdir():
163
- tar.add(item, arcname=f"oracle/{item.name}")
160
+ with tarfile.open(tar_path, "w:gz", dereference=True) as tar:
164
161
  if tests_dir.exists():
165
162
  for item in tests_dir.iterdir():
166
163
  tar.add(item, arcname=f"tests/{item.name}")
167
164
 
168
165
  remote_tar = "/tmp/harbor_tests.tar.gz"
169
166
  await sandbox_client.upload_file(sandbox_id, remote_tar, str(tar_path))
170
- await sandbox_client.execute_command(
167
+ oracle_cleanup = "rm -rf /oracle; " if not allow_existing_oracle else ""
168
+ setup_result = await sandbox_client.execute_command(
171
169
  sandbox_id,
172
- f"mkdir -p /oracle /tests && tar -xzf {remote_tar} -C / && rm {remote_tar}",
170
+ "if [ -e /logs ] && { [ ! -d /logs ] || [ -L /logs ]; }; then "
171
+ 'echo "reserved verifier path already exists: /logs" >&2; '
172
+ "exit 1; "
173
+ "fi; "
174
+ "rm -rf /tests /logs/verifier; "
175
+ f"{oracle_cleanup}"
176
+ f"mkdir -p /tests /logs/verifier && tar -xzf {remote_tar} -C / && rm {remote_tar}",
173
177
  timeout=900,
174
178
  )
179
+ if setup_result.exit_code != 0:
180
+ output = (setup_result.stdout or "") + (setup_result.stderr or "")
181
+ state["harbor_test_setup"] = {
182
+ "returncode": setup_result.exit_code,
183
+ "stdout": setup_result.stdout or "",
184
+ "stderr": setup_result.stderr or "",
185
+ }
186
+ raise RuntimeError(
187
+ f"test setup failed: exit_code={setup_result.exit_code} "
188
+ f"output={output[:500]}"
189
+ )
175
190
  finally:
176
191
  tar_path.unlink(missing_ok=True)
177
192
 
178
- await sandbox_client.run_background_job(
193
+ test_result = await sandbox_client.run_background_job(
179
194
  sandbox_id, "bash test.sh", timeout=test_timeout, working_dir="/tests"
180
195
  )
196
+ state["harbor_tests"] = {
197
+ "returncode": test_result.exit_code,
198
+ "stdout": test_result.stdout or "",
199
+ "stderr": test_result.stderr or "",
200
+ }
181
201
 
182
202
  reward_result = await sandbox_client.execute_command(
183
203
  sandbox_id,
184
204
  "if [ -s /logs/verifier/reward.txt ]; then cat /logs/verifier/reward.txt; "
185
205
  "elif [ -s /logs/verifier/reward.json ]; then cat /logs/verifier/reward.json; fi",
186
206
  )
187
- return (reward_result.stdout or "").strip()
207
+ reward_output = (reward_result.stdout or "").strip()
208
+ if not reward_output and test_result.exit_code != 0:
209
+ output = (test_result.stdout or "") + (test_result.stderr or "")
210
+ raise RuntimeError(
211
+ f"test.sh failed before writing reward: "
212
+ f"exit_code={test_result.exit_code} output={output[:500]}"
213
+ )
214
+ return reward_output
188
215
 
189
216
  def _calculate_reward(self, test_output: str, info: dict) -> float:
190
217
  """Parse reward string: try float, fallback JSON with .reward key."""
@@ -214,7 +241,7 @@ class HarborTaskSet(SandboxTaskSet):
214
241
  tar_path = Path(tmp_file.name)
215
242
 
216
243
  try:
217
- with tarfile.open(tar_path, "w:gz") as tar:
244
+ with tarfile.open(tar_path, "w:gz", dereference=True) as tar:
218
245
  for item in solution_dir.iterdir():
219
246
  tar.add(item, arcname=f"oracle/{item.name}")
220
247
 
@@ -228,7 +255,10 @@ class HarborTaskSet(SandboxTaskSet):
228
255
  tar_path.unlink(missing_ok=True)
229
256
 
230
257
  results = await sandbox_client.execute_command(
231
- sandbox_id, "bash /oracle/solve.sh", working_dir="/app", timeout=120
258
+ sandbox_id,
259
+ "bash /oracle/solve.sh",
260
+ working_dir="/app",
261
+ timeout=int(state.get("solution_timeout", 120)),
232
262
  )
233
263
  if results.exit_code != 0:
234
264
  stderr = (results.stderr or "")[:500]
@@ -250,7 +280,11 @@ class HarborTaskSet(SandboxTaskSet):
250
280
  sandbox_id = state["sandbox_id"]
251
281
  await self._apply_gold_patch(sandbox_client, sandbox_id, state)
252
282
  test_output = await self._run_tests(
253
- sandbox_client, sandbox_id, state, state.get("test_timeout", 900)
283
+ sandbox_client,
284
+ sandbox_id,
285
+ state,
286
+ state.get("test_timeout", 900),
287
+ allow_existing_oracle=True,
254
288
  )
255
289
  state["test_output"] = test_output
256
290
  info = state.get("info") or {}
@@ -368,9 +402,16 @@ class HarborDatasetTaskSet(SandboxTaskSet):
368
402
  sandbox_id: str,
369
403
  state: dict,
370
404
  test_timeout: int,
405
+ allow_existing_oracle: bool = False,
371
406
  ) -> str:
372
407
  task = HarborTaskSet(state["info"]["task_dir"])
373
- return await task._run_tests(sandbox_client, sandbox_id, state, test_timeout)
408
+ return await task._run_tests(
409
+ sandbox_client,
410
+ sandbox_id,
411
+ state,
412
+ test_timeout,
413
+ allow_existing_oracle=allow_existing_oracle,
414
+ )
374
415
 
375
416
  def _calculate_reward(self, test_output: str, info: dict) -> float:
376
417
  task = HarborTaskSet(info["task_dir"])
@@ -0,0 +1,413 @@
1
+ """Terminal-Lego taskset built on the composable Harbor task layout."""
2
+
3
+ import contextlib
4
+ import logging
5
+ import math
6
+ import os
7
+ import shutil
8
+ import subprocess
9
+ import tempfile
10
+ from pathlib import Path
11
+ from typing import Any, Iterator
12
+
13
+ from verifiers.envs.experimental.composable import SandboxSpec
14
+ from verifiers.envs.experimental.composable.tasksets.harbor.harbor import (
15
+ HarborDatasetTaskSet,
16
+ _load_task_entry,
17
+ )
18
+
19
+ logger = logging.getLogger(__name__)
20
+
21
+ DEFAULT_HF_REPO_ID = "PrimeIntellect/Terminal-Lego-15k"
22
+ DEFAULT_WORKDIR = "/app"
23
+ DATASET_PATH_ENV = "TERMINAL_LEGO_DATASET_PATH"
24
+
25
+
26
+ class TerminalLegoTaskSet(HarborDatasetTaskSet):
27
+ """Terminal-Lego tasks with prebuilt per-task images from our registry.
28
+
29
+ Terminal-Lego ships as a Hugging Face dataset repository whose rows are
30
+ Terminal-Bench/Harbor-style task directories. The Docker build context is
31
+ each task's ``environment/`` directory; this taskset expects a local Git
32
+ LFS/Xet checkout, cloned automatically if needed, and prebuilt per-task
33
+ image refs in ``task.toml``.
34
+ """
35
+
36
+ def __init__(
37
+ self,
38
+ dataset_path: str | Path | None = None,
39
+ task_names: list[str] | None = None,
40
+ hf_repo_id: str = DEFAULT_HF_REPO_ID,
41
+ hf_revision: str | None = None,
42
+ filter_fn: str | None = None,
43
+ ):
44
+ self.hf_repo_id = hf_repo_id
45
+ self.hf_revision = hf_revision
46
+
47
+ resolved_dataset_path = _resolve_dataset_path(
48
+ dataset_path=dataset_path,
49
+ hf_repo_id=hf_repo_id,
50
+ hf_revision=hf_revision,
51
+ )
52
+ super().__init__(
53
+ dataset_path=resolved_dataset_path,
54
+ task_names=task_names,
55
+ filter_fn=filter_fn,
56
+ )
57
+ self.name = "terminal-lego"
58
+
59
+ def _build_dataset(self) -> Any:
60
+ from datasets import Dataset
61
+
62
+ requested = set(self.task_names or [])
63
+ seen: set[str] = set()
64
+ tasks: list[dict] = []
65
+
66
+ for task_dir in sorted(self.dataset_path.iterdir()):
67
+ if not task_dir.is_dir() or not task_dir.name.startswith("task_"):
68
+ continue
69
+ task_name = task_dir.name
70
+ if requested and task_name not in requested:
71
+ continue
72
+ seen.add(task_name)
73
+
74
+ missing = _missing_required_files(task_dir)
75
+ if missing:
76
+ if requested:
77
+ missing_str = ", ".join(missing)
78
+ raise ValueError(
79
+ f"Terminal-Lego task {task_name!r} is incomplete; "
80
+ f"missing {missing_str}"
81
+ )
82
+ logger.warning(
83
+ "Skipping %s: missing required files: %s",
84
+ task_name,
85
+ ", ".join(missing),
86
+ )
87
+ continue
88
+
89
+ entry = _load_task_entry(task_dir, len(tasks))
90
+ config = entry["info"]["config"]
91
+ image_ref = config.get("environment", {}).get("docker_image")
92
+ if not image_ref:
93
+ if requested:
94
+ raise ValueError(
95
+ f"Terminal-Lego task {task_name!r} is missing "
96
+ "[environment].docker_image in task.toml"
97
+ )
98
+ logger.warning(
99
+ "Skipping %s: missing [environment].docker_image in task.toml",
100
+ task_name,
101
+ )
102
+ continue
103
+ entry["info"].update(
104
+ {
105
+ "docker_image": image_ref,
106
+ "terminal_lego_source": {
107
+ "hf_repo_id": self.hf_repo_id,
108
+ "hf_revision": self.hf_revision,
109
+ },
110
+ "config": config,
111
+ }
112
+ )
113
+ tasks.append(entry)
114
+
115
+ if requested:
116
+ missing_tasks = sorted(requested - seen)
117
+ if missing_tasks:
118
+ raise ValueError(
119
+ "Requested Terminal-Lego tasks were not found under "
120
+ f"{self.dataset_path}: {missing_tasks}"
121
+ )
122
+
123
+ if not tasks:
124
+ raise ValueError(
125
+ "No runnable Terminal-Lego tasks found. Check dataset_path and "
126
+ "that task.toml files contain [environment].docker_image."
127
+ )
128
+
129
+ logger.info(
130
+ "Loaded %s Terminal-Lego tasks from %s",
131
+ len(tasks),
132
+ self.dataset_path,
133
+ )
134
+ return Dataset.from_list(tasks)
135
+
136
+ def get_sandbox_spec(self, info: dict) -> SandboxSpec:
137
+ image = info.get("docker_image")
138
+ if not image:
139
+ task_name = info.get("task_name", "<unknown>")
140
+ raise ValueError(f"Terminal-Lego task {task_name!r} is missing an image")
141
+
142
+ env_config = (info.get("config") or {}).get("environment", {})
143
+ return SandboxSpec(
144
+ image=str(image),
145
+ cpu_cores=_parse_int(env_config.get("cpus"), default=1),
146
+ memory_gb=_parse_size_gb(env_config.get("memory"), default=1),
147
+ disk_size_gb=_parse_size_gb(env_config.get("storage"), default=5),
148
+ )
149
+
150
+ def get_workdir(self, info: dict) -> str:
151
+ return DEFAULT_WORKDIR
152
+
153
+ async def setup(self, state) -> None:
154
+ await super().setup(state)
155
+ sandbox_client = state["sandbox_client"]
156
+ sandbox_id = state["sandbox_id"]
157
+ await sandbox_client.execute_command(
158
+ sandbox_id,
159
+ "if [ -d /app/task_file ] && [ ! -e /app/task_file/output ]; then mkdir -p /app/task_file/output; fi",
160
+ timeout=10,
161
+ )
162
+ config = state.get("info", {}).get("config") or {}
163
+ verifier_timeout = _timeout_seconds(
164
+ config.get("verifier", {}).get("timeout_sec")
165
+ )
166
+ agent_timeout = _timeout_seconds(config.get("agent", {}).get("timeout_sec"))
167
+ if verifier_timeout is not None:
168
+ state["test_timeout"] = verifier_timeout
169
+ if agent_timeout is not None:
170
+ state["solution_timeout"] = agent_timeout
171
+
172
+
173
+ def make_terminal_lego_taskset(
174
+ dataset_path: str | Path | None = None,
175
+ task_names: list[str] | str | None = None,
176
+ hf_repo_id: str = DEFAULT_HF_REPO_ID,
177
+ hf_revision: str | None = None,
178
+ filter_fn: str | None = None,
179
+ ) -> TerminalLegoTaskSet:
180
+ return TerminalLegoTaskSet(
181
+ dataset_path=dataset_path,
182
+ task_names=_normalize_task_names(task_names),
183
+ hf_repo_id=hf_repo_id,
184
+ hf_revision=hf_revision,
185
+ filter_fn=filter_fn,
186
+ )
187
+
188
+
189
+ def _normalize_task_names(task_names: list[str] | str | None) -> list[str] | None:
190
+ if task_names is None:
191
+ return None
192
+ if isinstance(task_names, str):
193
+ names = [name.strip() for name in task_names.split(",")]
194
+ else:
195
+ names = [str(name).strip() for name in task_names]
196
+ return [name for name in names if name]
197
+
198
+
199
+ def _resolve_dataset_path(
200
+ *,
201
+ dataset_path: str | Path | None,
202
+ hf_repo_id: str,
203
+ hf_revision: str | None,
204
+ ) -> Path:
205
+ if dataset_path is not None:
206
+ path = Path(dataset_path).expanduser()
207
+ elif env_path := os.environ.get(DATASET_PATH_ENV):
208
+ path = Path(env_path).expanduser()
209
+ else:
210
+ path = _ensure_git_checkout(hf_repo_id=hf_repo_id, hf_revision=hf_revision)
211
+
212
+ if not path.exists():
213
+ raise FileNotFoundError(f"Terminal-Lego dataset path not found: {path}")
214
+ return path
215
+
216
+
217
+ def _ensure_git_checkout(*, hf_repo_id: str, hf_revision: str | None) -> Path:
218
+ cache_root = _git_cache_root()
219
+ cache_root.mkdir(parents=True, exist_ok=True)
220
+ checkout_dir = cache_root / _cache_key(hf_repo_id, hf_revision)
221
+ lock_path = cache_root / f"{checkout_dir.name}.lock"
222
+
223
+ with _file_lock(lock_path):
224
+ if checkout_dir.exists():
225
+ if not (checkout_dir / ".git").exists():
226
+ raise RuntimeError(
227
+ f"Terminal-Lego cache path exists but is not a Git checkout: "
228
+ f"{checkout_dir}"
229
+ )
230
+ return checkout_dir
231
+
232
+ tmp_dir = cache_root / f".{checkout_dir.name}.tmp-{os.getpid()}"
233
+ shutil.rmtree(tmp_dir, ignore_errors=True)
234
+ token = _hf_token()
235
+ repo_url = f"https://huggingface.co/datasets/{hf_repo_id}"
236
+ try:
237
+ _run_git(["git", "clone", repo_url, str(tmp_dir)], token=token)
238
+ if hf_revision:
239
+ _checkout_revision(tmp_dir, hf_revision, token=token)
240
+ _run_git(["git", "-C", str(tmp_dir), "lfs", "version"], token=token)
241
+ _run_git(["git", "-C", str(tmp_dir), "lfs", "pull"], token=token)
242
+ tmp_dir.rename(checkout_dir)
243
+ except Exception:
244
+ shutil.rmtree(tmp_dir, ignore_errors=True)
245
+ raise
246
+
247
+ return checkout_dir
248
+
249
+
250
+ def _checkout_revision(checkout_dir: Path, revision: str, token: str | None) -> None:
251
+ verify = _run_git(
252
+ [
253
+ "git",
254
+ "-C",
255
+ str(checkout_dir),
256
+ "rev-parse",
257
+ "--verify",
258
+ f"{revision}^{{commit}}",
259
+ ],
260
+ check=False,
261
+ token=token,
262
+ )
263
+ if verify.returncode != 0:
264
+ _run_git(
265
+ ["git", "-C", str(checkout_dir), "fetch", "origin", revision], token=token
266
+ )
267
+ _run_git(
268
+ ["git", "-C", str(checkout_dir), "checkout", "--detach", revision], token=token
269
+ )
270
+
271
+
272
+ def _git_cache_root() -> Path:
273
+ return Path(os.environ.get("HF_HOME", "~/.cache/huggingface")).expanduser() / (
274
+ "terminal-lego-git"
275
+ )
276
+
277
+
278
+ def _cache_key(hf_repo_id: str, hf_revision: str | None) -> str:
279
+ revision = hf_revision or "default"
280
+ raw = f"{hf_repo_id}--{revision}"
281
+ return "".join(ch if ch.isalnum() or ch in ("-", ".", "_") else "-" for ch in raw)
282
+
283
+
284
+ @contextlib.contextmanager
285
+ def _file_lock(lock_path: Path) -> Iterator[None]:
286
+ import fcntl
287
+
288
+ with lock_path.open("w") as lock_file:
289
+ fcntl.flock(lock_file.fileno(), fcntl.LOCK_EX)
290
+ try:
291
+ yield
292
+ finally:
293
+ fcntl.flock(lock_file.fileno(), fcntl.LOCK_UN)
294
+
295
+
296
+ def _hf_token() -> str | None:
297
+ for env_name in ("HF_TOKEN", "HUGGING_FACE_HUB_TOKEN", "HUGGINGFACE_HUB_TOKEN"):
298
+ token = os.environ.get(env_name)
299
+ if token:
300
+ return token
301
+ try:
302
+ from huggingface_hub import get_token
303
+ except ImportError:
304
+ return None
305
+ return get_token()
306
+
307
+
308
+ def _run_git(
309
+ args: list[str],
310
+ *,
311
+ token: str | None,
312
+ check: bool = True,
313
+ ) -> subprocess.CompletedProcess[str]:
314
+ if shutil.which("git") is None:
315
+ raise RuntimeError("Terminal-Lego dataset cloning requires git on PATH")
316
+
317
+ env = os.environ.copy()
318
+ env["GIT_TERMINAL_PROMPT"] = "0"
319
+ askpass_path: str | None = None
320
+ if token:
321
+ fd, askpass_path = tempfile.mkstemp(prefix="hf-git-askpass-")
322
+ with os.fdopen(fd, "w") as askpass:
323
+ askpass.write(
324
+ "#!/bin/sh\n"
325
+ 'case "$1" in\n'
326
+ '*Username*) printf "%s\\n" "hf_user" ;;\n'
327
+ '*) printf "%s\\n" "$HF_GIT_TOKEN" ;;\n'
328
+ "esac\n"
329
+ )
330
+ os.chmod(askpass_path, 0o700)
331
+ env["GIT_ASKPASS"] = askpass_path
332
+ env["HF_GIT_TOKEN"] = token
333
+
334
+ try:
335
+ result = subprocess.run(
336
+ args,
337
+ check=False,
338
+ capture_output=True,
339
+ env=env,
340
+ text=True,
341
+ )
342
+ if check and result.returncode != 0:
343
+ command = " ".join(args)
344
+ raise RuntimeError(
345
+ f"Git command failed with exit code {result.returncode}: {command}\n"
346
+ f"stdout:\n{result.stdout[-2000:]}\n"
347
+ f"stderr:\n{result.stderr[-2000:]}"
348
+ )
349
+ return result
350
+ finally:
351
+ if askpass_path:
352
+ Path(askpass_path).unlink(missing_ok=True)
353
+
354
+
355
+ def _missing_required_files(task_dir: Path) -> list[str]:
356
+ required = (
357
+ "task.toml",
358
+ "instruction.md",
359
+ "solution/solve.sh",
360
+ "tests/test.sh",
361
+ "tests/test_outputs.py",
362
+ )
363
+ return [relative for relative in required if not (task_dir / relative).exists()]
364
+
365
+
366
+ def _parse_int(value: Any, default: int) -> int:
367
+ if value is None:
368
+ return default
369
+ try:
370
+ return int(float(value))
371
+ except (TypeError, ValueError):
372
+ return default
373
+
374
+
375
+ def _parse_size_gb(value: Any, default: int) -> int:
376
+ if value is None:
377
+ return default
378
+ if isinstance(value, (int, float)):
379
+ return max(1, math.ceil(float(value)))
380
+
381
+ raw = str(value).strip().lower()
382
+ for suffix in ("ib", "b"):
383
+ if raw.endswith(suffix):
384
+ raw = raw[: -len(suffix)]
385
+ if not raw:
386
+ return default
387
+
388
+ multipliers = {
389
+ "k": 1 / (1024 * 1024),
390
+ "m": 1 / 1024,
391
+ "g": 1,
392
+ "t": 1024,
393
+ }
394
+ unit = raw[-1]
395
+ if unit in multipliers:
396
+ number = raw[:-1]
397
+ multiplier = multipliers[unit]
398
+ else:
399
+ number = raw
400
+ multiplier = 1
401
+ try:
402
+ return max(1, math.ceil(float(number) * multiplier))
403
+ except ValueError:
404
+ return default
405
+
406
+
407
+ def _timeout_seconds(value: Any) -> int | None:
408
+ if value is None:
409
+ return None
410
+ try:
411
+ return max(1, math.ceil(float(value)))
412
+ except (TypeError, ValueError):
413
+ return None