kernel 0.80.0__tar.gz → 0.82.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 (357) hide show
  1. kernel-0.82.0/.release-please-manifest.json +3 -0
  2. {kernel-0.80.0 → kernel-0.82.0}/CHANGELOG.md +18 -0
  3. {kernel-0.80.0 → kernel-0.82.0}/PKG-INFO +1 -1
  4. {kernel-0.80.0 → kernel-0.82.0}/api.md +1 -1
  5. {kernel-0.80.0 → kernel-0.82.0}/pyproject.toml +1 -1
  6. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/__init__.py +8 -0
  7. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/_version.py +1 -1
  8. kernel-0.82.0/src/kernel/lib/audit_log_download.py +232 -0
  9. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/resources/audit_logs.py +116 -1
  10. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/resources/profiles.py +33 -7
  11. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/resources/projects/projects.py +4 -4
  12. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/__init__.py +1 -0
  13. kernel-0.82.0/src/kernel/types/profile_download_params.py +15 -0
  14. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/project_create_params.py +1 -1
  15. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/project_update_params.py +1 -1
  16. {kernel-0.80.0 → kernel-0.82.0}/tests/api_resources/test_profiles.py +37 -9
  17. {kernel-0.80.0 → kernel-0.82.0}/tests/api_resources/test_projects.py +2 -2
  18. kernel-0.82.0/tests/test_audit_log_download.py +409 -0
  19. kernel-0.80.0/.release-please-manifest.json +0 -3
  20. {kernel-0.80.0 → kernel-0.82.0}/.gitignore +0 -0
  21. {kernel-0.80.0 → kernel-0.82.0}/CONTRIBUTING.md +0 -0
  22. {kernel-0.80.0 → kernel-0.82.0}/LICENSE +0 -0
  23. {kernel-0.80.0 → kernel-0.82.0}/README.md +0 -0
  24. {kernel-0.80.0 → kernel-0.82.0}/SECURITY.md +0 -0
  25. {kernel-0.80.0 → kernel-0.82.0}/bin/check-release-environment +0 -0
  26. {kernel-0.80.0 → kernel-0.82.0}/bin/publish-pypi +0 -0
  27. {kernel-0.80.0 → kernel-0.82.0}/examples/.keep +0 -0
  28. {kernel-0.80.0 → kernel-0.82.0}/examples/browser_routing.py +0 -0
  29. {kernel-0.80.0 → kernel-0.82.0}/examples/browser_telemetry.py +0 -0
  30. {kernel-0.80.0 → kernel-0.82.0}/noxfile.py +0 -0
  31. {kernel-0.80.0 → kernel-0.82.0}/release-please-config.json +0 -0
  32. {kernel-0.80.0 → kernel-0.82.0}/requirements-dev.lock +0 -0
  33. {kernel-0.80.0 → kernel-0.82.0}/requirements.lock +0 -0
  34. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/_base_client.py +0 -0
  35. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/_client.py +0 -0
  36. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/_compat.py +0 -0
  37. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/_constants.py +0 -0
  38. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/_exceptions.py +0 -0
  39. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/_files.py +0 -0
  40. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/_models.py +0 -0
  41. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/_qs.py +0 -0
  42. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/_resource.py +0 -0
  43. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/_response.py +0 -0
  44. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/_streaming.py +0 -0
  45. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/_types.py +0 -0
  46. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/_utils/__init__.py +0 -0
  47. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/_utils/_compat.py +0 -0
  48. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/_utils/_datetime_parse.py +0 -0
  49. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/_utils/_json.py +0 -0
  50. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/_utils/_logs.py +0 -0
  51. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/_utils/_path.py +0 -0
  52. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/_utils/_proxy.py +0 -0
  53. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/_utils/_reflection.py +0 -0
  54. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/_utils/_resources_proxy.py +0 -0
  55. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/_utils/_streams.py +0 -0
  56. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/_utils/_sync.py +0 -0
  57. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/_utils/_transform.py +0 -0
  58. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/_utils/_typing.py +0 -0
  59. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/_utils/_utils.py +0 -0
  60. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/app_framework.py +0 -0
  61. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/lib/.keep +0 -0
  62. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/lib/browser_routing/__init__.py +0 -0
  63. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/lib/browser_routing/raw_http.py +0 -0
  64. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/lib/browser_routing/routing.py +0 -0
  65. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/lib/browser_routing/util.py +0 -0
  66. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/pagination.py +0 -0
  67. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/py.typed +0 -0
  68. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/resources/__init__.py +0 -0
  69. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/resources/api_keys.py +0 -0
  70. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/resources/apps.py +0 -0
  71. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/resources/auth/__init__.py +0 -0
  72. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/resources/auth/auth.py +0 -0
  73. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/resources/auth/connections.py +0 -0
  74. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/resources/browser_pools.py +0 -0
  75. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/resources/browsers/__init__.py +0 -0
  76. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/resources/browsers/browsers.py +0 -0
  77. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/resources/browsers/computer.py +0 -0
  78. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/resources/browsers/fs/__init__.py +0 -0
  79. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/resources/browsers/fs/fs.py +0 -0
  80. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/resources/browsers/fs/watch.py +0 -0
  81. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/resources/browsers/logs.py +0 -0
  82. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/resources/browsers/playwright.py +0 -0
  83. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/resources/browsers/process.py +0 -0
  84. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/resources/browsers/replays.py +0 -0
  85. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/resources/browsers/telemetry.py +0 -0
  86. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/resources/credential_providers.py +0 -0
  87. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/resources/credentials.py +0 -0
  88. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/resources/deployments.py +0 -0
  89. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/resources/extensions.py +0 -0
  90. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/resources/invocations.py +0 -0
  91. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/resources/organization/__init__.py +0 -0
  92. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/resources/organization/limits.py +0 -0
  93. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/resources/organization/organization.py +0 -0
  94. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/resources/projects/__init__.py +0 -0
  95. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/resources/projects/limits.py +0 -0
  96. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/resources/proxies.py +0 -0
  97. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/api_key.py +0 -0
  98. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/api_key_create_params.py +0 -0
  99. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/api_key_list_params.py +0 -0
  100. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/api_key_retrieve_params.py +0 -0
  101. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/api_key_rotate_params.py +0 -0
  102. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/api_key_update_params.py +0 -0
  103. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/app_list_params.py +0 -0
  104. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/app_list_response.py +0 -0
  105. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/audit_log_entry.py +0 -0
  106. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/audit_log_export_chunk_params.py +0 -0
  107. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/audit_log_list_params.py +0 -0
  108. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/auth/__init__.py +0 -0
  109. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/auth/connection_create_params.py +0 -0
  110. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/auth/connection_follow_response.py +0 -0
  111. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/auth/connection_list_params.py +0 -0
  112. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/auth/connection_login_params.py +0 -0
  113. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/auth/connection_submit_params.py +0 -0
  114. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/auth/connection_timeline_params.py +0 -0
  115. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/auth/connection_update_params.py +0 -0
  116. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/auth/login_response.py +0 -0
  117. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/auth/managed_auth.py +0 -0
  118. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/auth/managed_auth_timeline_event.py +0 -0
  119. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/auth/submit_fields_response.py +0 -0
  120. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/browser_create_params.py +0 -0
  121. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/browser_create_response.py +0 -0
  122. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/browser_curl_params.py +0 -0
  123. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/browser_curl_response.py +0 -0
  124. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/browser_list_params.py +0 -0
  125. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/browser_list_response.py +0 -0
  126. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/browser_load_extensions_params.py +0 -0
  127. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/browser_pool.py +0 -0
  128. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/browser_pool_acquire_params.py +0 -0
  129. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/browser_pool_acquire_response.py +0 -0
  130. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/browser_pool_create_params.py +0 -0
  131. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/browser_pool_delete_params.py +0 -0
  132. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/browser_pool_list_params.py +0 -0
  133. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/browser_pool_ref.py +0 -0
  134. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/browser_pool_release_params.py +0 -0
  135. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/browser_pool_update_params.py +0 -0
  136. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/browser_retrieve_params.py +0 -0
  137. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/browser_retrieve_response.py +0 -0
  138. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/browser_update_params.py +0 -0
  139. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/browser_update_response.py +0 -0
  140. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/browser_usage.py +0 -0
  141. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/browsers/__init__.py +0 -0
  142. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/browsers/browser_api_call_event.py +0 -0
  143. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/browsers/browser_call_stack.py +0 -0
  144. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/browsers/browser_captcha_solve_result_event.py +0 -0
  145. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/browsers/browser_cdp_connect_event.py +0 -0
  146. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/browsers/browser_cdp_disconnect_event.py +0 -0
  147. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/browsers/browser_console_error_event.py +0 -0
  148. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/browsers/browser_console_log_event.py +0 -0
  149. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/browsers/browser_event_context.py +0 -0
  150. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/browsers/browser_event_source.py +0 -0
  151. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/browsers/browser_http_headers.py +0 -0
  152. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/browsers/browser_interaction_click_event.py +0 -0
  153. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/browsers/browser_interaction_key_event.py +0 -0
  154. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/browsers/browser_interaction_scroll_settled_event.py +0 -0
  155. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/browsers/browser_live_view_connect_event.py +0 -0
  156. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/browsers/browser_live_view_disconnect_event.py +0 -0
  157. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/browsers/browser_monitor_disconnected_event.py +0 -0
  158. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/browsers/browser_monitor_init_failed_event.py +0 -0
  159. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/browsers/browser_monitor_reconnect_failed_event.py +0 -0
  160. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/browsers/browser_monitor_reconnected_event.py +0 -0
  161. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/browsers/browser_monitor_screenshot_event.py +0 -0
  162. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/browsers/browser_network_idle_event.py +0 -0
  163. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/browsers/browser_network_loading_failed_event.py +0 -0
  164. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/browsers/browser_network_request_event.py +0 -0
  165. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/browsers/browser_network_response_event.py +0 -0
  166. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/browsers/browser_page_dom_content_loaded_event.py +0 -0
  167. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/browsers/browser_page_layout_settled_event.py +0 -0
  168. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/browsers/browser_page_layout_shift_event.py +0 -0
  169. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/browsers/browser_page_lcp_event.py +0 -0
  170. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/browsers/browser_page_load_event.py +0 -0
  171. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/browsers/browser_page_navigation_event.py +0 -0
  172. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/browsers/browser_page_navigation_settled_event.py +0 -0
  173. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/browsers/browser_page_tab_opened_event.py +0 -0
  174. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/browsers/browser_service_crashed_event.py +0 -0
  175. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/browsers/browser_system_oom_kill_event.py +0 -0
  176. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/browsers/browser_telemetry_categories_config.py +0 -0
  177. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/browsers/browser_telemetry_categories_config_param.py +0 -0
  178. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/browsers/browser_telemetry_category_config.py +0 -0
  179. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/browsers/browser_telemetry_category_config_param.py +0 -0
  180. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/browsers/browser_telemetry_config.py +0 -0
  181. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/browsers/browser_telemetry_event.py +0 -0
  182. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/browsers/computer_batch_params.py +0 -0
  183. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/browsers/computer_capture_screenshot_params.py +0 -0
  184. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/browsers/computer_click_mouse_params.py +0 -0
  185. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/browsers/computer_drag_mouse_params.py +0 -0
  186. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/browsers/computer_get_mouse_position_response.py +0 -0
  187. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/browsers/computer_move_mouse_params.py +0 -0
  188. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/browsers/computer_press_key_params.py +0 -0
  189. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/browsers/computer_read_clipboard_response.py +0 -0
  190. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/browsers/computer_scroll_params.py +0 -0
  191. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/browsers/computer_set_cursor_visibility_params.py +0 -0
  192. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/browsers/computer_set_cursor_visibility_response.py +0 -0
  193. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/browsers/computer_type_text_params.py +0 -0
  194. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/browsers/computer_write_clipboard_params.py +0 -0
  195. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/browsers/f_create_directory_params.py +0 -0
  196. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/browsers/f_delete_directory_params.py +0 -0
  197. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/browsers/f_delete_file_params.py +0 -0
  198. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/browsers/f_download_dir_zip_params.py +0 -0
  199. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/browsers/f_file_info_params.py +0 -0
  200. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/browsers/f_file_info_response.py +0 -0
  201. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/browsers/f_list_files_params.py +0 -0
  202. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/browsers/f_list_files_response.py +0 -0
  203. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/browsers/f_move_params.py +0 -0
  204. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/browsers/f_read_file_params.py +0 -0
  205. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/browsers/f_set_file_permissions_params.py +0 -0
  206. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/browsers/f_upload_params.py +0 -0
  207. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/browsers/f_upload_zip_params.py +0 -0
  208. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/browsers/f_write_file_params.py +0 -0
  209. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/browsers/fs/__init__.py +0 -0
  210. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/browsers/fs/watch_events_response.py +0 -0
  211. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/browsers/fs/watch_start_params.py +0 -0
  212. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/browsers/fs/watch_start_response.py +0 -0
  213. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/browsers/log_stream_params.py +0 -0
  214. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/browsers/playwright_execute_params.py +0 -0
  215. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/browsers/playwright_execute_response.py +0 -0
  216. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/browsers/process_exec_params.py +0 -0
  217. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/browsers/process_exec_response.py +0 -0
  218. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/browsers/process_kill_params.py +0 -0
  219. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/browsers/process_kill_response.py +0 -0
  220. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/browsers/process_resize_params.py +0 -0
  221. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/browsers/process_resize_response.py +0 -0
  222. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/browsers/process_spawn_params.py +0 -0
  223. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/browsers/process_spawn_response.py +0 -0
  224. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/browsers/process_status_response.py +0 -0
  225. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/browsers/process_stdin_params.py +0 -0
  226. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/browsers/process_stdin_response.py +0 -0
  227. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/browsers/process_stdout_stream_response.py +0 -0
  228. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/browsers/replay_list_response.py +0 -0
  229. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/browsers/replay_start_params.py +0 -0
  230. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/browsers/replay_start_response.py +0 -0
  231. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/browsers/telemetry_events_params.py +0 -0
  232. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/browsers/telemetry_events_response.py +0 -0
  233. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/browsers/telemetry_stream_params.py +0 -0
  234. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/browsers/telemetry_stream_response.py +0 -0
  235. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/created_api_key.py +0 -0
  236. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/credential.py +0 -0
  237. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/credential_create_params.py +0 -0
  238. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/credential_list_params.py +0 -0
  239. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/credential_provider.py +0 -0
  240. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/credential_provider_create_params.py +0 -0
  241. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/credential_provider_item.py +0 -0
  242. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/credential_provider_list_items_response.py +0 -0
  243. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/credential_provider_list_params.py +0 -0
  244. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/credential_provider_test_result.py +0 -0
  245. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/credential_provider_update_params.py +0 -0
  246. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/credential_totp_code_response.py +0 -0
  247. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/credential_update_params.py +0 -0
  248. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/deployment_create_params.py +0 -0
  249. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/deployment_create_response.py +0 -0
  250. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/deployment_follow_params.py +0 -0
  251. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/deployment_follow_response.py +0 -0
  252. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/deployment_list_params.py +0 -0
  253. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/deployment_list_response.py +0 -0
  254. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/deployment_retrieve_response.py +0 -0
  255. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/deployment_state_event.py +0 -0
  256. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/extension_download_from_chrome_store_params.py +0 -0
  257. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/extension_get_response.py +0 -0
  258. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/extension_list_params.py +0 -0
  259. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/extension_list_response.py +0 -0
  260. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/extension_upload_params.py +0 -0
  261. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/extension_upload_response.py +0 -0
  262. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/invocation_create_params.py +0 -0
  263. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/invocation_create_response.py +0 -0
  264. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/invocation_follow_params.py +0 -0
  265. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/invocation_follow_response.py +0 -0
  266. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/invocation_list_browsers_response.py +0 -0
  267. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/invocation_list_params.py +0 -0
  268. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/invocation_list_response.py +0 -0
  269. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/invocation_retrieve_response.py +0 -0
  270. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/invocation_state_event.py +0 -0
  271. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/invocation_update_params.py +0 -0
  272. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/invocation_update_response.py +0 -0
  273. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/organization/__init__.py +0 -0
  274. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/organization/limit_update_params.py +0 -0
  275. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/organization/org_limits.py +0 -0
  276. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/profile.py +0 -0
  277. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/profile_create_params.py +0 -0
  278. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/profile_list_params.py +0 -0
  279. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/profile_update_params.py +0 -0
  280. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/project.py +0 -0
  281. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/project_list_params.py +0 -0
  282. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/projects/__init__.py +0 -0
  283. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/projects/limit_update_params.py +0 -0
  284. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/projects/project_limits.py +0 -0
  285. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/proxy_check_params.py +0 -0
  286. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/proxy_check_response.py +0 -0
  287. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/proxy_create_params.py +0 -0
  288. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/proxy_create_response.py +0 -0
  289. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/proxy_list_params.py +0 -0
  290. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/proxy_list_response.py +0 -0
  291. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/proxy_retrieve_response.py +0 -0
  292. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/proxy_update_params.py +0 -0
  293. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/proxy_update_response.py +0 -0
  294. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/shared/__init__.py +0 -0
  295. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/shared/app_action.py +0 -0
  296. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/shared/browser_extension.py +0 -0
  297. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/shared/browser_profile.py +0 -0
  298. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/shared/browser_viewport.py +0 -0
  299. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/shared/error_detail.py +0 -0
  300. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/shared/error_event.py +0 -0
  301. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/shared/error_model.py +0 -0
  302. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/shared/heartbeat_event.py +0 -0
  303. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/shared/log_event.py +0 -0
  304. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/shared_params/__init__.py +0 -0
  305. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/shared_params/browser_extension.py +0 -0
  306. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/shared_params/browser_profile.py +0 -0
  307. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/shared_params/browser_viewport.py +0 -0
  308. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/tags.py +0 -0
  309. {kernel-0.80.0 → kernel-0.82.0}/src/kernel/types/tags_param.py +0 -0
  310. {kernel-0.80.0 → kernel-0.82.0}/tests/__init__.py +0 -0
  311. {kernel-0.80.0 → kernel-0.82.0}/tests/api_resources/__init__.py +0 -0
  312. {kernel-0.80.0 → kernel-0.82.0}/tests/api_resources/auth/__init__.py +0 -0
  313. {kernel-0.80.0 → kernel-0.82.0}/tests/api_resources/auth/test_connections.py +0 -0
  314. {kernel-0.80.0 → kernel-0.82.0}/tests/api_resources/browsers/__init__.py +0 -0
  315. {kernel-0.80.0 → kernel-0.82.0}/tests/api_resources/browsers/fs/__init__.py +0 -0
  316. {kernel-0.80.0 → kernel-0.82.0}/tests/api_resources/browsers/fs/test_watch.py +0 -0
  317. {kernel-0.80.0 → kernel-0.82.0}/tests/api_resources/browsers/test_computer.py +0 -0
  318. {kernel-0.80.0 → kernel-0.82.0}/tests/api_resources/browsers/test_fs.py +0 -0
  319. {kernel-0.80.0 → kernel-0.82.0}/tests/api_resources/browsers/test_logs.py +0 -0
  320. {kernel-0.80.0 → kernel-0.82.0}/tests/api_resources/browsers/test_playwright.py +0 -0
  321. {kernel-0.80.0 → kernel-0.82.0}/tests/api_resources/browsers/test_process.py +0 -0
  322. {kernel-0.80.0 → kernel-0.82.0}/tests/api_resources/browsers/test_replays.py +0 -0
  323. {kernel-0.80.0 → kernel-0.82.0}/tests/api_resources/browsers/test_telemetry.py +0 -0
  324. {kernel-0.80.0 → kernel-0.82.0}/tests/api_resources/organization/__init__.py +0 -0
  325. {kernel-0.80.0 → kernel-0.82.0}/tests/api_resources/organization/test_limits.py +0 -0
  326. {kernel-0.80.0 → kernel-0.82.0}/tests/api_resources/projects/__init__.py +0 -0
  327. {kernel-0.80.0 → kernel-0.82.0}/tests/api_resources/projects/test_limits.py +0 -0
  328. {kernel-0.80.0 → kernel-0.82.0}/tests/api_resources/test_api_keys.py +0 -0
  329. {kernel-0.80.0 → kernel-0.82.0}/tests/api_resources/test_apps.py +0 -0
  330. {kernel-0.80.0 → kernel-0.82.0}/tests/api_resources/test_audit_logs.py +0 -0
  331. {kernel-0.80.0 → kernel-0.82.0}/tests/api_resources/test_browser_pools.py +0 -0
  332. {kernel-0.80.0 → kernel-0.82.0}/tests/api_resources/test_browsers.py +0 -0
  333. {kernel-0.80.0 → kernel-0.82.0}/tests/api_resources/test_credential_providers.py +0 -0
  334. {kernel-0.80.0 → kernel-0.82.0}/tests/api_resources/test_credentials.py +0 -0
  335. {kernel-0.80.0 → kernel-0.82.0}/tests/api_resources/test_deployments.py +0 -0
  336. {kernel-0.80.0 → kernel-0.82.0}/tests/api_resources/test_extensions.py +0 -0
  337. {kernel-0.80.0 → kernel-0.82.0}/tests/api_resources/test_invocations.py +0 -0
  338. {kernel-0.80.0 → kernel-0.82.0}/tests/api_resources/test_proxies.py +0 -0
  339. {kernel-0.80.0 → kernel-0.82.0}/tests/conftest.py +0 -0
  340. {kernel-0.80.0 → kernel-0.82.0}/tests/sample_file.txt +0 -0
  341. {kernel-0.80.0 → kernel-0.82.0}/tests/test_browser_routing.py +0 -0
  342. {kernel-0.80.0 → kernel-0.82.0}/tests/test_client.py +0 -0
  343. {kernel-0.80.0 → kernel-0.82.0}/tests/test_extract_files.py +0 -0
  344. {kernel-0.80.0 → kernel-0.82.0}/tests/test_files.py +0 -0
  345. {kernel-0.80.0 → kernel-0.82.0}/tests/test_models.py +0 -0
  346. {kernel-0.80.0 → kernel-0.82.0}/tests/test_pagination.py +0 -0
  347. {kernel-0.80.0 → kernel-0.82.0}/tests/test_qs.py +0 -0
  348. {kernel-0.80.0 → kernel-0.82.0}/tests/test_required_args.py +0 -0
  349. {kernel-0.80.0 → kernel-0.82.0}/tests/test_response.py +0 -0
  350. {kernel-0.80.0 → kernel-0.82.0}/tests/test_streaming.py +0 -0
  351. {kernel-0.80.0 → kernel-0.82.0}/tests/test_transform.py +0 -0
  352. {kernel-0.80.0 → kernel-0.82.0}/tests/test_utils/test_datetime_parse.py +0 -0
  353. {kernel-0.80.0 → kernel-0.82.0}/tests/test_utils/test_json.py +0 -0
  354. {kernel-0.80.0 → kernel-0.82.0}/tests/test_utils/test_path.py +0 -0
  355. {kernel-0.80.0 → kernel-0.82.0}/tests/test_utils/test_proxy.py +0 -0
  356. {kernel-0.80.0 → kernel-0.82.0}/tests/test_utils/test_typing.py +0 -0
  357. {kernel-0.80.0 → kernel-0.82.0}/tests/utils.py +0 -0
@@ -0,0 +1,3 @@
1
+ {
2
+ ".": "0.82.0"
3
+ }
@@ -1,5 +1,23 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.82.0 (2026-07-23)
4
+
5
+ Full Changelog: [v0.81.0...v0.82.0](https://github.com/kernel/kernel-python-sdk/compare/v0.81.0...v0.82.0)
6
+
7
+ ### Features
8
+
9
+ * Count project names by Unicode code point ([cecdf6d](https://github.com/kernel/kernel-python-sdk/commit/cecdf6d4a4ef7919b6eef5d03f76542b6ade0906))
10
+ * Stream profile downloads as tar archives ([3a2eb97](https://github.com/kernel/kernel-python-sdk/commit/3a2eb97686f3ecf02db16d7bccea803476cb730f))
11
+ * Use format-neutral profile download Accept header ([95d1334](https://github.com/kernel/kernel-python-sdk/commit/95d1334660d2ebaed70d2170233e4bdf3b074958))
12
+
13
+ ## 0.81.0 (2026-07-21)
14
+
15
+ Full Changelog: [v0.80.0...v0.81.0](https://github.com/kernel/kernel-python-sdk/compare/v0.80.0...v0.81.0)
16
+
17
+ ### Features
18
+
19
+ * add complete audit log downloads ([18aa8c9](https://github.com/kernel/kernel-python-sdk/commit/18aa8c925b3f7699c30a6202685447432df2da6c))
20
+
3
21
  ## 0.80.0 (2026-07-19)
4
22
 
5
23
  Full Changelog: [v0.79.0...v0.80.0](https://github.com/kernel/kernel-python-sdk/compare/v0.79.0...v0.80.0)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: kernel
3
- Version: 0.80.0
3
+ Version: 0.82.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
@@ -288,7 +288,7 @@ Methods:
288
288
  - <code title="patch /profiles/{id_or_name}">client.profiles.<a href="./src/kernel/resources/profiles.py">update</a>(id_or_name, \*\*<a href="src/kernel/types/profile_update_params.py">params</a>) -> <a href="./src/kernel/types/profile.py">Profile</a></code>
289
289
  - <code title="get /profiles">client.profiles.<a href="./src/kernel/resources/profiles.py">list</a>(\*\*<a href="src/kernel/types/profile_list_params.py">params</a>) -> <a href="./src/kernel/types/profile.py">SyncOffsetPagination[Profile]</a></code>
290
290
  - <code title="delete /profiles/{id_or_name}">client.profiles.<a href="./src/kernel/resources/profiles.py">delete</a>(id_or_name) -> None</code>
291
- - <code title="get /profiles/{id_or_name}/download">client.profiles.<a href="./src/kernel/resources/profiles.py">download</a>(id_or_name) -> BinaryAPIResponse</code>
291
+ - <code title="get /profiles/{id_or_name}/download">client.profiles.<a href="./src/kernel/resources/profiles.py">download</a>(id_or_name, \*\*<a href="src/kernel/types/profile_download_params.py">params</a>) -> BinaryAPIResponse</code>
292
292
 
293
293
  # Auth
294
294
 
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "kernel"
3
- version = "0.80.0"
3
+ version = "0.82.0"
4
4
  description = "The official Python library for the kernel API"
5
5
  dynamic = ["readme"]
6
6
  license = "Apache-2.0"
@@ -51,6 +51,11 @@ from .app_framework import (
51
51
  app_registry,
52
52
  export_registry,
53
53
  )
54
+ from .lib.audit_log_download import (
55
+ AuditLogDownloadError,
56
+ AuditLogDownloadResult,
57
+ AuditLogDownloadProgress,
58
+ )
54
59
 
55
60
  __all__ = [
56
61
  "types",
@@ -105,6 +110,9 @@ __all__ = [
105
110
  "App",
106
111
  "app_registry",
107
112
  "export_registry",
113
+ "AuditLogDownloadError",
114
+ "AuditLogDownloadProgress",
115
+ "AuditLogDownloadResult",
108
116
  ]
109
117
 
110
118
  if not _t.TYPE_CHECKING:
@@ -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.80.0" # x-release-please-version
4
+ __version__ = "0.82.0" # x-release-please-version
@@ -0,0 +1,232 @@
1
+ from __future__ import annotations
2
+
3
+ import time
4
+ import hashlib
5
+ import inspect
6
+ from typing import BinaryIO, Callable, Optional, Protocol, Awaitable, ContextManager, AsyncContextManager
7
+ from dataclasses import dataclass
8
+
9
+ import anyio
10
+ import httpx
11
+ from anyio import to_thread
12
+
13
+ from .._exceptions import KernelError
14
+
15
+ _DEFAULT_MAX_TRANSFER_RETRIES = 6
16
+ _MAX_CHUNK_ROWS = 50_000
17
+ _MAX_RETRY_DELAY = 8.0
18
+
19
+
20
+ class AuditLogDownloadError(KernelError):
21
+ pass
22
+
23
+
24
+ @dataclass(frozen=True)
25
+ class AuditLogDownloadResult:
26
+ bytes_written: int
27
+ chunks: int
28
+ rows: int
29
+
30
+
31
+ @dataclass(frozen=True)
32
+ class AuditLogDownloadProgress(AuditLogDownloadResult):
33
+ chunk_rows: int
34
+
35
+
36
+ class _SyncChunkResponse(Protocol):
37
+ @property
38
+ def headers(self) -> httpx.Headers: ...
39
+
40
+ def read(self) -> bytes: ...
41
+
42
+ def close(self) -> None: ...
43
+
44
+
45
+ class _AsyncChunkResponse(Protocol):
46
+ @property
47
+ def headers(self) -> httpx.Headers: ...
48
+
49
+ async def read(self) -> bytes: ...
50
+
51
+ async def close(self) -> None: ...
52
+
53
+
54
+ SyncFetchChunk = Callable[[Optional[str]], ContextManager[_SyncChunkResponse]]
55
+ AsyncFetchChunk = Callable[[Optional[str]], AsyncContextManager[_AsyncChunkResponse]]
56
+ ProgressCallback = Callable[[AuditLogDownloadProgress], None]
57
+ AsyncProgressCallback = Callable[[AuditLogDownloadProgress], Optional[Awaitable[None]]]
58
+
59
+
60
+ def download_audit_logs(
61
+ fetch_chunk: SyncFetchChunk,
62
+ destination: BinaryIO,
63
+ *,
64
+ on_progress: ProgressCallback | None = None,
65
+ max_transfer_retries: int = _DEFAULT_MAX_TRANSFER_RETRIES,
66
+ ) -> AuditLogDownloadResult:
67
+ if not callable(getattr(destination, "write", None)):
68
+ raise TypeError("audit log download destination must provide write()")
69
+ _validate_max_transfer_retries(max_transfer_retries)
70
+
71
+ cursor: str | None = None
72
+ result = AuditLogDownloadResult(bytes_written=0, chunks=0, rows=0)
73
+ seen_cursors: set[str] = set()
74
+ while True:
75
+ body, headers = _fetch_verified_chunk(fetch_chunk, cursor, max_transfer_retries)
76
+ chunk_rows, next_cursor, has_more = _parse_chunk_headers(headers, cursor)
77
+ if has_more and next_cursor is not None:
78
+ if next_cursor in seen_cursors:
79
+ raise AuditLogDownloadError("response repeated X-Next-Cursor header")
80
+ seen_cursors.add(next_cursor)
81
+ _write_chunk(destination, body)
82
+
83
+ cursor = next_cursor
84
+ result = AuditLogDownloadResult(
85
+ bytes_written=result.bytes_written + len(body),
86
+ chunks=result.chunks + 1,
87
+ rows=result.rows + chunk_rows,
88
+ )
89
+ if on_progress is not None:
90
+ on_progress(
91
+ AuditLogDownloadProgress(
92
+ bytes_written=result.bytes_written,
93
+ chunks=result.chunks,
94
+ rows=result.rows,
95
+ chunk_rows=chunk_rows,
96
+ )
97
+ )
98
+ if not has_more:
99
+ return result
100
+
101
+
102
+ async def async_download_audit_logs(
103
+ fetch_chunk: AsyncFetchChunk,
104
+ destination: BinaryIO,
105
+ *,
106
+ on_progress: AsyncProgressCallback | None = None,
107
+ max_transfer_retries: int = _DEFAULT_MAX_TRANSFER_RETRIES,
108
+ ) -> AuditLogDownloadResult:
109
+ if not callable(getattr(destination, "write", None)):
110
+ raise TypeError("audit log download destination must provide write()")
111
+ _validate_max_transfer_retries(max_transfer_retries)
112
+
113
+ cursor: str | None = None
114
+ result = AuditLogDownloadResult(bytes_written=0, chunks=0, rows=0)
115
+ seen_cursors: set[str] = set()
116
+ while True:
117
+ body, headers = await _async_fetch_verified_chunk(fetch_chunk, cursor, max_transfer_retries)
118
+ chunk_rows, next_cursor, has_more = _parse_chunk_headers(headers, cursor)
119
+ if has_more and next_cursor is not None:
120
+ if next_cursor in seen_cursors:
121
+ raise AuditLogDownloadError("response repeated X-Next-Cursor header")
122
+ seen_cursors.add(next_cursor)
123
+ await to_thread.run_sync(_write_chunk, destination, body)
124
+
125
+ cursor = next_cursor
126
+ result = AuditLogDownloadResult(
127
+ bytes_written=result.bytes_written + len(body),
128
+ chunks=result.chunks + 1,
129
+ rows=result.rows + chunk_rows,
130
+ )
131
+ if on_progress is not None:
132
+ callback_result = on_progress(
133
+ AuditLogDownloadProgress(
134
+ bytes_written=result.bytes_written,
135
+ chunks=result.chunks,
136
+ rows=result.rows,
137
+ chunk_rows=chunk_rows,
138
+ )
139
+ )
140
+ if inspect.isawaitable(callback_result):
141
+ await callback_result
142
+ if not has_more:
143
+ return result
144
+
145
+
146
+ def _fetch_verified_chunk(
147
+ fetch_chunk: SyncFetchChunk, cursor: str | None, max_transfer_retries: int
148
+ ) -> tuple[bytes, httpx.Headers]:
149
+ for retries in range(max_transfer_retries + 1):
150
+ transfer_error: Exception | None = None
151
+ with fetch_chunk(cursor) as response:
152
+ try:
153
+ body = response.read()
154
+ headers = httpx.Headers(response.headers)
155
+ _verify_checksum(body, headers)
156
+ except Exception as error:
157
+ transfer_error = error
158
+ else:
159
+ return body, headers
160
+ assert transfer_error is not None
161
+ if retries == max_transfer_retries:
162
+ raise transfer_error
163
+ time.sleep(min(2**retries, _MAX_RETRY_DELAY))
164
+ raise AssertionError("unreachable")
165
+
166
+
167
+ async def _async_fetch_verified_chunk(
168
+ fetch_chunk: AsyncFetchChunk, cursor: str | None, max_transfer_retries: int
169
+ ) -> tuple[bytes, httpx.Headers]:
170
+ for retries in range(max_transfer_retries + 1):
171
+ transfer_error: Exception | None = None
172
+ async with fetch_chunk(cursor) as response:
173
+ try:
174
+ body = await response.read()
175
+ headers = httpx.Headers(response.headers)
176
+ await to_thread.run_sync(_verify_checksum, body, headers)
177
+ except Exception as error:
178
+ transfer_error = error
179
+ else:
180
+ return body, headers
181
+ assert transfer_error is not None
182
+ if retries == max_transfer_retries:
183
+ raise transfer_error
184
+ await anyio.sleep(min(2**retries, _MAX_RETRY_DELAY))
185
+ raise AssertionError("unreachable")
186
+
187
+
188
+ def _verify_checksum(body: bytes, headers: httpx.Headers) -> None:
189
+ expected = headers.get("x-content-sha256")
190
+ if not expected:
191
+ raise AuditLogDownloadError("response missing X-Content-Sha256 header")
192
+ actual = hashlib.sha256(body).hexdigest()
193
+ if actual != expected:
194
+ raise AuditLogDownloadError(f"audit log chunk checksum mismatch (got {actual}, want {expected})")
195
+
196
+
197
+ def _parse_chunk_headers(headers: httpx.Headers, current_cursor: str | None) -> tuple[int, str | None, bool]:
198
+ has_more_value = headers.get("x-has-more")
199
+ if has_more_value not in {"true", "false"}:
200
+ raise AuditLogDownloadError("response missing or invalid X-Has-More header")
201
+ has_more = has_more_value == "true"
202
+
203
+ row_count = headers.get("x-row-count")
204
+ if row_count is None or not row_count.isascii() or not row_count.isdecimal():
205
+ raise AuditLogDownloadError("response missing or invalid X-Row-Count header")
206
+ normalized_row_count = row_count.lstrip("0") or "0"
207
+ if len(normalized_row_count) > len(str(_MAX_CHUNK_ROWS)):
208
+ raise AuditLogDownloadError("response missing or invalid X-Row-Count header")
209
+ rows = int(normalized_row_count)
210
+ if rows > _MAX_CHUNK_ROWS:
211
+ raise AuditLogDownloadError("response missing or invalid X-Row-Count header")
212
+
213
+ next_cursor = headers.get("x-next-cursor") or None
214
+ if has_more and (not next_cursor or next_cursor == current_cursor):
215
+ raise AuditLogDownloadError("response has invalid X-Next-Cursor header")
216
+ if not has_more and next_cursor:
217
+ raise AuditLogDownloadError("response returned a cursor after the final chunk")
218
+ return rows, next_cursor, has_more
219
+
220
+
221
+ def _write_chunk(destination: BinaryIO, body: bytes) -> None:
222
+ remaining = memoryview(body)
223
+ while remaining:
224
+ written = destination.write(remaining)
225
+ if type(written) is not int or written <= 0 or written > len(remaining):
226
+ raise AuditLogDownloadError("audit log download destination performed a short write")
227
+ remaining = remaining[written:]
228
+
229
+
230
+ def _validate_max_transfer_retries(max_transfer_retries: int) -> None:
231
+ if type(max_transfer_retries) is not int or max_transfer_retries < 0:
232
+ raise ValueError("max_transfer_retries must be a non-negative integer")
@@ -2,7 +2,7 @@
2
2
 
3
3
  from __future__ import annotations
4
4
 
5
- from typing import Union
5
+ from typing import Union, BinaryIO, ContextManager, AsyncContextManager
6
6
  from datetime import datetime
7
7
  from typing_extensions import Literal
8
8
 
@@ -30,6 +30,13 @@ from .._response import (
30
30
  from ..pagination import SyncPageTokenPagination, AsyncPageTokenPagination
31
31
  from .._base_client import AsyncPaginator, make_request_options
32
32
  from ..types.audit_log_entry import AuditLogEntry
33
+ from ..lib.audit_log_download import (
34
+ ProgressCallback,
35
+ AsyncProgressCallback,
36
+ AuditLogDownloadResult,
37
+ download_audit_logs,
38
+ async_download_audit_logs,
39
+ )
33
40
 
34
41
  __all__ = ["AuditLogsResource", "AsyncAuditLogsResource"]
35
42
 
@@ -222,6 +229,60 @@ class AuditLogsResource(SyncAPIResource):
222
229
  cast_to=BinaryAPIResponse,
223
230
  )
224
231
 
232
+ def download(
233
+ self,
234
+ *,
235
+ to: BinaryIO,
236
+ end: Union[str, datetime],
237
+ start: Union[str, datetime],
238
+ auth_strategy: str | Omit = omit,
239
+ exclude_method: SequenceNotStr[str] | Omit = omit,
240
+ limit: int | Omit = omit,
241
+ method: str | Omit = omit,
242
+ search: str | Omit = omit,
243
+ search_user_id: SequenceNotStr[str] | Omit = omit,
244
+ service: str | Omit = omit,
245
+ on_progress: ProgressCallback | None = None,
246
+ max_transfer_retries: int = 6,
247
+ extra_headers: Headers | None = None,
248
+ extra_query: Query | None = None,
249
+ extra_body: Body | None = None,
250
+ timeout: float | httpx.Timeout | None | NotGiven = not_given,
251
+ ) -> AuditLogDownloadResult:
252
+ """Download a complete gzip-compressed JSON Lines audit log export.
253
+
254
+ The SDK writes the export to a writable binary destination, verifies
255
+ every chunk, and retries transient transfer failures. It does not close
256
+ the destination. If the download fails, the destination may contain a
257
+ partial export; use a temporary file and atomic rename when the completed
258
+ export must be published atomically.
259
+ """
260
+
261
+ def fetch_chunk(cursor: str | None) -> ContextManager[StreamedBinaryAPIResponse]:
262
+ return self.with_streaming_response.export_chunk(
263
+ end=end,
264
+ start=start,
265
+ auth_strategy=auth_strategy,
266
+ cursor=cursor if cursor is not None else omit,
267
+ exclude_method=exclude_method,
268
+ limit=limit,
269
+ method=method,
270
+ search=search,
271
+ search_user_id=search_user_id,
272
+ service=service,
273
+ extra_headers=extra_headers,
274
+ extra_query=extra_query,
275
+ extra_body=extra_body,
276
+ timeout=timeout,
277
+ )
278
+
279
+ return download_audit_logs(
280
+ fetch_chunk,
281
+ to,
282
+ on_progress=on_progress,
283
+ max_transfer_retries=max_transfer_retries,
284
+ )
285
+
225
286
 
226
287
  class AsyncAuditLogsResource(AsyncAPIResource):
227
288
  """Read audit log records for the authenticated organization."""
@@ -411,6 +472,60 @@ class AsyncAuditLogsResource(AsyncAPIResource):
411
472
  cast_to=AsyncBinaryAPIResponse,
412
473
  )
413
474
 
475
+ async def download(
476
+ self,
477
+ *,
478
+ to: BinaryIO,
479
+ end: Union[str, datetime],
480
+ start: Union[str, datetime],
481
+ auth_strategy: str | Omit = omit,
482
+ exclude_method: SequenceNotStr[str] | Omit = omit,
483
+ limit: int | Omit = omit,
484
+ method: str | Omit = omit,
485
+ search: str | Omit = omit,
486
+ search_user_id: SequenceNotStr[str] | Omit = omit,
487
+ service: str | Omit = omit,
488
+ on_progress: AsyncProgressCallback | None = None,
489
+ max_transfer_retries: int = 6,
490
+ extra_headers: Headers | None = None,
491
+ extra_query: Query | None = None,
492
+ extra_body: Body | None = None,
493
+ timeout: float | httpx.Timeout | None | NotGiven = not_given,
494
+ ) -> AuditLogDownloadResult:
495
+ """Download a complete gzip-compressed JSON Lines audit log export.
496
+
497
+ The SDK writes the export to a writable binary destination, verifies
498
+ every chunk, and retries transient transfer failures. It does not close
499
+ the destination. If the download fails, the destination may contain a
500
+ partial export; use a temporary file and atomic rename when the completed
501
+ export must be published atomically.
502
+ """
503
+
504
+ def fetch_chunk(cursor: str | None) -> AsyncContextManager[AsyncStreamedBinaryAPIResponse]:
505
+ return self.with_streaming_response.export_chunk(
506
+ end=end,
507
+ start=start,
508
+ auth_strategy=auth_strategy,
509
+ cursor=cursor if cursor is not None else omit,
510
+ exclude_method=exclude_method,
511
+ limit=limit,
512
+ method=method,
513
+ search=search,
514
+ search_user_id=search_user_id,
515
+ service=service,
516
+ extra_headers=extra_headers,
517
+ extra_query=extra_query,
518
+ extra_body=extra_body,
519
+ timeout=timeout,
520
+ )
521
+
522
+ return await async_download_audit_logs(
523
+ fetch_chunk,
524
+ to,
525
+ on_progress=on_progress,
526
+ max_transfer_retries=max_transfer_retries,
527
+ )
528
+
414
529
 
415
530
  class AuditLogsResourceWithRawResponse:
416
531
  def __init__(self, audit_logs: AuditLogsResource) -> None:
@@ -2,9 +2,11 @@
2
2
 
3
3
  from __future__ import annotations
4
4
 
5
+ from typing_extensions import Literal
6
+
5
7
  import httpx
6
8
 
7
- from ..types import profile_list_params, profile_create_params, profile_update_params
9
+ from ..types import profile_list_params, profile_create_params, profile_update_params, profile_download_params
8
10
  from .._types import Body, Omit, Query, Headers, NoneType, NotGiven, omit, not_given
9
11
  from .._utils import path_template, maybe_transform, async_maybe_transform
10
12
  from .._compat import cached_property
@@ -264,6 +266,7 @@ class ProfilesResource(SyncAPIResource):
264
266
  self,
265
267
  id_or_name: str,
266
268
  *,
269
+ format: Literal["tar.zst", "tar"] | Omit = omit,
267
270
  # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
268
271
  # The extra values given here take precedence over values defined on the client or passed to this method.
269
272
  extra_headers: Headers | None = None,
@@ -271,10 +274,17 @@ class ProfilesResource(SyncAPIResource):
271
274
  extra_body: Body | None = None,
272
275
  timeout: float | httpx.Timeout | None | NotGiven = not_given,
273
276
  ) -> BinaryAPIResponse:
274
- """
275
- Returns a zstd-compressed tar file of the full user-data directory.
277
+ """Downloads the profile in its stored format by default.
278
+
279
+ Current profiles are
280
+ returned as zstd-compressed tar archives, while legacy profiles remain JSON. Set
281
+ `format=tar` to decompress current profiles during download; legacy profiles
282
+ remain JSON.
276
283
 
277
284
  Args:
285
+ format: Response format for current profile archives. Legacy profiles are always
286
+ returned as JSON.
287
+
278
288
  extra_headers: Send extra headers
279
289
 
280
290
  extra_query: Add additional query parameters to the request
@@ -289,7 +299,11 @@ class ProfilesResource(SyncAPIResource):
289
299
  return self._get(
290
300
  path_template("/profiles/{id_or_name}/download", id_or_name=id_or_name),
291
301
  options=make_request_options(
292
- extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
302
+ extra_headers=extra_headers,
303
+ extra_query=extra_query,
304
+ extra_body=extra_body,
305
+ timeout=timeout,
306
+ query=maybe_transform({"format": format}, profile_download_params.ProfileDownloadParams),
293
307
  ),
294
308
  cast_to=BinaryAPIResponse,
295
309
  )
@@ -529,6 +543,7 @@ class AsyncProfilesResource(AsyncAPIResource):
529
543
  self,
530
544
  id_or_name: str,
531
545
  *,
546
+ format: Literal["tar.zst", "tar"] | Omit = omit,
532
547
  # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
533
548
  # The extra values given here take precedence over values defined on the client or passed to this method.
534
549
  extra_headers: Headers | None = None,
@@ -536,10 +551,17 @@ class AsyncProfilesResource(AsyncAPIResource):
536
551
  extra_body: Body | None = None,
537
552
  timeout: float | httpx.Timeout | None | NotGiven = not_given,
538
553
  ) -> AsyncBinaryAPIResponse:
539
- """
540
- Returns a zstd-compressed tar file of the full user-data directory.
554
+ """Downloads the profile in its stored format by default.
555
+
556
+ Current profiles are
557
+ returned as zstd-compressed tar archives, while legacy profiles remain JSON. Set
558
+ `format=tar` to decompress current profiles during download; legacy profiles
559
+ remain JSON.
541
560
 
542
561
  Args:
562
+ format: Response format for current profile archives. Legacy profiles are always
563
+ returned as JSON.
564
+
543
565
  extra_headers: Send extra headers
544
566
 
545
567
  extra_query: Add additional query parameters to the request
@@ -554,7 +576,11 @@ class AsyncProfilesResource(AsyncAPIResource):
554
576
  return await self._get(
555
577
  path_template("/profiles/{id_or_name}/download", id_or_name=id_or_name),
556
578
  options=make_request_options(
557
- extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
579
+ extra_headers=extra_headers,
580
+ extra_query=extra_query,
581
+ extra_body=extra_body,
582
+ timeout=timeout,
583
+ query=await async_maybe_transform({"format": format}, profile_download_params.ProfileDownloadParams),
558
584
  ),
559
585
  cast_to=AsyncBinaryAPIResponse,
560
586
  )
@@ -74,7 +74,7 @@ class ProjectsResource(SyncAPIResource):
74
74
  Create a new project within the authenticated organization.
75
75
 
76
76
  Args:
77
- name: Project name (1-255 characters)
77
+ name: Project name (1-255 Unicode code points)
78
78
 
79
79
  extra_headers: Send extra headers
80
80
 
@@ -144,7 +144,7 @@ class ProjectsResource(SyncAPIResource):
144
144
  Update a project's name or status.
145
145
 
146
146
  Args:
147
- name: New project name
147
+ name: New project name (1-255 Unicode code points)
148
148
 
149
149
  status: New project status
150
150
 
@@ -307,7 +307,7 @@ class AsyncProjectsResource(AsyncAPIResource):
307
307
  Create a new project within the authenticated organization.
308
308
 
309
309
  Args:
310
- name: Project name (1-255 characters)
310
+ name: Project name (1-255 Unicode code points)
311
311
 
312
312
  extra_headers: Send extra headers
313
313
 
@@ -377,7 +377,7 @@ class AsyncProjectsResource(AsyncAPIResource):
377
377
  Update a project's name or status.
378
378
 
379
379
  Args:
380
- name: New project name
380
+ name: New project name (1-255 Unicode code points)
381
381
 
382
382
  status: New project status
383
383
 
@@ -67,6 +67,7 @@ from .browser_retrieve_params import BrowserRetrieveParams as BrowserRetrievePar
67
67
  from .browser_update_response import BrowserUpdateResponse as BrowserUpdateResponse
68
68
  from .extension_list_response import ExtensionListResponse as ExtensionListResponse
69
69
  from .extension_upload_params import ExtensionUploadParams as ExtensionUploadParams
70
+ from .profile_download_params import ProfileDownloadParams as ProfileDownloadParams
70
71
  from .proxy_retrieve_response import ProxyRetrieveResponse as ProxyRetrieveResponse
71
72
  from .browser_pool_list_params import BrowserPoolListParams as BrowserPoolListParams
72
73
  from .credential_create_params import CredentialCreateParams as CredentialCreateParams
@@ -0,0 +1,15 @@
1
+ # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
2
+
3
+ from __future__ import annotations
4
+
5
+ from typing_extensions import Literal, TypedDict
6
+
7
+ __all__ = ["ProfileDownloadParams"]
8
+
9
+
10
+ class ProfileDownloadParams(TypedDict, total=False):
11
+ format: Literal["tar.zst", "tar"]
12
+ """Response format for current profile archives.
13
+
14
+ Legacy profiles are always returned as JSON.
15
+ """
@@ -9,4 +9,4 @@ __all__ = ["ProjectCreateParams"]
9
9
 
10
10
  class ProjectCreateParams(TypedDict, total=False):
11
11
  name: Required[str]
12
- """Project name (1-255 characters)"""
12
+ """Project name (1-255 Unicode code points)"""
@@ -9,7 +9,7 @@ __all__ = ["ProjectUpdateParams"]
9
9
 
10
10
  class ProjectUpdateParams(TypedDict, total=False):
11
11
  name: str
12
- """New project name"""
12
+ """New project name (1-255 Unicode code points)"""
13
13
 
14
14
  status: Literal["active", "archived"]
15
15
  """New project status"""