kernel 0.51.0__tar.gz → 0.53.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 (278) hide show
  1. kernel-0.53.0/.release-please-manifest.json +3 -0
  2. {kernel-0.51.0 → kernel-0.53.0}/CHANGELOG.md +51 -0
  3. {kernel-0.51.0 → kernel-0.53.0}/PKG-INFO +1 -1
  4. kernel-0.53.0/examples/browser_routing.py +26 -0
  5. {kernel-0.51.0 → kernel-0.53.0}/pyproject.toml +2 -2
  6. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/_client.py +23 -1
  7. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/_files.py +1 -1
  8. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/_models.py +80 -0
  9. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/_qs.py +2 -6
  10. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/_types.py +3 -0
  11. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/_utils/_utils.py +34 -8
  12. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/_version.py +1 -1
  13. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/resources/auth/connections.py +40 -2
  14. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/resources/browser_pools.py +36 -4
  15. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/resources/browsers/browsers.py +16 -0
  16. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/resources/credentials.py +2 -2
  17. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/resources/extensions.py +2 -2
  18. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/resources/profiles.py +6 -10
  19. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/resources/projects/projects.py +8 -0
  20. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/types/auth/connection_create_params.py +6 -0
  21. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/types/auth/connection_follow_response.py +19 -9
  22. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/types/auth/connection_login_params.py +6 -0
  23. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/types/auth/connection_update_params.py +3 -0
  24. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/types/auth/managed_auth.py +25 -9
  25. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/types/browser_create_params.py +9 -0
  26. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/types/browser_create_response.py +6 -0
  27. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/types/browser_list_response.py +6 -0
  28. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/types/browser_pool.py +10 -1
  29. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/types/browser_pool_acquire_response.py +6 -0
  30. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/types/browser_pool_create_params.py +10 -1
  31. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/types/browser_pool_update_params.py +10 -1
  32. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/types/browser_retrieve_response.py +6 -0
  33. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/types/browser_update_response.py +6 -0
  34. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/types/credential.py +1 -1
  35. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/types/credential_create_params.py +1 -1
  36. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/types/extension_list_response.py +1 -1
  37. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/types/extension_upload_params.py +1 -1
  38. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/types/extension_upload_response.py +1 -1
  39. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/types/invocation_list_browsers_response.py +6 -0
  40. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/types/profile_create_params.py +1 -1
  41. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/types/project_list_params.py +3 -0
  42. {kernel-0.51.0 → kernel-0.53.0}/tests/api_resources/auth/test_connections.py +6 -0
  43. {kernel-0.51.0 → kernel-0.53.0}/tests/api_resources/test_browser_pools.py +4 -0
  44. {kernel-0.51.0 → kernel-0.53.0}/tests/api_resources/test_browsers.py +2 -0
  45. {kernel-0.51.0 → kernel-0.53.0}/tests/api_resources/test_projects.py +2 -0
  46. {kernel-0.51.0 → kernel-0.53.0}/tests/test_extract_files.py +23 -5
  47. {kernel-0.51.0 → kernel-0.53.0}/tests/test_files.py +1 -1
  48. {kernel-0.51.0 → kernel-0.53.0}/tests/test_models.py +57 -3
  49. kernel-0.51.0/.release-please-manifest.json +0 -3
  50. kernel-0.51.0/examples/browser_routing.py +0 -25
  51. {kernel-0.51.0 → kernel-0.53.0}/.gitignore +0 -0
  52. {kernel-0.51.0 → kernel-0.53.0}/CONTRIBUTING.md +0 -0
  53. {kernel-0.51.0 → kernel-0.53.0}/LICENSE +0 -0
  54. {kernel-0.51.0 → kernel-0.53.0}/README.md +0 -0
  55. {kernel-0.51.0 → kernel-0.53.0}/SECURITY.md +0 -0
  56. {kernel-0.51.0 → kernel-0.53.0}/api.md +0 -0
  57. {kernel-0.51.0 → kernel-0.53.0}/bin/check-release-environment +0 -0
  58. {kernel-0.51.0 → kernel-0.53.0}/bin/publish-pypi +0 -0
  59. {kernel-0.51.0 → kernel-0.53.0}/examples/.keep +0 -0
  60. {kernel-0.51.0 → kernel-0.53.0}/noxfile.py +0 -0
  61. {kernel-0.51.0 → kernel-0.53.0}/release-please-config.json +0 -0
  62. {kernel-0.51.0 → kernel-0.53.0}/requirements-dev.lock +0 -0
  63. {kernel-0.51.0 → kernel-0.53.0}/requirements.lock +0 -0
  64. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/__init__.py +0 -0
  65. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/_base_client.py +0 -0
  66. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/_compat.py +0 -0
  67. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/_constants.py +0 -0
  68. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/_exceptions.py +0 -0
  69. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/_resource.py +0 -0
  70. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/_response.py +0 -0
  71. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/_streaming.py +0 -0
  72. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/_utils/__init__.py +0 -0
  73. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/_utils/_compat.py +0 -0
  74. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/_utils/_datetime_parse.py +0 -0
  75. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/_utils/_json.py +0 -0
  76. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/_utils/_logs.py +0 -0
  77. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/_utils/_path.py +0 -0
  78. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/_utils/_proxy.py +0 -0
  79. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/_utils/_reflection.py +0 -0
  80. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/_utils/_resources_proxy.py +0 -0
  81. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/_utils/_streams.py +0 -0
  82. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/_utils/_sync.py +0 -0
  83. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/_utils/_transform.py +0 -0
  84. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/_utils/_typing.py +0 -0
  85. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/app_framework.py +0 -0
  86. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/lib/.keep +0 -0
  87. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/lib/browser_routing/__init__.py +0 -0
  88. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/lib/browser_routing/raw_http.py +0 -0
  89. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/lib/browser_routing/routing.py +0 -0
  90. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/lib/browser_routing/util.py +0 -0
  91. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/pagination.py +0 -0
  92. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/py.typed +0 -0
  93. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/resources/__init__.py +0 -0
  94. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/resources/apps.py +0 -0
  95. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/resources/auth/__init__.py +0 -0
  96. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/resources/auth/auth.py +0 -0
  97. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/resources/browsers/__init__.py +0 -0
  98. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/resources/browsers/computer.py +0 -0
  99. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/resources/browsers/fs/__init__.py +0 -0
  100. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/resources/browsers/fs/fs.py +0 -0
  101. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/resources/browsers/fs/watch.py +0 -0
  102. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/resources/browsers/logs.py +0 -0
  103. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/resources/browsers/playwright.py +0 -0
  104. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/resources/browsers/process.py +0 -0
  105. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/resources/browsers/replays.py +0 -0
  106. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/resources/credential_providers.py +0 -0
  107. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/resources/deployments.py +0 -0
  108. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/resources/invocations.py +0 -0
  109. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/resources/projects/__init__.py +0 -0
  110. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/resources/projects/limits.py +0 -0
  111. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/resources/proxies.py +0 -0
  112. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/types/__init__.py +0 -0
  113. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/types/app_list_params.py +0 -0
  114. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/types/app_list_response.py +0 -0
  115. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/types/auth/__init__.py +0 -0
  116. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/types/auth/connection_list_params.py +0 -0
  117. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/types/auth/connection_submit_params.py +0 -0
  118. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/types/auth/login_response.py +0 -0
  119. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/types/auth/submit_fields_response.py +0 -0
  120. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/types/browser_curl_params.py +0 -0
  121. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/types/browser_curl_response.py +0 -0
  122. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/types/browser_delete_params.py +0 -0
  123. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/types/browser_list_params.py +0 -0
  124. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/types/browser_load_extensions_params.py +0 -0
  125. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/types/browser_persistence.py +0 -0
  126. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/types/browser_persistence_param.py +0 -0
  127. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/types/browser_pool_acquire_params.py +0 -0
  128. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/types/browser_pool_delete_params.py +0 -0
  129. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/types/browser_pool_list_response.py +0 -0
  130. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/types/browser_pool_ref.py +0 -0
  131. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/types/browser_pool_release_params.py +0 -0
  132. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/types/browser_retrieve_params.py +0 -0
  133. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/types/browser_update_params.py +0 -0
  134. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/types/browser_usage.py +0 -0
  135. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/types/browsers/__init__.py +0 -0
  136. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/types/browsers/computer_batch_params.py +0 -0
  137. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/types/browsers/computer_capture_screenshot_params.py +0 -0
  138. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/types/browsers/computer_click_mouse_params.py +0 -0
  139. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/types/browsers/computer_drag_mouse_params.py +0 -0
  140. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/types/browsers/computer_get_mouse_position_response.py +0 -0
  141. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/types/browsers/computer_move_mouse_params.py +0 -0
  142. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/types/browsers/computer_press_key_params.py +0 -0
  143. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/types/browsers/computer_read_clipboard_response.py +0 -0
  144. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/types/browsers/computer_scroll_params.py +0 -0
  145. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/types/browsers/computer_set_cursor_visibility_params.py +0 -0
  146. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/types/browsers/computer_set_cursor_visibility_response.py +0 -0
  147. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/types/browsers/computer_type_text_params.py +0 -0
  148. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/types/browsers/computer_write_clipboard_params.py +0 -0
  149. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/types/browsers/f_create_directory_params.py +0 -0
  150. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/types/browsers/f_delete_directory_params.py +0 -0
  151. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/types/browsers/f_delete_file_params.py +0 -0
  152. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/types/browsers/f_download_dir_zip_params.py +0 -0
  153. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/types/browsers/f_file_info_params.py +0 -0
  154. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/types/browsers/f_file_info_response.py +0 -0
  155. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/types/browsers/f_list_files_params.py +0 -0
  156. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/types/browsers/f_list_files_response.py +0 -0
  157. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/types/browsers/f_move_params.py +0 -0
  158. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/types/browsers/f_read_file_params.py +0 -0
  159. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/types/browsers/f_set_file_permissions_params.py +0 -0
  160. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/types/browsers/f_upload_params.py +0 -0
  161. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/types/browsers/f_upload_zip_params.py +0 -0
  162. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/types/browsers/f_write_file_params.py +0 -0
  163. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/types/browsers/fs/__init__.py +0 -0
  164. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/types/browsers/fs/watch_events_response.py +0 -0
  165. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/types/browsers/fs/watch_start_params.py +0 -0
  166. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/types/browsers/fs/watch_start_response.py +0 -0
  167. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/types/browsers/log_stream_params.py +0 -0
  168. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/types/browsers/playwright_execute_params.py +0 -0
  169. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/types/browsers/playwright_execute_response.py +0 -0
  170. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/types/browsers/process_exec_params.py +0 -0
  171. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/types/browsers/process_exec_response.py +0 -0
  172. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/types/browsers/process_kill_params.py +0 -0
  173. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/types/browsers/process_kill_response.py +0 -0
  174. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/types/browsers/process_resize_params.py +0 -0
  175. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/types/browsers/process_resize_response.py +0 -0
  176. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/types/browsers/process_spawn_params.py +0 -0
  177. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/types/browsers/process_spawn_response.py +0 -0
  178. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/types/browsers/process_status_response.py +0 -0
  179. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/types/browsers/process_stdin_params.py +0 -0
  180. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/types/browsers/process_stdin_response.py +0 -0
  181. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/types/browsers/process_stdout_stream_response.py +0 -0
  182. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/types/browsers/replay_list_response.py +0 -0
  183. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/types/browsers/replay_start_params.py +0 -0
  184. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/types/browsers/replay_start_response.py +0 -0
  185. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/types/credential_list_params.py +0 -0
  186. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/types/credential_provider.py +0 -0
  187. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/types/credential_provider_create_params.py +0 -0
  188. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/types/credential_provider_item.py +0 -0
  189. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/types/credential_provider_list_items_response.py +0 -0
  190. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/types/credential_provider_list_response.py +0 -0
  191. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/types/credential_provider_test_result.py +0 -0
  192. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/types/credential_provider_update_params.py +0 -0
  193. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/types/credential_totp_code_response.py +0 -0
  194. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/types/credential_update_params.py +0 -0
  195. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/types/deployment_create_params.py +0 -0
  196. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/types/deployment_create_response.py +0 -0
  197. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/types/deployment_follow_params.py +0 -0
  198. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/types/deployment_follow_response.py +0 -0
  199. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/types/deployment_list_params.py +0 -0
  200. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/types/deployment_list_response.py +0 -0
  201. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/types/deployment_retrieve_response.py +0 -0
  202. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/types/deployment_state_event.py +0 -0
  203. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/types/extension_download_from_chrome_store_params.py +0 -0
  204. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/types/invocation_create_params.py +0 -0
  205. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/types/invocation_create_response.py +0 -0
  206. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/types/invocation_follow_params.py +0 -0
  207. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/types/invocation_follow_response.py +0 -0
  208. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/types/invocation_list_params.py +0 -0
  209. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/types/invocation_list_response.py +0 -0
  210. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/types/invocation_retrieve_response.py +0 -0
  211. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/types/invocation_state_event.py +0 -0
  212. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/types/invocation_update_params.py +0 -0
  213. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/types/invocation_update_response.py +0 -0
  214. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/types/profile.py +0 -0
  215. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/types/profile_list_params.py +0 -0
  216. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/types/project.py +0 -0
  217. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/types/project_create_params.py +0 -0
  218. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/types/project_update_params.py +0 -0
  219. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/types/projects/__init__.py +0 -0
  220. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/types/projects/limit_update_params.py +0 -0
  221. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/types/projects/project_limits.py +0 -0
  222. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/types/proxy_check_params.py +0 -0
  223. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/types/proxy_check_response.py +0 -0
  224. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/types/proxy_create_params.py +0 -0
  225. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/types/proxy_create_response.py +0 -0
  226. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/types/proxy_list_response.py +0 -0
  227. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/types/proxy_retrieve_response.py +0 -0
  228. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/types/shared/__init__.py +0 -0
  229. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/types/shared/app_action.py +0 -0
  230. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/types/shared/browser_extension.py +0 -0
  231. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/types/shared/browser_profile.py +0 -0
  232. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/types/shared/browser_viewport.py +0 -0
  233. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/types/shared/error_detail.py +0 -0
  234. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/types/shared/error_event.py +0 -0
  235. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/types/shared/error_model.py +0 -0
  236. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/types/shared/heartbeat_event.py +0 -0
  237. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/types/shared/log_event.py +0 -0
  238. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/types/shared_params/__init__.py +0 -0
  239. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/types/shared_params/browser_extension.py +0 -0
  240. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/types/shared_params/browser_profile.py +0 -0
  241. {kernel-0.51.0 → kernel-0.53.0}/src/kernel/types/shared_params/browser_viewport.py +0 -0
  242. {kernel-0.51.0 → kernel-0.53.0}/tests/__init__.py +0 -0
  243. {kernel-0.51.0 → kernel-0.53.0}/tests/api_resources/__init__.py +0 -0
  244. {kernel-0.51.0 → kernel-0.53.0}/tests/api_resources/auth/__init__.py +0 -0
  245. {kernel-0.51.0 → kernel-0.53.0}/tests/api_resources/browsers/__init__.py +0 -0
  246. {kernel-0.51.0 → kernel-0.53.0}/tests/api_resources/browsers/fs/__init__.py +0 -0
  247. {kernel-0.51.0 → kernel-0.53.0}/tests/api_resources/browsers/fs/test_watch.py +0 -0
  248. {kernel-0.51.0 → kernel-0.53.0}/tests/api_resources/browsers/test_computer.py +0 -0
  249. {kernel-0.51.0 → kernel-0.53.0}/tests/api_resources/browsers/test_fs.py +0 -0
  250. {kernel-0.51.0 → kernel-0.53.0}/tests/api_resources/browsers/test_logs.py +0 -0
  251. {kernel-0.51.0 → kernel-0.53.0}/tests/api_resources/browsers/test_playwright.py +0 -0
  252. {kernel-0.51.0 → kernel-0.53.0}/tests/api_resources/browsers/test_process.py +0 -0
  253. {kernel-0.51.0 → kernel-0.53.0}/tests/api_resources/browsers/test_replays.py +0 -0
  254. {kernel-0.51.0 → kernel-0.53.0}/tests/api_resources/projects/__init__.py +0 -0
  255. {kernel-0.51.0 → kernel-0.53.0}/tests/api_resources/projects/test_limits.py +0 -0
  256. {kernel-0.51.0 → kernel-0.53.0}/tests/api_resources/test_apps.py +0 -0
  257. {kernel-0.51.0 → kernel-0.53.0}/tests/api_resources/test_credential_providers.py +0 -0
  258. {kernel-0.51.0 → kernel-0.53.0}/tests/api_resources/test_credentials.py +0 -0
  259. {kernel-0.51.0 → kernel-0.53.0}/tests/api_resources/test_deployments.py +0 -0
  260. {kernel-0.51.0 → kernel-0.53.0}/tests/api_resources/test_extensions.py +0 -0
  261. {kernel-0.51.0 → kernel-0.53.0}/tests/api_resources/test_invocations.py +0 -0
  262. {kernel-0.51.0 → kernel-0.53.0}/tests/api_resources/test_profiles.py +0 -0
  263. {kernel-0.51.0 → kernel-0.53.0}/tests/api_resources/test_proxies.py +0 -0
  264. {kernel-0.51.0 → kernel-0.53.0}/tests/conftest.py +0 -0
  265. {kernel-0.51.0 → kernel-0.53.0}/tests/sample_file.txt +0 -0
  266. {kernel-0.51.0 → kernel-0.53.0}/tests/test_browser_routing.py +0 -0
  267. {kernel-0.51.0 → kernel-0.53.0}/tests/test_client.py +0 -0
  268. {kernel-0.51.0 → kernel-0.53.0}/tests/test_qs.py +0 -0
  269. {kernel-0.51.0 → kernel-0.53.0}/tests/test_required_args.py +0 -0
  270. {kernel-0.51.0 → kernel-0.53.0}/tests/test_response.py +0 -0
  271. {kernel-0.51.0 → kernel-0.53.0}/tests/test_streaming.py +0 -0
  272. {kernel-0.51.0 → kernel-0.53.0}/tests/test_transform.py +0 -0
  273. {kernel-0.51.0 → kernel-0.53.0}/tests/test_utils/test_datetime_parse.py +0 -0
  274. {kernel-0.51.0 → kernel-0.53.0}/tests/test_utils/test_json.py +0 -0
  275. {kernel-0.51.0 → kernel-0.53.0}/tests/test_utils/test_path.py +0 -0
  276. {kernel-0.51.0 → kernel-0.53.0}/tests/test_utils/test_proxy.py +0 -0
  277. {kernel-0.51.0 → kernel-0.53.0}/tests/test_utils/test_typing.py +0 -0
  278. {kernel-0.51.0 → kernel-0.53.0}/tests/utils.py +0 -0
@@ -0,0 +1,3 @@
1
+ {
2
+ ".": "0.53.0"
3
+ }
@@ -1,5 +1,56 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.53.0 (2026-05-12)
4
+
5
+ Full Changelog: [v0.52.0...v0.53.0](https://github.com/kernel/kernel-python-sdk/compare/v0.52.0...v0.53.0)
6
+
7
+ ### Features
8
+
9
+ * Add 'switch' MFA option type for generic method-switcher links ([82ae224](https://github.com/kernel/kernel-python-sdk/commit/82ae224a85a22b16e48a26a8058cc992ef772cf2))
10
+ * Add opt-in record_session flag to managed auth ([53fea1c](https://github.com/kernel/kernel-python-sdk/commit/53fea1c26cd8de2b93944bb7625c401d05362b1c))
11
+ * **api:** server-side search on GET /projects ([cacb057](https://github.com/kernel/kernel-python-sdk/commit/cacb057a5d1d3bcb26b6df1f6fe83067f936d642))
12
+ * browser_pools: add start_url config (KERNEL-1217 PR 2) ([e3f0b8d](https://github.com/kernel/kernel-python-sdk/commit/e3f0b8db4b2d05140d112317315ba1e393f385cf))
13
+ * **internal/types:** support eagerly validating pydantic iterators ([b30bc1e](https://github.com/kernel/kernel-python-sdk/commit/b30bc1e0c3493f12a3499eb037f13561dfdcaedf))
14
+ * managed-auth: surface awaiting_external_action even when fallback actions exist ([fd4ffe4](https://github.com/kernel/kernel-python-sdk/commit/fd4ffe40e037e95e93f46b7773d6a5e468c7b8fd))
15
+ * Scope name uniqueness to project for profiles, session_pools, extensions, credentials ([c510a51](https://github.com/kernel/kernel-python-sdk/commit/c510a515b3c57846f0e681638167ba87b8ee15c3))
16
+
17
+
18
+ ### Bug Fixes
19
+
20
+ * **client:** add missing f-string prefix in file type error message ([fb5340d](https://github.com/kernel/kernel-python-sdk/commit/fb5340dbf9ea49393d87b5760a2efaaf932c9442))
21
+
22
+
23
+ ### Chores
24
+
25
+ * **internal:** reformat pyproject.toml ([27c799b](https://github.com/kernel/kernel-python-sdk/commit/27c799be452cb66af59b79d24b3d5147a85b70f7))
26
+
27
+
28
+ ### Documentation
29
+
30
+ * clarify record_session description in OpenAPI spec ([3ac3fb8](https://github.com/kernel/kernel-python-sdk/commit/3ac3fb8e4e643c40addd3e85f8480d5821cecca7))
31
+
32
+ ## 0.52.0 (2026-04-29)
33
+
34
+ Full Changelog: [v0.51.0...v0.52.0](https://github.com/kernel/kernel-python-sdk/compare/v0.51.0...v0.52.0)
35
+
36
+ ### Features
37
+
38
+ * profile download: 409 for empty profile + surface API errors in dashboard ([fd0c20e](https://github.com/kernel/kernel-python-sdk/commit/fd0c20eb17f0a6df382672c34830a81fac9217d9))
39
+ * support setting headers via env ([37dda88](https://github.com/kernel/kernel-python-sdk/commit/37dda88a1f88fdf4bd8da615cbb6be1aadae3f41))
40
+
41
+
42
+ ### Bug Fixes
43
+
44
+ * use correct field name format for multipart file arrays ([663f0a8](https://github.com/kernel/kernel-python-sdk/commit/663f0a8a633fd5b0f5f8b65ed169c4d780251e1d))
45
+
46
+
47
+ ### Documentation
48
+
49
+ * annotate response with httpx.Response in browser routing example ([0dfa1fb](https://github.com/kernel/kernel-python-sdk/commit/0dfa1fb978da1c4fd474840ae8664f027e1feb39))
50
+ * print buffered body and mention httpx.Response semantics ([84cb2e3](https://github.com/kernel/kernel-python-sdk/commit/84cb2e38486f330635487ed049d692f7c9716a1f))
51
+ * show both raw streaming and buffered curl in routing example ([407e748](https://github.com/kernel/kernel-python-sdk/commit/407e74862f99db13320ea6c02a8752759d4de60a))
52
+ * simplify browser routing example ([58b0ee2](https://github.com/kernel/kernel-python-sdk/commit/58b0ee27cdac1f4021c6e333f8157318c838ec56))
53
+
3
54
  ## 0.51.0 (2026-04-25)
4
55
 
5
56
  Full Changelog: [v0.50.0...v0.51.0](https://github.com/kernel/kernel-python-sdk/compare/v0.50.0...v0.51.0)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: kernel
3
- Version: 0.51.0
3
+ Version: 0.53.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
@@ -0,0 +1,26 @@
1
+ """Example: direct-to-VM browser routing for raw HTTP."""
2
+
3
+ import httpx
4
+
5
+ from kernel import Kernel
6
+
7
+
8
+ def main() -> None:
9
+ client = Kernel()
10
+
11
+ browser = client.browsers.create()
12
+
13
+ # Raw browser curl: streams the response. Use for large responses, when you want to stream,
14
+ # or when you want httpx.Response semantics.
15
+ response: httpx.Response = client.browsers.request(browser.session_id, "GET", "https://example.com")
16
+ print("status", response.status_code)
17
+
18
+ # Buffered browser curl: returns the full response in a JSON envelope. Use for small responses.
19
+ buffered = client.browsers.curl(browser.session_id, url="https://example.com", method="GET")
20
+ print("body", buffered.body)
21
+
22
+ client.browsers.delete_by_id(browser.session_id)
23
+
24
+
25
+ if __name__ == "__main__":
26
+ main()
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "kernel"
3
- version = "0.51.0"
3
+ version = "0.53.0"
4
4
  description = "The official Python library for the kernel API"
5
5
  dynamic = ["readme"]
6
6
  license = "Apache-2.0"
@@ -168,7 +168,7 @@ show_error_codes = true
168
168
  #
169
169
  # We also exclude our `tests` as mypy doesn't always infer
170
170
  # types correctly and Pyright will still catch any type errors.
171
- exclude = ['src/kernel/_files.py', '_dev/.*.py', 'tests/.*']
171
+ exclude = ["src/kernel/_files.py", "_dev/.*.py", "tests/.*"]
172
172
 
173
173
  strict_equality = true
174
174
  implicit_reexport = true
@@ -20,7 +20,11 @@ from ._types import (
20
20
  RequestOptions,
21
21
  not_given,
22
22
  )
23
- from ._utils import is_given, get_async_library
23
+ from ._utils import (
24
+ is_given,
25
+ is_mapping_t,
26
+ get_async_library,
27
+ )
24
28
  from ._compat import cached_property
25
29
  from ._models import FinalRequestOptions
26
30
  from ._version import __version__
@@ -158,6 +162,15 @@ class Kernel(SyncAPIClient):
158
162
  except KeyError as exc:
159
163
  raise ValueError(f"Unknown environment: {environment}") from exc
160
164
 
165
+ custom_headers_env = os.environ.get("KERNEL_CUSTOM_HEADERS")
166
+ if custom_headers_env is not None:
167
+ parsed: dict[str, str] = {}
168
+ for line in custom_headers_env.split("\n"):
169
+ colon = line.find(":")
170
+ if colon >= 0:
171
+ parsed[line[:colon].strip()] = line[colon + 1 :].strip()
172
+ default_headers = {**parsed, **(default_headers if is_mapping_t(default_headers) else {})}
173
+
161
174
  super().__init__(
162
175
  version=__version__,
163
176
  base_url=base_url,
@@ -473,6 +486,15 @@ class AsyncKernel(AsyncAPIClient):
473
486
  except KeyError as exc:
474
487
  raise ValueError(f"Unknown environment: {environment}") from exc
475
488
 
489
+ custom_headers_env = os.environ.get("KERNEL_CUSTOM_HEADERS")
490
+ if custom_headers_env is not None:
491
+ parsed: dict[str, str] = {}
492
+ for line in custom_headers_env.split("\n"):
493
+ colon = line.find(":")
494
+ if colon >= 0:
495
+ parsed[line[:colon].strip()] = line[colon + 1 :].strip()
496
+ default_headers = {**parsed, **(default_headers if is_mapping_t(default_headers) else {})}
497
+
476
498
  super().__init__(
477
499
  version=__version__,
478
500
  base_url=base_url,
@@ -99,7 +99,7 @@ async def async_to_httpx_files(files: RequestFiles | None) -> HttpxRequestFiles
99
99
  elif is_sequence_t(files):
100
100
  files = [(key, await _async_transform_file(file)) for key, file in files]
101
101
  else:
102
- raise TypeError("Unexpected file type input {type(files)}, expected mapping or sequence")
102
+ raise TypeError(f"Unexpected file type input {type(files)}, expected mapping or sequence")
103
103
 
104
104
  return files
105
105
 
@@ -25,7 +25,9 @@ from typing_extensions import (
25
25
  ClassVar,
26
26
  Protocol,
27
27
  Required,
28
+ Annotated,
28
29
  ParamSpec,
30
+ TypeAlias,
29
31
  TypedDict,
30
32
  TypeGuard,
31
33
  final,
@@ -79,7 +81,15 @@ from ._compat import (
79
81
  from ._constants import RAW_RESPONSE_HEADER
80
82
 
81
83
  if TYPE_CHECKING:
84
+ from pydantic import GetCoreSchemaHandler, ValidatorFunctionWrapHandler
85
+ from pydantic_core import CoreSchema, core_schema
82
86
  from pydantic_core.core_schema import ModelField, ModelSchema, LiteralSchema, ModelFieldsSchema
87
+ else:
88
+ try:
89
+ from pydantic_core import CoreSchema, core_schema
90
+ except ImportError:
91
+ CoreSchema = None
92
+ core_schema = None
83
93
 
84
94
  __all__ = ["BaseModel", "GenericModel"]
85
95
 
@@ -396,6 +406,76 @@ class BaseModel(pydantic.BaseModel):
396
406
  )
397
407
 
398
408
 
409
+ class _EagerIterable(list[_T], Generic[_T]):
410
+ """
411
+ Accepts any Iterable[T] input (including generators), consumes it
412
+ eagerly, and validates all items upfront.
413
+
414
+ Validation preserves the original container type where possible
415
+ (e.g. a set[T] stays a set[T]). Serialization (model_dump / JSON)
416
+ always emits a list — round-tripping through model_dump() will not
417
+ restore the original container type.
418
+ """
419
+
420
+ @classmethod
421
+ def __get_pydantic_core_schema__(
422
+ cls,
423
+ source_type: Any,
424
+ handler: GetCoreSchemaHandler,
425
+ ) -> CoreSchema:
426
+ (item_type,) = get_args(source_type) or (Any,)
427
+ item_schema: CoreSchema = handler.generate_schema(item_type)
428
+ list_of_items_schema: CoreSchema = core_schema.list_schema(item_schema)
429
+
430
+ return core_schema.no_info_wrap_validator_function(
431
+ cls._validate,
432
+ list_of_items_schema,
433
+ serialization=core_schema.plain_serializer_function_ser_schema(
434
+ cls._serialize,
435
+ info_arg=False,
436
+ ),
437
+ )
438
+
439
+ @staticmethod
440
+ def _validate(v: Iterable[_T], handler: "ValidatorFunctionWrapHandler") -> Any:
441
+ original_type: type[Any] = type(v)
442
+
443
+ # Normalize to list so list_schema can validate each item
444
+ if isinstance(v, list):
445
+ items: list[_T] = v
446
+ else:
447
+ try:
448
+ items = list(v)
449
+ except TypeError as e:
450
+ raise TypeError("Value is not iterable") from e
451
+
452
+ # Validate items against the inner schema
453
+ validated: list[_T] = handler(items)
454
+
455
+ # Reconstruct original container type
456
+ if original_type is list:
457
+ return validated
458
+ # str(list) produces the list's repr, not a string built from items,
459
+ # so skip reconstruction for str and its subclasses.
460
+ if issubclass(original_type, str):
461
+ return validated
462
+ try:
463
+ return original_type(validated)
464
+ except (TypeError, ValueError):
465
+ # If the type cannot be reconstructed, just return the validated list
466
+ return validated
467
+
468
+ @staticmethod
469
+ def _serialize(v: Iterable[_T]) -> list[_T]:
470
+ """Always serialize as a list so Pydantic's JSON encoder is happy."""
471
+ if isinstance(v, list):
472
+ return v
473
+ return list(v)
474
+
475
+
476
+ EagerIterable: TypeAlias = Annotated[Iterable[_T], _EagerIterable]
477
+
478
+
399
479
  def _construct_field(value: object, field: FieldInfo, key: str) -> object:
400
480
  if value is None:
401
481
  return field_get_default(field)
@@ -2,17 +2,13 @@ from __future__ import annotations
2
2
 
3
3
  from typing import Any, List, Tuple, Union, Mapping, TypeVar
4
4
  from urllib.parse import parse_qs, urlencode
5
- from typing_extensions import Literal, get_args
5
+ from typing_extensions import get_args
6
6
 
7
- from ._types import NotGiven, not_given
7
+ from ._types import NotGiven, ArrayFormat, NestedFormat, not_given
8
8
  from ._utils import flatten
9
9
 
10
10
  _T = TypeVar("_T")
11
11
 
12
-
13
- ArrayFormat = Literal["comma", "repeat", "indices", "brackets"]
14
- NestedFormat = Literal["dots", "brackets"]
15
-
16
12
  PrimitiveData = Union[str, int, float, bool, None]
17
13
  # this should be Data = Union[PrimitiveData, "List[Data]", "Tuple[Data]", "Mapping[str, Data]"]
18
14
  # https://github.com/microsoft/pyright/issues/3555
@@ -47,6 +47,9 @@ AnyMapping = Mapping[str, object]
47
47
  ModelT = TypeVar("ModelT", bound=pydantic.BaseModel)
48
48
  _T = TypeVar("_T")
49
49
 
50
+ ArrayFormat = Literal["comma", "repeat", "indices", "brackets"]
51
+ NestedFormat = Literal["dots", "brackets"]
52
+
50
53
 
51
54
  # Approximates httpx internal ProxiesTypes and RequestFiles types
52
55
  # while adding support for `PathLike` instances
@@ -17,11 +17,11 @@ from typing import (
17
17
  )
18
18
  from pathlib import Path
19
19
  from datetime import date, datetime
20
- from typing_extensions import TypeGuard
20
+ from typing_extensions import TypeGuard, get_args
21
21
 
22
22
  import sniffio
23
23
 
24
- from .._types import Omit, NotGiven, FileTypes, HeadersLike
24
+ from .._types import Omit, NotGiven, FileTypes, ArrayFormat, HeadersLike
25
25
 
26
26
  _T = TypeVar("_T")
27
27
  _TupleT = TypeVar("_TupleT", bound=Tuple[object, ...])
@@ -40,25 +40,45 @@ def extract_files(
40
40
  query: Mapping[str, object],
41
41
  *,
42
42
  paths: Sequence[Sequence[str]],
43
+ array_format: ArrayFormat = "brackets",
43
44
  ) -> list[tuple[str, FileTypes]]:
44
45
  """Recursively extract files from the given dictionary based on specified paths.
45
46
 
46
47
  A path may look like this ['foo', 'files', '<array>', 'data'].
47
48
 
49
+ ``array_format`` controls how ``<array>`` segments contribute to the emitted
50
+ field name. Supported values: ``"brackets"`` (``foo[]``), ``"repeat"`` and
51
+ ``"comma"`` (``foo``), ``"indices"`` (``foo[0]``, ``foo[1]``).
52
+
48
53
  Note: this mutates the given dictionary.
49
54
  """
50
55
  files: list[tuple[str, FileTypes]] = []
51
56
  for path in paths:
52
- files.extend(_extract_items(query, path, index=0, flattened_key=None))
57
+ files.extend(_extract_items(query, path, index=0, flattened_key=None, array_format=array_format))
53
58
  return files
54
59
 
55
60
 
61
+ def _array_suffix(array_format: ArrayFormat, array_index: int) -> str:
62
+ if array_format == "brackets":
63
+ return "[]"
64
+ if array_format == "indices":
65
+ return f"[{array_index}]"
66
+ if array_format == "repeat" or array_format == "comma":
67
+ # Both repeat the bare field name for each file part; there is no
68
+ # meaningful way to comma-join binary parts.
69
+ return ""
70
+ raise NotImplementedError(
71
+ f"Unknown array_format value: {array_format}, choose from {', '.join(get_args(ArrayFormat))}"
72
+ )
73
+
74
+
56
75
  def _extract_items(
57
76
  obj: object,
58
77
  path: Sequence[str],
59
78
  *,
60
79
  index: int,
61
80
  flattened_key: str | None,
81
+ array_format: ArrayFormat,
62
82
  ) -> list[tuple[str, FileTypes]]:
63
83
  try:
64
84
  key = path[index]
@@ -75,9 +95,11 @@ def _extract_items(
75
95
 
76
96
  if is_list(obj):
77
97
  files: list[tuple[str, FileTypes]] = []
78
- for entry in obj:
79
- assert_is_file_content(entry, key=flattened_key + "[]" if flattened_key else "")
80
- files.append((flattened_key + "[]", cast(FileTypes, entry)))
98
+ for array_index, entry in enumerate(obj):
99
+ suffix = _array_suffix(array_format, array_index)
100
+ emitted_key = (flattened_key + suffix) if flattened_key else suffix
101
+ assert_is_file_content(entry, key=emitted_key)
102
+ files.append((emitted_key, cast(FileTypes, entry)))
81
103
  return files
82
104
 
83
105
  assert_is_file_content(obj, key=flattened_key)
@@ -106,6 +128,7 @@ def _extract_items(
106
128
  path,
107
129
  index=index,
108
130
  flattened_key=flattened_key,
131
+ array_format=array_format,
109
132
  )
110
133
  elif is_list(obj):
111
134
  if key != "<array>":
@@ -117,9 +140,12 @@ def _extract_items(
117
140
  item,
118
141
  path,
119
142
  index=index,
120
- flattened_key=flattened_key + "[]" if flattened_key is not None else "[]",
143
+ flattened_key=(
144
+ (flattened_key if flattened_key is not None else "") + _array_suffix(array_format, array_index)
145
+ ),
146
+ array_format=array_format,
121
147
  )
122
- for item in obj
148
+ for array_index, item in enumerate(obj)
123
149
  ]
124
150
  )
125
151
 
@@ -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.51.0" # x-release-please-version
4
+ __version__ = "0.53.0" # x-release-please-version
@@ -66,6 +66,7 @@ class ConnectionsResource(SyncAPIResource):
66
66
  health_check_interval: int | Omit = omit,
67
67
  login_url: str | Omit = omit,
68
68
  proxy: connection_create_params.Proxy | Omit = omit,
69
+ record_session: bool | Omit = omit,
69
70
  save_credentials: bool | Omit = omit,
70
71
  # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
71
72
  # The extra values given here take precedence over values defined on the client or passed to this method.
@@ -122,6 +123,9 @@ class ConnectionsResource(SyncAPIResource):
122
123
  proxy: Proxy selection. Provide either id or name. The proxy must belong to the
123
124
  caller's org.
124
125
 
126
+ record_session: Whether to record browser sessions for this connection by default. Useful for
127
+ debugging. Can be overridden per-login. Defaults to false.
128
+
125
129
  save_credentials: Whether to save credentials after every successful login. Defaults to true.
126
130
  One-time codes (TOTP, SMS, etc.) are not saved.
127
131
 
@@ -144,6 +148,7 @@ class ConnectionsResource(SyncAPIResource):
144
148
  "health_check_interval": health_check_interval,
145
149
  "login_url": login_url,
146
150
  "proxy": proxy,
151
+ "record_session": record_session,
147
152
  "save_credentials": save_credentials,
148
153
  },
149
154
  connection_create_params.ConnectionCreateParams,
@@ -198,6 +203,7 @@ class ConnectionsResource(SyncAPIResource):
198
203
  health_check_interval: int | Omit = omit,
199
204
  login_url: str | Omit = omit,
200
205
  proxy: connection_update_params.Proxy | Omit = omit,
206
+ record_session: bool | Omit = omit,
201
207
  save_credentials: bool | Omit = omit,
202
208
  # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
203
209
  # The extra values given here take precedence over values defined on the client or passed to this method.
@@ -228,6 +234,8 @@ class ConnectionsResource(SyncAPIResource):
228
234
  proxy: Proxy selection. Provide either id or name. The proxy must belong to the
229
235
  caller's org.
230
236
 
237
+ record_session: Whether to record browser sessions for this connection by default
238
+
231
239
  save_credentials: Whether to save credentials after every successful login
232
240
 
233
241
  extra_headers: Send extra headers
@@ -249,6 +257,7 @@ class ConnectionsResource(SyncAPIResource):
249
257
  "health_check_interval": health_check_interval,
250
258
  "login_url": login_url,
251
259
  "proxy": proxy,
260
+ "record_session": record_session,
252
261
  "save_credentials": save_credentials,
253
262
  },
254
263
  connection_update_params.ConnectionUpdateParams,
@@ -398,6 +407,7 @@ class ConnectionsResource(SyncAPIResource):
398
407
  id: str,
399
408
  *,
400
409
  proxy: connection_login_params.Proxy | Omit = omit,
410
+ record_session: bool | Omit = omit,
401
411
  # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
402
412
  # The extra values given here take precedence over values defined on the client or passed to this method.
403
413
  extra_headers: Headers | None = None,
@@ -415,6 +425,9 @@ class ConnectionsResource(SyncAPIResource):
415
425
  proxy: Proxy selection. Provide either id or name. The proxy must belong to the
416
426
  caller's org.
417
427
 
428
+ record_session: Override the connection's default for recording this login's browser session.
429
+ When omitted, the connection's record_session default is used.
430
+
418
431
  extra_headers: Send extra headers
419
432
 
420
433
  extra_query: Add additional query parameters to the request
@@ -427,7 +440,13 @@ class ConnectionsResource(SyncAPIResource):
427
440
  raise ValueError(f"Expected a non-empty value for `id` but received {id!r}")
428
441
  return self._post(
429
442
  path_template("/auth/connections/{id}/login", id=id),
430
- body=maybe_transform({"proxy": proxy}, connection_login_params.ConnectionLoginParams),
443
+ body=maybe_transform(
444
+ {
445
+ "proxy": proxy,
446
+ "record_session": record_session,
447
+ },
448
+ connection_login_params.ConnectionLoginParams,
449
+ ),
431
450
  options=make_request_options(
432
451
  extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
433
452
  ),
@@ -529,6 +548,7 @@ class AsyncConnectionsResource(AsyncAPIResource):
529
548
  health_check_interval: int | Omit = omit,
530
549
  login_url: str | Omit = omit,
531
550
  proxy: connection_create_params.Proxy | Omit = omit,
551
+ record_session: bool | Omit = omit,
532
552
  save_credentials: bool | Omit = omit,
533
553
  # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
534
554
  # The extra values given here take precedence over values defined on the client or passed to this method.
@@ -585,6 +605,9 @@ class AsyncConnectionsResource(AsyncAPIResource):
585
605
  proxy: Proxy selection. Provide either id or name. The proxy must belong to the
586
606
  caller's org.
587
607
 
608
+ record_session: Whether to record browser sessions for this connection by default. Useful for
609
+ debugging. Can be overridden per-login. Defaults to false.
610
+
588
611
  save_credentials: Whether to save credentials after every successful login. Defaults to true.
589
612
  One-time codes (TOTP, SMS, etc.) are not saved.
590
613
 
@@ -607,6 +630,7 @@ class AsyncConnectionsResource(AsyncAPIResource):
607
630
  "health_check_interval": health_check_interval,
608
631
  "login_url": login_url,
609
632
  "proxy": proxy,
633
+ "record_session": record_session,
610
634
  "save_credentials": save_credentials,
611
635
  },
612
636
  connection_create_params.ConnectionCreateParams,
@@ -661,6 +685,7 @@ class AsyncConnectionsResource(AsyncAPIResource):
661
685
  health_check_interval: int | Omit = omit,
662
686
  login_url: str | Omit = omit,
663
687
  proxy: connection_update_params.Proxy | Omit = omit,
688
+ record_session: bool | Omit = omit,
664
689
  save_credentials: bool | Omit = omit,
665
690
  # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
666
691
  # The extra values given here take precedence over values defined on the client or passed to this method.
@@ -691,6 +716,8 @@ class AsyncConnectionsResource(AsyncAPIResource):
691
716
  proxy: Proxy selection. Provide either id or name. The proxy must belong to the
692
717
  caller's org.
693
718
 
719
+ record_session: Whether to record browser sessions for this connection by default
720
+
694
721
  save_credentials: Whether to save credentials after every successful login
695
722
 
696
723
  extra_headers: Send extra headers
@@ -712,6 +739,7 @@ class AsyncConnectionsResource(AsyncAPIResource):
712
739
  "health_check_interval": health_check_interval,
713
740
  "login_url": login_url,
714
741
  "proxy": proxy,
742
+ "record_session": record_session,
715
743
  "save_credentials": save_credentials,
716
744
  },
717
745
  connection_update_params.ConnectionUpdateParams,
@@ -861,6 +889,7 @@ class AsyncConnectionsResource(AsyncAPIResource):
861
889
  id: str,
862
890
  *,
863
891
  proxy: connection_login_params.Proxy | Omit = omit,
892
+ record_session: bool | Omit = omit,
864
893
  # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
865
894
  # The extra values given here take precedence over values defined on the client or passed to this method.
866
895
  extra_headers: Headers | None = None,
@@ -878,6 +907,9 @@ class AsyncConnectionsResource(AsyncAPIResource):
878
907
  proxy: Proxy selection. Provide either id or name. The proxy must belong to the
879
908
  caller's org.
880
909
 
910
+ record_session: Override the connection's default for recording this login's browser session.
911
+ When omitted, the connection's record_session default is used.
912
+
881
913
  extra_headers: Send extra headers
882
914
 
883
915
  extra_query: Add additional query parameters to the request
@@ -890,7 +922,13 @@ class AsyncConnectionsResource(AsyncAPIResource):
890
922
  raise ValueError(f"Expected a non-empty value for `id` but received {id!r}")
891
923
  return await self._post(
892
924
  path_template("/auth/connections/{id}/login", id=id),
893
- body=await async_maybe_transform({"proxy": proxy}, connection_login_params.ConnectionLoginParams),
925
+ body=await async_maybe_transform(
926
+ {
927
+ "proxy": proxy,
928
+ "record_session": record_session,
929
+ },
930
+ connection_login_params.ConnectionLoginParams,
931
+ ),
894
932
  options=make_request_options(
895
933
  extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
896
934
  ),