kernel 0.79.0__tar.gz → 0.81.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 (356) hide show
  1. kernel-0.81.0/.release-please-manifest.json +3 -0
  2. {kernel-0.79.0 → kernel-0.81.0}/CHANGELOG.md +19 -0
  3. {kernel-0.79.0 → kernel-0.81.0}/PKG-INFO +1 -1
  4. {kernel-0.79.0 → kernel-0.81.0}/pyproject.toml +1 -1
  5. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/__init__.py +8 -0
  6. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/_version.py +1 -1
  7. kernel-0.81.0/src/kernel/lib/audit_log_download.py +232 -0
  8. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/resources/audit_logs.py +116 -1
  9. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/resources/auth/connections.py +16 -0
  10. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/auth/connection_follow_response.py +58 -0
  11. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/auth/connection_submit_params.py +6 -0
  12. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/auth/managed_auth.py +66 -1
  13. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/auth/managed_auth_timeline_event.py +3 -0
  14. {kernel-0.79.0 → kernel-0.81.0}/tests/api_resources/auth/test_connections.py +10 -0
  15. {kernel-0.79.0 → kernel-0.81.0}/tests/api_resources/test_proxies.py +2 -2
  16. kernel-0.81.0/tests/test_audit_log_download.py +409 -0
  17. kernel-0.79.0/.release-please-manifest.json +0 -3
  18. {kernel-0.79.0 → kernel-0.81.0}/.gitignore +0 -0
  19. {kernel-0.79.0 → kernel-0.81.0}/CONTRIBUTING.md +0 -0
  20. {kernel-0.79.0 → kernel-0.81.0}/LICENSE +0 -0
  21. {kernel-0.79.0 → kernel-0.81.0}/README.md +0 -0
  22. {kernel-0.79.0 → kernel-0.81.0}/SECURITY.md +0 -0
  23. {kernel-0.79.0 → kernel-0.81.0}/api.md +0 -0
  24. {kernel-0.79.0 → kernel-0.81.0}/bin/check-release-environment +0 -0
  25. {kernel-0.79.0 → kernel-0.81.0}/bin/publish-pypi +0 -0
  26. {kernel-0.79.0 → kernel-0.81.0}/examples/.keep +0 -0
  27. {kernel-0.79.0 → kernel-0.81.0}/examples/browser_routing.py +0 -0
  28. {kernel-0.79.0 → kernel-0.81.0}/examples/browser_telemetry.py +0 -0
  29. {kernel-0.79.0 → kernel-0.81.0}/noxfile.py +0 -0
  30. {kernel-0.79.0 → kernel-0.81.0}/release-please-config.json +0 -0
  31. {kernel-0.79.0 → kernel-0.81.0}/requirements-dev.lock +0 -0
  32. {kernel-0.79.0 → kernel-0.81.0}/requirements.lock +0 -0
  33. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/_base_client.py +0 -0
  34. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/_client.py +0 -0
  35. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/_compat.py +0 -0
  36. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/_constants.py +0 -0
  37. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/_exceptions.py +0 -0
  38. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/_files.py +0 -0
  39. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/_models.py +0 -0
  40. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/_qs.py +0 -0
  41. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/_resource.py +0 -0
  42. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/_response.py +0 -0
  43. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/_streaming.py +0 -0
  44. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/_types.py +0 -0
  45. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/_utils/__init__.py +0 -0
  46. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/_utils/_compat.py +0 -0
  47. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/_utils/_datetime_parse.py +0 -0
  48. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/_utils/_json.py +0 -0
  49. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/_utils/_logs.py +0 -0
  50. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/_utils/_path.py +0 -0
  51. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/_utils/_proxy.py +0 -0
  52. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/_utils/_reflection.py +0 -0
  53. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/_utils/_resources_proxy.py +0 -0
  54. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/_utils/_streams.py +0 -0
  55. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/_utils/_sync.py +0 -0
  56. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/_utils/_transform.py +0 -0
  57. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/_utils/_typing.py +0 -0
  58. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/_utils/_utils.py +0 -0
  59. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/app_framework.py +0 -0
  60. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/lib/.keep +0 -0
  61. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/lib/browser_routing/__init__.py +0 -0
  62. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/lib/browser_routing/raw_http.py +0 -0
  63. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/lib/browser_routing/routing.py +0 -0
  64. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/lib/browser_routing/util.py +0 -0
  65. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/pagination.py +0 -0
  66. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/py.typed +0 -0
  67. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/resources/__init__.py +0 -0
  68. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/resources/api_keys.py +0 -0
  69. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/resources/apps.py +0 -0
  70. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/resources/auth/__init__.py +0 -0
  71. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/resources/auth/auth.py +0 -0
  72. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/resources/browser_pools.py +0 -0
  73. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/resources/browsers/__init__.py +0 -0
  74. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/resources/browsers/browsers.py +0 -0
  75. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/resources/browsers/computer.py +0 -0
  76. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/resources/browsers/fs/__init__.py +0 -0
  77. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/resources/browsers/fs/fs.py +0 -0
  78. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/resources/browsers/fs/watch.py +0 -0
  79. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/resources/browsers/logs.py +0 -0
  80. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/resources/browsers/playwright.py +0 -0
  81. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/resources/browsers/process.py +0 -0
  82. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/resources/browsers/replays.py +0 -0
  83. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/resources/browsers/telemetry.py +0 -0
  84. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/resources/credential_providers.py +0 -0
  85. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/resources/credentials.py +0 -0
  86. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/resources/deployments.py +0 -0
  87. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/resources/extensions.py +0 -0
  88. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/resources/invocations.py +0 -0
  89. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/resources/organization/__init__.py +0 -0
  90. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/resources/organization/limits.py +0 -0
  91. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/resources/organization/organization.py +0 -0
  92. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/resources/profiles.py +0 -0
  93. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/resources/projects/__init__.py +0 -0
  94. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/resources/projects/limits.py +0 -0
  95. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/resources/projects/projects.py +0 -0
  96. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/resources/proxies.py +0 -0
  97. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/__init__.py +0 -0
  98. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/api_key.py +0 -0
  99. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/api_key_create_params.py +0 -0
  100. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/api_key_list_params.py +0 -0
  101. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/api_key_retrieve_params.py +0 -0
  102. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/api_key_rotate_params.py +0 -0
  103. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/api_key_update_params.py +0 -0
  104. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/app_list_params.py +0 -0
  105. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/app_list_response.py +0 -0
  106. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/audit_log_entry.py +0 -0
  107. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/audit_log_export_chunk_params.py +0 -0
  108. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/audit_log_list_params.py +0 -0
  109. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/auth/__init__.py +0 -0
  110. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/auth/connection_create_params.py +0 -0
  111. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/auth/connection_list_params.py +0 -0
  112. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/auth/connection_login_params.py +0 -0
  113. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/auth/connection_timeline_params.py +0 -0
  114. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/auth/connection_update_params.py +0 -0
  115. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/auth/login_response.py +0 -0
  116. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/auth/submit_fields_response.py +0 -0
  117. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/browser_create_params.py +0 -0
  118. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/browser_create_response.py +0 -0
  119. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/browser_curl_params.py +0 -0
  120. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/browser_curl_response.py +0 -0
  121. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/browser_list_params.py +0 -0
  122. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/browser_list_response.py +0 -0
  123. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/browser_load_extensions_params.py +0 -0
  124. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/browser_pool.py +0 -0
  125. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/browser_pool_acquire_params.py +0 -0
  126. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/browser_pool_acquire_response.py +0 -0
  127. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/browser_pool_create_params.py +0 -0
  128. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/browser_pool_delete_params.py +0 -0
  129. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/browser_pool_list_params.py +0 -0
  130. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/browser_pool_ref.py +0 -0
  131. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/browser_pool_release_params.py +0 -0
  132. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/browser_pool_update_params.py +0 -0
  133. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/browser_retrieve_params.py +0 -0
  134. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/browser_retrieve_response.py +0 -0
  135. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/browser_update_params.py +0 -0
  136. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/browser_update_response.py +0 -0
  137. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/browser_usage.py +0 -0
  138. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/browsers/__init__.py +0 -0
  139. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/browsers/browser_api_call_event.py +0 -0
  140. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/browsers/browser_call_stack.py +0 -0
  141. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/browsers/browser_captcha_solve_result_event.py +0 -0
  142. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/browsers/browser_cdp_connect_event.py +0 -0
  143. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/browsers/browser_cdp_disconnect_event.py +0 -0
  144. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/browsers/browser_console_error_event.py +0 -0
  145. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/browsers/browser_console_log_event.py +0 -0
  146. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/browsers/browser_event_context.py +0 -0
  147. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/browsers/browser_event_source.py +0 -0
  148. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/browsers/browser_http_headers.py +0 -0
  149. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/browsers/browser_interaction_click_event.py +0 -0
  150. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/browsers/browser_interaction_key_event.py +0 -0
  151. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/browsers/browser_interaction_scroll_settled_event.py +0 -0
  152. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/browsers/browser_live_view_connect_event.py +0 -0
  153. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/browsers/browser_live_view_disconnect_event.py +0 -0
  154. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/browsers/browser_monitor_disconnected_event.py +0 -0
  155. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/browsers/browser_monitor_init_failed_event.py +0 -0
  156. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/browsers/browser_monitor_reconnect_failed_event.py +0 -0
  157. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/browsers/browser_monitor_reconnected_event.py +0 -0
  158. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/browsers/browser_monitor_screenshot_event.py +0 -0
  159. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/browsers/browser_network_idle_event.py +0 -0
  160. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/browsers/browser_network_loading_failed_event.py +0 -0
  161. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/browsers/browser_network_request_event.py +0 -0
  162. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/browsers/browser_network_response_event.py +0 -0
  163. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/browsers/browser_page_dom_content_loaded_event.py +0 -0
  164. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/browsers/browser_page_layout_settled_event.py +0 -0
  165. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/browsers/browser_page_layout_shift_event.py +0 -0
  166. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/browsers/browser_page_lcp_event.py +0 -0
  167. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/browsers/browser_page_load_event.py +0 -0
  168. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/browsers/browser_page_navigation_event.py +0 -0
  169. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/browsers/browser_page_navigation_settled_event.py +0 -0
  170. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/browsers/browser_page_tab_opened_event.py +0 -0
  171. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/browsers/browser_service_crashed_event.py +0 -0
  172. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/browsers/browser_system_oom_kill_event.py +0 -0
  173. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/browsers/browser_telemetry_categories_config.py +0 -0
  174. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/browsers/browser_telemetry_categories_config_param.py +0 -0
  175. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/browsers/browser_telemetry_category_config.py +0 -0
  176. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/browsers/browser_telemetry_category_config_param.py +0 -0
  177. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/browsers/browser_telemetry_config.py +0 -0
  178. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/browsers/browser_telemetry_event.py +0 -0
  179. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/browsers/computer_batch_params.py +0 -0
  180. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/browsers/computer_capture_screenshot_params.py +0 -0
  181. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/browsers/computer_click_mouse_params.py +0 -0
  182. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/browsers/computer_drag_mouse_params.py +0 -0
  183. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/browsers/computer_get_mouse_position_response.py +0 -0
  184. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/browsers/computer_move_mouse_params.py +0 -0
  185. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/browsers/computer_press_key_params.py +0 -0
  186. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/browsers/computer_read_clipboard_response.py +0 -0
  187. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/browsers/computer_scroll_params.py +0 -0
  188. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/browsers/computer_set_cursor_visibility_params.py +0 -0
  189. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/browsers/computer_set_cursor_visibility_response.py +0 -0
  190. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/browsers/computer_type_text_params.py +0 -0
  191. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/browsers/computer_write_clipboard_params.py +0 -0
  192. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/browsers/f_create_directory_params.py +0 -0
  193. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/browsers/f_delete_directory_params.py +0 -0
  194. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/browsers/f_delete_file_params.py +0 -0
  195. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/browsers/f_download_dir_zip_params.py +0 -0
  196. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/browsers/f_file_info_params.py +0 -0
  197. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/browsers/f_file_info_response.py +0 -0
  198. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/browsers/f_list_files_params.py +0 -0
  199. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/browsers/f_list_files_response.py +0 -0
  200. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/browsers/f_move_params.py +0 -0
  201. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/browsers/f_read_file_params.py +0 -0
  202. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/browsers/f_set_file_permissions_params.py +0 -0
  203. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/browsers/f_upload_params.py +0 -0
  204. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/browsers/f_upload_zip_params.py +0 -0
  205. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/browsers/f_write_file_params.py +0 -0
  206. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/browsers/fs/__init__.py +0 -0
  207. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/browsers/fs/watch_events_response.py +0 -0
  208. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/browsers/fs/watch_start_params.py +0 -0
  209. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/browsers/fs/watch_start_response.py +0 -0
  210. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/browsers/log_stream_params.py +0 -0
  211. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/browsers/playwright_execute_params.py +0 -0
  212. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/browsers/playwright_execute_response.py +0 -0
  213. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/browsers/process_exec_params.py +0 -0
  214. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/browsers/process_exec_response.py +0 -0
  215. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/browsers/process_kill_params.py +0 -0
  216. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/browsers/process_kill_response.py +0 -0
  217. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/browsers/process_resize_params.py +0 -0
  218. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/browsers/process_resize_response.py +0 -0
  219. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/browsers/process_spawn_params.py +0 -0
  220. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/browsers/process_spawn_response.py +0 -0
  221. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/browsers/process_status_response.py +0 -0
  222. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/browsers/process_stdin_params.py +0 -0
  223. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/browsers/process_stdin_response.py +0 -0
  224. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/browsers/process_stdout_stream_response.py +0 -0
  225. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/browsers/replay_list_response.py +0 -0
  226. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/browsers/replay_start_params.py +0 -0
  227. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/browsers/replay_start_response.py +0 -0
  228. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/browsers/telemetry_events_params.py +0 -0
  229. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/browsers/telemetry_events_response.py +0 -0
  230. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/browsers/telemetry_stream_params.py +0 -0
  231. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/browsers/telemetry_stream_response.py +0 -0
  232. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/created_api_key.py +0 -0
  233. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/credential.py +0 -0
  234. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/credential_create_params.py +0 -0
  235. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/credential_list_params.py +0 -0
  236. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/credential_provider.py +0 -0
  237. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/credential_provider_create_params.py +0 -0
  238. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/credential_provider_item.py +0 -0
  239. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/credential_provider_list_items_response.py +0 -0
  240. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/credential_provider_list_params.py +0 -0
  241. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/credential_provider_test_result.py +0 -0
  242. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/credential_provider_update_params.py +0 -0
  243. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/credential_totp_code_response.py +0 -0
  244. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/credential_update_params.py +0 -0
  245. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/deployment_create_params.py +0 -0
  246. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/deployment_create_response.py +0 -0
  247. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/deployment_follow_params.py +0 -0
  248. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/deployment_follow_response.py +0 -0
  249. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/deployment_list_params.py +0 -0
  250. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/deployment_list_response.py +0 -0
  251. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/deployment_retrieve_response.py +0 -0
  252. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/deployment_state_event.py +0 -0
  253. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/extension_download_from_chrome_store_params.py +0 -0
  254. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/extension_get_response.py +0 -0
  255. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/extension_list_params.py +0 -0
  256. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/extension_list_response.py +0 -0
  257. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/extension_upload_params.py +0 -0
  258. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/extension_upload_response.py +0 -0
  259. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/invocation_create_params.py +0 -0
  260. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/invocation_create_response.py +0 -0
  261. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/invocation_follow_params.py +0 -0
  262. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/invocation_follow_response.py +0 -0
  263. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/invocation_list_browsers_response.py +0 -0
  264. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/invocation_list_params.py +0 -0
  265. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/invocation_list_response.py +0 -0
  266. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/invocation_retrieve_response.py +0 -0
  267. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/invocation_state_event.py +0 -0
  268. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/invocation_update_params.py +0 -0
  269. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/invocation_update_response.py +0 -0
  270. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/organization/__init__.py +0 -0
  271. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/organization/limit_update_params.py +0 -0
  272. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/organization/org_limits.py +0 -0
  273. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/profile.py +0 -0
  274. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/profile_create_params.py +0 -0
  275. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/profile_list_params.py +0 -0
  276. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/profile_update_params.py +0 -0
  277. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/project.py +0 -0
  278. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/project_create_params.py +0 -0
  279. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/project_list_params.py +0 -0
  280. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/project_update_params.py +0 -0
  281. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/projects/__init__.py +0 -0
  282. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/projects/limit_update_params.py +0 -0
  283. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/projects/project_limits.py +0 -0
  284. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/proxy_check_params.py +0 -0
  285. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/proxy_check_response.py +0 -0
  286. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/proxy_create_params.py +0 -0
  287. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/proxy_create_response.py +0 -0
  288. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/proxy_list_params.py +0 -0
  289. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/proxy_list_response.py +0 -0
  290. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/proxy_retrieve_response.py +0 -0
  291. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/proxy_update_params.py +0 -0
  292. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/proxy_update_response.py +0 -0
  293. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/shared/__init__.py +0 -0
  294. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/shared/app_action.py +0 -0
  295. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/shared/browser_extension.py +0 -0
  296. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/shared/browser_profile.py +0 -0
  297. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/shared/browser_viewport.py +0 -0
  298. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/shared/error_detail.py +0 -0
  299. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/shared/error_event.py +0 -0
  300. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/shared/error_model.py +0 -0
  301. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/shared/heartbeat_event.py +0 -0
  302. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/shared/log_event.py +0 -0
  303. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/shared_params/__init__.py +0 -0
  304. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/shared_params/browser_extension.py +0 -0
  305. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/shared_params/browser_profile.py +0 -0
  306. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/shared_params/browser_viewport.py +0 -0
  307. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/tags.py +0 -0
  308. {kernel-0.79.0 → kernel-0.81.0}/src/kernel/types/tags_param.py +0 -0
  309. {kernel-0.79.0 → kernel-0.81.0}/tests/__init__.py +0 -0
  310. {kernel-0.79.0 → kernel-0.81.0}/tests/api_resources/__init__.py +0 -0
  311. {kernel-0.79.0 → kernel-0.81.0}/tests/api_resources/auth/__init__.py +0 -0
  312. {kernel-0.79.0 → kernel-0.81.0}/tests/api_resources/browsers/__init__.py +0 -0
  313. {kernel-0.79.0 → kernel-0.81.0}/tests/api_resources/browsers/fs/__init__.py +0 -0
  314. {kernel-0.79.0 → kernel-0.81.0}/tests/api_resources/browsers/fs/test_watch.py +0 -0
  315. {kernel-0.79.0 → kernel-0.81.0}/tests/api_resources/browsers/test_computer.py +0 -0
  316. {kernel-0.79.0 → kernel-0.81.0}/tests/api_resources/browsers/test_fs.py +0 -0
  317. {kernel-0.79.0 → kernel-0.81.0}/tests/api_resources/browsers/test_logs.py +0 -0
  318. {kernel-0.79.0 → kernel-0.81.0}/tests/api_resources/browsers/test_playwright.py +0 -0
  319. {kernel-0.79.0 → kernel-0.81.0}/tests/api_resources/browsers/test_process.py +0 -0
  320. {kernel-0.79.0 → kernel-0.81.0}/tests/api_resources/browsers/test_replays.py +0 -0
  321. {kernel-0.79.0 → kernel-0.81.0}/tests/api_resources/browsers/test_telemetry.py +0 -0
  322. {kernel-0.79.0 → kernel-0.81.0}/tests/api_resources/organization/__init__.py +0 -0
  323. {kernel-0.79.0 → kernel-0.81.0}/tests/api_resources/organization/test_limits.py +0 -0
  324. {kernel-0.79.0 → kernel-0.81.0}/tests/api_resources/projects/__init__.py +0 -0
  325. {kernel-0.79.0 → kernel-0.81.0}/tests/api_resources/projects/test_limits.py +0 -0
  326. {kernel-0.79.0 → kernel-0.81.0}/tests/api_resources/test_api_keys.py +0 -0
  327. {kernel-0.79.0 → kernel-0.81.0}/tests/api_resources/test_apps.py +0 -0
  328. {kernel-0.79.0 → kernel-0.81.0}/tests/api_resources/test_audit_logs.py +0 -0
  329. {kernel-0.79.0 → kernel-0.81.0}/tests/api_resources/test_browser_pools.py +0 -0
  330. {kernel-0.79.0 → kernel-0.81.0}/tests/api_resources/test_browsers.py +0 -0
  331. {kernel-0.79.0 → kernel-0.81.0}/tests/api_resources/test_credential_providers.py +0 -0
  332. {kernel-0.79.0 → kernel-0.81.0}/tests/api_resources/test_credentials.py +0 -0
  333. {kernel-0.79.0 → kernel-0.81.0}/tests/api_resources/test_deployments.py +0 -0
  334. {kernel-0.79.0 → kernel-0.81.0}/tests/api_resources/test_extensions.py +0 -0
  335. {kernel-0.79.0 → kernel-0.81.0}/tests/api_resources/test_invocations.py +0 -0
  336. {kernel-0.79.0 → kernel-0.81.0}/tests/api_resources/test_profiles.py +0 -0
  337. {kernel-0.79.0 → kernel-0.81.0}/tests/api_resources/test_projects.py +0 -0
  338. {kernel-0.79.0 → kernel-0.81.0}/tests/conftest.py +0 -0
  339. {kernel-0.79.0 → kernel-0.81.0}/tests/sample_file.txt +0 -0
  340. {kernel-0.79.0 → kernel-0.81.0}/tests/test_browser_routing.py +0 -0
  341. {kernel-0.79.0 → kernel-0.81.0}/tests/test_client.py +0 -0
  342. {kernel-0.79.0 → kernel-0.81.0}/tests/test_extract_files.py +0 -0
  343. {kernel-0.79.0 → kernel-0.81.0}/tests/test_files.py +0 -0
  344. {kernel-0.79.0 → kernel-0.81.0}/tests/test_models.py +0 -0
  345. {kernel-0.79.0 → kernel-0.81.0}/tests/test_pagination.py +0 -0
  346. {kernel-0.79.0 → kernel-0.81.0}/tests/test_qs.py +0 -0
  347. {kernel-0.79.0 → kernel-0.81.0}/tests/test_required_args.py +0 -0
  348. {kernel-0.79.0 → kernel-0.81.0}/tests/test_response.py +0 -0
  349. {kernel-0.79.0 → kernel-0.81.0}/tests/test_streaming.py +0 -0
  350. {kernel-0.79.0 → kernel-0.81.0}/tests/test_transform.py +0 -0
  351. {kernel-0.79.0 → kernel-0.81.0}/tests/test_utils/test_datetime_parse.py +0 -0
  352. {kernel-0.79.0 → kernel-0.81.0}/tests/test_utils/test_json.py +0 -0
  353. {kernel-0.79.0 → kernel-0.81.0}/tests/test_utils/test_path.py +0 -0
  354. {kernel-0.79.0 → kernel-0.81.0}/tests/test_utils/test_proxy.py +0 -0
  355. {kernel-0.79.0 → kernel-0.81.0}/tests/test_utils/test_typing.py +0 -0
  356. {kernel-0.79.0 → kernel-0.81.0}/tests/utils.py +0 -0
@@ -0,0 +1,3 @@
1
+ {
2
+ ".": "0.81.0"
3
+ }
@@ -1,5 +1,24 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.81.0 (2026-07-21)
4
+
5
+ Full Changelog: [v0.80.0...v0.81.0](https://github.com/kernel/kernel-python-sdk/compare/v0.80.0...v0.81.0)
6
+
7
+ ### Features
8
+
9
+ * add complete audit log downloads ([18aa8c9](https://github.com/kernel/kernel-python-sdk/commit/18aa8c925b3f7699c30a6202685447432df2da6c))
10
+
11
+ ## 0.80.0 (2026-07-19)
12
+
13
+ Full Changelog: [v0.79.0...v0.80.0](https://github.com/kernel/kernel-python-sdk/compare/v0.79.0...v0.80.0)
14
+
15
+ ### Features
16
+
17
+ * Add example to ProxyCheckRequest.url so API reference sample shows it ([2a288ca](https://github.com/kernel/kernel-python-sdk/commit/2a288ca546da7760cdc16e566260fd440ae36fb7))
18
+ * Expose browser sessions on auth timeline events ([687b401](https://github.com/kernel/kernel-python-sdk/commit/687b401117d37d6db8e818cd08ee3983671a23f6))
19
+ * **managed-auth:** add TS CUA worker contract (KERNEL-1456) ([de2fc59](https://github.com/kernel/kernel-python-sdk/commit/de2fc590e00152328ac6a4f5165da0fb727644bb))
20
+ * **stlc:** configurable CI runner and private-production-repo support in workflow templates ([79f96e4](https://github.com/kernel/kernel-python-sdk/commit/79f96e4e8d8f0e04e21c37010e1faa765f17afb6))
21
+
3
22
  ## 0.79.0 (2026-07-15)
4
23
 
5
24
  Full Changelog: [v0.78.1...v0.79.0](https://github.com/kernel/kernel-python-sdk/compare/v0.78.1...v0.79.0)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: kernel
3
- Version: 0.79.0
3
+ Version: 0.81.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
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "kernel"
3
- version = "0.79.0"
3
+ version = "0.81.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.79.0" # x-release-please-version
4
+ __version__ = "0.81.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:
@@ -505,8 +505,10 @@ class ConnectionsResource(SyncAPIResource):
505
505
  self,
506
506
  id: str,
507
507
  *,
508
+ field_values: Dict[str, str] | Omit = omit,
508
509
  fields: Dict[str, str] | Omit = omit,
509
510
  mfa_option_id: str | Omit = omit,
511
+ selected_choice_id: str | Omit = omit,
510
512
  sign_in_option_id: str | Omit = omit,
511
513
  sso_button_selector: str | Omit = omit,
512
514
  sso_provider: str | Omit = omit,
@@ -523,10 +525,14 @@ class ConnectionsResource(SyncAPIResource):
523
525
  progress and get results.
524
526
 
525
527
  Args:
528
+ field_values: Canonical map of field ID to submitted value.
529
+
526
530
  fields: Map of field name to value
527
531
 
528
532
  mfa_option_id: The MFA method type to select (when mfa_options were returned)
529
533
 
534
+ selected_choice_id: Canonical choice ID selected by the user.
535
+
530
536
  sign_in_option_id: The sign-in option ID to select (when sign_in_options were returned)
531
537
 
532
538
  sso_button_selector: XPath selector for the SSO button to click (ODA). Use sso_provider instead for
@@ -549,8 +555,10 @@ class ConnectionsResource(SyncAPIResource):
549
555
  path_template("/auth/connections/{id}/submit", id=id),
550
556
  body=maybe_transform(
551
557
  {
558
+ "field_values": field_values,
552
559
  "fields": fields,
553
560
  "mfa_option_id": mfa_option_id,
561
+ "selected_choice_id": selected_choice_id,
554
562
  "sign_in_option_id": sign_in_option_id,
555
563
  "sso_button_selector": sso_button_selector,
556
564
  "sso_provider": sso_provider,
@@ -1088,8 +1096,10 @@ class AsyncConnectionsResource(AsyncAPIResource):
1088
1096
  self,
1089
1097
  id: str,
1090
1098
  *,
1099
+ field_values: Dict[str, str] | Omit = omit,
1091
1100
  fields: Dict[str, str] | Omit = omit,
1092
1101
  mfa_option_id: str | Omit = omit,
1102
+ selected_choice_id: str | Omit = omit,
1093
1103
  sign_in_option_id: str | Omit = omit,
1094
1104
  sso_button_selector: str | Omit = omit,
1095
1105
  sso_provider: str | Omit = omit,
@@ -1106,10 +1116,14 @@ class AsyncConnectionsResource(AsyncAPIResource):
1106
1116
  progress and get results.
1107
1117
 
1108
1118
  Args:
1119
+ field_values: Canonical map of field ID to submitted value.
1120
+
1109
1121
  fields: Map of field name to value
1110
1122
 
1111
1123
  mfa_option_id: The MFA method type to select (when mfa_options were returned)
1112
1124
 
1125
+ selected_choice_id: Canonical choice ID selected by the user.
1126
+
1113
1127
  sign_in_option_id: The sign-in option ID to select (when sign_in_options were returned)
1114
1128
 
1115
1129
  sso_button_selector: XPath selector for the SSO button to click (ODA). Use sso_provider instead for
@@ -1132,8 +1146,10 @@ class AsyncConnectionsResource(AsyncAPIResource):
1132
1146
  path_template("/auth/connections/{id}/submit", id=id),
1133
1147
  body=await async_maybe_transform(
1134
1148
  {
1149
+ "field_values": field_values,
1135
1150
  "fields": fields,
1136
1151
  "mfa_option_id": mfa_option_id,
1152
+ "selected_choice_id": selected_choice_id,
1137
1153
  "sign_in_option_id": sign_in_option_id,
1138
1154
  "sso_button_selector": sso_button_selector,
1139
1155
  "sso_provider": sso_provider,
@@ -12,13 +12,36 @@ from ..shared.heartbeat_event import HeartbeatEvent
12
12
  __all__ = [
13
13
  "ConnectionFollowResponse",
14
14
  "ManagedAuthStateEvent",
15
+ "ManagedAuthStateEventChoice",
15
16
  "ManagedAuthStateEventDiscoveredField",
17
+ "ManagedAuthStateEventField",
16
18
  "ManagedAuthStateEventMfaOption",
17
19
  "ManagedAuthStateEventPendingSSOButton",
18
20
  "ManagedAuthStateEventSignInOption",
19
21
  ]
20
22
 
21
23
 
24
+ class ManagedAuthStateEventChoice(BaseModel):
25
+ """Canonical auth-flow choice awaiting user selection."""
26
+
27
+ id: str
28
+ """Stable choice identifier for canonical submit."""
29
+
30
+ label: str
31
+ """Human-readable choice label."""
32
+
33
+ type: Literal[
34
+ "mfa_method", "sso_provider", "sign_in_method", "auth_method", "identifier_method", "account", "other"
35
+ ]
36
+ """Choice type."""
37
+
38
+ description: Optional[str] = None
39
+ """Additional context for the choice."""
40
+
41
+ observed_selector: Optional[str] = None
42
+ """Selector for the visible choice, when available."""
43
+
44
+
22
45
  class ManagedAuthStateEventDiscoveredField(BaseModel):
23
46
  """A discovered form field"""
24
47
 
@@ -53,6 +76,28 @@ class ManagedAuthStateEventDiscoveredField(BaseModel):
53
76
  """Whether field is required"""
54
77
 
55
78
 
79
+ class ManagedAuthStateEventField(BaseModel):
80
+ """Canonical field awaiting user input."""
81
+
82
+ id: str
83
+ """Stable field identifier for canonical submit."""
84
+
85
+ ref: str
86
+ """Credential reference name to store the submitted value under."""
87
+
88
+ type: Literal["identifier", "password", "code", "totp_code", "totp_secret", "text"]
89
+ """Managed-auth field type."""
90
+
91
+ label: Optional[str] = None
92
+ """Human-readable label shown to the user."""
93
+
94
+ observed_selector: Optional[str] = None
95
+ """Selector for the visible field, when available."""
96
+
97
+ required: Optional[bool] = None
98
+ """Whether this field is required."""
99
+
100
+
56
101
  class ManagedAuthStateEventMfaOption(BaseModel):
57
102
  """An MFA method option for verification"""
58
103
 
@@ -118,6 +163,13 @@ class ManagedAuthStateEvent(BaseModel):
118
163
  timestamp: datetime
119
164
  """Time the state was reported."""
120
165
 
166
+ choices: Optional[List[ManagedAuthStateEventChoice]] = None
167
+ """Canonical choices awaiting selection.
168
+
169
+ Prefer this over pending_sso_buttons, mfa_options, and sign_in_options when
170
+ present.
171
+ """
172
+
121
173
  discovered_fields: Optional[List[ManagedAuthStateEventDiscoveredField]] = None
122
174
  """
123
175
  Fields awaiting input (present when flow_step=AWAITING_INPUT; may also be
@@ -136,6 +188,12 @@ class ManagedAuthStateEvent(BaseModel):
136
188
  flow_step=AWAITING_EXTERNAL_ACTION).
137
189
  """
138
190
 
191
+ fields: Optional[List[ManagedAuthStateEventField]] = None
192
+ """Canonical fields awaiting input.
193
+
194
+ Prefer this over discovered_fields when present.
195
+ """
196
+
139
197
  flow_type: Optional[Literal["LOGIN", "REAUTH"]] = None
140
198
  """Type of the current flow."""
141
199
 
@@ -9,12 +9,18 @@ __all__ = ["ConnectionSubmitParams"]
9
9
 
10
10
 
11
11
  class ConnectionSubmitParams(TypedDict, total=False):
12
+ field_values: Dict[str, str]
13
+ """Canonical map of field ID to submitted value."""
14
+
12
15
  fields: Dict[str, str]
13
16
  """Map of field name to value"""
14
17
 
15
18
  mfa_option_id: str
16
19
  """The MFA method type to select (when mfa_options were returned)"""
17
20
 
21
+ selected_choice_id: str
22
+ """Canonical choice ID selected by the user."""
23
+
18
24
  sign_in_option_id: str
19
25
  """The sign-in option ID to select (when sign_in_options were returned)"""
20
26