verifiers 0.1.15.dev178__tar.gz → 0.1.15.dev180__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.dev180}/PKG-INFO +1 -1
  2. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/pyproject.toml +5 -0
  3. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/envs/experimental/composable/tasksets/__init__.py +6 -0
  4. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/envs/experimental/composable/tasksets/harbor/__init__.py +3 -0
  5. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/envs/experimental/composable/tasksets/harbor/harbor.py +57 -16
  6. verifiers-0.1.15.dev180/verifiers/envs/experimental/composable/tasksets/harbor/terminal_lego.py +413 -0
  7. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/.gitignore +0 -0
  8. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/LICENSE +0 -0
  9. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/README.md +0 -0
  10. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/tests/AGENTS.md +0 -0
  11. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/tests/README.md +0 -0
  12. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/tests/__init__.py +0 -0
  13. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/tests/conftest.py +0 -0
  14. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/tests/test_browser_env.py +0 -0
  15. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/tests/test_build_script.py +0 -0
  16. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/tests/test_cli_agent_env.py +0 -0
  17. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/tests/test_client_auth_errors.py +0 -0
  18. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/tests/test_client_config.py +0 -0
  19. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/tests/test_client_multimodal_types.py +0 -0
  20. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/tests/test_composable_env.py +0 -0
  21. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/tests/test_context_token_metrics.py +0 -0
  22. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/tests/test_decorator_ranks.py +0 -0
  23. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/tests/test_endpoint_registry.py +0 -0
  24. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/tests/test_env_group.py +0 -0
  25. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/tests/test_env_server.py +0 -0
  26. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/tests/test_environment.py +0 -0
  27. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/tests/test_environment_extra.py +0 -0
  28. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/tests/test_envs.py +0 -0
  29. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/tests/test_error_chain.py +0 -0
  30. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/tests/test_eval_cli.py +0 -0
  31. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/tests/test_eval_display.py +0 -0
  32. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/tests/test_eval_utils.py +0 -0
  33. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/tests/test_gepa_cli.py +0 -0
  34. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/tests/test_gepa_utils.py +0 -0
  35. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/tests/test_gym_env.py +0 -0
  36. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/tests/test_harbor_env_mcp.py +0 -0
  37. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/tests/test_imports.py +0 -0
  38. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/tests/test_init_script.py +0 -0
  39. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/tests/test_install_utils.py +0 -0
  40. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/tests/test_interception_utils.py +0 -0
  41. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/tests/test_langchain_deep_agents_wikispeedia.py +0 -0
  42. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/tests/test_lean_task.py +0 -0
  43. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/tests/test_logging.py +0 -0
  44. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/tests/test_math_rubric.py +0 -0
  45. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/tests/test_maybe_think_parser.py +0 -0
  46. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/tests/test_mcp_search_env.py +0 -0
  47. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/tests/test_message_utils.py +0 -0
  48. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/tests/test_message_utils_multimodal.py +0 -0
  49. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/tests/test_multiturn_env.py +0 -0
  50. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/tests/test_nemorl_client.py +0 -0
  51. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/tests/test_openai_chat_completions_token_client.py +0 -0
  52. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/tests/test_openai_responses_client.py +0 -0
  53. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/tests/test_opencode_harbor.py +0 -0
  54. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/tests/test_opencode_rlm_env.py +0 -0
  55. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/tests/test_openenv_client.py +0 -0
  56. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/tests/test_parser.py +0 -0
  57. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/tests/test_path_utils.py +0 -0
  58. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/tests/test_per_turn_timing.py +0 -0
  59. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/tests/test_pricing_utils.py +0 -0
  60. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/tests/test_prime_plugin.py +0 -0
  61. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/tests/test_renderer_client.py +0 -0
  62. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/tests/test_renderer_e2e.py +0 -0
  63. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/tests/test_rlm_composable_env.py +0 -0
  64. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/tests/test_rubric.py +0 -0
  65. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/tests/test_rubric_group.py +0 -0
  66. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/tests/test_sandbox_env.py +0 -0
  67. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/tests/test_sandbox_mixin.py +0 -0
  68. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/tests/test_save_utils.py +0 -0
  69. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/tests/test_setup_script.py +0 -0
  70. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/tests/test_singleturn_env.py +0 -0
  71. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/tests/test_stateful_tool_env.py +0 -0
  72. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/tests/test_think_parser.py +0 -0
  73. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/tests/test_tool_env.py +0 -0
  74. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/tests/test_tool_utils.py +0 -0
  75. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/tests/test_trajectory_processing.py +0 -0
  76. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/tests/test_tui_info_formatting.py +0 -0
  77. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/tests/test_types.py +0 -0
  78. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/tests/test_v1_bfcl.py +0 -0
  79. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/tests/test_v1_config_extension.py +0 -0
  80. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/tests/test_v1_empty_completions.py +0 -0
  81. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/tests/test_v1_endpoint_protocols.py +0 -0
  82. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/tests/test_v1_example_counts.py +0 -0
  83. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/tests/test_v1_group_reward_env.py +0 -0
  84. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/tests/test_v1_harbor_cli.py +0 -0
  85. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/tests/test_v1_mini_swe_agent.py +0 -0
  86. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/tests/test_v1_nemo_gym_harness.py +0 -0
  87. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/tests/test_v1_openenv_taskset.py +0 -0
  88. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/tests/test_v1_openreward_taskset.py +0 -0
  89. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/tests/test_v1_replay_harness.py +0 -0
  90. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/tests/test_v1_rlm_swe.py +0 -0
  91. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/tests/test_v1_runtime_lifecycle.py +0 -0
  92. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/tests/test_v1_scoring_functions.py +0 -0
  93. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/tests/test_v1_taskset_bindings.py +0 -0
  94. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/tests/test_v1_taskset_utils.py +0 -0
  95. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/tests/test_v1_textarena_taskset.py +0 -0
  96. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/tests/test_wiki_search_v1.py +0 -0
  97. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/tests/test_wordle_env.py +0 -0
  98. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/tests/test_wordle_v1_env.py +0 -0
  99. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/tests/test_xml_parser.py +0 -0
  100. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/AGENTS.md +0 -0
  101. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/__init__.py +0 -0
  102. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/cli/__init__.py +0 -0
  103. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/cli/commands/__init__.py +0 -0
  104. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/cli/commands/build.py +0 -0
  105. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/cli/commands/eval.py +0 -0
  106. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/cli/commands/gepa.py +0 -0
  107. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/cli/commands/init.py +0 -0
  108. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/cli/commands/install.py +0 -0
  109. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/cli/commands/setup.py +0 -0
  110. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/cli/plugins/__init__.py +0 -0
  111. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/cli/plugins/prime.py +0 -0
  112. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/cli/tui.py +0 -0
  113. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/clients/__init__.py +0 -0
  114. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/clients/anthropic_messages_client.py +0 -0
  115. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/clients/client.py +0 -0
  116. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/clients/nemorl_chat_completions_client.py +0 -0
  117. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/clients/openai_chat_completions_client.py +0 -0
  118. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/clients/openai_chat_completions_token_client.py +0 -0
  119. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/clients/openai_completions_client.py +0 -0
  120. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/clients/openai_responses_client.py +0 -0
  121. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/clients/renderer_client.py +0 -0
  122. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/decorators.py +0 -0
  123. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/envs/AGENTS.md +0 -0
  124. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/envs/__init__.py +0 -0
  125. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/envs/env_group.py +0 -0
  126. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/envs/environment.py +0 -0
  127. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/envs/experimental/README.md +0 -0
  128. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/envs/experimental/__init__.py +0 -0
  129. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/envs/experimental/cli_agent_env.py +0 -0
  130. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/envs/experimental/composable/README.md +0 -0
  131. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/envs/experimental/composable/__init__.py +0 -0
  132. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/envs/experimental/composable/_filter.py +0 -0
  133. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/envs/experimental/composable/composable_env.py +0 -0
  134. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/envs/experimental/composable/harness.py +0 -0
  135. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/envs/experimental/composable/harnesses/__init__.py +0 -0
  136. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/envs/experimental/composable/harnesses/mini_swe_agent.py +0 -0
  137. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/envs/experimental/composable/harnesses/opencode.py +0 -0
  138. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/envs/experimental/composable/harnesses/prompt.txt +0 -0
  139. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/envs/experimental/composable/harnesses/rlm.py +0 -0
  140. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/envs/experimental/composable/swe_debug_env.py +0 -0
  141. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/envs/experimental/composable/task.py +0 -0
  142. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/envs/experimental/composable/tasksets/cp/__init__.py +0 -0
  143. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/envs/experimental/composable/tasksets/cp/cp_task.py +0 -0
  144. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/envs/experimental/composable/tasksets/cp/test_utils.py +0 -0
  145. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/envs/experimental/composable/tasksets/lean/__init__.py +0 -0
  146. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/envs/experimental/composable/tasksets/lean/lean_task.py +0 -0
  147. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/envs/experimental/composable/tasksets/math/__init__.py +0 -0
  148. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/envs/experimental/composable/tasksets/math/math_task.py +0 -0
  149. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/envs/experimental/composable/tasksets/search/README.md +0 -0
  150. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/envs/experimental/composable/tasksets/search/__init__.py +0 -0
  151. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/envs/experimental/composable/tasksets/search/openseeker/README.md +0 -0
  152. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/envs/experimental/composable/tasksets/search/openseeker/__init__.py +0 -0
  153. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/envs/experimental/composable/tasksets/search/openseeker/taskset.py +0 -0
  154. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/envs/experimental/composable/tasksets/search/quest/README.md +0 -0
  155. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/envs/experimental/composable/tasksets/search/quest/__init__.py +0 -0
  156. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/__init__.py +0 -0
  157. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/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.dev180}/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.dev180}/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.dev180}/verifiers/envs/experimental/composable/tasksets/search/quest/obj_task_eval/evaluator.py +0 -0
  161. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/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.dev180}/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.dev180}/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.dev180}/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.dev180}/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.dev180}/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.dev180}/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.dev180}/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.dev180}/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.dev180}/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.dev180}/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.dev180}/verifiers/envs/experimental/composable/tasksets/search/quest/open_ended.py +0 -0
  173. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/envs/experimental/composable/tasksets/search/quest/taskset.py +0 -0
  174. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/envs/experimental/composable/tasksets/search/redsearcher/README.md +0 -0
  175. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/envs/experimental/composable/tasksets/search/redsearcher/__init__.py +0 -0
  176. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/envs/experimental/composable/tasksets/search/redsearcher/taskset.py +0 -0
  177. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/envs/experimental/composable/tasksets/search/search_tasksets.py +0 -0
  178. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/envs/experimental/composable/tasksets/swe/README.md +0 -0
  179. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/envs/experimental/composable/tasksets/swe/__init__.py +0 -0
  180. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/__init__.py +0 -0
  181. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/extract_fix_patch.sh +0 -0
  182. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/taskset.py +0 -0
  183. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/envs/experimental/composable/tasksets/swe/openswe/__init__.py +0 -0
  184. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/envs/experimental/composable/tasksets/swe/openswe/taskset.py +0 -0
  185. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/__init__.py +0 -0
  186. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/log_parser.py +0 -0
  187. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/taskset.py +0 -0
  188. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/envs/experimental/composable/tasksets/swe/scale_swe/__init__.py +0 -0
  189. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/envs/experimental/composable/tasksets/swe/scale_swe/taskset.py +0 -0
  190. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/envs/experimental/composable/tasksets/swe/shared/__init__.py +0 -0
  191. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/envs/experimental/composable/tasksets/swe/shared/test_patch.py +0 -0
  192. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/envs/experimental/composable/tasksets/swe/swe_bench/__init__.py +0 -0
  193. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/envs/experimental/composable/tasksets/swe/swe_bench/taskset.py +0 -0
  194. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/envs/experimental/composable/tasksets/swe/swe_lego/__init__.py +0 -0
  195. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/envs/experimental/composable/tasksets/swe/swe_lego/taskset.py +0 -0
  196. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/__init__.py +0 -0
  197. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/log_parsers.py +0 -0
  198. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/taskset.py +0 -0
  199. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/envs/experimental/composable/tasksets/swe/swe_smith/__init__.py +0 -0
  200. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/envs/experimental/composable/tasksets/swe/swe_smith/taskset.py +0 -0
  201. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/envs/experimental/composable/tasksets/swe/swe_tasksets.py +0 -0
  202. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/envs/experimental/gym_env.py +0 -0
  203. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/envs/experimental/harbor_env/__init__.py +0 -0
  204. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/envs/experimental/harbor_env/env.py +0 -0
  205. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/envs/experimental/harbor_env/mcp.py +0 -0
  206. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/envs/experimental/mcp_env.py +0 -0
  207. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/envs/experimental/opencode_env.py +0 -0
  208. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/envs/experimental/opencode_qa_env.py +0 -0
  209. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/envs/experimental/opencode_rlm_env.py +0 -0
  210. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/envs/experimental/sandbox_mixin.py +0 -0
  211. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/envs/experimental/utils/__init__.py +0 -0
  212. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/envs/experimental/utils/file_locks.py +0 -0
  213. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/envs/experimental/utils/git_checkout_cache.py +0 -0
  214. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/envs/integrations/README.md +0 -0
  215. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/envs/integrations/__init__.py +0 -0
  216. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/envs/integrations/browser_env/README.md +0 -0
  217. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/envs/integrations/browser_env/__init__.py +0 -0
  218. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/envs/integrations/browser_env/browser_env.py +0 -0
  219. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/envs/integrations/browser_env/modes/__init__.py +0 -0
  220. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/envs/integrations/browser_env/modes/base.py +0 -0
  221. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/envs/integrations/browser_env/modes/cua_mode.py +0 -0
  222. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/envs/integrations/browser_env/modes/dom_mode.py +0 -0
  223. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/envs/integrations/openenv_env.py +0 -0
  224. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/envs/integrations/reasoninggym_env.py +0 -0
  225. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/envs/integrations/textarena_env.py +0 -0
  226. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/envs/multiturn_env.py +0 -0
  227. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/envs/python_env.py +0 -0
  228. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/envs/sandbox_env.py +0 -0
  229. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/envs/singleturn_env.py +0 -0
  230. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/envs/stateful_tool_env.py +0 -0
  231. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/envs/tool_env.py +0 -0
  232. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/errors.py +0 -0
  233. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/gepa/__init__.py +0 -0
  234. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/gepa/adapter.py +0 -0
  235. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/gepa/config.py +0 -0
  236. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/gepa/display.py +0 -0
  237. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/gepa/gepa_utils.py +0 -0
  238. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/parsers/__init__.py +0 -0
  239. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/parsers/maybe_think_parser.py +0 -0
  240. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/parsers/parser.py +0 -0
  241. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/parsers/think_parser.py +0 -0
  242. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/parsers/xml_parser.py +0 -0
  243. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/rl/README.md +0 -0
  244. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/rl/__init__.py +0 -0
  245. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/rl/inference/__init__.py +0 -0
  246. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/rl/inference/client.py +0 -0
  247. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/rl/inference/server.py +0 -0
  248. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/rl/trainer/__init__.py +0 -0
  249. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/rl/trainer/config.py +0 -0
  250. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/rl/trainer/orchestrator.py +0 -0
  251. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/rl/trainer/trainer.py +0 -0
  252. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/rl/trainer/utils.py +0 -0
  253. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/rubrics/__init__.py +0 -0
  254. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/rubrics/experimental/hybrid_math_rubric.py +0 -0
  255. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/rubrics/judge_rubric.py +0 -0
  256. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/rubrics/math_rubric.py +0 -0
  257. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/rubrics/rubric.py +0 -0
  258. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/rubrics/rubric_group.py +0 -0
  259. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/scripts/__init__.py +0 -0
  260. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/scripts/build.py +0 -0
  261. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/scripts/eval.py +0 -0
  262. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/scripts/gepa.py +0 -0
  263. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/scripts/init.py +0 -0
  264. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/scripts/install.py +0 -0
  265. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/scripts/rl.py +0 -0
  266. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/scripts/setup.py +0 -0
  267. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/scripts/train.py +0 -0
  268. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/scripts/tui.py +0 -0
  269. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/scripts/vllm.py +0 -0
  270. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/serve/__init__.py +0 -0
  271. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/serve/client/env_client.py +0 -0
  272. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/serve/client/zmq_env_client.py +0 -0
  273. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/serve/server/__init__.py +0 -0
  274. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/serve/server/env_router.py +0 -0
  275. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/serve/server/env_server.py +0 -0
  276. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/serve/server/env_worker.py +0 -0
  277. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/serve/server/zmq_env_server.py +0 -0
  278. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/serve/types.py +0 -0
  279. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/types.py +0 -0
  280. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/utils/__init__.py +0 -0
  281. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/utils/async_utils.py +0 -0
  282. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/utils/client_utils.py +0 -0
  283. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/utils/config_utils.py +0 -0
  284. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/utils/data_utils.py +0 -0
  285. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/utils/display_utils.py +0 -0
  286. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/utils/env_config_utils.py +0 -0
  287. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/utils/env_utils.py +0 -0
  288. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/utils/error_utils.py +0 -0
  289. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/utils/eval_display.py +0 -0
  290. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/utils/eval_utils.py +0 -0
  291. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/utils/heartbeat.py +0 -0
  292. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/utils/import_utils.py +0 -0
  293. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/utils/install_utils.py +0 -0
  294. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/utils/interception_utils.py +0 -0
  295. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/utils/logging_utils.py +0 -0
  296. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/utils/message_utils.py +0 -0
  297. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/utils/metric_utils.py +0 -0
  298. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/utils/path_utils.py +0 -0
  299. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/utils/pricing_utils.py +0 -0
  300. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/utils/process_utils.py +0 -0
  301. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/utils/response_utils.py +0 -0
  302. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/utils/save_utils.py +0 -0
  303. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/utils/serve_utils.py +0 -0
  304. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/utils/thread_utils.py +0 -0
  305. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/utils/threaded_sandbox_client.py +0 -0
  306. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/utils/tool_utils.py +0 -0
  307. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/utils/usage_utils.py +0 -0
  308. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/utils/version_utils.py +0 -0
  309. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/v1/ENVIRONMENT_BEST_PRACTICES.md +0 -0
  310. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/v1/README.md +0 -0
  311. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/v1/RE_MIGRATION.md +0 -0
  312. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/v1/__init__.py +0 -0
  313. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/v1/artifact.py +0 -0
  314. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/v1/config.py +0 -0
  315. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/v1/env.py +0 -0
  316. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/v1/harness.py +0 -0
  317. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/v1/model.py +0 -0
  318. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/v1/program.py +0 -0
  319. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/v1/runtime.py +0 -0
  320. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/v1/runtime_handles.py +0 -0
  321. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/v1/sandbox.py +0 -0
  322. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/v1/state.py +0 -0
  323. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/v1/task.py +0 -0
  324. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/v1/taskset.py +0 -0
  325. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/v1/toolset.py +0 -0
  326. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/v1/types.py +0 -0
  327. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/v1/user.py +0 -0
  328. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/v1/utils/__init__.py +0 -0
  329. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/v1/utils/binding_utils.py +0 -0
  330. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/v1/utils/config_callable_utils.py +0 -0
  331. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/v1/utils/config_utils.py +0 -0
  332. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/v1/utils/endpoint_utils.py +0 -0
  333. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/v1/utils/json_utils.py +0 -0
  334. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/v1/utils/judge_utils.py +0 -0
  335. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/v1/utils/lifecycle_utils.py +0 -0
  336. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/v1/utils/logging_utils.py +0 -0
  337. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/v1/utils/mcp_proxy_utils.py +0 -0
  338. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/v1/utils/mcp_utils.py +0 -0
  339. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/v1/utils/object_utils.py +0 -0
  340. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/v1/utils/program_utils.py +0 -0
  341. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/v1/utils/prompt_utils.py +0 -0
  342. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/v1/utils/runtime_owner_utils.py +0 -0
  343. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/v1/utils/runtime_registry.py +0 -0
  344. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/v1/utils/sandbox_program_utils.py +0 -0
  345. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/v1/utils/sandbox_python_utils.py +0 -0
  346. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/v1/utils/sandbox_utils.py +0 -0
  347. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/v1/utils/scoring_utils.py +0 -0
  348. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/v1/utils/serialization_utils.py +0 -0
  349. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/v1/utils/task_freeze_utils.py +0 -0
  350. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/v1/utils/taskset_utils.py +0 -0
  351. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/v1/utils/tool_utils.py +0 -0
  352. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/v1/utils/toolset_utils.py +0 -0
  353. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/verifiers/v1/utils/trajectory_utils.py +0 -0
  354. {verifiers-0.1.15.dev178 → verifiers-0.1.15.dev180}/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.dev180
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
@@ -225,6 +225,11 @@ vf-vllm = "verifiers.scripts.vllm:main"
225
225
  # hatchling configuration
226
226
  [tool.hatch.version]
227
227
  source = "vcs"
228
+ # Resolve a version when building without VCS metadata (e.g. the prime-rl
229
+ # Docker build copies the source but not a usable .git for the submodule).
230
+ # Mirrors renderers; without it hatch-vcs raises LookupError and the editable
231
+ # build fails.
232
+ fallback-version = "0.0.0"
228
233
 
229
234
  [tool.hatch.version.raw-options]
230
235
  local_scheme = "no-local-version"
@@ -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