runloop-api-client 0.48.0__tar.gz → 0.48.2__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 (290) hide show
  1. runloop_api_client-0.48.2/.release-please-manifest.json +3 -0
  2. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/CHANGELOG.md +22 -0
  3. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/PKG-INFO +8 -5
  4. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/README.md +6 -4
  5. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/pyproject.toml +5 -1
  6. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/requirements-dev.lock +2 -2
  7. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/requirements.lock +2 -2
  8. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/_models.py +8 -5
  9. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/_version.py +1 -1
  10. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/lib/polling.py +17 -18
  11. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/resources/devboxes/devboxes.py +31 -56
  12. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/resources/devboxes/executions.py +54 -37
  13. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/resources/scenarios/scenarios.py +0 -4
  14. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/tests/api_resources/devboxes/test_executions.py +339 -0
  15. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/tests/api_resources/devboxes/test_lsp.py +8 -0
  16. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/tests/api_resources/test_devboxes.py +281 -0
  17. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/tests/conftest.py +29 -0
  18. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/tests/test_models.py +45 -0
  19. runloop_api_client-0.48.2/tests/test_polling.py +262 -0
  20. runloop_api_client-0.48.2/uv.lock +1500 -0
  21. runloop_api_client-0.48.0/.release-please-manifest.json +0 -3
  22. runloop_api_client-0.48.0/uv.lock +0 -295
  23. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/.gitignore +0 -0
  24. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/CONTRIBUTING.md +0 -0
  25. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/LICENSE +0 -0
  26. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/SECURITY.md +0 -0
  27. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/api.md +0 -0
  28. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/bin/check-release-environment +0 -0
  29. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/bin/publish-pypi +0 -0
  30. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/examples/.keep +0 -0
  31. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/mypy.ini +0 -0
  32. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/noxfile.py +0 -0
  33. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/release-please-config.json +0 -0
  34. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop/lib/.keep +0 -0
  35. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/__init__.py +0 -0
  36. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/_base_client.py +0 -0
  37. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/_client.py +0 -0
  38. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/_compat.py +0 -0
  39. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/_constants.py +0 -0
  40. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/_exceptions.py +0 -0
  41. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/_files.py +0 -0
  42. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/_qs.py +0 -0
  43. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/_resource.py +0 -0
  44. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/_response.py +0 -0
  45. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/_streaming.py +0 -0
  46. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/_types.py +0 -0
  47. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/_utils/__init__.py +0 -0
  48. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/_utils/_logs.py +0 -0
  49. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/_utils/_proxy.py +0 -0
  50. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/_utils/_reflection.py +0 -0
  51. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/_utils/_resources_proxy.py +0 -0
  52. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/_utils/_streams.py +0 -0
  53. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/_utils/_sync.py +0 -0
  54. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/_utils/_transform.py +0 -0
  55. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/_utils/_typing.py +0 -0
  56. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/_utils/_utils.py +0 -0
  57. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/lib/.keep +0 -0
  58. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/lib/polling_async.py +0 -0
  59. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/pagination.py +0 -0
  60. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/py.typed +0 -0
  61. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/resources/__init__.py +0 -0
  62. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/resources/benchmarks/__init__.py +0 -0
  63. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/resources/benchmarks/benchmarks.py +0 -0
  64. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/resources/benchmarks/runs.py +0 -0
  65. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/resources/blueprints.py +0 -0
  66. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/resources/devboxes/__init__.py +0 -0
  67. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/resources/devboxes/browsers.py +0 -0
  68. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/resources/devboxes/computers.py +0 -0
  69. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/resources/devboxes/disk_snapshots.py +0 -0
  70. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/resources/devboxes/logs.py +0 -0
  71. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/resources/devboxes/lsp.py +0 -0
  72. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/resources/repositories.py +0 -0
  73. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/resources/scenarios/__init__.py +0 -0
  74. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/resources/scenarios/runs.py +0 -0
  75. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/resources/scenarios/scorers.py +0 -0
  76. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/resources/secrets.py +0 -0
  77. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/__init__.py +0 -0
  78. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/benchmark_create_params.py +0 -0
  79. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/benchmark_definitions_params.py +0 -0
  80. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/benchmark_list_params.py +0 -0
  81. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/benchmark_list_public_params.py +0 -0
  82. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/benchmark_run_list_view.py +0 -0
  83. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/benchmark_run_view.py +0 -0
  84. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/benchmark_start_run_params.py +0 -0
  85. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/benchmark_update_params.py +0 -0
  86. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/benchmark_view.py +0 -0
  87. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/benchmarks/__init__.py +0 -0
  88. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/benchmarks/run_list_params.py +0 -0
  89. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/benchmarks/run_list_scenario_runs_params.py +0 -0
  90. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/blueprint_build_log.py +0 -0
  91. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/blueprint_build_logs_list_view.py +0 -0
  92. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/blueprint_build_parameters.py +0 -0
  93. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/blueprint_create_params.py +0 -0
  94. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/blueprint_list_params.py +0 -0
  95. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/blueprint_list_view.py +0 -0
  96. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/blueprint_preview_params.py +0 -0
  97. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/blueprint_preview_view.py +0 -0
  98. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/blueprint_view.py +0 -0
  99. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/devbox_async_execution_detail_view.py +0 -0
  100. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/devbox_create_params.py +0 -0
  101. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/devbox_create_ssh_key_response.py +0 -0
  102. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/devbox_create_tunnel_params.py +0 -0
  103. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/devbox_download_file_params.py +0 -0
  104. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/devbox_execute_async_params.py +0 -0
  105. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/devbox_execute_sync_params.py +0 -0
  106. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/devbox_execution_detail_view.py +0 -0
  107. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/devbox_list_disk_snapshots_params.py +0 -0
  108. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/devbox_list_params.py +0 -0
  109. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/devbox_list_view.py +0 -0
  110. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/devbox_read_file_contents_params.py +0 -0
  111. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/devbox_read_file_contents_response.py +0 -0
  112. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/devbox_remove_tunnel_params.py +0 -0
  113. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/devbox_snapshot_disk_async_params.py +0 -0
  114. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/devbox_snapshot_disk_params.py +0 -0
  115. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/devbox_snapshot_list_view.py +0 -0
  116. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/devbox_snapshot_view.py +0 -0
  117. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/devbox_tunnel_view.py +0 -0
  118. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/devbox_update_params.py +0 -0
  119. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/devbox_upload_file_params.py +0 -0
  120. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/devbox_view.py +0 -0
  121. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/devbox_write_file_contents_params.py +0 -0
  122. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/devboxes/__init__.py +0 -0
  123. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/devboxes/base_code_action.py +0 -0
  124. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/devboxes/base_command.py +0 -0
  125. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/devboxes/base_command_param.py +0 -0
  126. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/devboxes/base_diagnostic.py +0 -0
  127. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/devboxes/base_diagnostic_param.py +0 -0
  128. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/devboxes/base_location.py +0 -0
  129. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/devboxes/base_markup_content.py +0 -0
  130. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/devboxes/base_parameter_information.py +0 -0
  131. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/devboxes/base_range.py +0 -0
  132. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/devboxes/base_range_param.py +0 -0
  133. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/devboxes/base_signature.py +0 -0
  134. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/devboxes/base_workspace_edit.py +0 -0
  135. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/devboxes/base_workspace_edit_param.py +0 -0
  136. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/devboxes/browser_create_params.py +0 -0
  137. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/devboxes/browser_view.py +0 -0
  138. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/devboxes/code_action_application_result.py +0 -0
  139. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/devboxes/code_action_context_param.py +0 -0
  140. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/devboxes/code_action_kind.py +0 -0
  141. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/devboxes/code_action_trigger_kind.py +0 -0
  142. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/devboxes/code_actions_response.py +0 -0
  143. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/devboxes/code_description_param.py +0 -0
  144. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/devboxes/code_segment_info_response.py +0 -0
  145. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/devboxes/computer_create_params.py +0 -0
  146. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/devboxes/computer_keyboard_interaction_params.py +0 -0
  147. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/devboxes/computer_keyboard_interaction_response.py +0 -0
  148. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/devboxes/computer_mouse_interaction_params.py +0 -0
  149. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/devboxes/computer_mouse_interaction_response.py +0 -0
  150. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/devboxes/computer_screen_interaction_params.py +0 -0
  151. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/devboxes/computer_screen_interaction_response.py +0 -0
  152. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/devboxes/computer_view.py +0 -0
  153. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/devboxes/devbox_logs_list_view.py +0 -0
  154. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/devboxes/devbox_snapshot_async_status_view.py +0 -0
  155. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/devboxes/diagnostic_param.py +0 -0
  156. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/devboxes/diagnostic_related_information_param.py +0 -0
  157. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/devboxes/diagnostic_severity.py +0 -0
  158. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/devboxes/diagnostic_tag.py +0 -0
  159. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/devboxes/diagnostics_response.py +0 -0
  160. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/devboxes/disk_snapshot_list_params.py +0 -0
  161. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/devboxes/disk_snapshot_update_params.py +0 -0
  162. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/devboxes/document_symbol.py +0 -0
  163. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/devboxes/document_symbol_response.py +0 -0
  164. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/devboxes/document_uri.py +0 -0
  165. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/devboxes/execution_execute_async_params.py +0 -0
  166. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/devboxes/execution_execute_sync_params.py +0 -0
  167. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/devboxes/execution_retrieve_params.py +0 -0
  168. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/devboxes/file_contents_response.py +0 -0
  169. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/devboxes/file_definition_response.py +0 -0
  170. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/devboxes/file_path.py +0 -0
  171. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/devboxes/file_uri.py +0 -0
  172. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/devboxes/formatting_response.py +0 -0
  173. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/devboxes/health_status_response.py +0 -0
  174. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/devboxes/integer.py +0 -0
  175. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/devboxes/l_sp_any_param.py +0 -0
  176. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/devboxes/location_param.py +0 -0
  177. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/devboxes/log_list_params.py +0 -0
  178. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/devboxes/lsp_apply_code_action_params.py +0 -0
  179. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/devboxes/lsp_code_actions_params.py +0 -0
  180. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/devboxes/lsp_diagnostics_params.py +0 -0
  181. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/devboxes/lsp_document_symbols_params.py +0 -0
  182. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/devboxes/lsp_file_definition_params.py +0 -0
  183. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/devboxes/lsp_file_params.py +0 -0
  184. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/devboxes/lsp_files_response.py +0 -0
  185. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/devboxes/lsp_formatting_params.py +0 -0
  186. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/devboxes/lsp_get_code_actions_for_diagnostic_params.py +0 -0
  187. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/devboxes/lsp_get_code_actions_for_diagnostic_response.py +0 -0
  188. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/devboxes/lsp_get_code_segment_info_params.py +0 -0
  189. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/devboxes/lsp_get_signature_help_params.py +0 -0
  190. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/devboxes/lsp_references_params.py +0 -0
  191. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/devboxes/lsp_set_watch_directory_params.py +0 -0
  192. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/devboxes/lsp_set_watch_directory_response.py +0 -0
  193. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/devboxes/position.py +0 -0
  194. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/devboxes/position_param.py +0 -0
  195. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/devboxes/range.py +0 -0
  196. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/devboxes/range_param.py +0 -0
  197. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/devboxes/record_string_text_edit_array.py +0 -0
  198. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/devboxes/record_string_text_edit_array_param.py +0 -0
  199. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/devboxes/references_response.py +0 -0
  200. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/devboxes/signature_help_response.py +0 -0
  201. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/devboxes/symbol_kind.py +0 -0
  202. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/devboxes/symbol_tag.py +0 -0
  203. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/devboxes/symbol_type.py +0 -0
  204. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/devboxes/text_edit.py +0 -0
  205. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/devboxes/text_edit_param.py +0 -0
  206. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/devboxes/u_ri.py +0 -0
  207. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/devboxes/uinteger.py +0 -0
  208. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/devboxes/watched_file_response.py +0 -0
  209. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/input_context.py +0 -0
  210. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/input_context_param.py +0 -0
  211. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/input_context_update_param.py +0 -0
  212. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/repository_connection_list_view.py +0 -0
  213. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/repository_connection_view.py +0 -0
  214. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/repository_create_params.py +0 -0
  215. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/repository_inspection_details.py +0 -0
  216. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/repository_inspection_list_view.py +0 -0
  217. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/repository_list_params.py +0 -0
  218. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/repository_manifest_view.py +0 -0
  219. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/repository_refresh_params.py +0 -0
  220. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/scenario_create_params.py +0 -0
  221. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/scenario_definition_list_view.py +0 -0
  222. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/scenario_environment.py +0 -0
  223. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/scenario_environment_param.py +0 -0
  224. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/scenario_list_params.py +0 -0
  225. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/scenario_list_public_params.py +0 -0
  226. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/scenario_run_list_view.py +0 -0
  227. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/scenario_run_view.py +0 -0
  228. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/scenario_start_run_params.py +0 -0
  229. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/scenario_update_params.py +0 -0
  230. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/scenario_view.py +0 -0
  231. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/scenarios/__init__.py +0 -0
  232. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/scenarios/run_list_params.py +0 -0
  233. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/scenarios/scorer_create_params.py +0 -0
  234. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/scenarios/scorer_create_response.py +0 -0
  235. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/scenarios/scorer_list_params.py +0 -0
  236. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/scenarios/scorer_list_response.py +0 -0
  237. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/scenarios/scorer_retrieve_response.py +0 -0
  238. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/scenarios/scorer_update_params.py +0 -0
  239. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/scenarios/scorer_update_response.py +0 -0
  240. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/scenarios/scorer_validate_params.py +0 -0
  241. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/scenarios/scorer_validate_response.py +0 -0
  242. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/scoring_contract.py +0 -0
  243. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/scoring_contract_param.py +0 -0
  244. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/scoring_contract_result_view.py +0 -0
  245. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/scoring_contract_update_param.py +0 -0
  246. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/scoring_function.py +0 -0
  247. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/scoring_function_param.py +0 -0
  248. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/scoring_function_result_view.py +0 -0
  249. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/secret_create_params.py +0 -0
  250. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/secret_list_view.py +0 -0
  251. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/secret_update_params.py +0 -0
  252. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/secret_view.py +0 -0
  253. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/shared/__init__.py +0 -0
  254. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/shared/after_idle.py +0 -0
  255. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/shared/code_mount_parameters.py +0 -0
  256. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/shared/launch_parameters.py +0 -0
  257. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/shared_params/__init__.py +0 -0
  258. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/shared_params/after_idle.py +0 -0
  259. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/shared_params/code_mount_parameters.py +0 -0
  260. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/src/runloop_api_client/types/shared_params/launch_parameters.py +0 -0
  261. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/tests/__init__.py +0 -0
  262. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/tests/api_resources/__init__.py +0 -0
  263. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/tests/api_resources/benchmarks/__init__.py +0 -0
  264. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/tests/api_resources/benchmarks/test_runs.py +0 -0
  265. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/tests/api_resources/devboxes/__init__.py +0 -0
  266. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/tests/api_resources/devboxes/test_browsers.py +0 -0
  267. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/tests/api_resources/devboxes/test_computers.py +0 -0
  268. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/tests/api_resources/devboxes/test_disk_snapshots.py +0 -0
  269. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/tests/api_resources/devboxes/test_logs.py +0 -0
  270. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/tests/api_resources/scenarios/__init__.py +0 -0
  271. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/tests/api_resources/scenarios/test_runs.py +0 -0
  272. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/tests/api_resources/scenarios/test_scorers.py +0 -0
  273. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/tests/api_resources/test_benchmarks.py +0 -0
  274. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/tests/api_resources/test_blueprints.py +0 -0
  275. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/tests/api_resources/test_repositories.py +0 -0
  276. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/tests/api_resources/test_scenarios.py +0 -0
  277. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/tests/api_resources/test_secrets.py +0 -0
  278. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/tests/sample_file.txt +0 -0
  279. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/tests/test_client.py +0 -0
  280. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/tests/test_deepcopy.py +0 -0
  281. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/tests/test_extract_files.py +0 -0
  282. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/tests/test_files.py +0 -0
  283. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/tests/test_qs.py +0 -0
  284. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/tests/test_required_args.py +0 -0
  285. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/tests/test_response.py +0 -0
  286. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/tests/test_streaming.py +0 -0
  287. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/tests/test_transform.py +0 -0
  288. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/tests/test_utils/test_proxy.py +0 -0
  289. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/tests/test_utils/test_typing.py +0 -0
  290. {runloop_api_client-0.48.0 → runloop_api_client-0.48.2}/tests/utils.py +0 -0
@@ -0,0 +1,3 @@
1
+ {
2
+ ".": "0.48.2"
3
+ }
@@ -1,5 +1,27 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.48.2 (2025-07-11)
4
+
5
+ Full Changelog: [v0.48.1...v0.48.2](https://github.com/runloopai/api-client-python/compare/v0.48.1...v0.48.2)
6
+
7
+ ### Chores
8
+
9
+ * **readme:** fix version rendering on pypi ([73af53e](https://github.com/runloopai/api-client-python/commit/73af53e19889262ac445fc0789999873c411c35a))
10
+
11
+ ## 0.48.1 (2025-07-10)
12
+
13
+ Full Changelog: [v0.48.0...v0.48.1](https://github.com/runloopai/api-client-python/compare/v0.48.0...v0.48.1)
14
+
15
+ ### Bug Fixes
16
+
17
+ * **parsing:** correctly handle nested discriminated unions ([3312be9](https://github.com/runloopai/api-client-python/commit/3312be9e751dd58396884644be4ceabbaba11014))
18
+
19
+
20
+ ### Chores
21
+
22
+ * **internal:** bump pinned h11 dep ([80ff87c](https://github.com/runloopai/api-client-python/commit/80ff87cde91eedd2169bd3b3e563545291928cbd))
23
+ * **package:** mark python 3.13 as supported ([7043864](https://github.com/runloopai/api-client-python/commit/70438649e40206746ea1543fc6c29b3c9fb47bd3))
24
+
3
25
  ## 0.48.0 (2025-07-09)
4
26
 
5
27
  Full Changelog: [v0.47.1...v0.48.0](https://github.com/runloopai/api-client-python/compare/v0.47.1...v0.48.0)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: runloop_api_client
3
- Version: 0.48.0
3
+ Version: 0.48.2
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
@@ -18,6 +18,7 @@ Classifier: Programming Language :: Python :: 3.9
18
18
  Classifier: Programming Language :: Python :: 3.10
19
19
  Classifier: Programming Language :: Python :: 3.11
20
20
  Classifier: Programming Language :: Python :: 3.12
21
+ Classifier: Programming Language :: Python :: 3.13
21
22
  Classifier: Topic :: Software Development :: Libraries :: Python Modules
22
23
  Classifier: Typing :: Typed
23
24
  Requires-Python: >=3.8
@@ -34,7 +35,8 @@ Description-Content-Type: text/markdown
34
35
 
35
36
  # Runloop Python API library
36
37
 
37
- [![PyPI version](https://github.com/runloopai/api-client-python/tree/main/<https://img.shields.io/pypi/v/runloop_api_client.svg?label=pypi%20(stable)>)](https://pypi.org/project/runloop_api_client/)
38
+ <!-- prettier-ignore -->
39
+ [![PyPI version](https://img.shields.io/pypi/v/runloop_api_client.svg?label=pypi%20(stable))](https://pypi.org/project/runloop_api_client/)
38
40
 
39
41
  The Runloop Python library provides convenient access to the Runloop REST API from any Python 3.8+
40
42
  application. The library includes type definitions for all request params and response fields,
@@ -281,7 +283,8 @@ Error codes are as follows:
281
283
 
282
284
  Certain errors are automatically retried 5 times by default, with a short exponential backoff.
283
285
  Connection errors (for example, due to a network connectivity problem), 408 Request Timeout, 409 Conflict,
284
- 429 Rate Limit, and >=500 Internal errors are all retried by default.
286
+ 429 Rate Limit, and >=500 Internal errors are all retried by default for GET requests. For POST requests, only
287
+ 429 errors will be retried.
285
288
 
286
289
  You can use the `max_retries` option to configure or disable retry settings:
287
290
 
@@ -290,12 +293,12 @@ from runloop_api_client import Runloop
290
293
 
291
294
  # Configure the default for all requests:
292
295
  client = Runloop(
293
- # default is 2
296
+ # default is 5
294
297
  max_retries=0,
295
298
  )
296
299
 
297
300
  # Or, configure per-request:
298
- client.with_options(max_retries=5).devboxes.create()
301
+ client.with_options(max_retries=10).devboxes.create()
299
302
  ```
300
303
 
301
304
  ### Timeouts
@@ -1,6 +1,7 @@
1
1
  # Runloop Python API library
2
2
 
3
- [![PyPI version](<https://img.shields.io/pypi/v/runloop_api_client.svg?label=pypi%20(stable)>)](https://pypi.org/project/runloop_api_client/)
3
+ <!-- prettier-ignore -->
4
+ [![PyPI version](https://img.shields.io/pypi/v/runloop_api_client.svg?label=pypi%20(stable))](https://pypi.org/project/runloop_api_client/)
4
5
 
5
6
  The Runloop Python library provides convenient access to the Runloop REST API from any Python 3.8+
6
7
  application. The library includes type definitions for all request params and response fields,
@@ -247,7 +248,8 @@ Error codes are as follows:
247
248
 
248
249
  Certain errors are automatically retried 5 times by default, with a short exponential backoff.
249
250
  Connection errors (for example, due to a network connectivity problem), 408 Request Timeout, 409 Conflict,
250
- 429 Rate Limit, and >=500 Internal errors are all retried by default.
251
+ 429 Rate Limit, and >=500 Internal errors are all retried by default for GET requests. For POST requests, only
252
+ 429 errors will be retried.
251
253
 
252
254
  You can use the `max_retries` option to configure or disable retry settings:
253
255
 
@@ -256,12 +258,12 @@ from runloop_api_client import Runloop
256
258
 
257
259
  # Configure the default for all requests:
258
260
  client = Runloop(
259
- # default is 2
261
+ # default is 5
260
262
  max_retries=0,
261
263
  )
262
264
 
263
265
  # Or, configure per-request:
264
- client.with_options(max_retries=5).devboxes.create()
266
+ client.with_options(max_retries=10).devboxes.create()
265
267
  ```
266
268
 
267
269
  ### Timeouts
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "runloop_api_client"
3
- version = "0.48.0"
3
+ version = "0.48.2"
4
4
  description = "The official Python library for the runloop API"
5
5
  dynamic = ["readme"]
6
6
  license = "MIT"
@@ -24,6 +24,7 @@ classifiers = [
24
24
  "Programming Language :: Python :: 3.10",
25
25
  "Programming Language :: Python :: 3.11",
26
26
  "Programming Language :: Python :: 3.12",
27
+ "Programming Language :: Python :: 3.13",
27
28
  "Operating System :: OS Independent",
28
29
  "Operating System :: POSIX",
29
30
  "Operating System :: MacOS",
@@ -135,6 +136,9 @@ asyncio_default_fixture_loop_scope = "session"
135
136
  filterwarnings = [
136
137
  "error"
137
138
  ]
139
+ markers = [
140
+ "skip_if_strict: skip test if using strict validation (for prism mock server issues)"
141
+ ]
138
142
 
139
143
  [tool.pyright]
140
144
  # this enables practically every flag given by pyright.
@@ -48,9 +48,9 @@ filelock==3.12.4
48
48
  frozenlist==1.6.2
49
49
  # via aiohttp
50
50
  # via aiosignal
51
- h11==0.14.0
51
+ h11==0.16.0
52
52
  # via httpcore
53
- httpcore==1.0.2
53
+ httpcore==1.0.9
54
54
  # via httpx
55
55
  httpx==0.28.1
56
56
  # via httpx-aiohttp
@@ -36,9 +36,9 @@ exceptiongroup==1.2.2
36
36
  frozenlist==1.6.2
37
37
  # via aiohttp
38
38
  # via aiosignal
39
- h11==0.14.0
39
+ h11==0.16.0
40
40
  # via httpcore
41
- httpcore==1.0.2
41
+ httpcore==1.0.9
42
42
  # via httpx
43
43
  httpx==0.28.1
44
44
  # via httpx-aiohttp
@@ -2,9 +2,10 @@ from __future__ import annotations
2
2
 
3
3
  import os
4
4
  import inspect
5
- from typing import TYPE_CHECKING, Any, Type, Union, Generic, TypeVar, Callable, cast
5
+ from typing import TYPE_CHECKING, Any, Type, Union, Generic, TypeVar, Callable, Optional, cast
6
6
  from datetime import date, datetime
7
7
  from typing_extensions import (
8
+ List,
8
9
  Unpack,
9
10
  Literal,
10
11
  ClassVar,
@@ -366,7 +367,7 @@ def _construct_field(value: object, field: FieldInfo, key: str) -> object:
366
367
  if type_ is None:
367
368
  raise RuntimeError(f"Unexpected field type is None for {key}")
368
369
 
369
- return construct_type(value=value, type_=type_)
370
+ return construct_type(value=value, type_=type_, metadata=getattr(field, "metadata", None))
370
371
 
371
372
 
372
373
  def is_basemodel(type_: type) -> bool:
@@ -420,7 +421,7 @@ def construct_type_unchecked(*, value: object, type_: type[_T]) -> _T:
420
421
  return cast(_T, construct_type(value=value, type_=type_))
421
422
 
422
423
 
423
- def construct_type(*, value: object, type_: object) -> object:
424
+ def construct_type(*, value: object, type_: object, metadata: Optional[List[Any]] = None) -> object:
424
425
  """Loose coercion to the expected type with construction of nested values.
425
426
 
426
427
  If the given value does not match the expected type then it is returned as-is.
@@ -438,8 +439,10 @@ def construct_type(*, value: object, type_: object) -> object:
438
439
  type_ = type_.__value__ # type: ignore[unreachable]
439
440
 
440
441
  # unwrap `Annotated[T, ...]` -> `T`
441
- if is_annotated_type(type_):
442
- meta: tuple[Any, ...] = get_args(type_)[1:]
442
+ if metadata is not None:
443
+ meta: tuple[Any, ...] = tuple(metadata)
444
+ elif is_annotated_type(type_):
445
+ meta = get_args(type_)[1:]
443
446
  type_ = extract_type_arg(type_, 0)
444
447
  else:
445
448
  meta = tuple()
@@ -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__ = "0.48.0" # x-release-please-version
4
+ __version__ = "0.48.2" # x-release-please-version
@@ -2,21 +2,26 @@ import time
2
2
  from typing import Any, TypeVar, Callable, Optional
3
3
  from dataclasses import dataclass
4
4
 
5
- T = TypeVar('T')
5
+ T = TypeVar("T")
6
+
6
7
 
7
8
  @dataclass
8
9
  class PollingConfig:
9
10
  """Configuration for polling behavior"""
11
+
10
12
  interval_seconds: float = 1.0
11
13
  max_attempts: int = 120
12
14
  timeout_seconds: Optional[float] = None
13
15
 
16
+
14
17
  class PollingTimeout(Exception):
15
18
  """Raised when polling exceeds max attempts or timeout"""
19
+
16
20
  def __init__(self, message: str, last_value: Any):
17
21
  self.last_value = last_value
18
22
  super().__init__(f"{message}. Last retrieved value: {last_value}")
19
23
 
24
+
20
25
  def poll_until(
21
26
  retriever: Callable[[], T],
22
27
  is_terminal: Callable[[T], bool],
@@ -25,27 +30,27 @@ def poll_until(
25
30
  ) -> T:
26
31
  """
27
32
  Poll until a condition is met or timeout/max attempts are reached.
28
-
33
+
29
34
  Args:
30
35
  retriever: Callable that returns the object to check
31
36
  is_terminal: Callable that returns True when polling should stop
32
37
  config: Optional polling configuration
33
38
  on_error: Optional error handler that can return a value to continue polling
34
39
  or re-raise the exception to stop polling
35
-
40
+
36
41
  Returns:
37
42
  The final state of the polled object
38
-
43
+
39
44
  Raises:
40
45
  PollingTimeout: When max attempts or timeout is reached
41
46
  """
42
47
  if config is None:
43
48
  config = PollingConfig()
44
-
49
+
45
50
  attempts = 0
46
51
  start_time = time.time()
47
52
  last_result = None
48
-
53
+
49
54
  while True:
50
55
  try:
51
56
  last_result = retriever()
@@ -54,23 +59,17 @@ def poll_until(
54
59
  last_result = on_error(e)
55
60
  else:
56
61
  raise
57
-
62
+
58
63
  if is_terminal(last_result):
59
64
  return last_result
60
-
65
+
61
66
  attempts += 1
62
67
  if attempts >= config.max_attempts:
63
- raise PollingTimeout(
64
- f"Exceeded maximum attempts ({config.max_attempts})",
65
- last_result
66
- )
67
-
68
+ raise PollingTimeout(f"Exceeded maximum attempts ({config.max_attempts})", last_result)
69
+
68
70
  if config.timeout_seconds is not None:
69
71
  elapsed = time.time() - start_time
70
72
  if elapsed >= config.timeout_seconds:
71
- raise PollingTimeout(
72
- f"Exceeded timeout of {config.timeout_seconds} seconds",
73
- last_result
74
- )
75
-
73
+ raise PollingTimeout(f"Exceeded timeout of {config.timeout_seconds} seconds", last_result)
74
+
76
75
  time.sleep(config.interval_seconds)
@@ -88,7 +88,7 @@ from ...pagination import (
88
88
  SyncDiskSnapshotsCursorIDPage,
89
89
  AsyncDiskSnapshotsCursorIDPage,
90
90
  )
91
- from ..._exceptions import RunloopError, APIStatusError
91
+ from ..._exceptions import RunloopError, APIStatusError, APITimeoutError
92
92
  from ...lib.polling import PollingConfig, poll_until
93
93
  from ..._base_client import AsyncPaginator, make_request_options
94
94
  from .disk_snapshots import (
@@ -115,6 +115,18 @@ __all__ = ["DevboxesResource", "AsyncDevboxesResource"]
115
115
  DEVBOX_BOOTING_STATES = frozenset(("provisioning", "initializing"))
116
116
 
117
117
 
118
+ def placeholder_devbox_view(id: str) -> DevboxView:
119
+ return DevboxView(
120
+ id=id,
121
+ status="provisioning",
122
+ capabilities=[],
123
+ create_time_ms=0,
124
+ launch_parameters=SharedLaunchParameters(),
125
+ metadata={},
126
+ state_transitions=[],
127
+ )
128
+
129
+
118
130
  class DevboxesResource(SyncAPIResource):
119
131
  @cached_property
120
132
  def disk_snapshots(self) -> DiskSnapshotsResource:
@@ -360,13 +372,8 @@ class DevboxesResource(SyncAPIResource):
360
372
  self,
361
373
  id: str,
362
374
  *,
375
+ # Use polling_config to configure the "long" polling behavior.
363
376
  polling_config: PollingConfig | None = None,
364
- # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
365
- # The extra values given here take precedence over values defined on the client or passed to this method.
366
- extra_headers: Headers | None = None,
367
- extra_query: Query | None = None,
368
- extra_body: Body | None = None,
369
- timeout: float | httpx.Timeout | None | NotGiven = NOT_GIVEN,
370
377
  ) -> DevboxView:
371
378
  """Wait for a devbox to be in running state.
372
379
 
@@ -392,28 +399,19 @@ class DevboxesResource(SyncAPIResource):
392
399
  return self._post(
393
400
  f"/v1/devboxes/{id}/wait_for_status",
394
401
  body={"statuses": ["running", "failure"]},
395
- options=make_request_options(
396
- extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
397
- ),
398
402
  cast_to=DevboxView,
399
403
  )
400
404
 
401
405
  def handle_timeout_error(error: Exception) -> DevboxView:
402
- # Handle 408 timeout errors by returning current devbox state to continue polling
403
- if isinstance(error, APIStatusError) and error.response.status_code == 408:
406
+ # Handle timeout errors by returning current devbox state to continue polling
407
+ if isinstance(error, APITimeoutError) or (
408
+ isinstance(error, APIStatusError) and error.response.status_code == 408
409
+ ):
404
410
  # Return a placeholder result to continue polling
405
- return DevboxView(
406
- id=id,
407
- status="provisioning",
408
- capabilities=[],
409
- create_time_ms=0,
410
- launch_parameters=SharedLaunchParameters(),
411
- metadata={},
412
- state_transitions=[],
413
- )
414
- else:
415
- # Re-raise other errors to stop polling
416
- raise error
411
+ return placeholder_devbox_view(id)
412
+
413
+ # Re-raise other errors to stop polling
414
+ raise error
417
415
 
418
416
  def is_done_booting(devbox: DevboxView) -> bool:
419
417
  return devbox.status not in DEVBOX_BOOTING_STATES
@@ -495,10 +493,6 @@ class DevboxesResource(SyncAPIResource):
495
493
  return self.await_running(
496
494
  devbox.id,
497
495
  polling_config=polling_config,
498
- extra_headers=extra_headers,
499
- extra_query=extra_query,
500
- extra_body=extra_body,
501
- timeout=timeout,
502
496
  )
503
497
 
504
498
  def list(
@@ -1662,23 +1656,14 @@ class AsyncDevboxesResource(AsyncAPIResource):
1662
1656
  return await self.await_running(
1663
1657
  devbox.id,
1664
1658
  polling_config=polling_config,
1665
- extra_headers=extra_headers,
1666
- extra_query=extra_query,
1667
- extra_body=extra_body,
1668
- timeout=timeout,
1669
1659
  )
1670
1660
 
1671
1661
  async def await_running(
1672
1662
  self,
1673
1663
  id: str,
1674
1664
  *,
1665
+ # Use polling_config to configure the "long" polling behavior.
1675
1666
  polling_config: PollingConfig | None = None,
1676
- # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
1677
- # The extra values given here take precedence over values defined on the client or passed to this method.
1678
- extra_headers: Headers | None = None,
1679
- extra_query: Query | None = None,
1680
- extra_body: Body | None = None,
1681
- timeout: float | httpx.Timeout | None | NotGiven = NOT_GIVEN,
1682
1667
  ) -> DevboxView:
1683
1668
  """Wait for a devbox to be in running state.
1684
1669
 
@@ -1705,26 +1690,16 @@ class AsyncDevboxesResource(AsyncAPIResource):
1705
1690
  return await self._post(
1706
1691
  f"/v1/devboxes/{id}/wait_for_status",
1707
1692
  body={"statuses": ["running", "failure"]},
1708
- options=make_request_options(
1709
- extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
1710
- ),
1711
1693
  cast_to=DevboxView,
1712
1694
  )
1713
- except APIStatusError as error:
1714
- if error.response.status_code == 408:
1715
- # Handle 408 timeout errors by returning a placeholder result to continue polling
1716
- return DevboxView(
1717
- id=id,
1718
- status="provisioning",
1719
- capabilities=[],
1720
- create_time_ms=0,
1721
- launch_parameters=SharedLaunchParameters(),
1722
- metadata={},
1723
- state_transitions=[],
1724
- )
1725
- else:
1726
- # Re-raise other errors to stop polling
1727
- raise
1695
+ except (APITimeoutError, APIStatusError) as error:
1696
+ # Handle timeout errors by returning current devbox state to continue polling
1697
+ if isinstance(error, APITimeoutError) or error.response.status_code == 408:
1698
+ # Return a placeholder result to continue polling
1699
+ return placeholder_devbox_view(id)
1700
+
1701
+ # Re-raise other errors to stop polling
1702
+ raise
1728
1703
 
1729
1704
  def is_done_booting(devbox: DevboxView) -> bool:
1730
1705
  return devbox.status not in DEVBOX_BOOTING_STATES
@@ -17,6 +17,7 @@ from ..._response import (
17
17
  async_to_streamed_response_wrapper,
18
18
  )
19
19
  from ..._constants import DEFAULT_TIMEOUT
20
+ from ..._exceptions import APIStatusError, APITimeoutError
20
21
  from ...lib.polling import PollingConfig, poll_until
21
22
  from ..._base_client import make_request_options
22
23
  from ...types.devboxes import execution_retrieve_params, execution_execute_sync_params, execution_execute_async_params
@@ -27,6 +28,16 @@ from ...types.devbox_async_execution_detail_view import DevboxAsyncExecutionDeta
27
28
  __all__ = ["ExecutionsResource", "AsyncExecutionsResource"]
28
29
 
29
30
 
31
+ def placeholder_execution_detail_view(devbox_id: str, execution_id: str) -> DevboxAsyncExecutionDetailView:
32
+ return DevboxAsyncExecutionDetailView(
33
+ devbox_id=devbox_id,
34
+ execution_id=execution_id,
35
+ status="queued",
36
+ stdout="",
37
+ stderr="",
38
+ )
39
+
40
+
30
41
  class ExecutionsResource(SyncAPIResource):
31
42
  @cached_property
32
43
  def with_raw_response(self) -> ExecutionsResourceWithRawResponse:
@@ -96,16 +107,11 @@ class ExecutionsResource(SyncAPIResource):
96
107
  execution_id: str,
97
108
  devbox_id: str,
98
109
  *,
99
- config: PollingConfig | None = None,
100
- # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
101
- # The extra values given here take precedence over values defined on the client or passed to this method.
102
- extra_headers: Headers | None = None,
103
- extra_query: Query | None = None,
104
- extra_body: Body | None = None,
105
- timeout: float | httpx.Timeout | None | NotGiven = NOT_GIVEN,
110
+ # Use polling_config to configure the "long" polling behavior.
111
+ polling_config: PollingConfig | None = None,
106
112
  ) -> DevboxAsyncExecutionDetailView:
107
113
  """Wait for an execution to complete.
108
-
114
+
109
115
  Args:
110
116
  execution_id: The ID of the execution to wait for
111
117
  id: The ID of the devbox
@@ -121,20 +127,30 @@ class ExecutionsResource(SyncAPIResource):
121
127
  Raises:
122
128
  PollingTimeout: If polling times out before execution completes
123
129
  """
124
- def retrieve_execution() -> DevboxAsyncExecutionDetailView:
125
- return self.retrieve(
126
- execution_id,
127
- devbox_id=devbox_id,
128
- extra_headers=extra_headers,
129
- extra_query=extra_query,
130
- extra_body=extra_body,
131
- timeout=timeout
130
+
131
+ def wait_for_execution_status() -> DevboxAsyncExecutionDetailView:
132
+ # This wait_for_status endpoint polls the execution status for 60 seconds until it reaches either completed.
133
+ return self._post(
134
+ f"/v1/devboxes/{devbox_id}/executions/{execution_id}/wait_for_status",
135
+ body={"statuses": ["completed"]},
136
+ cast_to=DevboxAsyncExecutionDetailView,
132
137
  )
133
138
 
139
+ def handle_timeout_error(error: Exception) -> DevboxAsyncExecutionDetailView:
140
+ # Handle timeout errors by returning current execution state to continue polling
141
+ if isinstance(error, APITimeoutError) or (
142
+ isinstance(error, APIStatusError) and error.response.status_code == 408
143
+ ):
144
+ # Return a placeholder result to continue polling
145
+ return placeholder_execution_detail_view(devbox_id, execution_id)
146
+ else:
147
+ # Re-raise other errors to stop polling
148
+ raise error
149
+
134
150
  def is_done(execution: DevboxAsyncExecutionDetailView) -> bool:
135
- return execution.status == 'completed'
151
+ return execution.status == "completed"
136
152
 
137
- return poll_until(retrieve_execution, is_done, config)
153
+ return poll_until(wait_for_execution_status, is_done, polling_config, handle_timeout_error)
138
154
 
139
155
  def execute_async(
140
156
  self,
@@ -369,19 +385,14 @@ class AsyncExecutionsResource(AsyncAPIResource):
369
385
 
370
386
  async def await_completed(
371
387
  self,
372
- execution_id: str,
388
+ execution_id: str,
373
389
  *,
374
390
  devbox_id: str,
391
+ # Use polling_config to configure the "long" polling behavior.
375
392
  polling_config: PollingConfig | None = None,
376
- # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
377
- # The extra values given here take precedence over values defined on the client or passed to this method.
378
- extra_headers: Headers | None = None,
379
- extra_query: Query | None = None,
380
- extra_body: Body | None = None,
381
- timeout: float | httpx.Timeout | None | NotGiven = NOT_GIVEN,
382
393
  ) -> DevboxAsyncExecutionDetailView:
383
394
  """Wait for an execution to complete.
384
-
395
+
385
396
  Args:
386
397
  execution_id: The ID of the execution to wait for
387
398
  id: The ID of the devbox
@@ -397,20 +408,26 @@ class AsyncExecutionsResource(AsyncAPIResource):
397
408
  Raises:
398
409
  PollingTimeout: If polling times out before execution completes
399
410
  """
400
- async def retrieve_execution() -> DevboxAsyncExecutionDetailView:
401
- return await self.retrieve(
402
- execution_id,
403
- devbox_id=devbox_id,
404
- extra_headers=extra_headers,
405
- extra_query=extra_query,
406
- extra_body=extra_body,
407
- timeout=timeout,
408
- )
411
+
412
+ async def wait_for_execution_status() -> DevboxAsyncExecutionDetailView:
413
+ try:
414
+ return await self._post(
415
+ f"/v1/devboxes/{devbox_id}/executions/{execution_id}/wait_for_status",
416
+ body={"statuses": ["completed"]},
417
+ cast_to=DevboxAsyncExecutionDetailView,
418
+ )
419
+ except (APITimeoutError, APIStatusError) as error:
420
+ # Handle timeout errors by returning placeholder to continue polling
421
+ if isinstance(error, APITimeoutError) or error.response.status_code == 408:
422
+ return placeholder_execution_detail_view(devbox_id, execution_id)
423
+
424
+ # Re-raise other errors to stop polling
425
+ raise
409
426
 
410
427
  def is_done(execution: DevboxAsyncExecutionDetailView) -> bool:
411
- return execution.status == 'completed'
428
+ return execution.status == "completed"
412
429
 
413
- return await async_poll_until(retrieve_execution, is_done, polling_config)
430
+ return await async_poll_until(wait_for_execution_status, is_done, polling_config)
414
431
 
415
432
  async def execute_async(
416
433
  self,
@@ -471,10 +471,6 @@ class ScenariosResource(SyncAPIResource):
471
471
  self._client.devboxes.await_running(
472
472
  run.devbox_id,
473
473
  polling_config=polling_config,
474
- extra_headers=extra_headers,
475
- extra_query=extra_query,
476
- extra_body=extra_body,
477
- timeout=timeout,
478
474
  )
479
475
 
480
476
  return run