runloop_api_client 1.4.0__tar.gz → 1.5.1__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 (393) hide show
  1. runloop_api_client-1.5.1/.release-please-manifest.json +3 -0
  2. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/CHANGELOG.md +16 -0
  3. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/PKG-INFO +1 -1
  4. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/api.md +2 -0
  5. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/pyproject.toml +1 -1
  6. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/_version.py +1 -1
  7. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/resources/devboxes/devboxes.py +114 -0
  8. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/sdk/_types.py +5 -0
  9. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/sdk/async_devbox.py +29 -1
  10. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/sdk/devbox.py +29 -1
  11. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/types/__init__.py +2 -0
  12. runloop_api_client-1.5.1/src/runloop_api_client/types/devbox_enable_tunnel_params.py +13 -0
  13. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/types/devbox_view.py +3 -26
  14. runloop_api_client-1.5.1/src/runloop_api_client/types/tunnel_view.py +34 -0
  15. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/tests/api_resources/test_devboxes.py +93 -0
  16. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/tests/smoketests/sdk/test_async_devbox.py +47 -0
  17. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/tests/smoketests/sdk/test_devbox.py +45 -0
  18. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/uv.lock +1 -1
  19. runloop_api_client-1.4.0/.release-please-manifest.json +0 -3
  20. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/.gitignore +0 -0
  21. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/CONTRIBUTING.md +0 -0
  22. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/LICENSE +0 -0
  23. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/README-SDK.md +0 -0
  24. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/README.md +0 -0
  25. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/SECURITY.md +0 -0
  26. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/bin/check-release-environment +0 -0
  27. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/bin/publish-pypi +0 -0
  28. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/examples/.keep +0 -0
  29. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/release-please-config.json +0 -0
  30. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/requirements-dev.lock +0 -0
  31. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop/lib/.keep +0 -0
  32. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/__init__.py +0 -0
  33. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/_base_client.py +0 -0
  34. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/_client.py +0 -0
  35. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/_compat.py +0 -0
  36. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/_constants.py +0 -0
  37. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/_exceptions.py +0 -0
  38. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/_files.py +0 -0
  39. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/_models.py +0 -0
  40. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/_qs.py +0 -0
  41. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/_resource.py +0 -0
  42. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/_response.py +0 -0
  43. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/_streaming.py +0 -0
  44. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/_types.py +0 -0
  45. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/_utils/__init__.py +0 -0
  46. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/_utils/_compat.py +0 -0
  47. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/_utils/_datetime_parse.py +0 -0
  48. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/_utils/_json.py +0 -0
  49. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/_utils/_logs.py +0 -0
  50. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/_utils/_proxy.py +0 -0
  51. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/_utils/_reflection.py +0 -0
  52. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/_utils/_resources_proxy.py +0 -0
  53. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/_utils/_streams.py +0 -0
  54. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/_utils/_sync.py +0 -0
  55. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/_utils/_transform.py +0 -0
  56. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/_utils/_typing.py +0 -0
  57. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/_utils/_utils.py +0 -0
  58. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/_utils/_validation.py +0 -0
  59. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/lib/.keep +0 -0
  60. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/lib/__init__.py +0 -0
  61. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/lib/_ignore.py +0 -0
  62. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/lib/context_loader.py +0 -0
  63. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/lib/polling.py +0 -0
  64. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/lib/polling_async.py +0 -0
  65. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/pagination.py +0 -0
  66. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/py.typed +0 -0
  67. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/resources/__init__.py +0 -0
  68. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/resources/agents.py +0 -0
  69. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/resources/benchmark_jobs.py +0 -0
  70. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/resources/benchmark_runs.py +0 -0
  71. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/resources/benchmarks.py +0 -0
  72. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/resources/blueprints.py +0 -0
  73. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/resources/devboxes/__init__.py +0 -0
  74. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/resources/devboxes/browsers.py +0 -0
  75. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/resources/devboxes/computers.py +0 -0
  76. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/resources/devboxes/disk_snapshots.py +0 -0
  77. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/resources/devboxes/executions.py +0 -0
  78. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/resources/devboxes/logs.py +0 -0
  79. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/resources/gateway_configs.py +0 -0
  80. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/resources/network_policies.py +0 -0
  81. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/resources/objects.py +0 -0
  82. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/resources/repositories.py +0 -0
  83. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/resources/scenarios/__init__.py +0 -0
  84. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/resources/scenarios/runs.py +0 -0
  85. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/resources/scenarios/scenarios.py +0 -0
  86. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/resources/scenarios/scorers.py +0 -0
  87. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/resources/secrets.py +0 -0
  88. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/sdk/__init__.py +0 -0
  89. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/sdk/_helpers.py +0 -0
  90. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/sdk/agent.py +0 -0
  91. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/sdk/async_.py +0 -0
  92. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/sdk/async_agent.py +0 -0
  93. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/sdk/async_benchmark.py +0 -0
  94. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/sdk/async_benchmark_run.py +0 -0
  95. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/sdk/async_blueprint.py +0 -0
  96. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/sdk/async_execution.py +0 -0
  97. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/sdk/async_execution_result.py +0 -0
  98. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/sdk/async_network_policy.py +0 -0
  99. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/sdk/async_scenario.py +0 -0
  100. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/sdk/async_scenario_builder.py +0 -0
  101. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/sdk/async_scenario_run.py +0 -0
  102. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/sdk/async_scorer.py +0 -0
  103. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/sdk/async_snapshot.py +0 -0
  104. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/sdk/async_storage_object.py +0 -0
  105. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/sdk/benchmark.py +0 -0
  106. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/sdk/benchmark_run.py +0 -0
  107. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/sdk/blueprint.py +0 -0
  108. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/sdk/execution.py +0 -0
  109. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/sdk/execution_result.py +0 -0
  110. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/sdk/network_policy.py +0 -0
  111. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/sdk/scenario.py +0 -0
  112. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/sdk/scenario_builder.py +0 -0
  113. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/sdk/scenario_run.py +0 -0
  114. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/sdk/scorer.py +0 -0
  115. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/sdk/snapshot.py +0 -0
  116. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/sdk/storage_object.py +0 -0
  117. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/sdk/sync.py +0 -0
  118. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/types/agent_create_params.py +0 -0
  119. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/types/agent_list_params.py +0 -0
  120. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/types/agent_list_view.py +0 -0
  121. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/types/agent_view.py +0 -0
  122. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/types/benchmark_create_params.py +0 -0
  123. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/types/benchmark_definitions_params.py +0 -0
  124. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/types/benchmark_job_create_params.py +0 -0
  125. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/types/benchmark_job_list_params.py +0 -0
  126. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/types/benchmark_job_list_view.py +0 -0
  127. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/types/benchmark_job_view.py +0 -0
  128. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/types/benchmark_list_params.py +0 -0
  129. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/types/benchmark_list_public_params.py +0 -0
  130. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/types/benchmark_run_list_params.py +0 -0
  131. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/types/benchmark_run_list_scenario_runs_params.py +0 -0
  132. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/types/benchmark_run_list_view.py +0 -0
  133. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/types/benchmark_run_view.py +0 -0
  134. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/types/benchmark_start_run_params.py +0 -0
  135. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/types/benchmark_update_params.py +0 -0
  136. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/types/benchmark_update_scenarios_params.py +0 -0
  137. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/types/benchmark_view.py +0 -0
  138. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/types/blueprint_build_log.py +0 -0
  139. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/types/blueprint_build_logs_list_view.py +0 -0
  140. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/types/blueprint_build_parameters.py +0 -0
  141. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/types/blueprint_create_from_inspection_params.py +0 -0
  142. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/types/blueprint_create_params.py +0 -0
  143. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/types/blueprint_list_params.py +0 -0
  144. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/types/blueprint_list_public_params.py +0 -0
  145. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/types/blueprint_list_view.py +0 -0
  146. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/types/blueprint_preview_params.py +0 -0
  147. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/types/blueprint_preview_view.py +0 -0
  148. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/types/blueprint_view.py +0 -0
  149. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/types/devbox_async_execution_detail_view.py +0 -0
  150. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/types/devbox_create_params.py +0 -0
  151. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/types/devbox_create_ssh_key_response.py +0 -0
  152. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/types/devbox_create_tunnel_params.py +0 -0
  153. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/types/devbox_download_file_params.py +0 -0
  154. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/types/devbox_execute_async_params.py +0 -0
  155. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/types/devbox_execute_params.py +0 -0
  156. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/types/devbox_execute_sync_params.py +0 -0
  157. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/types/devbox_execution_detail_view.py +0 -0
  158. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/types/devbox_list_disk_snapshots_params.py +0 -0
  159. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/types/devbox_list_params.py +0 -0
  160. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/types/devbox_list_view.py +0 -0
  161. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/types/devbox_read_file_contents_params.py +0 -0
  162. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/types/devbox_read_file_contents_response.py +0 -0
  163. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/types/devbox_remove_tunnel_params.py +0 -0
  164. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/types/devbox_send_std_in_result.py +0 -0
  165. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/types/devbox_snapshot_disk_async_params.py +0 -0
  166. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/types/devbox_snapshot_disk_params.py +0 -0
  167. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/types/devbox_snapshot_list_view.py +0 -0
  168. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/types/devbox_snapshot_view.py +0 -0
  169. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/types/devbox_tunnel_view.py +0 -0
  170. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/types/devbox_update_params.py +0 -0
  171. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/types/devbox_upload_file_params.py +0 -0
  172. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/types/devbox_wait_for_command_params.py +0 -0
  173. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/types/devbox_write_file_contents_params.py +0 -0
  174. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/types/devboxes/__init__.py +0 -0
  175. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/types/devboxes/browser_create_params.py +0 -0
  176. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/types/devboxes/browser_view.py +0 -0
  177. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/types/devboxes/computer_create_params.py +0 -0
  178. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/types/devboxes/computer_keyboard_interaction_params.py +0 -0
  179. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/types/devboxes/computer_keyboard_interaction_response.py +0 -0
  180. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/types/devboxes/computer_mouse_interaction_params.py +0 -0
  181. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/types/devboxes/computer_mouse_interaction_response.py +0 -0
  182. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/types/devboxes/computer_screen_interaction_params.py +0 -0
  183. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/types/devboxes/computer_screen_interaction_response.py +0 -0
  184. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/types/devboxes/computer_view.py +0 -0
  185. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/types/devboxes/devbox_logs_list_view.py +0 -0
  186. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/types/devboxes/devbox_snapshot_async_status_view.py +0 -0
  187. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/types/devboxes/disk_snapshot_list_params.py +0 -0
  188. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/types/devboxes/disk_snapshot_update_params.py +0 -0
  189. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/types/devboxes/execution_execute_async_params.py +0 -0
  190. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/types/devboxes/execution_execute_sync_params.py +0 -0
  191. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/types/devboxes/execution_kill_params.py +0 -0
  192. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/types/devboxes/execution_retrieve_params.py +0 -0
  193. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/types/devboxes/execution_send_std_in_params.py +0 -0
  194. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/types/devboxes/execution_stream_stderr_updates_params.py +0 -0
  195. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/types/devboxes/execution_stream_stdout_updates_params.py +0 -0
  196. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/types/devboxes/execution_update_chunk.py +0 -0
  197. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/types/devboxes/log_list_params.py +0 -0
  198. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/types/gateway_config_create_params.py +0 -0
  199. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/types/gateway_config_list_params.py +0 -0
  200. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/types/gateway_config_list_view.py +0 -0
  201. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/types/gateway_config_update_params.py +0 -0
  202. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/types/gateway_config_view.py +0 -0
  203. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/types/input_context.py +0 -0
  204. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/types/input_context_param.py +0 -0
  205. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/types/input_context_update_param.py +0 -0
  206. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/types/inspection_source_param.py +0 -0
  207. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/types/network_policy_create_params.py +0 -0
  208. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/types/network_policy_list_params.py +0 -0
  209. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/types/network_policy_list_view.py +0 -0
  210. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/types/network_policy_update_params.py +0 -0
  211. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/types/network_policy_view.py +0 -0
  212. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/types/object_create_params.py +0 -0
  213. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/types/object_download_params.py +0 -0
  214. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/types/object_download_url_view.py +0 -0
  215. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/types/object_list_params.py +0 -0
  216. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/types/object_list_public_params.py +0 -0
  217. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/types/object_list_view.py +0 -0
  218. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/types/object_view.py +0 -0
  219. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/types/repository_connection_list_view.py +0 -0
  220. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/types/repository_connection_view.py +0 -0
  221. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/types/repository_create_params.py +0 -0
  222. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/types/repository_inspect_params.py +0 -0
  223. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/types/repository_inspection_details.py +0 -0
  224. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/types/repository_inspection_list_view.py +0 -0
  225. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/types/repository_list_params.py +0 -0
  226. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/types/repository_manifest_view.py +0 -0
  227. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/types/repository_refresh_params.py +0 -0
  228. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/types/scenario_create_params.py +0 -0
  229. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/types/scenario_definition_list_view.py +0 -0
  230. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/types/scenario_environment.py +0 -0
  231. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/types/scenario_environment_param.py +0 -0
  232. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/types/scenario_list_params.py +0 -0
  233. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/types/scenario_list_public_params.py +0 -0
  234. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/types/scenario_run_list_view.py +0 -0
  235. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/types/scenario_run_view.py +0 -0
  236. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/types/scenario_start_run_params.py +0 -0
  237. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/types/scenario_update_params.py +0 -0
  238. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/types/scenario_view.py +0 -0
  239. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/types/scenarios/__init__.py +0 -0
  240. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/types/scenarios/run_list_params.py +0 -0
  241. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/types/scenarios/scorer_create_params.py +0 -0
  242. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/types/scenarios/scorer_create_response.py +0 -0
  243. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/types/scenarios/scorer_list_params.py +0 -0
  244. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/types/scenarios/scorer_list_response.py +0 -0
  245. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/types/scenarios/scorer_retrieve_response.py +0 -0
  246. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/types/scenarios/scorer_update_params.py +0 -0
  247. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/types/scenarios/scorer_update_response.py +0 -0
  248. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/types/scenarios/scorer_validate_params.py +0 -0
  249. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/types/scenarios/scorer_validate_response.py +0 -0
  250. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/types/scoring_contract.py +0 -0
  251. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/types/scoring_contract_param.py +0 -0
  252. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/types/scoring_contract_result_view.py +0 -0
  253. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/types/scoring_contract_update_param.py +0 -0
  254. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/types/scoring_function.py +0 -0
  255. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/types/scoring_function_param.py +0 -0
  256. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/types/scoring_function_result_view.py +0 -0
  257. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/types/secret_create_params.py +0 -0
  258. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/types/secret_list_params.py +0 -0
  259. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/types/secret_list_view.py +0 -0
  260. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/types/secret_update_params.py +0 -0
  261. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/types/secret_view.py +0 -0
  262. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/types/shared/__init__.py +0 -0
  263. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/types/shared/after_idle.py +0 -0
  264. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/types/shared/agent_mount.py +0 -0
  265. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/types/shared/agent_source.py +0 -0
  266. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/types/shared/code_mount_parameters.py +0 -0
  267. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/types/shared/launch_parameters.py +0 -0
  268. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/types/shared/mount.py +0 -0
  269. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/types/shared/object_mount.py +0 -0
  270. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/types/shared/run_profile.py +0 -0
  271. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/types/shared_params/__init__.py +0 -0
  272. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/types/shared_params/after_idle.py +0 -0
  273. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/types/shared_params/agent_mount.py +0 -0
  274. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/types/shared_params/agent_source.py +0 -0
  275. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/types/shared_params/code_mount_parameters.py +0 -0
  276. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/types/shared_params/launch_parameters.py +0 -0
  277. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/types/shared_params/mount.py +0 -0
  278. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/types/shared_params/object_mount.py +0 -0
  279. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/src/runloop_api_client/types/shared_params/run_profile.py +0 -0
  280. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/tests/__init__.py +0 -0
  281. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/tests/api_resources/__init__.py +0 -0
  282. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/tests/api_resources/devboxes/__init__.py +0 -0
  283. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/tests/api_resources/devboxes/test_browsers.py +0 -0
  284. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/tests/api_resources/devboxes/test_computers.py +0 -0
  285. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/tests/api_resources/devboxes/test_disk_snapshots.py +0 -0
  286. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/tests/api_resources/devboxes/test_executions.py +0 -0
  287. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/tests/api_resources/devboxes/test_logs.py +0 -0
  288. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/tests/api_resources/scenarios/__init__.py +0 -0
  289. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/tests/api_resources/scenarios/test_runs.py +0 -0
  290. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/tests/api_resources/scenarios/test_scorers.py +0 -0
  291. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/tests/api_resources/test_agents.py +0 -0
  292. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/tests/api_resources/test_benchmark_jobs.py +0 -0
  293. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/tests/api_resources/test_benchmark_runs.py +0 -0
  294. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/tests/api_resources/test_benchmarks.py +0 -0
  295. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/tests/api_resources/test_blueprints.py +0 -0
  296. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/tests/api_resources/test_gateway_configs.py +0 -0
  297. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/tests/api_resources/test_network_policies.py +0 -0
  298. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/tests/api_resources/test_objects.py +0 -0
  299. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/tests/api_resources/test_repositories.py +0 -0
  300. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/tests/api_resources/test_scenarios.py +0 -0
  301. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/tests/api_resources/test_secrets.py +0 -0
  302. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/tests/conftest.py +0 -0
  303. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/tests/sample_file.txt +0 -0
  304. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/tests/sdk/__init__.py +0 -0
  305. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/tests/sdk/async_devbox/__init__.py +0 -0
  306. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/tests/sdk/async_devbox/conftest.py +0 -0
  307. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/tests/sdk/async_devbox/test_core.py +0 -0
  308. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/tests/sdk/async_devbox/test_edge_cases.py +0 -0
  309. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/tests/sdk/async_devbox/test_interfaces.py +0 -0
  310. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/tests/sdk/async_devbox/test_streaming.py +0 -0
  311. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/tests/sdk/conftest.py +0 -0
  312. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/tests/sdk/devbox/__init__.py +0 -0
  313. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/tests/sdk/devbox/conftest.py +0 -0
  314. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/tests/sdk/devbox/test_core.py +0 -0
  315. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/tests/sdk/devbox/test_edge_cases.py +0 -0
  316. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/tests/sdk/devbox/test_interfaces.py +0 -0
  317. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/tests/sdk/devbox/test_streaming.py +0 -0
  318. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/tests/sdk/test_agent.py +0 -0
  319. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/tests/sdk/test_async_agent.py +0 -0
  320. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/tests/sdk/test_async_benchmark.py +0 -0
  321. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/tests/sdk/test_async_benchmark_run.py +0 -0
  322. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/tests/sdk/test_async_blueprint.py +0 -0
  323. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/tests/sdk/test_async_execution.py +0 -0
  324. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/tests/sdk/test_async_execution_result.py +0 -0
  325. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/tests/sdk/test_async_network_policy.py +0 -0
  326. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/tests/sdk/test_async_ops.py +0 -0
  327. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/tests/sdk/test_async_scenario.py +0 -0
  328. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/tests/sdk/test_async_scenario_builder.py +0 -0
  329. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/tests/sdk/test_async_scenario_run.py +0 -0
  330. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/tests/sdk/test_async_scorer.py +0 -0
  331. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/tests/sdk/test_async_snapshot.py +0 -0
  332. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/tests/sdk/test_async_storage_object.py +0 -0
  333. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/tests/sdk/test_benchmark.py +0 -0
  334. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/tests/sdk/test_benchmark_run.py +0 -0
  335. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/tests/sdk/test_blueprint.py +0 -0
  336. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/tests/sdk/test_execution.py +0 -0
  337. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/tests/sdk/test_execution_result.py +0 -0
  338. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/tests/sdk/test_helpers.py +0 -0
  339. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/tests/sdk/test_network_policy.py +0 -0
  340. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/tests/sdk/test_ops.py +0 -0
  341. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/tests/sdk/test_scenario.py +0 -0
  342. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/tests/sdk/test_scenario_builder.py +0 -0
  343. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/tests/sdk/test_scenario_run.py +0 -0
  344. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/tests/sdk/test_scorer.py +0 -0
  345. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/tests/sdk/test_snapshot.py +0 -0
  346. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/tests/sdk/test_storage_object.py +0 -0
  347. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/tests/smoketests/README.md +0 -0
  348. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/tests/smoketests/__init__.py +0 -0
  349. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/tests/smoketests/conftest.py +0 -0
  350. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/tests/smoketests/sdk/README.md +0 -0
  351. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/tests/smoketests/sdk/__init__.py +0 -0
  352. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/tests/smoketests/sdk/conftest.py +0 -0
  353. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/tests/smoketests/sdk/test_agent.py +0 -0
  354. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/tests/smoketests/sdk/test_async_agent.py +0 -0
  355. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/tests/smoketests/sdk/test_async_benchmark.py +0 -0
  356. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/tests/smoketests/sdk/test_async_blueprint.py +0 -0
  357. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/tests/smoketests/sdk/test_async_network_policy.py +0 -0
  358. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/tests/smoketests/sdk/test_async_scenario.py +0 -0
  359. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/tests/smoketests/sdk/test_async_scorer.py +0 -0
  360. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/tests/smoketests/sdk/test_async_sdk.py +0 -0
  361. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/tests/smoketests/sdk/test_async_snapshot.py +0 -0
  362. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/tests/smoketests/sdk/test_async_storage_object.py +0 -0
  363. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/tests/smoketests/sdk/test_benchmark.py +0 -0
  364. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/tests/smoketests/sdk/test_blueprint.py +0 -0
  365. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/tests/smoketests/sdk/test_network_policy.py +0 -0
  366. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/tests/smoketests/sdk/test_scenario.py +0 -0
  367. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/tests/smoketests/sdk/test_scorer.py +0 -0
  368. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/tests/smoketests/sdk/test_sdk.py +0 -0
  369. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/tests/smoketests/sdk/test_snapshot.py +0 -0
  370. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/tests/smoketests/sdk/test_storage_object.py +0 -0
  371. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/tests/smoketests/test_blueprints.py +0 -0
  372. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/tests/smoketests/test_devboxes.py +0 -0
  373. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/tests/smoketests/test_executions.py +0 -0
  374. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/tests/smoketests/test_scenarios_benchmarks.py +0 -0
  375. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/tests/smoketests/test_snapshots.py +0 -0
  376. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/tests/smoketests/utils.py +0 -0
  377. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/tests/test_client.py +0 -0
  378. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/tests/test_deepcopy.py +0 -0
  379. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/tests/test_extract_files.py +0 -0
  380. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/tests/test_files.py +0 -0
  381. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/tests/test_models.py +0 -0
  382. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/tests/test_polling.py +0 -0
  383. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/tests/test_qs.py +0 -0
  384. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/tests/test_required_args.py +0 -0
  385. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/tests/test_response.py +0 -0
  386. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/tests/test_streaming.py +0 -0
  387. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/tests/test_transform.py +0 -0
  388. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/tests/test_utils/test_context_loader.py +0 -0
  389. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/tests/test_utils/test_datetime_parse.py +0 -0
  390. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/tests/test_utils/test_json.py +0 -0
  391. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/tests/test_utils/test_proxy.py +0 -0
  392. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/tests/test_utils/test_typing.py +0 -0
  393. {runloop_api_client-1.4.0 → runloop_api_client-1.5.1}/tests/utils.py +0 -0
@@ -0,0 +1,3 @@
1
+ {
2
+ ".": "1.5.1"
3
+ }
@@ -1,5 +1,21 @@
1
1
  # Changelog
2
2
 
3
+ ## 1.5.1 (2026-01-30)
4
+
5
+ Full Changelog: [v1.5.0...v1.5.1](https://github.com/runloopai/api-client-python/compare/v1.5.0...v1.5.1)
6
+
7
+ ### Chores
8
+
9
+ * **devbox:** rename tunnel auth enum ([#7239](https://github.com/runloopai/api-client-python/issues/7239)) ([7a9b7a4](https://github.com/runloopai/api-client-python/commit/7a9b7a449ce648ad4f220af83b35f800727ea28d))
10
+
11
+ ## 1.5.0 (2026-01-30)
12
+
13
+ Full Changelog: [v1.4.0...v1.5.0](https://github.com/runloopai/api-client-python/compare/v1.4.0...v1.5.0)
14
+
15
+ ### Features
16
+
17
+ * **devbox:** add enable_tunnel API ([#7236](https://github.com/runloopai/api-client-python/issues/7236)) ([bb58bfc](https://github.com/runloopai/api-client-python/commit/bb58bfc40c93c5832634ddb82c255ada7214c7f4))
18
+
3
19
  ## 1.4.0 (2026-01-30)
4
20
 
5
21
  Full Changelog: [v1.3.2...v1.4.0](https://github.com/runloopai/api-client-python/compare/v1.3.2...v1.4.0)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: runloop_api_client
3
- Version: 1.4.0
3
+ Version: 1.5.1
4
4
  Summary: The official Python library for the runloop API
5
5
  Project-URL: Homepage, https://github.com/runloopai/api-client-python
6
6
  Project-URL: Repository, https://github.com/runloopai/api-client-python
@@ -132,6 +132,7 @@ from runloop_api_client.types import (
132
132
  DevboxSnapshotView,
133
133
  DevboxTunnelView,
134
134
  DevboxView,
135
+ TunnelView,
135
136
  DevboxCreateSSHKeyResponse,
136
137
  DevboxReadFileContentsResponse,
137
138
  )
@@ -148,6 +149,7 @@ Methods:
148
149
  - <code title="post /v1/devboxes/{id}/create_tunnel">client.devboxes.<a href="./src/runloop_api_client/resources/devboxes/devboxes.py">create_tunnel</a>(id, \*\*<a href="src/runloop_api_client/types/devbox_create_tunnel_params.py">params</a>) -> <a href="./src/runloop_api_client/types/devbox_tunnel_view.py">DevboxTunnelView</a></code>
149
150
  - <code title="post /v1/devboxes/disk_snapshots/{id}/delete">client.devboxes.<a href="./src/runloop_api_client/resources/devboxes/devboxes.py">delete_disk_snapshot</a>(id) -> object</code>
150
151
  - <code title="post /v1/devboxes/{id}/download_file">client.devboxes.<a href="./src/runloop_api_client/resources/devboxes/devboxes.py">download_file</a>(id, \*\*<a href="src/runloop_api_client/types/devbox_download_file_params.py">params</a>) -> BinaryAPIResponse</code>
152
+ - <code title="post /v1/devboxes/{id}/enable_tunnel">client.devboxes.<a href="./src/runloop_api_client/resources/devboxes/devboxes.py">enable_tunnel</a>(id, \*\*<a href="src/runloop_api_client/types/devbox_enable_tunnel_params.py">params</a>) -> <a href="./src/runloop_api_client/types/tunnel_view.py">TunnelView</a></code>
151
153
  - <code title="post /v1/devboxes/{id}/execute">client.devboxes.<a href="./src/runloop_api_client/resources/devboxes/devboxes.py">execute</a>(id, \*\*<a href="src/runloop_api_client/types/devbox_execute_params.py">params</a>) -> <a href="./src/runloop_api_client/types/devbox_async_execution_detail_view.py">DevboxAsyncExecutionDetailView</a></code>
152
154
  - <code title="post /v1/devboxes/{id}/execute_async">client.devboxes.<a href="./src/runloop_api_client/resources/devboxes/devboxes.py">execute_async</a>(id, \*\*<a href="src/runloop_api_client/types/devbox_execute_async_params.py">params</a>) -> <a href="./src/runloop_api_client/types/devbox_async_execution_detail_view.py">DevboxAsyncExecutionDetailView</a></code>
153
155
  - <code title="post /v1/devboxes/{id}/execute_sync">client.devboxes.<a href="./src/runloop_api_client/resources/devboxes/devboxes.py">execute_sync</a>(id, \*\*<a href="src/runloop_api_client/types/devbox_execute_sync_params.py">params</a>) -> <a href="./src/runloop_api_client/types/devbox_execution_detail_view.py">DevboxExecutionDetailView</a></code>
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "runloop_api_client"
3
- version = "1.4.0"
3
+ version = "1.5.1"
4
4
  description = "The official Python library for the runloop API"
5
5
  dynamic = ["readme"]
6
6
  license = "MIT"
@@ -1,4 +1,4 @@
1
1
  # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
2
2
 
3
3
  __title__ = "runloop_api_client"
4
- __version__ = "1.4.0" # x-release-please-version
4
+ __version__ = "1.5.1" # x-release-please-version
@@ -28,6 +28,7 @@ from ...types import (
28
28
  devbox_execute_sync_params,
29
29
  devbox_create_tunnel_params,
30
30
  devbox_download_file_params,
31
+ devbox_enable_tunnel_params,
31
32
  devbox_execute_async_params,
32
33
  devbox_remove_tunnel_params,
33
34
  devbox_snapshot_disk_params,
@@ -99,6 +100,7 @@ from .disk_snapshots import (
99
100
  )
100
101
  from ...lib.polling_async import async_poll_until
101
102
  from ...types.devbox_view import DevboxView
103
+ from ...types.tunnel_view import TunnelView
102
104
  from ...types.devbox_tunnel_view import DevboxTunnelView
103
105
  from ...types.shared_params.mount import Mount
104
106
  from ...types.devbox_snapshot_view import DevboxSnapshotView
@@ -787,6 +789,55 @@ class DevboxesResource(SyncAPIResource):
787
789
  cast_to=BinaryAPIResponse,
788
790
  )
789
791
 
792
+ def enable_tunnel(
793
+ self,
794
+ id: str,
795
+ *,
796
+ auth_mode: Optional[Literal["open", "authenticated"]] | Omit = omit,
797
+ # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
798
+ # The extra values given here take precedence over values defined on the client or passed to this method.
799
+ extra_headers: Headers | None = None,
800
+ extra_query: Query | None = None,
801
+ extra_body: Body | None = None,
802
+ timeout: float | httpx.Timeout | None | NotGiven = not_given,
803
+ idempotency_key: str | None = None,
804
+ ) -> TunnelView:
805
+ """Create a V2 tunnel for an existing running Devbox.
806
+
807
+ Tunnels provide encrypted
808
+ URL-based access to the Devbox without exposing internal IDs. The tunnel URL
809
+ format is: https://{port}-{tunnel_key}.tunnel.runloop.ai
810
+
811
+ Each Devbox can have one tunnel.
812
+
813
+ Args:
814
+ auth_mode: Authentication mode for the tunnel. Defaults to 'public' if not specified.
815
+
816
+ extra_headers: Send extra headers
817
+
818
+ extra_query: Add additional query parameters to the request
819
+
820
+ extra_body: Add additional JSON properties to the request
821
+
822
+ timeout: Override the client-level default timeout for this request, in seconds
823
+
824
+ idempotency_key: Specify a custom idempotency key for this request
825
+ """
826
+ if not id:
827
+ raise ValueError(f"Expected a non-empty value for `id` but received {id!r}")
828
+ return self._post(
829
+ f"/v1/devboxes/{id}/enable_tunnel",
830
+ body=maybe_transform({"auth_mode": auth_mode}, devbox_enable_tunnel_params.DevboxEnableTunnelParams),
831
+ options=make_request_options(
832
+ extra_headers=extra_headers,
833
+ extra_query=extra_query,
834
+ extra_body=extra_body,
835
+ timeout=timeout,
836
+ idempotency_key=idempotency_key,
837
+ ),
838
+ cast_to=TunnelView,
839
+ )
840
+
790
841
  def execute(
791
842
  self,
792
843
  id: str,
@@ -2347,6 +2398,57 @@ class AsyncDevboxesResource(AsyncAPIResource):
2347
2398
  cast_to=AsyncBinaryAPIResponse,
2348
2399
  )
2349
2400
 
2401
+ async def enable_tunnel(
2402
+ self,
2403
+ id: str,
2404
+ *,
2405
+ auth_mode: Optional[Literal["open", "authenticated"]] | Omit = omit,
2406
+ # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
2407
+ # The extra values given here take precedence over values defined on the client or passed to this method.
2408
+ extra_headers: Headers | None = None,
2409
+ extra_query: Query | None = None,
2410
+ extra_body: Body | None = None,
2411
+ timeout: float | httpx.Timeout | None | NotGiven = not_given,
2412
+ idempotency_key: str | None = None,
2413
+ ) -> TunnelView:
2414
+ """Create a V2 tunnel for an existing running Devbox.
2415
+
2416
+ Tunnels provide encrypted
2417
+ URL-based access to the Devbox without exposing internal IDs. The tunnel URL
2418
+ format is: https://{port}-{tunnel_key}.tunnel.runloop.ai
2419
+
2420
+ Each Devbox can have one tunnel.
2421
+
2422
+ Args:
2423
+ auth_mode: Authentication mode for the tunnel. Defaults to 'public' if not specified.
2424
+
2425
+ extra_headers: Send extra headers
2426
+
2427
+ extra_query: Add additional query parameters to the request
2428
+
2429
+ extra_body: Add additional JSON properties to the request
2430
+
2431
+ timeout: Override the client-level default timeout for this request, in seconds
2432
+
2433
+ idempotency_key: Specify a custom idempotency key for this request
2434
+ """
2435
+ if not id:
2436
+ raise ValueError(f"Expected a non-empty value for `id` but received {id!r}")
2437
+ return await self._post(
2438
+ f"/v1/devboxes/{id}/enable_tunnel",
2439
+ body=await async_maybe_transform(
2440
+ {"auth_mode": auth_mode}, devbox_enable_tunnel_params.DevboxEnableTunnelParams
2441
+ ),
2442
+ options=make_request_options(
2443
+ extra_headers=extra_headers,
2444
+ extra_query=extra_query,
2445
+ extra_body=extra_body,
2446
+ timeout=timeout,
2447
+ idempotency_key=idempotency_key,
2448
+ ),
2449
+ cast_to=TunnelView,
2450
+ )
2451
+
2350
2452
  async def execute(
2351
2453
  self,
2352
2454
  id: str,
@@ -3293,6 +3395,9 @@ class DevboxesResourceWithRawResponse:
3293
3395
  devboxes.download_file,
3294
3396
  BinaryAPIResponse,
3295
3397
  )
3398
+ self.enable_tunnel = to_raw_response_wrapper(
3399
+ devboxes.enable_tunnel,
3400
+ )
3296
3401
  self.execute = to_raw_response_wrapper(
3297
3402
  devboxes.execute,
3298
3403
  )
@@ -3395,6 +3500,9 @@ class AsyncDevboxesResourceWithRawResponse:
3395
3500
  devboxes.download_file,
3396
3501
  AsyncBinaryAPIResponse,
3397
3502
  )
3503
+ self.enable_tunnel = async_to_raw_response_wrapper(
3504
+ devboxes.enable_tunnel,
3505
+ )
3398
3506
  self.execute = async_to_raw_response_wrapper(
3399
3507
  devboxes.execute,
3400
3508
  )
@@ -3497,6 +3605,9 @@ class DevboxesResourceWithStreamingResponse:
3497
3605
  devboxes.download_file,
3498
3606
  StreamedBinaryAPIResponse,
3499
3607
  )
3608
+ self.enable_tunnel = to_streamed_response_wrapper(
3609
+ devboxes.enable_tunnel,
3610
+ )
3500
3611
  self.execute = to_streamed_response_wrapper(
3501
3612
  devboxes.execute,
3502
3613
  )
@@ -3599,6 +3710,9 @@ class AsyncDevboxesResourceWithStreamingResponse:
3599
3710
  devboxes.download_file,
3600
3711
  AsyncStreamedBinaryAPIResponse,
3601
3712
  )
3713
+ self.enable_tunnel = async_to_streamed_response_wrapper(
3714
+ devboxes.enable_tunnel,
3715
+ )
3602
3716
  self.execute = async_to_streamed_response_wrapper(
3603
3717
  devboxes.execute,
3604
3718
  )
@@ -22,6 +22,7 @@ from ..types import (
22
22
  NetworkPolicyListParams,
23
23
  DevboxCreateTunnelParams,
24
24
  DevboxDownloadFileParams,
25
+ DevboxEnableTunnelParams,
25
26
  DevboxRemoveTunnelParams,
26
27
  DevboxSnapshotDiskParams,
27
28
  NetworkPolicyCreateParams,
@@ -121,6 +122,10 @@ class SDKDevboxCreateTunnelParams(DevboxCreateTunnelParams, LongRequestOptions):
121
122
  pass
122
123
 
123
124
 
125
+ class SDKDevboxEnableTunnelParams(DevboxEnableTunnelParams, LongRequestOptions):
126
+ pass
127
+
128
+
124
129
  class SDKDevboxRemoveTunnelParams(DevboxRemoveTunnelParams, LongRequestOptions):
125
130
  pass
126
131
 
@@ -10,6 +10,7 @@ from typing_extensions import Unpack, override
10
10
 
11
11
  from ..types import (
12
12
  DevboxView,
13
+ TunnelView,
13
14
  DevboxTunnelView,
14
15
  DevboxExecutionDetailView,
15
16
  DevboxCreateSSHKeyResponse,
@@ -24,6 +25,7 @@ from ._types import (
24
25
  SDKDevboxUploadFileParams,
25
26
  SDKDevboxCreateTunnelParams,
26
27
  SDKDevboxDownloadFileParams,
28
+ SDKDevboxEnableTunnelParams,
27
29
  SDKDevboxExecuteAsyncParams,
28
30
  SDKDevboxRemoveTunnelParams,
29
31
  SDKDevboxSnapshotDiskParams,
@@ -731,7 +733,9 @@ class AsyncNetworkInterface:
731
733
  self,
732
734
  **params: Unpack[SDKDevboxCreateTunnelParams],
733
735
  ) -> DevboxTunnelView:
734
- """Create a network tunnel to expose a devbox port publicly.
736
+ """[Deprecated] Create a legacy tunnel to expose a devbox port publicly.
737
+
738
+ Use :meth:`enable_tunnel` instead for the V2 tunnel API.
735
739
 
736
740
  :param params: See :typeddict:`~runloop_api_client.sdk._types.SDKDevboxCreateTunnelParams` for available parameters
737
741
  :return: Details about the public endpoint
@@ -748,6 +752,30 @@ class AsyncNetworkInterface:
748
752
  **params,
749
753
  )
750
754
 
755
+ async def enable_tunnel(
756
+ self,
757
+ **params: Unpack[SDKDevboxEnableTunnelParams],
758
+ ) -> TunnelView:
759
+ """Enable a V2 tunnel for secure HTTP access to the devbox.
760
+
761
+ V2 tunnels provide encrypted URL-based access without exposing internal IDs.
762
+ Each devbox can have one tunnel. The tunnel URL format is:
763
+ ``https://{port}-{tunnel_key}.tunnel.runloop.ai``
764
+
765
+ :param params: See :typeddict:`~runloop_api_client.sdk._types.SDKDevboxEnableTunnelParams` for available parameters
766
+ :return: Tunnel details including the tunnel key for constructing URLs
767
+ :rtype: TunnelView
768
+
769
+ Example:
770
+ >>> tunnel = await devbox.net.enable_tunnel(auth_mode="open")
771
+ >>> print(f"Tunnel key: {tunnel.tunnel_key}")
772
+ >>> # Access via: https://8080-{tunnel.tunnel_key}.tunnel.runloop.ai
773
+ """
774
+ return await self._devbox._client.devboxes.enable_tunnel(
775
+ self._devbox.id,
776
+ **params,
777
+ )
778
+
751
779
  async def remove_tunnel(
752
780
  self,
753
781
  **params: Unpack[SDKDevboxRemoveTunnelParams],
@@ -10,6 +10,7 @@ from typing_extensions import Unpack, override
10
10
 
11
11
  from ..types import (
12
12
  DevboxView,
13
+ TunnelView,
13
14
  DevboxTunnelView,
14
15
  DevboxExecutionDetailView,
15
16
  DevboxCreateSSHKeyResponse,
@@ -25,6 +26,7 @@ from ._types import (
25
26
  SDKDevboxUploadFileParams,
26
27
  SDKDevboxCreateTunnelParams,
27
28
  SDKDevboxDownloadFileParams,
29
+ SDKDevboxEnableTunnelParams,
28
30
  SDKDevboxExecuteAsyncParams,
29
31
  SDKDevboxRemoveTunnelParams,
30
32
  SDKDevboxSnapshotDiskParams,
@@ -734,7 +736,9 @@ class NetworkInterface:
734
736
  self,
735
737
  **params: Unpack[SDKDevboxCreateTunnelParams],
736
738
  ) -> DevboxTunnelView:
737
- """Create a network tunnel to expose a devbox port publicly.
739
+ """[Deprecated] Create a legacy tunnel to expose a devbox port publicly.
740
+
741
+ Use :meth:`enable_tunnel` instead for the V2 tunnel API.
738
742
 
739
743
  :param params: See :typeddict:`~runloop_api_client.sdk._types.SDKDevboxCreateTunnelParams` for available parameters
740
744
  :return: Details about the public endpoint
@@ -751,6 +755,30 @@ class NetworkInterface:
751
755
  **params,
752
756
  )
753
757
 
758
+ def enable_tunnel(
759
+ self,
760
+ **params: Unpack[SDKDevboxEnableTunnelParams],
761
+ ) -> TunnelView:
762
+ """Enable a V2 tunnel for secure HTTP access to the devbox.
763
+
764
+ V2 tunnels provide encrypted URL-based access without exposing internal IDs.
765
+ Each devbox can have one tunnel. The tunnel URL format is:
766
+ ``https://{port}-{tunnel_key}.tunnel.runloop.ai``
767
+
768
+ :param params: See :typeddict:`~runloop_api_client.sdk._types.SDKDevboxEnableTunnelParams` for available parameters
769
+ :return: Tunnel details including the tunnel key for constructing URLs
770
+ :rtype: :class:`~runloop_api_client.types.tunnel_view.TunnelView`
771
+
772
+ Example:
773
+ >>> tunnel = devbox.net.enable_tunnel(auth_mode="open")
774
+ >>> print(f"Tunnel key: {tunnel.tunnel_key}")
775
+ >>> # Access via: https://8080-{tunnel.tunnel_key}.tunnel.runloop.ai
776
+ """
777
+ return self._devbox._client.devboxes.enable_tunnel(
778
+ self._devbox.id,
779
+ **params,
780
+ )
781
+
754
782
  def remove_tunnel(
755
783
  self,
756
784
  **params: Unpack[SDKDevboxRemoveTunnelParams],
@@ -16,6 +16,7 @@ from .agent_view import AgentView as AgentView
16
16
  from .devbox_view import DevboxView as DevboxView
17
17
  from .object_view import ObjectView as ObjectView
18
18
  from .secret_view import SecretView as SecretView
19
+ from .tunnel_view import TunnelView as TunnelView
19
20
  from .input_context import InputContext as InputContext
20
21
  from .scenario_view import ScenarioView as ScenarioView
21
22
  from .benchmark_view import BenchmarkView as BenchmarkView
@@ -91,6 +92,7 @@ from .scenario_environment_param import ScenarioEnvironmentParam as ScenarioEnvi
91
92
  from .benchmark_job_create_params import BenchmarkJobCreateParams as BenchmarkJobCreateParams
92
93
  from .devbox_create_tunnel_params import DevboxCreateTunnelParams as DevboxCreateTunnelParams
93
94
  from .devbox_download_file_params import DevboxDownloadFileParams as DevboxDownloadFileParams
95
+ from .devbox_enable_tunnel_params import DevboxEnableTunnelParams as DevboxEnableTunnelParams
94
96
  from .devbox_execute_async_params import DevboxExecuteAsyncParams as DevboxExecuteAsyncParams
95
97
  from .devbox_remove_tunnel_params import DevboxRemoveTunnelParams as DevboxRemoveTunnelParams
96
98
  from .devbox_snapshot_disk_params import DevboxSnapshotDiskParams as DevboxSnapshotDiskParams
@@ -0,0 +1,13 @@
1
+ # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
2
+
3
+ from __future__ import annotations
4
+
5
+ from typing import Optional
6
+ from typing_extensions import Literal, TypedDict
7
+
8
+ __all__ = ["DevboxEnableTunnelParams"]
9
+
10
+
11
+ class DevboxEnableTunnelParams(TypedDict, total=False):
12
+ auth_mode: Optional[Literal["open", "authenticated"]]
13
+ """Authentication mode for the tunnel. Defaults to 'public' if not specified."""
@@ -4,9 +4,10 @@ from typing import Dict, List, Optional
4
4
  from typing_extensions import Literal
5
5
 
6
6
  from .._models import BaseModel
7
+ from .tunnel_view import TunnelView
7
8
  from .shared.launch_parameters import LaunchParameters
8
9
 
9
- __all__ = ["DevboxView", "StateTransition", "GatewaySpecs", "Tunnel"]
10
+ __all__ = ["DevboxView", "StateTransition", "GatewaySpecs"]
10
11
 
11
12
 
12
13
  class StateTransition(BaseModel):
@@ -38,30 +39,6 @@ class GatewaySpecs(BaseModel):
38
39
  """The ID of the secret containing the credential."""
39
40
 
40
41
 
41
- class Tunnel(BaseModel):
42
- """
43
- V2 tunnel information if a tunnel was created at launch time or via the createTunnel API.
44
- """
45
-
46
- auth_mode: Literal["public_", "authenticated"]
47
- """The authentication mode for the tunnel."""
48
-
49
- create_time_ms: int
50
- """Creation time of the tunnel (Unix timestamp milliseconds)."""
51
-
52
- tunnel_key: str
53
- """The encrypted tunnel key used to construct the tunnel URL.
54
-
55
- URL format: https://{port}-{tunnel_key}.tunnel.runloop.{domain}
56
- """
57
-
58
- auth_token: Optional[str] = None
59
- """Bearer token for tunnel authentication.
60
-
61
- Only present when auth_mode is 'authenticated'.
62
- """
63
-
64
-
65
42
  class DevboxView(BaseModel):
66
43
  """A Devbox represents a virtual development environment.
67
44
 
@@ -137,7 +114,7 @@ class DevboxView(BaseModel):
137
114
  Snapshot.
138
115
  """
139
116
 
140
- tunnel: Optional[Tunnel] = None
117
+ tunnel: Optional[TunnelView] = None
141
118
  """
142
119
  V2 tunnel information if a tunnel was created at launch time or via the
143
120
  createTunnel API.
@@ -0,0 +1,34 @@
1
+ # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
2
+
3
+ from typing import Optional
4
+ from typing_extensions import Literal
5
+
6
+ from .._models import BaseModel
7
+
8
+ __all__ = ["TunnelView"]
9
+
10
+
11
+ class TunnelView(BaseModel):
12
+ """A V2 tunnel provides secure HTTP access to services running on a Devbox.
13
+
14
+ Tunnels allow external clients to reach web servers, APIs, or other HTTP services running inside a Devbox without requiring direct network access. Each tunnel is uniquely identified by an encrypted tunnel_key and can be configured for either open (public) or authenticated access.
15
+ Usage: https://{port}-{tunnel_key}.tunnel.runloop.ai
16
+ """
17
+
18
+ auth_mode: Literal["open", "authenticated"]
19
+ """The authentication mode for the tunnel."""
20
+
21
+ create_time_ms: int
22
+ """Creation time of the tunnel (Unix timestamp milliseconds)."""
23
+
24
+ tunnel_key: str
25
+ """The encrypted tunnel key used to construct the tunnel URL.
26
+
27
+ URL format: https://{port}-{tunnel_key}.tunnel.runloop.{domain}
28
+ """
29
+
30
+ auth_token: Optional[str] = None
31
+ """Bearer token for tunnel authentication.
32
+
33
+ Only present when auth_mode is 'authenticated'.
34
+ """
@@ -14,6 +14,7 @@ from tests.utils import assert_matches_type
14
14
  from runloop_api_client import Runloop, AsyncRunloop
15
15
  from runloop_api_client.types import (
16
16
  DevboxView,
17
+ TunnelView,
17
18
  DevboxTunnelView,
18
19
  DevboxSnapshotView,
19
20
  DevboxExecutionDetailView,
@@ -427,6 +428,52 @@ class TestDevboxes:
427
428
  path="path",
428
429
  )
429
430
 
431
+ @parametrize
432
+ def test_method_enable_tunnel(self, client: Runloop) -> None:
433
+ devbox = client.devboxes.enable_tunnel(
434
+ id="id",
435
+ )
436
+ assert_matches_type(TunnelView, devbox, path=["response"])
437
+
438
+ @parametrize
439
+ def test_method_enable_tunnel_with_all_params(self, client: Runloop) -> None:
440
+ devbox = client.devboxes.enable_tunnel(
441
+ id="id",
442
+ auth_mode="open",
443
+ )
444
+ assert_matches_type(TunnelView, devbox, path=["response"])
445
+
446
+ @parametrize
447
+ def test_raw_response_enable_tunnel(self, client: Runloop) -> None:
448
+ response = client.devboxes.with_raw_response.enable_tunnel(
449
+ id="id",
450
+ )
451
+
452
+ assert response.is_closed is True
453
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
454
+ devbox = response.parse()
455
+ assert_matches_type(TunnelView, devbox, path=["response"])
456
+
457
+ @parametrize
458
+ def test_streaming_response_enable_tunnel(self, client: Runloop) -> None:
459
+ with client.devboxes.with_streaming_response.enable_tunnel(
460
+ id="id",
461
+ ) as response:
462
+ assert not response.is_closed
463
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
464
+
465
+ devbox = response.parse()
466
+ assert_matches_type(TunnelView, devbox, path=["response"])
467
+
468
+ assert cast(Any, response.is_closed) is True
469
+
470
+ @parametrize
471
+ def test_path_params_enable_tunnel(self, client: Runloop) -> None:
472
+ with pytest.raises(ValueError, match=r"Expected a non-empty value for `id` but received ''"):
473
+ client.devboxes.with_raw_response.enable_tunnel(
474
+ id="",
475
+ )
476
+
430
477
  @parametrize
431
478
  def test_method_execute(self, client: Runloop) -> None:
432
479
  devbox = client.devboxes.execute(
@@ -1993,6 +2040,52 @@ class TestAsyncDevboxes:
1993
2040
  path="path",
1994
2041
  )
1995
2042
 
2043
+ @parametrize
2044
+ async def test_method_enable_tunnel(self, async_client: AsyncRunloop) -> None:
2045
+ devbox = await async_client.devboxes.enable_tunnel(
2046
+ id="id",
2047
+ )
2048
+ assert_matches_type(TunnelView, devbox, path=["response"])
2049
+
2050
+ @parametrize
2051
+ async def test_method_enable_tunnel_with_all_params(self, async_client: AsyncRunloop) -> None:
2052
+ devbox = await async_client.devboxes.enable_tunnel(
2053
+ id="id",
2054
+ auth_mode="open",
2055
+ )
2056
+ assert_matches_type(TunnelView, devbox, path=["response"])
2057
+
2058
+ @parametrize
2059
+ async def test_raw_response_enable_tunnel(self, async_client: AsyncRunloop) -> None:
2060
+ response = await async_client.devboxes.with_raw_response.enable_tunnel(
2061
+ id="id",
2062
+ )
2063
+
2064
+ assert response.is_closed is True
2065
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
2066
+ devbox = await response.parse()
2067
+ assert_matches_type(TunnelView, devbox, path=["response"])
2068
+
2069
+ @parametrize
2070
+ async def test_streaming_response_enable_tunnel(self, async_client: AsyncRunloop) -> None:
2071
+ async with async_client.devboxes.with_streaming_response.enable_tunnel(
2072
+ id="id",
2073
+ ) as response:
2074
+ assert not response.is_closed
2075
+ assert response.http_request.headers.get("X-Stainless-Lang") == "python"
2076
+
2077
+ devbox = await response.parse()
2078
+ assert_matches_type(TunnelView, devbox, path=["response"])
2079
+
2080
+ assert cast(Any, response.is_closed) is True
2081
+
2082
+ @parametrize
2083
+ async def test_path_params_enable_tunnel(self, async_client: AsyncRunloop) -> None:
2084
+ with pytest.raises(ValueError, match=r"Expected a non-empty value for `id` but received ''"):
2085
+ await async_client.devboxes.with_raw_response.enable_tunnel(
2086
+ id="",
2087
+ )
2088
+
1996
2089
  @parametrize
1997
2090
  async def test_method_execute(self, async_client: AsyncRunloop) -> None:
1998
2091
  devbox = await async_client.devboxes.execute(
@@ -458,6 +458,53 @@ class TestAsyncDevboxNetworking:
458
458
  finally:
459
459
  await devbox.shutdown()
460
460
 
461
+ @pytest.mark.timeout(TWO_MINUTE_TIMEOUT)
462
+ async def test_create_with_tunnel_param(self, async_sdk_client: AsyncRunloopSDK) -> None:
463
+ """Test creating a devbox with tunnel configuration in create params."""
464
+ devbox = await async_sdk_client.devbox.create(
465
+ name=unique_name("sdk-async-devbox-tunnel-param"),
466
+ launch_parameters={"resource_size_request": "SMALL", "keep_alive_time_seconds": 60 * 5},
467
+ tunnel={"auth_mode": "open"},
468
+ )
469
+
470
+ try:
471
+ # Verify devbox is running
472
+ info = await devbox.get_info()
473
+ assert info.status == "running"
474
+
475
+ # Verify tunnel was created at launch
476
+ assert info.tunnel is not None
477
+ assert info.tunnel.tunnel_key is not None
478
+ assert info.tunnel.auth_mode is not None
479
+ finally:
480
+ await devbox.shutdown()
481
+
482
+ @pytest.mark.timeout(TWO_MINUTE_TIMEOUT)
483
+ async def test_enable_tunnel(self, async_sdk_client: AsyncRunloopSDK) -> None:
484
+ """Test enabling a V2 tunnel on an existing devbox."""
485
+ devbox = await async_sdk_client.devbox.create(
486
+ name=unique_name("sdk-async-devbox-enable-tunnel"),
487
+ launch_parameters={"resource_size_request": "SMALL", "keep_alive_time_seconds": 60 * 5},
488
+ )
489
+
490
+ try:
491
+ # Verify no tunnel exists initially
492
+ info = await devbox.get_info()
493
+ assert info.tunnel is None
494
+
495
+ # Enable tunnel using the V2 API via SDK
496
+ tunnel = await devbox.net.enable_tunnel(auth_mode="open")
497
+ assert tunnel is not None
498
+ assert tunnel.tunnel_key is not None
499
+ assert tunnel.auth_mode is not None
500
+
501
+ # Verify tunnel is now present in devbox info
502
+ info = await devbox.get_info()
503
+ assert info.tunnel is not None
504
+ assert info.tunnel.tunnel_key == tunnel.tunnel_key
505
+ finally:
506
+ await devbox.shutdown()
507
+
461
508
 
462
509
  class TestAsyncDevboxCreationMethods:
463
510
  """Test various async devbox creation methods."""