verifiers 0.2.2.dev87__tar.gz → 0.2.2.dev89__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 (431) hide show
  1. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/PKG-INFO +2 -2
  2. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/pyproject.toml +1 -1
  3. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/tests/v1/conftest.py +6 -4
  4. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/tests/v1/test_e2e.py +10 -4
  5. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/tests/v1/test_envs.py +1 -1
  6. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/__init__.py +4 -1
  7. verifiers-0.2.2.dev89/verifiers/v1/acp/__init__.py +303 -0
  8. verifiers-0.2.2.dev89/verifiers/v1/acp/runner.py +411 -0
  9. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/harness.py +106 -15
  10. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/harnesses/rlm/harness.py +74 -29
  11. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/interception/server.py +1 -1
  12. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/mcp/launch.py +22 -9
  13. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/rollout.py +33 -11
  14. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/runtimes/__init__.py +2 -0
  15. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/runtimes/base.py +37 -0
  16. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/runtimes/docker/__init__.py +162 -1
  17. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/runtimes/modal.py +99 -0
  18. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/runtimes/prime.py +44 -0
  19. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/runtimes/subprocess.py +67 -13
  20. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/session.py +1 -1
  21. verifiers-0.2.2.dev87/verifiers/v1/acp/__init__.py +0 -66
  22. verifiers-0.2.2.dev87/verifiers/v1/acp/_runner.py +0 -213
  23. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/.gitignore +0 -0
  24. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/LICENSE +0 -0
  25. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/README.md +0 -0
  26. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/tests/__init__.py +0 -0
  27. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/tests/conftest.py +0 -0
  28. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/tests/test_browser_env.py +0 -0
  29. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/tests/test_build_script.py +0 -0
  30. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/tests/test_cli_agent_env.py +0 -0
  31. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/tests/test_client_auth_errors.py +0 -0
  32. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/tests/test_client_config.py +0 -0
  33. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/tests/test_client_multimodal_types.py +0 -0
  34. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/tests/test_composable_env.py +0 -0
  35. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/tests/test_context_token_metrics.py +0 -0
  36. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/tests/test_decorator_ranks.py +0 -0
  37. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/tests/test_endpoint_registry.py +0 -0
  38. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/tests/test_env_group.py +0 -0
  39. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/tests/test_env_server.py +0 -0
  40. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/tests/test_environment.py +0 -0
  41. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/tests/test_environment_extra.py +0 -0
  42. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/tests/test_error_chain.py +0 -0
  43. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/tests/test_eval_display.py +0 -0
  44. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/tests/test_eval_utils.py +0 -0
  45. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/tests/test_gepa_cli.py +0 -0
  46. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/tests/test_gepa_utils.py +0 -0
  47. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/tests/test_gym_env.py +0 -0
  48. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/tests/test_harbor_env_mcp.py +0 -0
  49. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/tests/test_imports.py +0 -0
  50. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/tests/test_init_script.py +0 -0
  51. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/tests/test_install_utils.py +0 -0
  52. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/tests/test_interception_utils.py +0 -0
  53. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/tests/test_logging.py +0 -0
  54. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/tests/test_math_rubric.py +0 -0
  55. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/tests/test_maybe_think_parser.py +0 -0
  56. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/tests/test_message_utils.py +0 -0
  57. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/tests/test_message_utils_multimodal.py +0 -0
  58. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/tests/test_multiturn_env.py +0 -0
  59. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/tests/test_nemorl_client.py +0 -0
  60. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/tests/test_openai_chat_completions_token_client.py +0 -0
  61. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/tests/test_openai_responses_client.py +0 -0
  62. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/tests/test_opencode_rlm_env.py +0 -0
  63. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/tests/test_openenv_client.py +0 -0
  64. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/tests/test_parser.py +0 -0
  65. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/tests/test_path_utils.py +0 -0
  66. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/tests/test_per_turn_timing.py +0 -0
  67. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/tests/test_pricing_utils.py +0 -0
  68. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/tests/test_prime_plugin.py +0 -0
  69. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/tests/test_renderer_client.py +0 -0
  70. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/tests/test_renderer_e2e.py +0 -0
  71. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/tests/test_rlm_composable_env.py +0 -0
  72. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/tests/test_rubric.py +0 -0
  73. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/tests/test_rubric_group.py +0 -0
  74. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/tests/test_sandbox_debug_env.py +0 -0
  75. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/tests/test_sandbox_env.py +0 -0
  76. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/tests/test_sandbox_mixin.py +0 -0
  77. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/tests/test_save_utils.py +0 -0
  78. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/tests/test_setup_script.py +0 -0
  79. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/tests/test_singleturn_env.py +0 -0
  80. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/tests/test_stateful_tool_env.py +0 -0
  81. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/tests/test_think_parser.py +0 -0
  82. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/tests/test_tool_env.py +0 -0
  83. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/tests/test_tool_utils.py +0 -0
  84. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/tests/test_trajectory_processing.py +0 -0
  85. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/tests/test_tui_info_formatting.py +0 -0
  86. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/tests/test_types.py +0 -0
  87. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/tests/test_xml_parser.py +0 -0
  88. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/tests/v1/fixtures/counter_tool_v1.py +0 -0
  89. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/tests/v1/fixtures/duet_v1.py +0 -0
  90. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/tests/v1/fixtures/echo_acp_resume_v1.py +0 -0
  91. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/tests/v1/fixtures/echo_agentic_v1.py +0 -0
  92. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/tests/v1/fixtures/echo_multi_v0.py +0 -0
  93. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/tests/v1/fixtures/echo_tool_v1.py +0 -0
  94. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/tests/v1/fixtures/echo_user_sim_v1.py +0 -0
  95. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/tests/v1/fixtures/echo_v0.py +0 -0
  96. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/tests/v1/fixtures/echo_v1.py +0 -0
  97. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/tests/v1/fixtures/pyproject.toml +0 -0
  98. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/tests/v1/fixtures/tool_response_image_v1.py +0 -0
  99. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/tests/v1/test_color_codeword_tasks.py +0 -0
  100. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/tests/v1/test_configs.py +0 -0
  101. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/tests/v1/test_graph.py +0 -0
  102. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/tests/v1/test_judges.py +0 -0
  103. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/tests/v1/test_legacy.py +0 -0
  104. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/tests/v1/test_scoring.py +0 -0
  105. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/tests/v1/test_taskset.py +0 -0
  106. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/tests/v1/test_trace.py +0 -0
  107. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/__init__.py +0 -0
  108. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/cli/__init__.py +0 -0
  109. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/cli/commands/__init__.py +0 -0
  110. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/cli/commands/build.py +0 -0
  111. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/cli/commands/eval.py +0 -0
  112. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/cli/commands/gepa.py +0 -0
  113. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/cli/commands/init.py +0 -0
  114. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/cli/commands/install.py +0 -0
  115. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/cli/commands/setup.py +0 -0
  116. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/cli/plugins/__init__.py +0 -0
  117. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/cli/plugins/prime.py +0 -0
  118. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/cli/tui.py +0 -0
  119. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/clients/__init__.py +0 -0
  120. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/clients/anthropic_messages_client.py +0 -0
  121. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/clients/client.py +0 -0
  122. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/clients/nemorl_chat_completions_client.py +0 -0
  123. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/clients/openai_chat_completions_client.py +0 -0
  124. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/clients/openai_chat_completions_token_client.py +0 -0
  125. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/clients/openai_completions_client.py +0 -0
  126. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/clients/openai_responses_client.py +0 -0
  127. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/clients/renderer_client.py +0 -0
  128. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/decorators.py +0 -0
  129. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/envs/__init__.py +0 -0
  130. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/envs/env_group.py +0 -0
  131. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/envs/environment.py +0 -0
  132. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/envs/experimental/README.md +0 -0
  133. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/envs/experimental/__init__.py +0 -0
  134. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/envs/experimental/cli_agent_env.py +0 -0
  135. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/envs/experimental/composable/README.md +0 -0
  136. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/envs/experimental/composable/__init__.py +0 -0
  137. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/envs/experimental/composable/_filter.py +0 -0
  138. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/envs/experimental/composable/composable_env.py +0 -0
  139. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/envs/experimental/composable/harness.py +0 -0
  140. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/envs/experimental/composable/harnesses/__init__.py +0 -0
  141. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/envs/experimental/composable/harnesses/mini_swe_agent.py +0 -0
  142. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/envs/experimental/composable/harnesses/opencode.py +0 -0
  143. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/envs/experimental/composable/harnesses/prompt.txt +0 -0
  144. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/envs/experimental/composable/harnesses/rlm.py +0 -0
  145. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/envs/experimental/composable/sandbox_debug_env.py +0 -0
  146. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/envs/experimental/composable/swe_debug_env.py +0 -0
  147. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/envs/experimental/composable/task.py +0 -0
  148. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/envs/experimental/composable/tasksets/__init__.py +0 -0
  149. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/envs/experimental/composable/tasksets/cp/__init__.py +0 -0
  150. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/envs/experimental/composable/tasksets/cp/cp_task.py +0 -0
  151. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/envs/experimental/composable/tasksets/cp/test_utils.py +0 -0
  152. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/envs/experimental/composable/tasksets/harbor/__init__.py +0 -0
  153. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/envs/experimental/composable/tasksets/harbor/cli_gym.py +0 -0
  154. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/envs/experimental/composable/tasksets/harbor/harbor.py +0 -0
  155. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/envs/experimental/composable/tasksets/harbor/terminal_lego.py +0 -0
  156. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/envs/experimental/composable/tasksets/math/__init__.py +0 -0
  157. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/envs/experimental/composable/tasksets/math/math_task.py +0 -0
  158. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/envs/experimental/composable/tasksets/swe/README.md +0 -0
  159. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/envs/experimental/composable/tasksets/swe/__init__.py +0 -0
  160. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/__init__.py +0 -0
  161. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/extract_fix_patch.sh +0 -0
  162. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/envs/experimental/composable/tasksets/swe/multi_swe/taskset.py +0 -0
  163. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/envs/experimental/composable/tasksets/swe/openswe/__init__.py +0 -0
  164. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/envs/experimental/composable/tasksets/swe/openswe/taskset.py +0 -0
  165. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/__init__.py +0 -0
  166. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/log_parser.py +0 -0
  167. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/envs/experimental/composable/tasksets/swe/r2e_gym/taskset.py +0 -0
  168. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/envs/experimental/composable/tasksets/swe/scale_swe/__init__.py +0 -0
  169. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/envs/experimental/composable/tasksets/swe/scale_swe/taskset.py +0 -0
  170. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/envs/experimental/composable/tasksets/swe/shared/__init__.py +0 -0
  171. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/envs/experimental/composable/tasksets/swe/shared/test_patch.py +0 -0
  172. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/envs/experimental/composable/tasksets/swe/swe_bench/__init__.py +0 -0
  173. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/envs/experimental/composable/tasksets/swe/swe_bench/taskset.py +0 -0
  174. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/envs/experimental/composable/tasksets/swe/swe_lego/__init__.py +0 -0
  175. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/envs/experimental/composable/tasksets/swe/swe_lego/taskset.py +0 -0
  176. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/__init__.py +0 -0
  177. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/log_parsers.py +0 -0
  178. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/envs/experimental/composable/tasksets/swe/swe_rebench_v2/taskset.py +0 -0
  179. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/envs/experimental/composable/tasksets/swe/swe_smith/__init__.py +0 -0
  180. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/envs/experimental/composable/tasksets/swe/swe_smith/taskset.py +0 -0
  181. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/envs/experimental/composable/tasksets/swe/swe_tasksets.py +0 -0
  182. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/envs/experimental/gym_env.py +0 -0
  183. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/envs/experimental/harbor_env/__init__.py +0 -0
  184. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/envs/experimental/harbor_env/env.py +0 -0
  185. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/envs/experimental/harbor_env/mcp.py +0 -0
  186. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/envs/experimental/mcp_env.py +0 -0
  187. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/envs/experimental/opencode_env.py +0 -0
  188. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/envs/experimental/opencode_qa_env.py +0 -0
  189. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/envs/experimental/opencode_rlm_env.py +0 -0
  190. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/envs/experimental/sandbox_mixin.py +0 -0
  191. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/envs/experimental/utils/__init__.py +0 -0
  192. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/envs/experimental/utils/file_locks.py +0 -0
  193. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/envs/experimental/utils/git_checkout_cache.py +0 -0
  194. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/envs/integrations/README.md +0 -0
  195. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/envs/integrations/__init__.py +0 -0
  196. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/envs/integrations/browser_env/README.md +0 -0
  197. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/envs/integrations/browser_env/__init__.py +0 -0
  198. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/envs/integrations/browser_env/browser_env.py +0 -0
  199. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/envs/integrations/browser_env/modes/__init__.py +0 -0
  200. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/envs/integrations/browser_env/modes/base.py +0 -0
  201. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/envs/integrations/browser_env/modes/cua_mode.py +0 -0
  202. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/envs/integrations/browser_env/modes/dom_mode.py +0 -0
  203. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/envs/integrations/openenv_env.py +0 -0
  204. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/envs/integrations/reasoninggym_env.py +0 -0
  205. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/envs/integrations/textarena_env.py +0 -0
  206. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/envs/multiturn_env.py +0 -0
  207. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/envs/python_env.py +0 -0
  208. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/envs/sandbox_env.py +0 -0
  209. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/envs/singleturn_env.py +0 -0
  210. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/envs/stateful_tool_env.py +0 -0
  211. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/envs/tool_env.py +0 -0
  212. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/errors.py +0 -0
  213. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/gepa/__init__.py +0 -0
  214. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/gepa/adapter.py +0 -0
  215. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/gepa/config.py +0 -0
  216. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/gepa/display.py +0 -0
  217. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/gepa/gepa_utils.py +0 -0
  218. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/parsers/__init__.py +0 -0
  219. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/parsers/maybe_think_parser.py +0 -0
  220. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/parsers/parser.py +0 -0
  221. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/parsers/think_parser.py +0 -0
  222. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/parsers/xml_parser.py +0 -0
  223. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/rubrics/__init__.py +0 -0
  224. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/rubrics/experimental/hybrid_math_rubric.py +0 -0
  225. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/rubrics/judge_rubric.py +0 -0
  226. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/rubrics/math_rubric.py +0 -0
  227. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/rubrics/rubric.py +0 -0
  228. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/rubrics/rubric_group.py +0 -0
  229. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/scripts/__init__.py +0 -0
  230. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/scripts/build.py +0 -0
  231. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/scripts/eval.py +0 -0
  232. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/scripts/gepa.py +0 -0
  233. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/scripts/init.py +0 -0
  234. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/scripts/install.py +0 -0
  235. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/scripts/setup.py +0 -0
  236. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/scripts/tui.py +0 -0
  237. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/serve/__init__.py +0 -0
  238. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/serve/client/env_client.py +0 -0
  239. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/serve/client/zmq_env_client.py +0 -0
  240. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/serve/server/__init__.py +0 -0
  241. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/serve/server/env_router.py +0 -0
  242. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/serve/server/env_server.py +0 -0
  243. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/serve/server/env_worker.py +0 -0
  244. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/serve/server/zmq_env_server.py +0 -0
  245. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/serve/types.py +0 -0
  246. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/types.py +0 -0
  247. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/utils/__init__.py +0 -0
  248. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/utils/async_utils.py +0 -0
  249. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/utils/client_utils.py +0 -0
  250. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/utils/config_utils.py +0 -0
  251. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/utils/data_utils.py +0 -0
  252. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/utils/display_utils.py +0 -0
  253. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/utils/env_config_utils.py +0 -0
  254. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/utils/env_utils.py +0 -0
  255. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/utils/error_utils.py +0 -0
  256. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/utils/eval_display.py +0 -0
  257. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/utils/eval_utils.py +0 -0
  258. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/utils/heartbeat.py +0 -0
  259. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/utils/import_utils.py +0 -0
  260. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/utils/install_utils.py +0 -0
  261. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/utils/interception_utils.py +0 -0
  262. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/utils/logging_utils.py +0 -0
  263. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/utils/message_utils.py +0 -0
  264. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/utils/metric_utils.py +0 -0
  265. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/utils/path_utils.py +0 -0
  266. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/utils/pricing_utils.py +0 -0
  267. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/utils/process_utils.py +0 -0
  268. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/utils/response_utils.py +0 -0
  269. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/utils/save_utils.py +0 -0
  270. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/utils/serve_utils.py +0 -0
  271. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/utils/thread_utils.py +0 -0
  272. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/utils/threaded_sandbox_client.py +0 -0
  273. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/utils/tool_utils.py +0 -0
  274. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/utils/usage_utils.py +0 -0
  275. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/utils/version_utils.py +0 -0
  276. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/agent.py +0 -0
  277. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/cli/__init__.py +0 -0
  278. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/cli/dashboard/__init__.py +0 -0
  279. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/cli/dashboard/base.py +0 -0
  280. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/cli/dashboard/eval.py +0 -0
  281. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/cli/dashboard/replay.py +0 -0
  282. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/cli/dashboard/validate.py +0 -0
  283. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/cli/debug.py +0 -0
  284. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/cli/eval/__init__.py +0 -0
  285. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/cli/eval/main.py +0 -0
  286. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/cli/eval/resume.py +0 -0
  287. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/cli/eval/runner.py +0 -0
  288. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/cli/gepa.py +0 -0
  289. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/cli/init.py +0 -0
  290. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/cli/output.py +0 -0
  291. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/cli/replay.py +0 -0
  292. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/cli/resolve.py +0 -0
  293. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/cli/validate.py +0 -0
  294. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/clients/__init__.py +0 -0
  295. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/clients/base.py +0 -0
  296. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/clients/client.py +0 -0
  297. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/clients/eval.py +0 -0
  298. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/clients/train.py +0 -0
  299. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/configs/__init__.py +0 -0
  300. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/configs/agent.py +0 -0
  301. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/configs/cli/__init__.py +0 -0
  302. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/configs/cli/debug.py +0 -0
  303. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/configs/cli/env.py +0 -0
  304. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/configs/cli/eval.py +0 -0
  305. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/configs/cli/init.py +0 -0
  306. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/configs/cli/replay.py +0 -0
  307. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/configs/cli/validate.py +0 -0
  308. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/configs/client.py +0 -0
  309. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/configs/env.py +0 -0
  310. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/configs/harness.py +0 -0
  311. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/configs/judge.py +0 -0
  312. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/configs/legacy.py +0 -0
  313. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/configs/retries.py +0 -0
  314. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/configs/serve.py +0 -0
  315. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/configs/task.py +0 -0
  316. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/configs/taskset.py +0 -0
  317. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/dialects/__init__.py +0 -0
  318. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/dialects/anthropic.py +0 -0
  319. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/dialects/base.py +0 -0
  320. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/dialects/chat.py +0 -0
  321. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/dialects/responses.py +0 -0
  322. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/env.py +0 -0
  323. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/envs/__init__.py +0 -0
  324. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/envs/agentic_judge/__init__.py +0 -0
  325. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/envs/agentic_judge/env.py +0 -0
  326. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/envs/best_of_n/__init__.py +0 -0
  327. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/envs/best_of_n/env.py +0 -0
  328. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/envs/shared_agentic_judge/__init__.py +0 -0
  329. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/envs/single_agent/__init__.py +0 -0
  330. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/envs/single_agent/env.py +0 -0
  331. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/envs/user_sim/__init__.py +0 -0
  332. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/envs/user_sim/env.py +0 -0
  333. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/episode.py +0 -0
  334. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/errors.py +0 -0
  335. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/gepa/__init__.py +0 -0
  336. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/gepa/adapter.py +0 -0
  337. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/gepa/config.py +0 -0
  338. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/gepa/dataset.py +0 -0
  339. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/gepa/reflection.py +0 -0
  340. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/gepa/runner.py +0 -0
  341. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/graph.py +0 -0
  342. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/harnesses/__init__.py +0 -0
  343. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/harnesses/bash/__init__.py +0 -0
  344. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/harnesses/bash/harness.py +0 -0
  345. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/harnesses/bash/program.py +0 -0
  346. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/harnesses/browser_use/__init__.py +0 -0
  347. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/harnesses/browser_use/harness.py +0 -0
  348. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/harnesses/browser_use/program.py +0 -0
  349. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/harnesses/claude_code/__init__.py +0 -0
  350. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/harnesses/claude_code/harness.py +0 -0
  351. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/harnesses/codex/__init__.py +0 -0
  352. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/harnesses/codex/harness.py +0 -0
  353. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/harnesses/hermes_agent/__init__.py +0 -0
  354. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/harnesses/hermes_agent/harness.py +0 -0
  355. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/harnesses/hermes_agent/program.py +0 -0
  356. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/harnesses/kimi_code/__init__.py +0 -0
  357. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/harnesses/kimi_code/harness.py +0 -0
  358. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/harnesses/mini_swe_agent/__init__.py +0 -0
  359. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/harnesses/mini_swe_agent/harness.py +0 -0
  360. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/harnesses/mini_swe_agent/program.py +0 -0
  361. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/harnesses/null/__init__.py +0 -0
  362. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/harnesses/null/harness.py +0 -0
  363. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/harnesses/null/program.py +0 -0
  364. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/harnesses/openclaw/__init__.py +0 -0
  365. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/harnesses/openclaw/harness.py +0 -0
  366. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/harnesses/pi/__init__.py +0 -0
  367. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/harnesses/pi/harness.py +0 -0
  368. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/harnesses/pool/__init__.py +0 -0
  369. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/harnesses/pool/harness.py +0 -0
  370. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/harnesses/rlm/__init__.py +0 -0
  371. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/harnesses/terminus_2/__init__.py +0 -0
  372. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/harnesses/terminus_2/harness.py +0 -0
  373. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/harnesses/terminus_2/program.py +0 -0
  374. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/interception/__init__.py +0 -0
  375. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/interception/base.py +0 -0
  376. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/interception/pool.py +0 -0
  377. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/interception/tunnel/__init__.py +0 -0
  378. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/interception/tunnel/base.py +0 -0
  379. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/interception/tunnel/custom.py +0 -0
  380. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/interception/tunnel/prime.py +0 -0
  381. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/judge.py +0 -0
  382. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/judges/__init__.py +0 -0
  383. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/judges/reference.py +0 -0
  384. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/judges/reference.txt +0 -0
  385. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/judges/rubric.py +0 -0
  386. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/judges/rubric.txt +0 -0
  387. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/legacy.py +0 -0
  388. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/mcp/__init__.py +0 -0
  389. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/mcp/server.py +0 -0
  390. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/mcp/toolset.py +0 -0
  391. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/runtimes/docker/egress.py +0 -0
  392. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/runtimes/limiters.py +0 -0
  393. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/serve/__init__.py +0 -0
  394. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/serve/client.py +0 -0
  395. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/serve/pool.py +0 -0
  396. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/serve/server.py +0 -0
  397. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/serve/types.py +0 -0
  398. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/state.py +0 -0
  399. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/task.py +0 -0
  400. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/taskset.py +0 -0
  401. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/tasksets/__init__.py +0 -0
  402. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/tasksets/harbor/__init__.py +0 -0
  403. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/tasksets/harbor/env.py +0 -0
  404. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/tasksets/harbor/taskset.py +0 -0
  405. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/tasksets/lean/__init__.py +0 -0
  406. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/tasksets/lean/scoring.py +0 -0
  407. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/tasksets/lean/taskset.py +0 -0
  408. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/tasksets/openenv/__init__.py +0 -0
  409. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/tasksets/openenv/taskset.py +0 -0
  410. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/tasksets/textarena/__init__.py +0 -0
  411. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/tasksets/textarena/taskset.py +0 -0
  412. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/trace.py +0 -0
  413. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/types.py +0 -0
  414. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/utils/__init__.py +0 -0
  415. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/utils/aio.py +0 -0
  416. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/utils/artifacts.py +0 -0
  417. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/utils/compile.py +0 -0
  418. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/utils/decorators.py +0 -0
  419. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/utils/format.py +0 -0
  420. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/utils/generic.py +0 -0
  421. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/utils/git.py +0 -0
  422. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/utils/image.py +0 -0
  423. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/utils/install.py +0 -0
  424. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/utils/interrupt.py +0 -0
  425. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/utils/loaders.py +0 -0
  426. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/utils/logging.py +0 -0
  427. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/utils/memory.py +0 -0
  428. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/utils/platform.py +0 -0
  429. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/utils/retries.py +0 -0
  430. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/utils/score.py +0 -0
  431. {verifiers-0.2.2.dev87 → verifiers-0.2.2.dev89}/verifiers/v1/utils/version.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: verifiers
3
- Version: 0.2.2.dev87
3
+ Version: 0.2.2.dev89
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
@@ -35,7 +35,7 @@ Requires-Dist: numpy>=2.1.0
35
35
  Requires-Dist: openai-agents>=0.8.2
36
36
  Requires-Dist: openai>=2.9.0
37
37
  Requires-Dist: prime-pydantic-config[toml]>=0.4.2
38
- Requires-Dist: prime-sandboxes>=0.2.33
38
+ Requires-Dist: prime-sandboxes>=0.2.35
39
39
  Requires-Dist: prime-tunnel>=0.1.8
40
40
  Requires-Dist: pydantic>=2.12.3
41
41
  Requires-Dist: pyzmq>=27.1.0
@@ -35,7 +35,7 @@ dependencies = [
35
35
  "openai>=2.9.0",
36
36
  "openai-agents>=0.8.2",
37
37
  "prime-tunnel>=0.1.8",
38
- "prime-sandboxes>=0.2.33",
38
+ "prime-sandboxes>=0.2.35",
39
39
  "pydantic>=2.12.3",
40
40
  "requests",
41
41
  "rich>=11.0.0",
@@ -44,6 +44,8 @@ from verifiers.v1.configs.cli.eval import EvalConfig
44
44
  from verifiers.v1.trace import Trace
45
45
  from verifiers.v1.utils.loaders import load_environment
46
46
 
47
+ CI_MODEL = "openai/gpt-5.6-luna"
48
+
47
49
  # Fixture tasksets/envs (echo-v1, echo-agentic-v1, echo-v0, echo-multi-v0) live in
48
50
  # tests/v1/fixtures, added to the path via `pythonpath` in pyproject so the v1 loader and the
49
51
  # v0 legacy bridge both resolve them by id (no install).
@@ -129,13 +131,12 @@ def _eval_config(
129
131
  runtime: dict | None = None,
130
132
  env: dict | None = None,
131
133
  pool: dict | None = None,
132
- model: str | None = "deepseek/deepseek-v4-flash-0731",
133
134
  reasoning_effort: str | None = None,
134
135
  ) -> EvalConfig:
135
136
  """Build the smallest `EvalConfig` that still exercises the path, shared by the in-process
136
137
  (`run_v1`) and env-server (`run_v1_server`) fixtures. `taskset_overrides` merges onto the
137
138
  `{id: ...}` config; `runtime` places the `agent` seat's harness (an agent field, not a
138
- harness one); `model` overrides the default text model (e.g. a VLM for an image task).
139
+ harness one).
139
140
 
140
141
  `harness=None` leaves every seat on its own story — the multi-agent case: there
141
142
  is no run-level harness, so a single-agent test's `harness` lands on the `agent`
@@ -178,7 +179,7 @@ def _eval_config(
178
179
  rich=False,
179
180
  output_dir=output_dir,
180
181
  **({"serve": {"pool": pool}} if pool else {}),
181
- **({"model": model} if model else {}),
182
+ model=CI_MODEL,
182
183
  )
183
184
 
184
185
 
@@ -223,7 +224,7 @@ async def live_ctx():
223
224
 
224
225
  # Endpoint config only — each rollout builds and closes its own client.
225
226
  yield ModelContext(
226
- model="deepseek/deepseek-v4-flash-0731",
227
+ model=CI_MODEL,
227
228
  client=EvalClientConfig(),
228
229
  sampling=SamplingConfig(max_tokens=2048),
229
230
  )
@@ -244,6 +245,7 @@ def run_v0():
244
245
  ) -> list[Trace]:
245
246
  config = EvalConfig(
246
247
  legacy={"id": env_id, "args": args or {}},
248
+ model=CI_MODEL,
247
249
  num_tasks=1,
248
250
  num_rollouts=n,
249
251
  sampling={"max_tokens": max_tokens},
@@ -51,16 +51,18 @@ USER_RUNTIMES = [
51
51
  pytest.param("modal", marks=[_m.modal], id="harness-in-modal"),
52
52
  ]
53
53
 
54
- # ACP-backed harnesses: each must preserve an exchange across process relaunches and
54
+ # ACP-backed harnesses: each must preserve an exchange across interaction segments and
55
55
  # retain MCP access after resuming. Cover every harness in the local container runtime,
56
- # plus one remote placement for the sandbox/tunnel boundary.
56
+ # plus remote placements for the sandbox/tunnel and native-process boundaries.
57
57
  ACP_RESUME_PLACEMENTS = [
58
58
  _pair("hermes-agent", "docker", "hermes-agent-acp-in-docker"),
59
+ _pair("rlm", "docker", "rlm-acp-in-docker"),
59
60
  _pair("kimi-code", "docker", "kimi-code-acp-in-docker"),
60
61
  _pair("pi", "docker", "pi-acp-in-docker"),
61
62
  _pair("pool", "docker", "pool-acp-in-docker"),
62
63
  _pair("openclaw", "docker", "openclaw-acp-in-docker"),
63
64
  _pair("pool", "prime", "pool-acp-in-prime"),
65
+ _pair("rlm", "prime", "rlm-acp-in-prime-vm"),
64
66
  ]
65
67
 
66
68
  # harness runtime x tool placement: every axis value once plus the two-container case
@@ -215,7 +217,10 @@ async def test_acp_resume_with_tool(run_v1, harness, harness_runtime, tmp_path):
215
217
  (trace,) = await run_v1(
216
218
  "echo-acp-resume-v1",
217
219
  harness=harness,
218
- runtime={"type": harness_runtime},
220
+ runtime={
221
+ "type": harness_runtime,
222
+ **({"vm": True} if harness_runtime == "prime" else {}),
223
+ },
219
224
  output_dir=tmp_path,
220
225
  max_turns=8,
221
226
  max_tokens=8192,
@@ -231,6 +236,8 @@ async def test_acp_resume_with_tool(run_v1, harness, harness_runtime, tmp_path):
231
236
  assert segments[1]["terminated"] is False
232
237
  assert "tool" in segments[1]["roles"]
233
238
  assert segments[1]["tool_outputs"]
239
+ if harness == "rlm":
240
+ assert "turns_since_last_compaction" in trace.metrics
234
241
 
235
242
 
236
243
  @pytest.mark.e2e
@@ -314,7 +321,6 @@ async def test_tool_response_image(run_v1, tmp_path):
314
321
  "tool-response-image-v1",
315
322
  harness="null",
316
323
  runtime={"type": "subprocess"},
317
- model="openai/gpt-5.6-luna",
318
324
  reasoning_effort="none",
319
325
  output_dir=tmp_path,
320
326
  max_turns=4,
@@ -47,7 +47,7 @@ def test_eval(taskset: str):
47
47
  pytest.skip(f"{taskset} can't run a plain-CI smoke eval")
48
48
  if os.getenv("PRIME_API_KEY"):
49
49
  model = [
50
- "-m", "openai/gpt-4.1-mini",
50
+ "-m", "openai/gpt-5.6-luna",
51
51
  "--client.base-url", "https://api.pinference.ai/api/v1",
52
52
  "--client.api-key-var", "PRIME_API_KEY",
53
53
  ] # fmt: skip
@@ -43,7 +43,7 @@ from verifiers.v1.errors import (
43
43
  TunnelError,
44
44
  )
45
45
  from verifiers.v1.graph import MessageNode
46
- from verifiers.v1.harness import Harness
46
+ from verifiers.v1.harness import Harness, HarnessSession
47
47
  from verifiers.v1.judge import Judge, JudgeResponse, JudgeView
48
48
  from verifiers.v1.judges import (
49
49
  Criterion,
@@ -64,6 +64,7 @@ from verifiers.v1.runtimes import (
64
64
  Runtime,
65
65
  RuntimeConfig,
66
66
  RuntimeInfo,
67
+ RuntimeProcess,
67
68
  SubprocessConfig,
68
69
  )
69
70
  from verifiers.v1.state import State, StateT
@@ -241,10 +242,12 @@ __all__ = [ # noqa: RUF022 - grouped by public API area
241
242
  "TasksetConfig",
242
243
  "BaseConfig",
243
244
  "Harness",
245
+ "HarnessSession",
244
246
  "HarnessConfig",
245
247
  "ACP",
246
248
  "ModelContext",
247
249
  "Runtime",
250
+ "RuntimeProcess",
248
251
  "RuntimeConfig",
249
252
  "RuntimeInfo",
250
253
  "ProgramResult",
@@ -0,0 +1,303 @@
1
+ """Public Agent Client Protocol support for harness programs."""
2
+
3
+ import asyncio
4
+ import contextlib
5
+ import json
6
+ import secrets
7
+ from collections.abc import AsyncIterator
8
+ from pathlib import Path
9
+
10
+ from verifiers.v1.clients import ModelContext
11
+ from verifiers.v1.dialects.chat import message_to_wire
12
+ from verifiers.v1.errors import HarnessError
13
+ from verifiers.v1.harness import Harness, HarnessSession
14
+ from verifiers.v1.runtimes import ProgramResult, Runtime, RuntimeProcess
15
+ from verifiers.v1.task import TaskData
16
+ from verifiers.v1.trace import Trace
17
+ from verifiers.v1.types import Messages
18
+ from verifiers.v1.utils.aio import run_shielded
19
+
20
+ ACP_SOURCE = (Path(__file__).resolve().parent / "runner.py").read_text()
21
+ MAX_PACKET_BYTES = 128 * 1024 * 1024
22
+
23
+ __all__ = ["ACP"]
24
+
25
+
26
+ class ACP:
27
+ """Run one-shot ACP agents or create rollout-scoped ACP sessions."""
28
+
29
+ async def setup(self, harness: Harness, runtime: Runtime) -> None:
30
+ await runtime.prepare_uv_script(
31
+ ACP_SOURCE, {**harness.config.resolved_env, "UV_FROZEN": "false"}
32
+ )
33
+
34
+ def session(
35
+ self,
36
+ harness: Harness,
37
+ ctx: ModelContext,
38
+ trace: Trace,
39
+ runtime: Runtime,
40
+ endpoint: str,
41
+ secret: str,
42
+ mcp_urls: dict[str, str],
43
+ data: TaskData,
44
+ *,
45
+ env: dict[str, str],
46
+ command: list[str],
47
+ prompt: str | Messages | None,
48
+ system_prompt: str | None = None,
49
+ ) -> "ACPHarnessSession":
50
+ """Create a persistent ACP-backed handle owned by one rollout."""
51
+ return ACPHarnessSession(
52
+ harness,
53
+ ctx,
54
+ trace,
55
+ runtime,
56
+ endpoint,
57
+ secret,
58
+ mcp_urls,
59
+ data,
60
+ env=env,
61
+ command=command,
62
+ prompt=prompt,
63
+ system_prompt=system_prompt,
64
+ )
65
+
66
+ async def run(
67
+ self,
68
+ runtime: Runtime,
69
+ env: dict[str, str],
70
+ command: list[str],
71
+ prompt: str | Messages | None,
72
+ *,
73
+ mcp_urls: dict[str, str] | None = None,
74
+ system_prompt: str | None = None,
75
+ session_path: str | None = None,
76
+ allow_empty_tool_reply: bool = False,
77
+ ) -> ProgramResult:
78
+ """Run one ACP segment without retaining its process."""
79
+ return await self._run(
80
+ runtime,
81
+ env,
82
+ command,
83
+ prompt,
84
+ mcp_urls=mcp_urls,
85
+ system_prompt=system_prompt,
86
+ session_path=session_path,
87
+ allow_empty_tool_reply=allow_empty_tool_reply,
88
+ )
89
+
90
+ async def _run(
91
+ self,
92
+ runtime: Runtime,
93
+ env: dict[str, str],
94
+ command: list[str],
95
+ prompt: str | Messages | None,
96
+ *,
97
+ mcp_urls: dict[str, str] | None = None,
98
+ system_prompt: str | None = None,
99
+ session_path: str | None = None,
100
+ allow_empty_tool_reply: bool = False,
101
+ ) -> ProgramResult:
102
+ if prompt is None:
103
+ raise ValueError("ACP requires a prompt")
104
+ messages = (
105
+ [{"role": "user", "content": prompt}]
106
+ if isinstance(prompt, str)
107
+ else [message_to_wire(message) for message in prompt]
108
+ )
109
+ config = {
110
+ "command": command,
111
+ "messages": messages,
112
+ "mcp_urls": mcp_urls or {},
113
+ "system_prompt": system_prompt or "",
114
+ "session_path": session_path,
115
+ "allow_empty_tool_reply": allow_empty_tool_reply,
116
+ }
117
+ program = await runtime.prepare_uv_script(
118
+ ACP_SOURCE, {**env, "UV_FROZEN": "false"}
119
+ )
120
+ directory = f".vf-acp-{secrets.token_hex(8)}"
121
+ created = await runtime.run(["mkdir", "-m", "700", directory], {})
122
+ if created.exit_code != 0:
123
+ raise RuntimeError(f"ACP config directory failed: {created.stderr.strip()}")
124
+ path = f"{directory}/config.json"
125
+ try:
126
+ await runtime.write(path, json.dumps(config).encode())
127
+ return await runtime.run_program([*program, "once", path], env)
128
+ finally:
129
+ await run_shielded(runtime.run(["rm", "-rf", directory], {}))
130
+
131
+
132
+ def _packet(value: dict) -> bytes:
133
+ data = json.dumps(value, ensure_ascii=False).encode()
134
+ if len(data) > MAX_PACKET_BYTES:
135
+ raise ValueError(f"ACP session packet is too large: {len(data)} bytes")
136
+ return len(data).to_bytes(8, "big") + data
137
+
138
+
139
+ class _PacketReader:
140
+ def __init__(self, source: AsyncIterator[bytes]) -> None:
141
+ self._source = source.__aiter__()
142
+ self._buffer = bytearray()
143
+
144
+ async def _readexactly(self, size: int) -> bytes:
145
+ while len(self._buffer) < size:
146
+ try:
147
+ self._buffer.extend(await anext(self._source))
148
+ except StopAsyncIteration as e:
149
+ raise EOFError("ACP process closed its stdout") from e
150
+ data = bytes(self._buffer[:size])
151
+ del self._buffer[:size]
152
+ return data
153
+
154
+ async def read(self) -> dict:
155
+ size = int.from_bytes(await self._readexactly(8), "big")
156
+ if size > MAX_PACKET_BYTES:
157
+ raise ValueError(f"ACP session packet is too large: {size} bytes")
158
+ return json.loads((await self._readexactly(size)).decode())
159
+
160
+
161
+ class ACPHarnessSession(HarnessSession):
162
+ """A live ACP process, connection, and native session for one rollout."""
163
+
164
+ def __init__(
165
+ self,
166
+ harness: Harness,
167
+ ctx: ModelContext,
168
+ trace: Trace,
169
+ runtime: Runtime,
170
+ endpoint: str,
171
+ secret: str,
172
+ mcp_urls: dict[str, str],
173
+ data: TaskData,
174
+ env: dict[str, str],
175
+ command: list[str],
176
+ prompt: str | Messages | None,
177
+ system_prompt: str | None,
178
+ ) -> None:
179
+ super().__init__(harness, ctx, trace, runtime, endpoint, secret, mcp_urls, data)
180
+ self.env = env
181
+ self.command = command
182
+ self.prompt = prompt
183
+ self.system_prompt = system_prompt
184
+ self._process: RuntimeProcess | None = None
185
+ self._reader: _PacketReader | None = None
186
+ self._stderr_tail = bytearray()
187
+ self._stderr_task: asyncio.Task[None] | None = None
188
+ self._lock = asyncio.Lock()
189
+
190
+ async def _start(self) -> None:
191
+ self._stderr_tail.clear()
192
+ program = await self.runtime.prepare_uv_script(
193
+ ACP_SOURCE, {**self.env, "UV_FROZEN": "false"}
194
+ )
195
+ process = await self.runtime.open_process([*program, "stream"], self.env)
196
+ self._process = process
197
+ self._reader = _PacketReader(process.stdout)
198
+ self._stderr_task = asyncio.create_task(self._drain_stderr(process.stderr))
199
+
200
+ async def _drain_stderr(self, stream: AsyncIterator[bytes]) -> None:
201
+ async for chunk in stream:
202
+ self._stderr_tail.extend(chunk)
203
+ if len(self._stderr_tail) > 4000:
204
+ del self._stderr_tail[:-4000]
205
+
206
+ def _stderr(self) -> str:
207
+ return self._stderr_tail.decode(errors="replace").strip()
208
+
209
+ async def _run(self, messages: Messages | None) -> ProgramResult:
210
+ prompt = self.prompt if messages is None else messages
211
+ if prompt is None:
212
+ raise ValueError("ACP requires a prompt")
213
+ wire_messages = (
214
+ [{"role": "user", "content": prompt}]
215
+ if isinstance(prompt, str)
216
+ else [message_to_wire(message) for message in prompt]
217
+ )
218
+ config = {
219
+ "command": self.command,
220
+ "messages": wire_messages,
221
+ "mcp_urls": self.mcp_urls,
222
+ "system_prompt": self.system_prompt or "",
223
+ "session_path": None,
224
+ }
225
+ async with self._lock:
226
+ if self._closed:
227
+ raise HarnessError(
228
+ f"harness {self.harness.config.id!r} session is already closed"
229
+ )
230
+ if self._process is None:
231
+ await self._start()
232
+ assert self._process is not None
233
+ assert self._reader is not None
234
+ try:
235
+ await self._process.write(
236
+ _packet({"operation": "prompt", "config": config})
237
+ )
238
+ response = await self._reader.read()
239
+ except BaseException:
240
+ await run_shielded(self._stop(graceful=False))
241
+ raise
242
+ if not response.get("ok"):
243
+ detail = response.get("error") or "ACP session request failed"
244
+ if stderr := self._stderr():
245
+ detail = f"{detail}\n\nACP process stderr:\n{stderr}"
246
+ raise RuntimeError(detail)
247
+ return ProgramResult(exit_code=0, stdout=response.get("reply", ""), stderr="")
248
+
249
+ async def _stop(self, *, graceful: bool) -> None:
250
+ process, self._process = self._process, None
251
+ reader, self._reader = self._reader, None
252
+ stderr_task, self._stderr_task = self._stderr_task, None
253
+ if process is None:
254
+ return
255
+ failure: BaseException | None = None
256
+ try:
257
+ if graceful and reader is not None:
258
+ try:
259
+ await process.write(_packet({"operation": "shutdown"}))
260
+ response = await asyncio.wait_for(reader.read(), timeout=10)
261
+ if not response.get("ok"):
262
+ raise RuntimeError(
263
+ response.get("error") or "ACP session shutdown failed"
264
+ )
265
+ except BaseException as error: # noqa: BLE001 - finish teardown if cancelled
266
+ failure = error
267
+ try:
268
+ await asyncio.wait_for(process.wait(), timeout=10 if graceful else 0.1)
269
+ except BaseException: # noqa: BLE001 - cancellation still requires termination
270
+ with contextlib.suppress(Exception):
271
+ await asyncio.wait_for(process.terminate(), timeout=5)
272
+ try:
273
+ await asyncio.wait_for(process.wait(), timeout=5)
274
+ except BaseException: # noqa: BLE001 - cancellation still requires a kill
275
+ with contextlib.suppress(Exception):
276
+ await asyncio.wait_for(process.kill(), timeout=5)
277
+ with contextlib.suppress(BaseException):
278
+ await asyncio.wait_for(process.wait(), timeout=5)
279
+ finally:
280
+ if stderr_task is not None:
281
+ if not stderr_task.done():
282
+ stderr_task.cancel()
283
+ with contextlib.suppress(BaseException):
284
+ await stderr_task
285
+ if failure is not None:
286
+ detail = str(failure)
287
+ if stderr := self._stderr():
288
+ detail = f"{detail}\n\nACP process stderr:\n{stderr}"
289
+ raise RuntimeError(detail) from failure
290
+
291
+ async def close(self) -> None:
292
+ if self._closed:
293
+ return
294
+ # Publish closure before waiting for the process lock. A turn that
295
+ # already passed HarnessSession.turn()'s fast check rechecks under the
296
+ # same lock in _run(), so it cannot restart after teardown.
297
+ await super().close()
298
+
299
+ async def close_process() -> None:
300
+ async with self._lock:
301
+ await self._stop(graceful=True)
302
+
303
+ await run_shielded(close_process())