kernel 0.69.0__tar.gz → 0.70.0__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 (346) hide show
  1. kernel-0.70.0/.release-please-manifest.json +3 -0
  2. {kernel-0.69.0 → kernel-0.70.0}/CHANGELOG.md +18 -0
  3. {kernel-0.69.0 → kernel-0.70.0}/PKG-INFO +1 -1
  4. {kernel-0.69.0 → kernel-0.70.0}/api.md +5 -2
  5. {kernel-0.69.0 → kernel-0.70.0}/pyproject.toml +1 -1
  6. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/_version.py +1 -1
  7. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/lib/browser_routing/routing.py +20 -2
  8. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/resources/browser_pools.py +28 -8
  9. kernel-0.70.0/src/kernel/resources/browsers/telemetry.py +403 -0
  10. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/resources/extensions.py +81 -0
  11. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/resources/projects/projects.py +6 -4
  12. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/__init__.py +3 -0
  13. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/browser_pool.py +6 -2
  14. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/browser_pool_acquire_params.py +7 -0
  15. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/browser_pool_create_params.py +6 -2
  16. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/browser_pool_update_params.py +6 -2
  17. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/browsers/__init__.py +3 -0
  18. kernel-0.70.0/src/kernel/types/browsers/telemetry_events_params.py +52 -0
  19. kernel-0.70.0/src/kernel/types/browsers/telemetry_events_response.py +36 -0
  20. kernel-0.70.0/src/kernel/types/browsers/telemetry_stream_params.py +20 -0
  21. kernel-0.70.0/src/kernel/types/extension_get_response.py +30 -0
  22. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/shared/browser_viewport.py +4 -3
  23. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/shared_params/browser_viewport.py +4 -3
  24. kernel-0.70.0/tests/api_resources/browsers/test_telemetry.py +237 -0
  25. {kernel-0.69.0 → kernel-0.70.0}/tests/api_resources/test_browser_pools.py +6 -4
  26. {kernel-0.69.0 → kernel-0.70.0}/tests/api_resources/test_extensions.py +85 -0
  27. {kernel-0.69.0 → kernel-0.70.0}/tests/test_browser_routing.py +47 -2
  28. kernel-0.69.0/.release-please-manifest.json +0 -3
  29. kernel-0.69.0/src/kernel/resources/browsers/telemetry.py +0 -195
  30. kernel-0.69.0/tests/api_resources/browsers/test_telemetry.py +0 -122
  31. {kernel-0.69.0 → kernel-0.70.0}/.gitignore +0 -0
  32. {kernel-0.69.0 → kernel-0.70.0}/CONTRIBUTING.md +0 -0
  33. {kernel-0.69.0 → kernel-0.70.0}/LICENSE +0 -0
  34. {kernel-0.69.0 → kernel-0.70.0}/README.md +0 -0
  35. {kernel-0.69.0 → kernel-0.70.0}/SECURITY.md +0 -0
  36. {kernel-0.69.0 → kernel-0.70.0}/bin/check-release-environment +0 -0
  37. {kernel-0.69.0 → kernel-0.70.0}/bin/publish-pypi +0 -0
  38. {kernel-0.69.0 → kernel-0.70.0}/examples/.keep +0 -0
  39. {kernel-0.69.0 → kernel-0.70.0}/examples/browser_routing.py +0 -0
  40. {kernel-0.69.0 → kernel-0.70.0}/examples/browser_telemetry.py +0 -0
  41. {kernel-0.69.0 → kernel-0.70.0}/noxfile.py +0 -0
  42. {kernel-0.69.0 → kernel-0.70.0}/release-please-config.json +0 -0
  43. {kernel-0.69.0 → kernel-0.70.0}/requirements-dev.lock +0 -0
  44. {kernel-0.69.0 → kernel-0.70.0}/requirements.lock +0 -0
  45. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/__init__.py +0 -0
  46. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/_base_client.py +0 -0
  47. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/_client.py +0 -0
  48. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/_compat.py +0 -0
  49. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/_constants.py +0 -0
  50. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/_exceptions.py +0 -0
  51. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/_files.py +0 -0
  52. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/_models.py +0 -0
  53. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/_qs.py +0 -0
  54. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/_resource.py +0 -0
  55. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/_response.py +0 -0
  56. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/_streaming.py +0 -0
  57. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/_types.py +0 -0
  58. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/_utils/__init__.py +0 -0
  59. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/_utils/_compat.py +0 -0
  60. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/_utils/_datetime_parse.py +0 -0
  61. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/_utils/_json.py +0 -0
  62. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/_utils/_logs.py +0 -0
  63. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/_utils/_path.py +0 -0
  64. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/_utils/_proxy.py +0 -0
  65. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/_utils/_reflection.py +0 -0
  66. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/_utils/_resources_proxy.py +0 -0
  67. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/_utils/_streams.py +0 -0
  68. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/_utils/_sync.py +0 -0
  69. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/_utils/_transform.py +0 -0
  70. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/_utils/_typing.py +0 -0
  71. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/_utils/_utils.py +0 -0
  72. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/app_framework.py +0 -0
  73. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/lib/.keep +0 -0
  74. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/lib/browser_routing/__init__.py +0 -0
  75. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/lib/browser_routing/raw_http.py +0 -0
  76. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/lib/browser_routing/util.py +0 -0
  77. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/pagination.py +0 -0
  78. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/py.typed +0 -0
  79. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/resources/__init__.py +0 -0
  80. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/resources/api_keys.py +0 -0
  81. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/resources/apps.py +0 -0
  82. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/resources/auth/__init__.py +0 -0
  83. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/resources/auth/auth.py +0 -0
  84. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/resources/auth/connections.py +0 -0
  85. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/resources/browsers/__init__.py +0 -0
  86. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/resources/browsers/browsers.py +0 -0
  87. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/resources/browsers/computer.py +0 -0
  88. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/resources/browsers/fs/__init__.py +0 -0
  89. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/resources/browsers/fs/fs.py +0 -0
  90. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/resources/browsers/fs/watch.py +0 -0
  91. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/resources/browsers/logs.py +0 -0
  92. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/resources/browsers/playwright.py +0 -0
  93. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/resources/browsers/process.py +0 -0
  94. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/resources/browsers/replays.py +0 -0
  95. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/resources/credential_providers.py +0 -0
  96. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/resources/credentials.py +0 -0
  97. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/resources/deployments.py +0 -0
  98. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/resources/invocations.py +0 -0
  99. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/resources/organization/__init__.py +0 -0
  100. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/resources/organization/limits.py +0 -0
  101. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/resources/organization/organization.py +0 -0
  102. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/resources/profiles.py +0 -0
  103. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/resources/projects/__init__.py +0 -0
  104. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/resources/projects/limits.py +0 -0
  105. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/resources/proxies.py +0 -0
  106. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/api_key.py +0 -0
  107. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/api_key_create_params.py +0 -0
  108. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/api_key_list_params.py +0 -0
  109. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/api_key_retrieve_params.py +0 -0
  110. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/api_key_rotate_params.py +0 -0
  111. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/api_key_update_params.py +0 -0
  112. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/app_list_params.py +0 -0
  113. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/app_list_response.py +0 -0
  114. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/auth/__init__.py +0 -0
  115. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/auth/connection_create_params.py +0 -0
  116. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/auth/connection_follow_response.py +0 -0
  117. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/auth/connection_list_params.py +0 -0
  118. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/auth/connection_login_params.py +0 -0
  119. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/auth/connection_submit_params.py +0 -0
  120. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/auth/connection_update_params.py +0 -0
  121. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/auth/login_response.py +0 -0
  122. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/auth/managed_auth.py +0 -0
  123. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/auth/submit_fields_response.py +0 -0
  124. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/browser_create_params.py +0 -0
  125. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/browser_create_response.py +0 -0
  126. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/browser_curl_params.py +0 -0
  127. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/browser_curl_response.py +0 -0
  128. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/browser_list_params.py +0 -0
  129. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/browser_list_response.py +0 -0
  130. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/browser_load_extensions_params.py +0 -0
  131. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/browser_pool_acquire_response.py +0 -0
  132. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/browser_pool_delete_params.py +0 -0
  133. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/browser_pool_list_params.py +0 -0
  134. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/browser_pool_ref.py +0 -0
  135. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/browser_pool_release_params.py +0 -0
  136. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/browser_retrieve_params.py +0 -0
  137. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/browser_retrieve_response.py +0 -0
  138. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/browser_update_params.py +0 -0
  139. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/browser_update_response.py +0 -0
  140. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/browser_usage.py +0 -0
  141. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/browsers/browser_api_call_event.py +0 -0
  142. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/browsers/browser_call_stack.py +0 -0
  143. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/browsers/browser_captcha_solve_result_event.py +0 -0
  144. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/browsers/browser_cdp_connect_event.py +0 -0
  145. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/browsers/browser_cdp_disconnect_event.py +0 -0
  146. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/browsers/browser_console_error_event.py +0 -0
  147. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/browsers/browser_console_log_event.py +0 -0
  148. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/browsers/browser_event_context.py +0 -0
  149. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/browsers/browser_event_source.py +0 -0
  150. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/browsers/browser_http_headers.py +0 -0
  151. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/browsers/browser_interaction_click_event.py +0 -0
  152. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/browsers/browser_interaction_key_event.py +0 -0
  153. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/browsers/browser_interaction_scroll_settled_event.py +0 -0
  154. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/browsers/browser_live_view_connect_event.py +0 -0
  155. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/browsers/browser_live_view_disconnect_event.py +0 -0
  156. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/browsers/browser_monitor_disconnected_event.py +0 -0
  157. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/browsers/browser_monitor_init_failed_event.py +0 -0
  158. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/browsers/browser_monitor_reconnect_failed_event.py +0 -0
  159. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/browsers/browser_monitor_reconnected_event.py +0 -0
  160. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/browsers/browser_monitor_screenshot_event.py +0 -0
  161. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/browsers/browser_network_idle_event.py +0 -0
  162. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/browsers/browser_network_loading_failed_event.py +0 -0
  163. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/browsers/browser_network_request_event.py +0 -0
  164. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/browsers/browser_network_response_event.py +0 -0
  165. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/browsers/browser_page_dom_content_loaded_event.py +0 -0
  166. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/browsers/browser_page_layout_settled_event.py +0 -0
  167. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/browsers/browser_page_layout_shift_event.py +0 -0
  168. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/browsers/browser_page_lcp_event.py +0 -0
  169. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/browsers/browser_page_load_event.py +0 -0
  170. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/browsers/browser_page_navigation_event.py +0 -0
  171. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/browsers/browser_page_navigation_settled_event.py +0 -0
  172. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/browsers/browser_page_tab_opened_event.py +0 -0
  173. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/browsers/browser_service_crashed_event.py +0 -0
  174. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/browsers/browser_system_oom_kill_event.py +0 -0
  175. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/browsers/browser_telemetry_categories_config.py +0 -0
  176. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/browsers/browser_telemetry_categories_config_param.py +0 -0
  177. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/browsers/browser_telemetry_category_config.py +0 -0
  178. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/browsers/browser_telemetry_category_config_param.py +0 -0
  179. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/browsers/browser_telemetry_config.py +0 -0
  180. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/browsers/browser_telemetry_event.py +0 -0
  181. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/browsers/computer_batch_params.py +0 -0
  182. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/browsers/computer_capture_screenshot_params.py +0 -0
  183. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/browsers/computer_click_mouse_params.py +0 -0
  184. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/browsers/computer_drag_mouse_params.py +0 -0
  185. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/browsers/computer_get_mouse_position_response.py +0 -0
  186. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/browsers/computer_move_mouse_params.py +0 -0
  187. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/browsers/computer_press_key_params.py +0 -0
  188. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/browsers/computer_read_clipboard_response.py +0 -0
  189. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/browsers/computer_scroll_params.py +0 -0
  190. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/browsers/computer_set_cursor_visibility_params.py +0 -0
  191. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/browsers/computer_set_cursor_visibility_response.py +0 -0
  192. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/browsers/computer_type_text_params.py +0 -0
  193. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/browsers/computer_write_clipboard_params.py +0 -0
  194. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/browsers/f_create_directory_params.py +0 -0
  195. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/browsers/f_delete_directory_params.py +0 -0
  196. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/browsers/f_delete_file_params.py +0 -0
  197. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/browsers/f_download_dir_zip_params.py +0 -0
  198. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/browsers/f_file_info_params.py +0 -0
  199. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/browsers/f_file_info_response.py +0 -0
  200. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/browsers/f_list_files_params.py +0 -0
  201. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/browsers/f_list_files_response.py +0 -0
  202. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/browsers/f_move_params.py +0 -0
  203. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/browsers/f_read_file_params.py +0 -0
  204. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/browsers/f_set_file_permissions_params.py +0 -0
  205. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/browsers/f_upload_params.py +0 -0
  206. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/browsers/f_upload_zip_params.py +0 -0
  207. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/browsers/f_write_file_params.py +0 -0
  208. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/browsers/fs/__init__.py +0 -0
  209. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/browsers/fs/watch_events_response.py +0 -0
  210. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/browsers/fs/watch_start_params.py +0 -0
  211. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/browsers/fs/watch_start_response.py +0 -0
  212. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/browsers/log_stream_params.py +0 -0
  213. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/browsers/playwright_execute_params.py +0 -0
  214. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/browsers/playwright_execute_response.py +0 -0
  215. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/browsers/process_exec_params.py +0 -0
  216. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/browsers/process_exec_response.py +0 -0
  217. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/browsers/process_kill_params.py +0 -0
  218. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/browsers/process_kill_response.py +0 -0
  219. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/browsers/process_resize_params.py +0 -0
  220. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/browsers/process_resize_response.py +0 -0
  221. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/browsers/process_spawn_params.py +0 -0
  222. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/browsers/process_spawn_response.py +0 -0
  223. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/browsers/process_status_response.py +0 -0
  224. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/browsers/process_stdin_params.py +0 -0
  225. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/browsers/process_stdin_response.py +0 -0
  226. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/browsers/process_stdout_stream_response.py +0 -0
  227. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/browsers/replay_list_response.py +0 -0
  228. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/browsers/replay_start_params.py +0 -0
  229. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/browsers/replay_start_response.py +0 -0
  230. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/browsers/telemetry_stream_response.py +0 -0
  231. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/created_api_key.py +0 -0
  232. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/credential.py +0 -0
  233. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/credential_create_params.py +0 -0
  234. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/credential_list_params.py +0 -0
  235. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/credential_provider.py +0 -0
  236. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/credential_provider_create_params.py +0 -0
  237. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/credential_provider_item.py +0 -0
  238. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/credential_provider_list_items_response.py +0 -0
  239. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/credential_provider_list_params.py +0 -0
  240. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/credential_provider_test_result.py +0 -0
  241. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/credential_provider_update_params.py +0 -0
  242. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/credential_totp_code_response.py +0 -0
  243. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/credential_update_params.py +0 -0
  244. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/deployment_create_params.py +0 -0
  245. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/deployment_create_response.py +0 -0
  246. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/deployment_follow_params.py +0 -0
  247. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/deployment_follow_response.py +0 -0
  248. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/deployment_list_params.py +0 -0
  249. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/deployment_list_response.py +0 -0
  250. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/deployment_retrieve_response.py +0 -0
  251. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/deployment_state_event.py +0 -0
  252. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/extension_download_from_chrome_store_params.py +0 -0
  253. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/extension_list_params.py +0 -0
  254. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/extension_list_response.py +0 -0
  255. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/extension_upload_params.py +0 -0
  256. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/extension_upload_response.py +0 -0
  257. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/invocation_create_params.py +0 -0
  258. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/invocation_create_response.py +0 -0
  259. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/invocation_follow_params.py +0 -0
  260. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/invocation_follow_response.py +0 -0
  261. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/invocation_list_browsers_response.py +0 -0
  262. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/invocation_list_params.py +0 -0
  263. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/invocation_list_response.py +0 -0
  264. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/invocation_retrieve_response.py +0 -0
  265. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/invocation_state_event.py +0 -0
  266. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/invocation_update_params.py +0 -0
  267. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/invocation_update_response.py +0 -0
  268. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/organization/__init__.py +0 -0
  269. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/organization/limit_update_params.py +0 -0
  270. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/organization/org_limits.py +0 -0
  271. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/profile.py +0 -0
  272. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/profile_create_params.py +0 -0
  273. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/profile_list_params.py +0 -0
  274. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/project.py +0 -0
  275. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/project_create_params.py +0 -0
  276. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/project_list_params.py +0 -0
  277. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/project_update_params.py +0 -0
  278. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/projects/__init__.py +0 -0
  279. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/projects/limit_update_params.py +0 -0
  280. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/projects/project_limits.py +0 -0
  281. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/proxy_check_params.py +0 -0
  282. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/proxy_check_response.py +0 -0
  283. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/proxy_create_params.py +0 -0
  284. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/proxy_create_response.py +0 -0
  285. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/proxy_list_params.py +0 -0
  286. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/proxy_list_response.py +0 -0
  287. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/proxy_retrieve_response.py +0 -0
  288. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/shared/__init__.py +0 -0
  289. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/shared/app_action.py +0 -0
  290. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/shared/browser_extension.py +0 -0
  291. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/shared/browser_profile.py +0 -0
  292. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/shared/error_detail.py +0 -0
  293. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/shared/error_event.py +0 -0
  294. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/shared/error_model.py +0 -0
  295. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/shared/heartbeat_event.py +0 -0
  296. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/shared/log_event.py +0 -0
  297. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/shared_params/__init__.py +0 -0
  298. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/shared_params/browser_extension.py +0 -0
  299. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/shared_params/browser_profile.py +0 -0
  300. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/tags.py +0 -0
  301. {kernel-0.69.0 → kernel-0.70.0}/src/kernel/types/tags_param.py +0 -0
  302. {kernel-0.69.0 → kernel-0.70.0}/tests/__init__.py +0 -0
  303. {kernel-0.69.0 → kernel-0.70.0}/tests/api_resources/__init__.py +0 -0
  304. {kernel-0.69.0 → kernel-0.70.0}/tests/api_resources/auth/__init__.py +0 -0
  305. {kernel-0.69.0 → kernel-0.70.0}/tests/api_resources/auth/test_connections.py +0 -0
  306. {kernel-0.69.0 → kernel-0.70.0}/tests/api_resources/browsers/__init__.py +0 -0
  307. {kernel-0.69.0 → kernel-0.70.0}/tests/api_resources/browsers/fs/__init__.py +0 -0
  308. {kernel-0.69.0 → kernel-0.70.0}/tests/api_resources/browsers/fs/test_watch.py +0 -0
  309. {kernel-0.69.0 → kernel-0.70.0}/tests/api_resources/browsers/test_computer.py +0 -0
  310. {kernel-0.69.0 → kernel-0.70.0}/tests/api_resources/browsers/test_fs.py +0 -0
  311. {kernel-0.69.0 → kernel-0.70.0}/tests/api_resources/browsers/test_logs.py +0 -0
  312. {kernel-0.69.0 → kernel-0.70.0}/tests/api_resources/browsers/test_playwright.py +0 -0
  313. {kernel-0.69.0 → kernel-0.70.0}/tests/api_resources/browsers/test_process.py +0 -0
  314. {kernel-0.69.0 → kernel-0.70.0}/tests/api_resources/browsers/test_replays.py +0 -0
  315. {kernel-0.69.0 → kernel-0.70.0}/tests/api_resources/organization/__init__.py +0 -0
  316. {kernel-0.69.0 → kernel-0.70.0}/tests/api_resources/organization/test_limits.py +0 -0
  317. {kernel-0.69.0 → kernel-0.70.0}/tests/api_resources/projects/__init__.py +0 -0
  318. {kernel-0.69.0 → kernel-0.70.0}/tests/api_resources/projects/test_limits.py +0 -0
  319. {kernel-0.69.0 → kernel-0.70.0}/tests/api_resources/test_api_keys.py +0 -0
  320. {kernel-0.69.0 → kernel-0.70.0}/tests/api_resources/test_apps.py +0 -0
  321. {kernel-0.69.0 → kernel-0.70.0}/tests/api_resources/test_browsers.py +0 -0
  322. {kernel-0.69.0 → kernel-0.70.0}/tests/api_resources/test_credential_providers.py +0 -0
  323. {kernel-0.69.0 → kernel-0.70.0}/tests/api_resources/test_credentials.py +0 -0
  324. {kernel-0.69.0 → kernel-0.70.0}/tests/api_resources/test_deployments.py +0 -0
  325. {kernel-0.69.0 → kernel-0.70.0}/tests/api_resources/test_invocations.py +0 -0
  326. {kernel-0.69.0 → kernel-0.70.0}/tests/api_resources/test_profiles.py +0 -0
  327. {kernel-0.69.0 → kernel-0.70.0}/tests/api_resources/test_projects.py +0 -0
  328. {kernel-0.69.0 → kernel-0.70.0}/tests/api_resources/test_proxies.py +0 -0
  329. {kernel-0.69.0 → kernel-0.70.0}/tests/conftest.py +0 -0
  330. {kernel-0.69.0 → kernel-0.70.0}/tests/sample_file.txt +0 -0
  331. {kernel-0.69.0 → kernel-0.70.0}/tests/test_client.py +0 -0
  332. {kernel-0.69.0 → kernel-0.70.0}/tests/test_extract_files.py +0 -0
  333. {kernel-0.69.0 → kernel-0.70.0}/tests/test_files.py +0 -0
  334. {kernel-0.69.0 → kernel-0.70.0}/tests/test_models.py +0 -0
  335. {kernel-0.69.0 → kernel-0.70.0}/tests/test_pagination.py +0 -0
  336. {kernel-0.69.0 → kernel-0.70.0}/tests/test_qs.py +0 -0
  337. {kernel-0.69.0 → kernel-0.70.0}/tests/test_required_args.py +0 -0
  338. {kernel-0.69.0 → kernel-0.70.0}/tests/test_response.py +0 -0
  339. {kernel-0.69.0 → kernel-0.70.0}/tests/test_streaming.py +0 -0
  340. {kernel-0.69.0 → kernel-0.70.0}/tests/test_transform.py +0 -0
  341. {kernel-0.69.0 → kernel-0.70.0}/tests/test_utils/test_datetime_parse.py +0 -0
  342. {kernel-0.69.0 → kernel-0.70.0}/tests/test_utils/test_json.py +0 -0
  343. {kernel-0.69.0 → kernel-0.70.0}/tests/test_utils/test_path.py +0 -0
  344. {kernel-0.69.0 → kernel-0.70.0}/tests/test_utils/test_proxy.py +0 -0
  345. {kernel-0.69.0 → kernel-0.70.0}/tests/test_utils/test_typing.py +0 -0
  346. {kernel-0.69.0 → kernel-0.70.0}/tests/utils.py +0 -0
@@ -0,0 +1,3 @@
1
+ {
2
+ ".": "0.70.0"
3
+ }
@@ -1,5 +1,23 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.70.0 (2026-06-24)
4
+
5
+ Full Changelog: [v0.69.0...v0.70.0](https://github.com/kernel/kernel-python-sdk/compare/v0.69.0...v0.70.0)
6
+
7
+ ### Features
8
+
9
+ * Add GET /browsers/{id}/telemetry/events (read from S2) ([57eb393](https://github.com/kernel/kernel-python-sdk/commit/57eb393ea1eb5fb0d2e5211845f338610198a0fd))
10
+ * Align browser-pool timeout/viewport/fill-rate contract with implementation; reject save_changes on update ([4fddd6b](https://github.com/kernel/kernel-python-sdk/commit/4fddd6bb3f2ccb86ec3cc492311d5fe9c061ba49))
11
+ * api: support per-acquire start_url override on browser pool acquire ([3e11311](https://github.com/kernel/kernel-python-sdk/commit/3e11311f835d558c4fa6ab0c0fb8a9c7e3536a13))
12
+ * **api:** add GET /extensions/{id_or_name}/metadata ([681a8fc](https://github.com/kernel/kernel-python-sdk/commit/681a8fcd7d8ec5c3373a66c81fb405a6844308eb))
13
+ * **api:** resolve GET /org/projects/{id} by ID or name ([52eb598](https://github.com/kernel/kernel-python-sdk/commit/52eb598c7bfd6e696f0d510585439ba5658dc161))
14
+ * Forward replay param through telemetry stream passthrough ([a8001d2](https://github.com/kernel/kernel-python-sdk/commit/a8001d239ae583fa177164e1ce900e767797c853))
15
+
16
+
17
+ ### Bug Fixes
18
+
19
+ * don't misroute telemetry/events to the browser VM ([9bcc418](https://github.com/kernel/kernel-python-sdk/commit/9bcc418b4294295c0d8377adfc921c3748d42019))
20
+
3
21
  ## 0.69.0 (2026-06-18)
4
22
 
5
23
  Full Changelog: [v0.68.0...v0.69.0](https://github.com/kernel/kernel-python-sdk/compare/v0.68.0...v0.69.0)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: kernel
3
- Version: 0.69.0
3
+ Version: 0.70.0
4
4
  Summary: The official Python library for the kernel API
5
5
  Project-URL: Homepage, https://github.com/kernel/kernel-python-sdk
6
6
  Project-URL: Repository, https://github.com/kernel/kernel-python-sdk
@@ -146,13 +146,15 @@ from kernel.types.browsers import (
146
146
  BrowserTelemetryCategoryConfig,
147
147
  BrowserTelemetryConfig,
148
148
  BrowserTelemetryEvent,
149
+ TelemetryEventsResponse,
149
150
  TelemetryStreamResponse,
150
151
  )
151
152
  ```
152
153
 
153
154
  Methods:
154
155
 
155
- - <code title="get /browsers/{id}/telemetry/stream">client.browsers.telemetry.<a href="./src/kernel/resources/browsers/telemetry.py">stream</a>(id) -> <a href="./src/kernel/types/browsers/telemetry_stream_response.py">TelemetryStreamResponse</a></code>
156
+ - <code title="get /browsers/{id}/telemetry/events">client.browsers.telemetry.<a href="./src/kernel/resources/browsers/telemetry.py">events</a>(id, \*\*<a href="src/kernel/types/browsers/telemetry_events_params.py">params</a>) -> <a href="./src/kernel/types/browsers/telemetry_events_response.py">SyncOffsetPagination[TelemetryEventsResponse]</a></code>
157
+ - <code title="get /browsers/{id}/telemetry/stream">client.browsers.telemetry.<a href="./src/kernel/resources/browsers/telemetry.py">stream</a>(id, \*\*<a href="src/kernel/types/browsers/telemetry_stream_params.py">params</a>) -> <a href="./src/kernel/types/browsers/telemetry_stream_response.py">TelemetryStreamResponse</a></code>
156
158
 
157
159
  ## Replays
158
160
 
@@ -342,7 +344,7 @@ Methods:
342
344
  Types:
343
345
 
344
346
  ```python
345
- from kernel.types import ExtensionListResponse, ExtensionUploadResponse
347
+ from kernel.types import ExtensionListResponse, ExtensionGetResponse, ExtensionUploadResponse
346
348
  ```
347
349
 
348
350
  Methods:
@@ -351,6 +353,7 @@ Methods:
351
353
  - <code title="delete /extensions/{id_or_name}">client.extensions.<a href="./src/kernel/resources/extensions.py">delete</a>(id_or_name) -> None</code>
352
354
  - <code title="get /extensions/{id_or_name}">client.extensions.<a href="./src/kernel/resources/extensions.py">download</a>(id_or_name) -> BinaryAPIResponse</code>
353
355
  - <code title="get /extensions/from_chrome_store">client.extensions.<a href="./src/kernel/resources/extensions.py">download_from_chrome_store</a>(\*\*<a href="src/kernel/types/extension_download_from_chrome_store_params.py">params</a>) -> BinaryAPIResponse</code>
356
+ - <code title="get /extensions/{id_or_name}/metadata">client.extensions.<a href="./src/kernel/resources/extensions.py">get</a>(id_or_name) -> <a href="./src/kernel/types/extension_get_response.py">ExtensionGetResponse</a></code>
354
357
  - <code title="post /extensions">client.extensions.<a href="./src/kernel/resources/extensions.py">upload</a>(\*\*<a href="src/kernel/types/extension_upload_params.py">params</a>) -> <a href="./src/kernel/types/extension_upload_response.py">ExtensionUploadResponse</a></code>
355
358
 
356
359
  # BrowserPools
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "kernel"
3
- version = "0.69.0"
3
+ version = "0.70.0"
4
4
  description = "The official Python library for the kernel API"
5
5
  dynamic = ["readme"]
6
6
  license = "Apache-2.0"
@@ -1,4 +1,4 @@
1
1
  # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
2
2
 
3
3
  __title__ = "kernel"
4
- __version__ = "0.69.0" # x-release-please-version
4
+ __version__ = "0.70.0" # x-release-please-version
@@ -41,7 +41,10 @@ _BROWSER_POOL_RELEASE_PATH = re.compile(r"^/(?:v\d+/)?browser_pools/[^/]+/releas
41
41
  def browser_routing_config_from_env() -> BrowserRoutingConfig:
42
42
  raw = os.environ.get("KERNEL_BROWSER_ROUTING_SUBRESOURCES")
43
43
  if raw is None:
44
- return BrowserRoutingConfig(subresources=("curl", "telemetry"))
44
+ # Path prefixes eligible for direct-to-VM routing. "telemetry/stream" is
45
+ # the live SSE endpoint (VM); "telemetry/events" is a historical read
46
+ # served by the control plane (S2) and must NOT be here.
47
+ return BrowserRoutingConfig(subresources=("curl", "telemetry/stream"))
45
48
  if raw.strip() == "":
46
49
  return BrowserRoutingConfig()
47
50
 
@@ -188,6 +191,21 @@ def _session_id_from_browser_pool_release_request(request: httpx.Request, path:
188
191
  return normalized or None
189
192
 
190
193
 
194
+ def _matches_direct_vm_prefix(tail: str, prefixes: tuple[str, ...]) -> bool:
195
+ """Whether tail (the path after browsers/{id}/) is covered by an allow prefix,
196
+ matching on segment boundaries: "telemetry/stream" matches "telemetry/stream"
197
+ and "telemetry/stream/...", but not "telemetry/events" or "telemetry/streamfoo".
198
+ Keeps historical control-plane reads (e.g. telemetry/events, served from S2)
199
+ off the VM.
200
+ """
201
+ tail = tail.strip("/")
202
+ for prefix in prefixes:
203
+ prefix = prefix.strip("/")
204
+ if prefix and (tail == prefix or tail.startswith(prefix + "/")):
205
+ return True
206
+ return False
207
+
208
+
191
209
  def rewrite_direct_vm_options(
192
210
  options: FinalRequestOptions,
193
211
  *,
@@ -199,7 +217,7 @@ def rewrite_direct_vm_options(
199
217
  return options
200
218
 
201
219
  session_id, subresource, suffix = match
202
- if subresource not in set(config.subresources):
220
+ if not _matches_direct_vm_prefix(f"{subresource}{suffix}", config.subresources):
203
221
  return options
204
222
 
205
223
  route = cache.get(session_id)
@@ -96,7 +96,9 @@ class BrowserPoolsResource(SyncAPIResource):
96
96
 
97
97
  extensions: List of browser extensions to load into the session. Provide each by id or name.
98
98
 
99
- fill_rate_per_minute: Percentage of the pool to fill per minute. Defaults to 10%.
99
+ fill_rate_per_minute: Percentage of the pool to fill per minute. Defaults to 10. The cap is 25 for
100
+ most organizations but can be raised per-organization, so only the lower bound
101
+ is enforced here.
100
102
 
101
103
  headless: If true, launches the browser using a headless image. Defaults to false.
102
104
 
@@ -122,7 +124,7 @@ class BrowserPoolsResource(SyncAPIResource):
122
124
  mechanisms.
123
125
 
124
126
  timeout_seconds: Default idle timeout in seconds for browsers acquired from this pool before they
125
- are destroyed. Defaults to 600 seconds if not specified
127
+ are destroyed. Defaults to 600 seconds. Minimum 10, maximum 259200 (72 hours).
126
128
 
127
129
  viewport: Initial browser window size in pixels with optional refresh rate. If omitted,
128
130
  image defaults apply (1920x1080@25). For GPU images, the default is
@@ -243,7 +245,9 @@ class BrowserPoolsResource(SyncAPIResource):
243
245
 
244
246
  extensions: List of browser extensions to load into the session. Provide each by id or name.
245
247
 
246
- fill_rate_per_minute: Percentage of the pool to fill per minute. Defaults to 10%.
248
+ fill_rate_per_minute: Percentage of the pool to fill per minute. Defaults to 10. The cap is 25 for
249
+ most organizations but can be raised per-organization, so only the lower bound
250
+ is enforced here.
247
251
 
248
252
  headless: If true, launches the browser using a headless image. Defaults to false.
249
253
 
@@ -273,7 +277,7 @@ class BrowserPoolsResource(SyncAPIResource):
273
277
  mechanisms.
274
278
 
275
279
  timeout_seconds: Default idle timeout in seconds for browsers acquired from this pool before they
276
- are destroyed. Defaults to 600 seconds if not specified
280
+ are destroyed. Defaults to 600 seconds. Minimum 10, maximum 259200 (72 hours).
277
281
 
278
282
  viewport: Initial browser window size in pixels with optional refresh rate. If omitted,
279
283
  image defaults apply (1920x1080@25). For GPU images, the default is
@@ -423,6 +427,7 @@ class BrowserPoolsResource(SyncAPIResource):
423
427
  *,
424
428
  acquire_timeout_seconds: int | Omit = omit,
425
429
  name: str | Omit = omit,
430
+ start_url: str | Omit = omit,
426
431
  tags: TagsParam | Omit = omit,
427
432
  # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
428
433
  # The extra values given here take precedence over values defined on the client or passed to this method.
@@ -448,6 +453,10 @@ class BrowserPoolsResource(SyncAPIResource):
448
453
  project. Applies to this lease only and is cleared when the browser is released
449
454
  back to the pool.
450
455
 
456
+ start_url: Optional URL to navigate the acquired browser to. Overrides the pool's start_url
457
+ for this acquire only. Best-effort: failures to navigate do not fail the
458
+ acquire.
459
+
451
460
  tags: Optional user-defined key-value tags for the acquired browser session, used to
452
461
  find and group sessions later. Applies to this lease only and are cleared when
453
462
  the browser is released back to the pool. Up to 50 pairs.
@@ -468,6 +477,7 @@ class BrowserPoolsResource(SyncAPIResource):
468
477
  {
469
478
  "acquire_timeout_seconds": acquire_timeout_seconds,
470
479
  "name": name,
480
+ "start_url": start_url,
471
481
  "tags": tags,
472
482
  },
473
483
  browser_pool_acquire_params.BrowserPoolAcquireParams,
@@ -621,7 +631,9 @@ class AsyncBrowserPoolsResource(AsyncAPIResource):
621
631
 
622
632
  extensions: List of browser extensions to load into the session. Provide each by id or name.
623
633
 
624
- fill_rate_per_minute: Percentage of the pool to fill per minute. Defaults to 10%.
634
+ fill_rate_per_minute: Percentage of the pool to fill per minute. Defaults to 10. The cap is 25 for
635
+ most organizations but can be raised per-organization, so only the lower bound
636
+ is enforced here.
625
637
 
626
638
  headless: If true, launches the browser using a headless image. Defaults to false.
627
639
 
@@ -647,7 +659,7 @@ class AsyncBrowserPoolsResource(AsyncAPIResource):
647
659
  mechanisms.
648
660
 
649
661
  timeout_seconds: Default idle timeout in seconds for browsers acquired from this pool before they
650
- are destroyed. Defaults to 600 seconds if not specified
662
+ are destroyed. Defaults to 600 seconds. Minimum 10, maximum 259200 (72 hours).
651
663
 
652
664
  viewport: Initial browser window size in pixels with optional refresh rate. If omitted,
653
665
  image defaults apply (1920x1080@25). For GPU images, the default is
@@ -768,7 +780,9 @@ class AsyncBrowserPoolsResource(AsyncAPIResource):
768
780
 
769
781
  extensions: List of browser extensions to load into the session. Provide each by id or name.
770
782
 
771
- fill_rate_per_minute: Percentage of the pool to fill per minute. Defaults to 10%.
783
+ fill_rate_per_minute: Percentage of the pool to fill per minute. Defaults to 10. The cap is 25 for
784
+ most organizations but can be raised per-organization, so only the lower bound
785
+ is enforced here.
772
786
 
773
787
  headless: If true, launches the browser using a headless image. Defaults to false.
774
788
 
@@ -798,7 +812,7 @@ class AsyncBrowserPoolsResource(AsyncAPIResource):
798
812
  mechanisms.
799
813
 
800
814
  timeout_seconds: Default idle timeout in seconds for browsers acquired from this pool before they
801
- are destroyed. Defaults to 600 seconds if not specified
815
+ are destroyed. Defaults to 600 seconds. Minimum 10, maximum 259200 (72 hours).
802
816
 
803
817
  viewport: Initial browser window size in pixels with optional refresh rate. If omitted,
804
818
  image defaults apply (1920x1080@25). For GPU images, the default is
@@ -948,6 +962,7 @@ class AsyncBrowserPoolsResource(AsyncAPIResource):
948
962
  *,
949
963
  acquire_timeout_seconds: int | Omit = omit,
950
964
  name: str | Omit = omit,
965
+ start_url: str | Omit = omit,
951
966
  tags: TagsParam | Omit = omit,
952
967
  # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
953
968
  # The extra values given here take precedence over values defined on the client or passed to this method.
@@ -973,6 +988,10 @@ class AsyncBrowserPoolsResource(AsyncAPIResource):
973
988
  project. Applies to this lease only and is cleared when the browser is released
974
989
  back to the pool.
975
990
 
991
+ start_url: Optional URL to navigate the acquired browser to. Overrides the pool's start_url
992
+ for this acquire only. Best-effort: failures to navigate do not fail the
993
+ acquire.
994
+
976
995
  tags: Optional user-defined key-value tags for the acquired browser session, used to
977
996
  find and group sessions later. Applies to this lease only and are cleared when
978
997
  the browser is released back to the pool. Up to 50 pairs.
@@ -993,6 +1012,7 @@ class AsyncBrowserPoolsResource(AsyncAPIResource):
993
1012
  {
994
1013
  "acquire_timeout_seconds": acquire_timeout_seconds,
995
1014
  "name": name,
1015
+ "start_url": start_url,
996
1016
  "tags": tags,
997
1017
  },
998
1018
  browser_pool_acquire_params.BrowserPoolAcquireParams,
@@ -0,0 +1,403 @@
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 List
6
+ from typing_extensions import Literal
7
+
8
+ import httpx
9
+
10
+ from ..._types import Body, Omit, Query, Headers, NotGiven, omit, not_given
11
+ from ..._utils import path_template, maybe_transform, strip_not_given, async_maybe_transform
12
+ from ..._compat import cached_property
13
+ from ..._resource import SyncAPIResource, AsyncAPIResource
14
+ from ..._response import (
15
+ to_raw_response_wrapper,
16
+ to_streamed_response_wrapper,
17
+ async_to_raw_response_wrapper,
18
+ async_to_streamed_response_wrapper,
19
+ )
20
+ from ..._streaming import Stream, AsyncStream
21
+ from ...pagination import SyncOffsetPagination, AsyncOffsetPagination
22
+ from ..._base_client import AsyncPaginator, make_request_options
23
+ from ...types.browsers import telemetry_events_params, telemetry_stream_params
24
+ from ...types.browsers.telemetry_events_response import TelemetryEventsResponse
25
+ from ...types.browsers.telemetry_stream_response import TelemetryStreamResponse
26
+
27
+ __all__ = ["TelemetryResource", "AsyncTelemetryResource"]
28
+
29
+
30
+ class TelemetryResource(SyncAPIResource):
31
+ """Stream live telemetry events from a browser session."""
32
+
33
+ @cached_property
34
+ def with_raw_response(self) -> TelemetryResourceWithRawResponse:
35
+ """
36
+ This property can be used as a prefix for any HTTP method call to return
37
+ the raw response object instead of the parsed content.
38
+
39
+ For more information, see https://www.github.com/kernel/kernel-python-sdk#accessing-raw-response-data-eg-headers
40
+ """
41
+ return TelemetryResourceWithRawResponse(self)
42
+
43
+ @cached_property
44
+ def with_streaming_response(self) -> TelemetryResourceWithStreamingResponse:
45
+ """
46
+ An alternative to `.with_raw_response` that doesn't eagerly read the response body.
47
+
48
+ For more information, see https://www.github.com/kernel/kernel-python-sdk#with_streaming_response
49
+ """
50
+ return TelemetryResourceWithStreamingResponse(self)
51
+
52
+ def events(
53
+ self,
54
+ id: str,
55
+ *,
56
+ category: List[
57
+ Literal[
58
+ "console",
59
+ "network",
60
+ "page",
61
+ "interaction",
62
+ "control",
63
+ "connection",
64
+ "system",
65
+ "screenshot",
66
+ "captcha",
67
+ "monitor",
68
+ ]
69
+ ]
70
+ | Omit = omit,
71
+ limit: int | Omit = omit,
72
+ offset: int | Omit = omit,
73
+ since: str | Omit = omit,
74
+ until: str | Omit = omit,
75
+ # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
76
+ # The extra values given here take precedence over values defined on the client or passed to this method.
77
+ extra_headers: Headers | None = None,
78
+ extra_query: Query | None = None,
79
+ extra_body: Body | None = None,
80
+ timeout: float | httpx.Timeout | None | NotGiven = not_given,
81
+ ) -> SyncOffsetPagination[TelemetryEventsResponse]:
82
+ """
83
+ Reads a page of telemetry events for the browser session in ascending sequence
84
+ order. To page through results, pass the X-Next-Offset value from the previous
85
+ response as offset and repeat while X-Has-More is true. Returns an empty list
86
+ when telemetry data is unavailable.
87
+
88
+ Args:
89
+ category: Restrict results to these event categories. Repeat the parameter for multiple
90
+ values.
91
+
92
+ limit: Maximum number of events per page. Defaults to 20.
93
+
94
+ offset: Opaque pagination cursor: pass the X-Next-Offset value from the previous
95
+ response to fetch the next page. When set, paging continues from this cursor and
96
+ since is ignored, while until still bounds the page. It is not an event's seq
97
+ field, so do not derive it from the response body.
98
+
99
+ since: Start of the window: an RFC-3339 timestamp, or a duration like 5m meaning that
100
+ long ago. Defaults to 5m. Ignored when offset is set.
101
+
102
+ until: End of the window (exclusive): an RFC-3339 timestamp, or a duration like 5m
103
+ meaning that long ago.
104
+
105
+ extra_headers: Send extra headers
106
+
107
+ extra_query: Add additional query parameters to the request
108
+
109
+ extra_body: Add additional JSON properties to the request
110
+
111
+ timeout: Override the client-level default timeout for this request, in seconds
112
+ """
113
+ if not id:
114
+ raise ValueError(f"Expected a non-empty value for `id` but received {id!r}")
115
+ return self._get_api_list(
116
+ path_template("/browsers/{id}/telemetry/events", id=id),
117
+ page=SyncOffsetPagination[TelemetryEventsResponse],
118
+ options=make_request_options(
119
+ extra_headers=extra_headers,
120
+ extra_query=extra_query,
121
+ extra_body=extra_body,
122
+ timeout=timeout,
123
+ query=maybe_transform(
124
+ {
125
+ "category": category,
126
+ "limit": limit,
127
+ "offset": offset,
128
+ "since": since,
129
+ "until": until,
130
+ },
131
+ telemetry_events_params.TelemetryEventsParams,
132
+ ),
133
+ ),
134
+ model=TelemetryEventsResponse,
135
+ )
136
+
137
+ def stream(
138
+ self,
139
+ id: str,
140
+ *,
141
+ replay: str | Omit = omit,
142
+ last_event_id: str | Omit = omit,
143
+ # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
144
+ # The extra values given here take precedence over values defined on the client or passed to this method.
145
+ extra_headers: Headers | None = None,
146
+ extra_query: Query | None = None,
147
+ extra_body: Body | None = None,
148
+ timeout: float | httpx.Timeout | None | NotGiven = not_given,
149
+ ) -> Stream[TelemetryStreamResponse]:
150
+ """Streams browser telemetry events as a server-sent events (SSE) stream.
151
+
152
+ The
153
+ stream closes when the browser session terminates. Each event frame includes an
154
+ id: field containing a monotonically increasing sequence number; pass it as
155
+ Last-Event-ID on reconnect to resume without gaps. The event: field is never
156
+ set; all frames carry JSON in the data: field. A keepalive comment frame is sent
157
+ every 15 seconds when no events arrive. Returns 404 if the browser session does
158
+ not exist. If telemetry was not enabled on the session, the stream opens but no
159
+ events are delivered. Fresh connections only see new events; pass replay=all to
160
+ start from the oldest retained event instead.
161
+
162
+ Args:
163
+ replay: Pass `all` to start from the oldest retained event instead of only new events;
164
+ any other value is treated as from-now. The buffer is bounded, so the first
165
+ event id may be greater than 1 if older events were evicted.
166
+
167
+ extra_headers: Send extra headers
168
+
169
+ extra_query: Add additional query parameters to the request
170
+
171
+ extra_body: Add additional JSON properties to the request
172
+
173
+ timeout: Override the client-level default timeout for this request, in seconds
174
+ """
175
+ if not id:
176
+ raise ValueError(f"Expected a non-empty value for `id` but received {id!r}")
177
+ extra_headers = {"Accept": "text/event-stream", **(extra_headers or {})}
178
+ extra_headers = {**strip_not_given({"Last-Event-ID": last_event_id}), **(extra_headers or {})}
179
+ return self._get(
180
+ path_template("/browsers/{id}/telemetry/stream", id=id),
181
+ options=make_request_options(
182
+ extra_headers=extra_headers,
183
+ extra_query=extra_query,
184
+ extra_body=extra_body,
185
+ timeout=timeout,
186
+ query=maybe_transform({"replay": replay}, telemetry_stream_params.TelemetryStreamParams),
187
+ ),
188
+ cast_to=TelemetryStreamResponse,
189
+ stream=True,
190
+ stream_cls=Stream[TelemetryStreamResponse],
191
+ )
192
+
193
+
194
+ class AsyncTelemetryResource(AsyncAPIResource):
195
+ """Stream live telemetry events from a browser session."""
196
+
197
+ @cached_property
198
+ def with_raw_response(self) -> AsyncTelemetryResourceWithRawResponse:
199
+ """
200
+ This property can be used as a prefix for any HTTP method call to return
201
+ the raw response object instead of the parsed content.
202
+
203
+ For more information, see https://www.github.com/kernel/kernel-python-sdk#accessing-raw-response-data-eg-headers
204
+ """
205
+ return AsyncTelemetryResourceWithRawResponse(self)
206
+
207
+ @cached_property
208
+ def with_streaming_response(self) -> AsyncTelemetryResourceWithStreamingResponse:
209
+ """
210
+ An alternative to `.with_raw_response` that doesn't eagerly read the response body.
211
+
212
+ For more information, see https://www.github.com/kernel/kernel-python-sdk#with_streaming_response
213
+ """
214
+ return AsyncTelemetryResourceWithStreamingResponse(self)
215
+
216
+ def events(
217
+ self,
218
+ id: str,
219
+ *,
220
+ category: List[
221
+ Literal[
222
+ "console",
223
+ "network",
224
+ "page",
225
+ "interaction",
226
+ "control",
227
+ "connection",
228
+ "system",
229
+ "screenshot",
230
+ "captcha",
231
+ "monitor",
232
+ ]
233
+ ]
234
+ | Omit = omit,
235
+ limit: int | Omit = omit,
236
+ offset: int | Omit = omit,
237
+ since: str | Omit = omit,
238
+ until: str | Omit = omit,
239
+ # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
240
+ # The extra values given here take precedence over values defined on the client or passed to this method.
241
+ extra_headers: Headers | None = None,
242
+ extra_query: Query | None = None,
243
+ extra_body: Body | None = None,
244
+ timeout: float | httpx.Timeout | None | NotGiven = not_given,
245
+ ) -> AsyncPaginator[TelemetryEventsResponse, AsyncOffsetPagination[TelemetryEventsResponse]]:
246
+ """
247
+ Reads a page of telemetry events for the browser session in ascending sequence
248
+ order. To page through results, pass the X-Next-Offset value from the previous
249
+ response as offset and repeat while X-Has-More is true. Returns an empty list
250
+ when telemetry data is unavailable.
251
+
252
+ Args:
253
+ category: Restrict results to these event categories. Repeat the parameter for multiple
254
+ values.
255
+
256
+ limit: Maximum number of events per page. Defaults to 20.
257
+
258
+ offset: Opaque pagination cursor: pass the X-Next-Offset value from the previous
259
+ response to fetch the next page. When set, paging continues from this cursor and
260
+ since is ignored, while until still bounds the page. It is not an event's seq
261
+ field, so do not derive it from the response body.
262
+
263
+ since: Start of the window: an RFC-3339 timestamp, or a duration like 5m meaning that
264
+ long ago. Defaults to 5m. Ignored when offset is set.
265
+
266
+ until: End of the window (exclusive): an RFC-3339 timestamp, or a duration like 5m
267
+ meaning that long ago.
268
+
269
+ extra_headers: Send extra headers
270
+
271
+ extra_query: Add additional query parameters to the request
272
+
273
+ extra_body: Add additional JSON properties to the request
274
+
275
+ timeout: Override the client-level default timeout for this request, in seconds
276
+ """
277
+ if not id:
278
+ raise ValueError(f"Expected a non-empty value for `id` but received {id!r}")
279
+ return self._get_api_list(
280
+ path_template("/browsers/{id}/telemetry/events", id=id),
281
+ page=AsyncOffsetPagination[TelemetryEventsResponse],
282
+ options=make_request_options(
283
+ extra_headers=extra_headers,
284
+ extra_query=extra_query,
285
+ extra_body=extra_body,
286
+ timeout=timeout,
287
+ query=maybe_transform(
288
+ {
289
+ "category": category,
290
+ "limit": limit,
291
+ "offset": offset,
292
+ "since": since,
293
+ "until": until,
294
+ },
295
+ telemetry_events_params.TelemetryEventsParams,
296
+ ),
297
+ ),
298
+ model=TelemetryEventsResponse,
299
+ )
300
+
301
+ async def stream(
302
+ self,
303
+ id: str,
304
+ *,
305
+ replay: str | Omit = omit,
306
+ last_event_id: str | Omit = omit,
307
+ # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
308
+ # The extra values given here take precedence over values defined on the client or passed to this method.
309
+ extra_headers: Headers | None = None,
310
+ extra_query: Query | None = None,
311
+ extra_body: Body | None = None,
312
+ timeout: float | httpx.Timeout | None | NotGiven = not_given,
313
+ ) -> AsyncStream[TelemetryStreamResponse]:
314
+ """Streams browser telemetry events as a server-sent events (SSE) stream.
315
+
316
+ The
317
+ stream closes when the browser session terminates. Each event frame includes an
318
+ id: field containing a monotonically increasing sequence number; pass it as
319
+ Last-Event-ID on reconnect to resume without gaps. The event: field is never
320
+ set; all frames carry JSON in the data: field. A keepalive comment frame is sent
321
+ every 15 seconds when no events arrive. Returns 404 if the browser session does
322
+ not exist. If telemetry was not enabled on the session, the stream opens but no
323
+ events are delivered. Fresh connections only see new events; pass replay=all to
324
+ start from the oldest retained event instead.
325
+
326
+ Args:
327
+ replay: Pass `all` to start from the oldest retained event instead of only new events;
328
+ any other value is treated as from-now. The buffer is bounded, so the first
329
+ event id may be greater than 1 if older events were evicted.
330
+
331
+ extra_headers: Send extra headers
332
+
333
+ extra_query: Add additional query parameters to the request
334
+
335
+ extra_body: Add additional JSON properties to the request
336
+
337
+ timeout: Override the client-level default timeout for this request, in seconds
338
+ """
339
+ if not id:
340
+ raise ValueError(f"Expected a non-empty value for `id` but received {id!r}")
341
+ extra_headers = {"Accept": "text/event-stream", **(extra_headers or {})}
342
+ extra_headers = {**strip_not_given({"Last-Event-ID": last_event_id}), **(extra_headers or {})}
343
+ return await self._get(
344
+ path_template("/browsers/{id}/telemetry/stream", id=id),
345
+ options=make_request_options(
346
+ extra_headers=extra_headers,
347
+ extra_query=extra_query,
348
+ extra_body=extra_body,
349
+ timeout=timeout,
350
+ query=await async_maybe_transform({"replay": replay}, telemetry_stream_params.TelemetryStreamParams),
351
+ ),
352
+ cast_to=TelemetryStreamResponse,
353
+ stream=True,
354
+ stream_cls=AsyncStream[TelemetryStreamResponse],
355
+ )
356
+
357
+
358
+ class TelemetryResourceWithRawResponse:
359
+ def __init__(self, telemetry: TelemetryResource) -> None:
360
+ self._telemetry = telemetry
361
+
362
+ self.events = to_raw_response_wrapper(
363
+ telemetry.events,
364
+ )
365
+ self.stream = to_raw_response_wrapper(
366
+ telemetry.stream,
367
+ )
368
+
369
+
370
+ class AsyncTelemetryResourceWithRawResponse:
371
+ def __init__(self, telemetry: AsyncTelemetryResource) -> None:
372
+ self._telemetry = telemetry
373
+
374
+ self.events = async_to_raw_response_wrapper(
375
+ telemetry.events,
376
+ )
377
+ self.stream = async_to_raw_response_wrapper(
378
+ telemetry.stream,
379
+ )
380
+
381
+
382
+ class TelemetryResourceWithStreamingResponse:
383
+ def __init__(self, telemetry: TelemetryResource) -> None:
384
+ self._telemetry = telemetry
385
+
386
+ self.events = to_streamed_response_wrapper(
387
+ telemetry.events,
388
+ )
389
+ self.stream = to_streamed_response_wrapper(
390
+ telemetry.stream,
391
+ )
392
+
393
+
394
+ class AsyncTelemetryResourceWithStreamingResponse:
395
+ def __init__(self, telemetry: AsyncTelemetryResource) -> None:
396
+ self._telemetry = telemetry
397
+
398
+ self.events = async_to_streamed_response_wrapper(
399
+ telemetry.events,
400
+ )
401
+ self.stream = async_to_streamed_response_wrapper(
402
+ telemetry.stream,
403
+ )