volcano-sdk 0.33.0 → 0.35.0

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 (548) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +104 -4
  3. data/lib/volcano/auth_profile_fields.rb +2 -2
  4. data/lib/volcano/client.rb +1 -1
  5. data/lib/volcano/durable.rb +16 -38
  6. data/lib/volcano/durable_approval_models.rb +171 -0
  7. data/lib/volcano/durable_approval_responses.rb +222 -0
  8. data/lib/volcano/durable_approvals.rb +143 -0
  9. data/lib/volcano/durable_arguments.rb +59 -0
  10. data/lib/volcano/durable_message_arguments.rb +49 -0
  11. data/lib/volcano/durable_message_backlog.rb +38 -0
  12. data/lib/volcano/durable_message_catch_ups.rb +112 -0
  13. data/lib/volcano/durable_message_models.rb +62 -0
  14. data/lib/volcano/durable_message_responses.rb +107 -0
  15. data/lib/volcano/durable_message_session.rb +72 -0
  16. data/lib/volcano/durable_message_stream.rb +176 -0
  17. data/lib/volcano/durable_messages.rb +217 -0
  18. data/lib/volcano/durable_models.rb +32 -7
  19. data/lib/volcano/errors.rb +5 -0
  20. data/lib/volcano/generated/lib/volcano-generated/api/anon_keys_api.rb +8 -8
  21. data/lib/volcano/generated/lib/volcano-generated/api/auth_admin_api.rb +17 -17
  22. data/lib/volcano/generated/lib/volcano-generated/api/auth_configuration_api.rb +28 -28
  23. data/lib/volcano/generated/lib/volcano-generated/api/authentication_api.rb +4 -4
  24. data/lib/volcano/generated/lib/volcano-generated/api/autofix_api.rb +222 -0
  25. data/lib/volcano/generated/lib/volcano-generated/api/database_backups_api.rb +11 -11
  26. data/lib/volcano/generated/lib/volcano-generated/api/database_branches_api.rb +9 -9
  27. data/lib/volcano/generated/lib/volcano-generated/api/database_queries_api.rb +4 -4
  28. data/lib/volcano/generated/lib/volcano-generated/api/databases_api.rb +18 -18
  29. data/lib/volcano/generated/lib/volcano-generated/api/durable_functions_api.rb +1327 -51
  30. data/lib/volcano/generated/lib/volcano-generated/api/frontends_api.rb +337 -21
  31. data/lib/volcano/generated/lib/volcano-generated/api/functions_api.rb +33 -27
  32. data/lib/volcano/generated/lib/volcano-generated/api/git_connections_api.rb +19 -11
  33. data/lib/volcano/generated/lib/volcano-generated/api/issues_api.rb +254 -0
  34. data/lib/volcano/generated/lib/volcano-generated/api/locks_api.rb +2 -2
  35. data/lib/volcano/generated/lib/volcano-generated/api/logs_api.rb +11 -11
  36. data/lib/volcano/generated/lib/volcano-generated/api/o_auth_authentication_api.rb +2 -2
  37. data/lib/volcano/generated/lib/volcano-generated/api/o_auth_configuration_api.rb +8 -8
  38. data/lib/volcano/generated/lib/volcano-generated/api/project_access_tokens_api.rb +479 -0
  39. data/lib/volcano/generated/lib/volcano-generated/api/project_imports_api.rb +10 -2
  40. data/lib/volcano/generated/lib/volcano-generated/api/projects_api.rb +110 -30
  41. data/lib/volcano/generated/lib/volcano-generated/api/realtime_api.rb +5 -5
  42. data/lib/volcano/generated/lib/volcano-generated/api/sandboxes_api.rb +377 -18
  43. data/lib/volcano/generated/lib/volcano-generated/api/service_keys_api.rb +9 -9
  44. data/lib/volcano/generated/lib/volcano-generated/api/storage_admin_api.rb +4 -4
  45. data/lib/volcano/generated/lib/volcano-generated/api/storage_buckets_api.rb +7 -7
  46. data/lib/volcano/generated/lib/volcano-generated/api/storage_objects_api.rb +2 -2
  47. data/lib/volcano/generated/lib/volcano-generated/api/storage_policies_api.rb +5 -5
  48. data/lib/volcano/generated/lib/volcano-generated/api/system_api.rb +367 -2
  49. data/lib/volcano/generated/lib/volcano-generated/api/variable_environments_api.rb +373 -0
  50. data/lib/volcano/generated/lib/volcano-generated/api/variables_api.rb +13 -13
  51. data/lib/volcano/generated/lib/volcano-generated/api/verified_domains_api.rb +214 -0
  52. data/lib/volcano/generated/lib/volcano-generated/api_client.rb +2 -2
  53. data/lib/volcano/generated/lib/volcano-generated/api_error.rb +2 -2
  54. data/lib/volcano/generated/lib/volcano-generated/api_model_base.rb +2 -2
  55. data/lib/volcano/generated/lib/volcano-generated/configuration.rb +11 -3
  56. data/lib/volcano/generated/lib/volcano-generated/models/anon_key.rb +2 -2
  57. data/lib/volcano/generated/lib/volcano-generated/models/auth_config.rb +48 -6
  58. data/lib/volcano/generated/lib/volcano-generated/models/auth_confirm_email200_response.rb +2 -2
  59. data/lib/volcano/generated/lib/volcano-generated/models/auth_confirm_email_change200_response.rb +2 -2
  60. data/lib/volcano/generated/lib/volcano-generated/models/auth_confirm_email_change_request.rb +2 -2
  61. data/lib/volcano/generated/lib/volcano-generated/models/auth_confirm_email_request.rb +2 -2
  62. data/lib/volcano/generated/lib/volcano-generated/models/auth_convert_anonymous200_response.rb +2 -2
  63. data/lib/volcano/generated/lib/volcano-generated/models/auth_device_authorize_request.rb +2 -2
  64. data/lib/volcano/generated/lib/volcano-generated/models/auth_device_token_request.rb +2 -2
  65. data/lib/volcano/generated/lib/volcano-generated/models/auth_device_verify200_response.rb +2 -2
  66. data/lib/volcano/generated/lib/volcano-generated/models/auth_device_verify_request.rb +2 -2
  67. data/lib/volcano/generated/lib/volcano-generated/models/auth_forgot_password200_response.rb +2 -2
  68. data/lib/volcano/generated/lib/volcano-generated/models/auth_forgot_password_request.rb +2 -2
  69. data/lib/volcano/generated/lib/volcano-generated/models/auth_get_my_sessions200_response.rb +2 -2
  70. data/lib/volcano/generated/lib/volcano-generated/models/auth_hosted_page.rb +2 -2
  71. data/lib/volcano/generated/lib/volcano-generated/models/auth_hosted_page_defaults.rb +2 -2
  72. data/lib/volcano/generated/lib/volcano-generated/models/auth_hosted_page_response.rb +2 -2
  73. data/lib/volcano/generated/lib/volcano-generated/models/auth_hosted_page_runtime.rb +2 -2
  74. data/lib/volcano/generated/lib/volcano-generated/models/auth_identities_response.rb +2 -2
  75. data/lib/volcano/generated/lib/volcano-generated/models/auth_identity.rb +2 -2
  76. data/lib/volcano/generated/lib/volcano-generated/models/auth_insights_interval.rb +2 -2
  77. data/lib/volcano/generated/lib/volcano-generated/models/auth_insights_response.rb +2 -2
  78. data/lib/volcano/generated/lib/volcano-generated/models/auth_insights_series_point.rb +175 -4
  79. data/lib/volcano/generated/lib/volcano-generated/models/auth_insights_summary.rb +77 -5
  80. data/lib/volcano/generated/lib/volcano-generated/models/auth_insights_window.rb +2 -2
  81. data/lib/volcano/generated/lib/volcano-generated/models/auth_link_o_auth_provider200_response.rb +2 -2
  82. data/lib/volcano/generated/lib/volcano-generated/models/auth_list_o_auth_providers200_response.rb +2 -2
  83. data/lib/volcano/generated/lib/volcano-generated/models/auth_list_o_auth_providers200_response_providers_inner.rb +2 -2
  84. data/lib/volcano/generated/lib/volcano-generated/models/auth_method_summary.rb +2 -2
  85. data/lib/volcano/generated/lib/volcano-generated/models/auth_methods_response.rb +2 -2
  86. data/lib/volcano/generated/lib/volcano-generated/models/auth_o_auth_exchange_request.rb +2 -2
  87. data/lib/volcano/generated/lib/volcano-generated/models/auth_page_appearance_defaults.rb +2 -2
  88. data/lib/volcano/generated/lib/volcano-generated/models/auth_page_appearance_options.rb +2 -2
  89. data/lib/volcano/generated/lib/volcano-generated/models/auth_page_appearance_response.rb +2 -2
  90. data/lib/volcano/generated/lib/volcano-generated/models/auth_page_density.rb +2 -2
  91. data/lib/volcano/generated/lib/volcano-generated/models/auth_page_font.rb +2 -2
  92. data/lib/volcano/generated/lib/volcano-generated/models/auth_page_layout.rb +2 -2
  93. data/lib/volcano/generated/lib/volcano-generated/models/auth_page_radius.rb +2 -2
  94. data/lib/volcano/generated/lib/volcano-generated/models/auth_page_scale.rb +2 -2
  95. data/lib/volcano/generated/lib/volcano-generated/models/auth_page_theme.rb +2 -2
  96. data/lib/volcano/generated/lib/volcano-generated/models/auth_page_theme_colors.rb +2 -2
  97. data/lib/volcano/generated/lib/volcano-generated/models/auth_password_policy.rb +2 -2
  98. data/lib/volcano/generated/lib/volcano-generated/models/auth_platform_exchange_request.rb +2 -2
  99. data/lib/volcano/generated/lib/volcano-generated/models/auth_refresh_request.rb +2 -2
  100. data/lib/volcano/generated/lib/volcano-generated/models/auth_request_email_change200_response.rb +2 -2
  101. data/lib/volcano/generated/lib/volcano-generated/models/auth_request_email_change_request.rb +2 -2
  102. data/lib/volcano/generated/lib/volcano-generated/models/auth_reset_password200_response.rb +2 -2
  103. data/lib/volcano/generated/lib/volcano-generated/models/auth_reset_password_request.rb +2 -2
  104. data/lib/volcano/generated/lib/volcano-generated/models/auth_session.rb +2 -2
  105. data/lib/volcano/generated/lib/volcano-generated/models/auth_signin_request.rb +2 -2
  106. data/lib/volcano/generated/lib/volcano-generated/models/auth_signup_anonymous_request.rb +2 -2
  107. data/lib/volcano/generated/lib/volcano-generated/models/auth_signup_request.rb +2 -2
  108. data/lib/volcano/generated/lib/volcano-generated/models/auth_signup_response.rb +2 -2
  109. data/lib/volcano/generated/lib/volcano-generated/models/auth_token_response.rb +2 -2
  110. data/lib/volcano/generated/lib/volcano-generated/models/auth_update_user_request.rb +2 -2
  111. data/lib/volcano/generated/lib/volcano-generated/models/auth_user.rb +2 -2
  112. data/lib/volcano/generated/lib/volcano-generated/models/autofix_model.rb +45 -0
  113. data/lib/volcano/generated/lib/volcano-generated/models/autofix_provider.rb +40 -0
  114. data/lib/volcano/generated/lib/volcano-generated/models/autofix_settings.rb +385 -0
  115. data/lib/volcano/generated/lib/volcano-generated/models/autofix_stage.rb +40 -0
  116. data/lib/volcano/generated/lib/volcano-generated/models/ban_auth_user_request.rb +2 -2
  117. data/lib/volcano/generated/lib/volcano-generated/models/ban_user_response.rb +2 -2
  118. data/lib/volcano/generated/lib/volcano-generated/models/batch_function_deploy_failure.rb +2 -2
  119. data/lib/volcano/generated/lib/volcano-generated/models/batch_function_deploy_response.rb +2 -2
  120. data/lib/volcano/generated/lib/volcano-generated/models/byoc_project_config_frontend_custom_domain_tls_config.rb +270 -0
  121. data/lib/volcano/generated/lib/volcano-generated/models/byoc_project_config_frontend_custom_domain_tls_config_not.rb +102 -0
  122. data/lib/volcano/generated/lib/volcano-generated/models/call_mcp200_response.rb +220 -0
  123. data/lib/volcano/generated/lib/volcano-generated/models/call_mcp200_response_error.rb +190 -0
  124. data/lib/volcano/generated/lib/volcano-generated/models/call_mcp200_response_id.rb +105 -0
  125. data/lib/volcano/generated/lib/volcano-generated/models/call_mcp_request.rb +236 -0
  126. data/lib/volcano/generated/lib/volcano-generated/models/call_mcp_request_id.rb +105 -0
  127. data/lib/volcano/generated/lib/volcano-generated/models/call_o_auth_provider_api200_response.rb +2 -2
  128. data/lib/volcano/generated/lib/volcano-generated/models/call_o_auth_provider_api_request.rb +2 -2
  129. data/lib/volcano/generated/lib/volcano-generated/models/capability.rb +214 -0
  130. data/lib/volcano/generated/lib/volcano-generated/models/capability_list.rb +166 -0
  131. data/lib/volcano/generated/lib/volcano-generated/models/capability_status.rb +40 -0
  132. data/lib/volcano/generated/lib/volcano-generated/models/complete_upload_session_response.rb +2 -2
  133. data/lib/volcano/generated/lib/volcano-generated/models/configure_auth_methods_request.rb +2 -2
  134. data/lib/volcano/generated/lib/volcano-generated/models/configure_auth_methods_request_oauth_providers_inner.rb +2 -2
  135. data/lib/volcano/generated/lib/volcano-generated/models/connect_project_git_request.rb +2 -2
  136. data/lib/volcano/generated/lib/volcano-generated/models/create_anon_key_request.rb +2 -2
  137. data/lib/volcano/generated/lib/volcano-generated/models/create_database_backup_request.rb +2 -2
  138. data/lib/volcano/generated/lib/volcano-generated/models/create_database_branch_request.rb +2 -2
  139. data/lib/volcano/generated/lib/volcano-generated/models/create_database_request.rb +6 -6
  140. data/lib/volcano/generated/lib/volcano-generated/models/create_database_restore_request.rb +2 -2
  141. data/lib/volcano/generated/lib/volcano-generated/models/create_email_template_request.rb +2 -2
  142. data/lib/volcano/generated/lib/volcano-generated/models/create_frontend_custom_domain_request.rb +12 -3
  143. data/lib/volcano/generated/lib/volcano-generated/models/create_frontend_function_route_request.rb +230 -0
  144. data/lib/volcano/generated/lib/volcano-generated/models/create_function_scheduler_request.rb +2 -2
  145. data/lib/volcano/generated/lib/volcano-generated/models/create_o_auth_config_request.rb +2 -2
  146. data/lib/volcano/generated/lib/volcano-generated/models/create_project_access_token_request.rb +241 -0
  147. data/lib/volcano/generated/lib/volcano-generated/models/create_project_request.rb +57 -3
  148. data/lib/volcano/generated/lib/volcano-generated/models/create_sandbox_session_request.rb +18 -57
  149. data/lib/volcano/generated/lib/volcano-generated/models/create_sandbox_template_request.rb +2 -2
  150. data/lib/volcano/generated/lib/volcano-generated/models/create_service_key_request.rb +2 -2
  151. data/lib/volcano/generated/lib/volcano-generated/models/create_storage_bucket_request.rb +2 -2
  152. data/lib/volcano/generated/lib/volcano-generated/models/create_storage_policy_request.rb +2 -2
  153. data/lib/volcano/generated/lib/volcano-generated/models/create_upload_session_request.rb +2 -2
  154. data/lib/volcano/generated/lib/volcano-generated/models/create_upload_session_response.rb +2 -2
  155. data/lib/volcano/generated/lib/volcano-generated/models/create_variable_environment_request.rb +176 -0
  156. data/lib/volcano/generated/lib/volcano-generated/models/create_variable_request.rb +3 -2
  157. data/lib/volcano/generated/lib/volcano-generated/models/created_project_access_token.rb +459 -0
  158. data/lib/volcano/generated/lib/volcano-generated/models/database.rb +2 -2
  159. data/lib/volcano/generated/lib/volcano-generated/models/database_backup.rb +2 -2
  160. data/lib/volcano/generated/lib/volcano-generated/models/database_backup_list.rb +2 -2
  161. data/lib/volcano/generated/lib/volcano-generated/models/database_backup_schedule.rb +2 -2
  162. data/lib/volcano/generated/lib/volcano-generated/models/database_backup_schedule_entry.rb +2 -2
  163. data/lib/volcano/generated/lib/volcano-generated/models/database_branch.rb +2 -2
  164. data/lib/volcano/generated/lib/volcano-generated/models/database_branch_list.rb +2 -2
  165. data/lib/volcano/generated/lib/volcano-generated/models/database_branch_storage.rb +2 -2
  166. data/lib/volcano/generated/lib/volcano-generated/models/database_delete_request.rb +2 -2
  167. data/lib/volcano/generated/lib/volcano-generated/models/database_insert_request.rb +3 -3
  168. data/lib/volcano/generated/lib/volcano-generated/models/database_query_filter.rb +2 -2
  169. data/lib/volcano/generated/lib/volcano-generated/models/database_query_filter_value.rb +3 -3
  170. data/lib/volcano/generated/lib/volcano-generated/models/database_query_filter_value_one_of_inner.rb +3 -3
  171. data/lib/volcano/generated/lib/volcano-generated/models/database_query_order.rb +2 -2
  172. data/lib/volcano/generated/lib/volcano-generated/models/database_query_performance_database.rb +2 -2
  173. data/lib/volcano/generated/lib/volcano-generated/models/database_query_performance_item.rb +4 -4
  174. data/lib/volcano/generated/lib/volcano-generated/models/database_query_performance_response.rb +2 -2
  175. data/lib/volcano/generated/lib/volcano-generated/models/database_query_result.rb +2 -2
  176. data/lib/volcano/generated/lib/volcano-generated/models/database_restore.rb +2 -2
  177. data/lib/volcano/generated/lib/volcano-generated/models/database_restore_list.rb +2 -2
  178. data/lib/volcano/generated/lib/volcano-generated/models/database_restore_window.rb +2 -2
  179. data/lib/volcano/generated/lib/volcano-generated/models/database_select_request.rb +2 -2
  180. data/lib/volcano/generated/lib/volcano-generated/models/database_stats.rb +2 -2
  181. data/lib/volcano/generated/lib/volcano-generated/models/database_update_request.rb +3 -3
  182. data/lib/volcano/generated/lib/volcano-generated/models/delete_database202_response.rb +2 -2
  183. data/lib/volcano/generated/lib/volcano-generated/models/delete_database_backup200_response.rb +2 -2
  184. data/lib/volcano/generated/lib/volcano-generated/models/delete_database_branch202_response.rb +2 -2
  185. data/lib/volcano/generated/lib/volcano-generated/models/deployment_phase.rb +2 -2
  186. data/lib/volcano/generated/lib/volcano-generated/models/deployment_progress.rb +2 -2
  187. data/lib/volcano/generated/lib/volcano-generated/models/deployment_reference.rb +2 -2
  188. data/lib/volcano/generated/lib/volcano-generated/models/device_authorization_response.rb +2 -2
  189. data/lib/volcano/generated/lib/volcano-generated/models/durable_approval.rb +406 -0
  190. data/lib/volcano/generated/lib/volcano-generated/models/durable_approval_counts.rb +295 -0
  191. data/lib/volcano/generated/lib/volcano-generated/models/durable_approval_daily_counts.rb +190 -0
  192. data/lib/volcano/generated/lib/volcano-generated/models/durable_approval_decider.rb +191 -0
  193. data/lib/volcano/generated/lib/volcano-generated/models/durable_approval_decision.rb +203 -0
  194. data/lib/volcano/generated/lib/volcano-generated/models/durable_approval_decision_request.rb +167 -0
  195. data/lib/volcano/generated/lib/volcano-generated/models/durable_approval_execution.rb +211 -0
  196. data/lib/volcano/generated/lib/volcano-generated/models/durable_approval_function.rb +177 -0
  197. data/lib/volcano/generated/lib/volcano-generated/models/durable_approval_function_counts.rb +190 -0
  198. data/lib/volcano/generated/lib/volcano-generated/models/durable_approval_registration.rb +225 -0
  199. data/lib/volcano/generated/lib/volcano-generated/models/durable_approval_stats.rb +339 -0
  200. data/lib/volcano/generated/lib/volcano-generated/models/durable_approval_status.rb +43 -0
  201. data/lib/volcano/generated/lib/volcano-generated/models/durable_execution.rb +16 -6
  202. data/lib/volcano/generated/lib/volcano-generated/models/durable_execution_error.rb +2 -2
  203. data/lib/volcano/generated/lib/volcano-generated/models/durable_execution_invocation.rb +191 -0
  204. data/lib/volcano/generated/lib/volcano-generated/models/durable_execution_operation.rb +372 -0
  205. data/lib/volcano/generated/lib/volcano-generated/models/durable_execution_operation_attempt.rb +271 -0
  206. data/lib/volcano/generated/lib/volcano-generated/models/durable_execution_operation_list.rb +234 -0
  207. data/lib/volcano/generated/lib/volcano-generated/models/durable_execution_status.rb +2 -2
  208. data/lib/volcano/generated/lib/volcano-generated/models/durable_function.rb +31 -4
  209. data/lib/volcano/generated/lib/volcano-generated/models/durable_function_config.rb +2 -2
  210. data/lib/volcano/generated/lib/volcano-generated/models/durable_message.rb +396 -0
  211. data/lib/volcano/generated/lib/volcano-generated/models/durable_message_direction.rb +40 -0
  212. data/lib/volcano/generated/lib/volcano-generated/models/durable_message_list.rb +194 -0
  213. data/lib/volcano/generated/lib/volcano-generated/models/durable_message_sender.rb +203 -0
  214. data/lib/volcano/generated/lib/volcano-generated/models/durable_message_session_registration.rb +165 -0
  215. data/lib/volcano/generated/lib/volcano-generated/models/durable_message_status.rb +43 -0
  216. data/lib/volcano/generated/lib/volcano-generated/models/durable_message_wait.rb +278 -0
  217. data/lib/volcano/generated/lib/volcano-generated/models/durable_message_wait_list.rb +167 -0
  218. data/lib/volcano/generated/lib/volcano-generated/models/durable_message_wait_registration.rb +225 -0
  219. data/lib/volcano/generated/lib/volcano-generated/models/durable_message_wait_status.rb +43 -0
  220. data/lib/volcano/generated/lib/volcano-generated/models/email_template.rb +2 -2
  221. data/lib/volcano/generated/lib/volcano-generated/models/error.rb +2 -2
  222. data/lib/volcano/generated/lib/volcano-generated/models/export_project_source_request.rb +2 -2
  223. data/lib/volcano/generated/lib/volcano-generated/models/frontend.rb +95 -3
  224. data/lib/volcano/generated/lib/volcano-generated/models/frontend_custom_domain_conflict_error.rb +191 -0
  225. data/lib/volcano/generated/lib/volcano-generated/models/frontend_custom_domain_response.rb +50 -5
  226. data/lib/volcano/generated/lib/volcano-generated/models/frontend_custom_domain_tls_config.rb +42 -18
  227. data/lib/volcano/generated/lib/volcano-generated/models/frontend_custom_domain_tls_config_not.rb +103 -0
  228. data/lib/volcano/generated/lib/volcano-generated/models/frontend_custom_domain_tls_config_not_any_of.rb +188 -0
  229. data/lib/volcano/generated/lib/volcano-generated/models/frontend_custom_domain_tls_config_not_any_of1.rb +188 -0
  230. data/lib/volcano/generated/lib/volcano-generated/models/frontend_deployment.rb +24 -68
  231. data/lib/volcano/generated/lib/volcano-generated/models/frontend_domain_routing_record.rb +2 -2
  232. data/lib/volcano/generated/lib/volcano-generated/models/frontend_domain_verification_record.rb +3 -2
  233. data/lib/volcano/generated/lib/volcano-generated/models/frontend_function_route.rb +375 -0
  234. data/lib/volcano/generated/lib/volcano-generated/models/frontend_function_route_list.rb +166 -0
  235. data/lib/volcano/generated/lib/volcano-generated/models/frontend_usage_daily_entry.rb +2 -2
  236. data/lib/volcano/generated/lib/volcano-generated/models/frontend_usage_data.rb +2 -2
  237. data/lib/volcano/generated/lib/volcano-generated/models/frontend_usage_history_response.rb +2 -2
  238. data/lib/volcano/generated/lib/volcano-generated/models/function.rb +31 -14
  239. data/lib/volcano/generated/lib/volcano-generated/models/function_deployment.rb +24 -50
  240. data/lib/volcano/generated/lib/volcano-generated/models/function_http_auth_mode.rb +2 -2
  241. data/lib/volcano/generated/lib/volcano-generated/models/function_invocation_mode.rb +2 -2
  242. data/lib/volcano/generated/lib/volcano-generated/models/function_invocation_request.rb +2 -2
  243. data/lib/volcano/generated/lib/volcano-generated/models/function_kind.rb +2 -2
  244. data/lib/volcano/generated/lib/volcano-generated/models/function_kind_filter.rb +40 -0
  245. data/lib/volcano/generated/lib/volcano-generated/models/function_region.rb +2 -2
  246. data/lib/volcano/generated/lib/volcano-generated/models/function_runtime_deployment.rb +2 -2
  247. data/lib/volcano/generated/lib/volcano-generated/models/function_runtime_option.rb +30 -3
  248. data/lib/volcano/generated/lib/volcano-generated/models/function_runtimes_response.rb +2 -2
  249. data/lib/volcano/generated/lib/volcano-generated/models/function_scheduler.rb +2 -2
  250. data/lib/volcano/generated/lib/volcano-generated/models/function_scheduler_list_response.rb +2 -2
  251. data/lib/volcano/generated/lib/volcano-generated/models/function_visibility.rb +41 -0
  252. data/lib/volcano/generated/lib/volcano-generated/models/get_auth_methods200_response.rb +2 -2
  253. data/lib/volcano/generated/lib/volcano-generated/models/get_auth_methods200_response_email_password.rb +2 -2
  254. data/lib/volcano/generated/lib/volcano-generated/models/get_auth_methods200_response_oauth_providers_inner.rb +2 -2
  255. data/lib/volcano/generated/lib/volcano-generated/models/git_connect_start_response.rb +2 -2
  256. data/lib/volcano/generated/lib/volcano-generated/models/git_connection.rb +2 -2
  257. data/lib/volcano/generated/lib/volcano-generated/models/git_connections_response.rb +2 -2
  258. data/lib/volcano/generated/lib/volcano-generated/models/git_installation.rb +2 -2
  259. data/lib/volcano/generated/lib/volcano-generated/models/git_installations_response.rb +2 -2
  260. data/lib/volcano/generated/lib/volcano-generated/models/git_repositories_response.rb +2 -2
  261. data/lib/volcano/generated/lib/volcano-generated/models/git_repository.rb +2 -2
  262. data/lib/volcano/generated/lib/volcano-generated/models/hosted_auth_page_type.rb +2 -2
  263. data/lib/volcano/generated/lib/volcano-generated/models/hosted_login_email_check_request.rb +2 -2
  264. data/lib/volcano/generated/lib/volcano-generated/models/hosted_login_email_check_response.rb +2 -2
  265. data/lib/volcano/generated/lib/volcano-generated/models/hosted_login_options_response.rb +2 -2
  266. data/lib/volcano/generated/lib/volcano-generated/models/hosted_renderable_page_type.rb +2 -2
  267. data/lib/volcano/generated/lib/volcano-generated/models/import_connect_start_response.rb +2 -2
  268. data/lib/volcano/generated/lib/volcano-generated/models/import_connection.rb +2 -2
  269. data/lib/volcano/generated/lib/volcano-generated/models/import_connections_response.rb +2 -2
  270. data/lib/volcano/generated/lib/volcano-generated/models/import_provider.rb +2 -2
  271. data/lib/volcano/generated/lib/volcano-generated/models/import_source.rb +2 -2
  272. data/lib/volcano/generated/lib/volcano-generated/models/import_sources_response.rb +2 -2
  273. data/lib/volcano/generated/lib/volcano-generated/models/issue.rb +493 -0
  274. data/lib/volcano/generated/lib/volcano-generated/models/issue_status.rb +41 -0
  275. data/lib/volcano/generated/lib/volcano-generated/models/list_anon_keys200_response.rb +2 -2
  276. data/lib/volcano/generated/lib/volcano-generated/models/list_available_o_auth_providers200_response.rb +2 -2
  277. data/lib/volcano/generated/lib/volcano-generated/models/list_available_o_auth_providers200_response_providers_inner.rb +2 -2
  278. data/lib/volcano/generated/lib/volcano-generated/models/list_database_regions200_response_inner.rb +2 -2
  279. data/lib/volcano/generated/lib/volcano-generated/models/list_email_templates200_response.rb +2 -2
  280. data/lib/volcano/generated/lib/volcano-generated/models/list_o_auth_configs200_response.rb +2 -2
  281. data/lib/volcano/generated/lib/volcano-generated/models/list_postgres_versions200_response_inner.rb +14 -4
  282. data/lib/volcano/generated/lib/volcano-generated/models/list_storage_buckets200_response.rb +3 -3
  283. data/lib/volcano/generated/lib/volcano-generated/models/list_storage_objects_admin200_response.rb +2 -2
  284. data/lib/volcano/generated/lib/volcano-generated/models/live_log_level.rb +2 -2
  285. data/lib/volcano/generated/lib/volcano-generated/models/log_activity_bucket.rb +5 -5
  286. data/lib/volcano/generated/lib/volcano-generated/models/log_activity_bucket_counts.rb +2 -2
  287. data/lib/volcano/generated/lib/volcano-generated/models/log_activity_request.rb +5 -5
  288. data/lib/volcano/generated/lib/volcano-generated/models/log_activity_response.rb +2 -2
  289. data/lib/volcano/generated/lib/volcano-generated/models/log_database_request_resource.rb +2 -2
  290. data/lib/volcano/generated/lib/volcano-generated/models/log_deployment.rb +2 -2
  291. data/lib/volcano/generated/lib/volcano-generated/models/log_deployment_request_selector.rb +2 -2
  292. data/lib/volcano/generated/lib/volcano-generated/models/log_event.rb +2 -2
  293. data/lib/volcano/generated/lib/volcano-generated/models/log_event_body.rb +3 -3
  294. data/lib/volcano/generated/lib/volcano-generated/models/log_frontend_request_resource.rb +2 -2
  295. data/lib/volcano/generated/lib/volcano-generated/models/log_function_request_resource.rb +13 -3
  296. data/lib/volcano/generated/lib/volcano-generated/models/log_request_resource.rb +3 -3
  297. data/lib/volcano/generated/lib/volcano-generated/models/log_resource.rb +2 -2
  298. data/lib/volcano/generated/lib/volcano-generated/models/log_search_event.rb +2 -2
  299. data/lib/volcano/generated/lib/volcano-generated/models/log_search_request.rb +2 -2
  300. data/lib/volcano/generated/lib/volcano-generated/models/log_search_response.rb +4 -4
  301. data/lib/volcano/generated/lib/volcano-generated/models/log_stream_request.rb +2 -2
  302. data/lib/volcano/generated/lib/volcano-generated/models/managed_project_config_frontend_custom_domain_tls_config.rb +189 -0
  303. data/lib/volcano/generated/lib/volcano-generated/models/metric_usage_data.rb +3 -3
  304. data/lib/volcano/generated/lib/volcano-generated/models/o_auth_config.rb +2 -2
  305. data/lib/volcano/generated/lib/volcano-generated/models/o_auth_error_response.rb +2 -2
  306. data/lib/volcano/generated/lib/volcano-generated/models/open_durable_message_session_request.rb +228 -0
  307. data/lib/volcano/generated/lib/volcano-generated/models/paginated_auth_users.rb +2 -2
  308. data/lib/volcano/generated/lib/volcano-generated/models/paginated_databases.rb +2 -2
  309. data/lib/volcano/generated/lib/volcano-generated/models/paginated_durable_approvals.rb +274 -0
  310. data/lib/volcano/generated/lib/volcano-generated/models/paginated_durable_executions.rb +2 -2
  311. data/lib/volcano/generated/lib/volcano-generated/models/paginated_durable_functions.rb +2 -2
  312. data/lib/volcano/generated/lib/volcano-generated/models/paginated_frontend_deployments.rb +2 -2
  313. data/lib/volcano/generated/lib/volcano-generated/models/paginated_frontends.rb +2 -2
  314. data/lib/volcano/generated/lib/volcano-generated/models/paginated_function_deployments.rb +2 -2
  315. data/lib/volcano/generated/lib/volcano-generated/models/paginated_functions.rb +2 -2
  316. data/lib/volcano/generated/lib/volcano-generated/models/paginated_issues.rb +230 -0
  317. data/lib/volcano/generated/lib/volcano-generated/models/paginated_project_access_tokens.rb +279 -0
  318. data/lib/volcano/generated/lib/volcano-generated/models/paginated_project_custom_domains.rb +2 -2
  319. data/lib/volcano/generated/lib/volcano-generated/models/paginated_project_deployments.rb +2 -2
  320. data/lib/volcano/generated/lib/volcano-generated/models/paginated_projects.rb +2 -2
  321. data/lib/volcano/generated/lib/volcano-generated/models/paginated_service_keys.rb +2 -2
  322. data/lib/volcano/generated/lib/volcano-generated/models/paginated_storage_buckets.rb +2 -2
  323. data/lib/volcano/generated/lib/volcano-generated/models/paginated_variables.rb +2 -2
  324. data/lib/volcano/generated/lib/volcano-generated/models/platform_exchange_response.rb +2 -2
  325. data/lib/volcano/generated/lib/volcano-generated/models/preview_auth_page_request.rb +2 -2
  326. data/lib/volcano/generated/lib/volcano-generated/models/preview_auth_page_response.rb +2 -2
  327. data/lib/volcano/generated/lib/volcano-generated/models/project.rb +13 -13
  328. data/lib/volcano/generated/lib/volcano-generated/models/project_access_token.rb +426 -0
  329. data/lib/volcano/generated/lib/volcano-generated/models/project_access_token_scope.rb +40 -0
  330. data/lib/volcano/generated/lib/volcano-generated/models/project_access_token_usage.rb +299 -0
  331. data/lib/volcano/generated/lib/volcano-generated/models/project_access_token_usage_daily_entry.rb +191 -0
  332. data/lib/volcano/generated/lib/volcano-generated/models/project_config.rb +49 -6
  333. data/lib/volcano/generated/lib/volcano-generated/models/project_config_apply_result.rb +2 -2
  334. data/lib/volcano/generated/lib/volcano-generated/models/project_config_apply_result_entry.rb +2 -2
  335. data/lib/volcano/generated/lib/volcano-generated/models/project_config_apply_summary.rb +2 -2
  336. data/lib/volcano/generated/lib/volcano-generated/models/project_config_auth.rb +2 -2
  337. data/lib/volcano/generated/lib/volcano-generated/models/project_config_auth_cors.rb +2 -2
  338. data/lib/volcano/generated/lib/volcano-generated/models/project_config_auth_email.rb +2 -2
  339. data/lib/volcano/generated/lib/volcano-generated/models/project_config_auth_email_from.rb +2 -2
  340. data/lib/volcano/generated/lib/volcano-generated/models/project_config_auth_email_password_provider.rb +2 -2
  341. data/lib/volcano/generated/lib/volcano-generated/models/project_config_auth_email_smtp.rb +2 -2
  342. data/lib/volcano/generated/lib/volcano-generated/models/project_config_auth_email_verification.rb +2 -2
  343. data/lib/volcano/generated/lib/volcano-generated/models/project_config_auth_managed_pages.rb +2 -2
  344. data/lib/volcano/generated/lib/volcano-generated/models/project_config_auth_page_appearance.rb +2 -2
  345. data/lib/volcano/generated/lib/volcano-generated/models/project_config_auth_page_layouts.rb +2 -2
  346. data/lib/volcano/generated/lib/volcano-generated/models/project_config_auth_password.rb +2 -2
  347. data/lib/volcano/generated/lib/volcano-generated/models/project_config_auth_password_reset.rb +2 -2
  348. data/lib/volcano/generated/lib/volcano-generated/models/project_config_auth_providers.rb +2 -2
  349. data/lib/volcano/generated/lib/volcano-generated/models/project_config_auth_rate_limits.rb +2 -2
  350. data/lib/volcano/generated/lib/volcano-generated/models/project_config_auth_redirects.rb +2 -2
  351. data/lib/volcano/generated/lib/volcano-generated/models/project_config_auth_sessions.rb +2 -2
  352. data/lib/volcano/generated/lib/volcano-generated/models/project_config_auth_signup.rb +2 -2
  353. data/lib/volcano/generated/lib/volcano-generated/models/project_config_auth_tokens.rb +2 -2
  354. data/lib/volcano/generated/lib/volcano-generated/models/project_config_autofix.rb +206 -0
  355. data/lib/volcano/generated/lib/volcano-generated/models/project_config_bucket.rb +2 -2
  356. data/lib/volcano/generated/lib/volcano-generated/models/project_config_bucket_policy.rb +2 -2
  357. data/lib/volcano/generated/lib/volcano-generated/models/project_config_custom_domain.rb +14 -5
  358. data/lib/volcano/generated/lib/volcano-generated/models/project_config_database.rb +6 -6
  359. data/lib/volcano/generated/lib/volcano-generated/models/project_config_email_template.rb +2 -2
  360. data/lib/volcano/generated/lib/volcano-generated/models/project_config_email_templates.rb +2 -2
  361. data/lib/volcano/generated/lib/volcano-generated/models/project_config_frontend.rb +103 -6
  362. data/lib/volcano/generated/lib/volcano-generated/models/project_config_frontend_custom_domain_tls_config.rb +105 -0
  363. data/lib/volcano/generated/lib/volcano-generated/models/project_config_frontend_function_route.rb +240 -0
  364. data/lib/volcano/generated/lib/volcano-generated/models/project_config_function.rb +13 -4
  365. data/lib/volcano/generated/lib/volcano-generated/models/project_config_hosted_page.rb +2 -2
  366. data/lib/volcano/generated/lib/volcano-generated/models/project_config_hosted_pages.rb +2 -2
  367. data/lib/volcano/generated/lib/volcano-generated/models/project_config_missing_resource.rb +4 -4
  368. data/lib/volcano/generated/lib/volcano-generated/models/project_config_o_auth_provider.rb +2 -2
  369. data/lib/volcano/generated/lib/volcano-generated/models/project_config_project.rb +2 -2
  370. data/lib/volcano/generated/lib/volcano-generated/models/project_config_realtime.rb +2 -2
  371. data/lib/volcano/generated/lib/volcano-generated/models/project_config_sandbox.rb +289 -0
  372. data/lib/volcano/generated/lib/volcano-generated/models/project_config_scheduler.rb +2 -2
  373. data/lib/volcano/generated/lib/volcano-generated/models/project_config_skipped_resource.rb +4 -4
  374. data/lib/volcano/generated/lib/volcano-generated/models/project_config_validation_error.rb +2 -2
  375. data/lib/volcano/generated/lib/volcano-generated/models/project_config_validation_error_response.rb +2 -2
  376. data/lib/volcano/generated/lib/volcano-generated/models/project_config_variable.rb +3 -2
  377. data/lib/volcano/generated/lib/volcano-generated/models/project_deployment.rb +3 -12
  378. data/lib/volcano/generated/lib/volcano-generated/models/project_deployment_resource.rb +2 -2
  379. data/lib/volcano/generated/lib/volcano-generated/models/project_deployment_summary.rb +3 -3
  380. data/lib/volcano/generated/lib/volcano-generated/models/project_frontend_custom_domain.rb +50 -5
  381. data/lib/volcano/generated/lib/volcano-generated/models/project_frontend_custom_domain_all_of_frontend.rb +2 -2
  382. data/lib/volcano/generated/lib/volcano-generated/models/project_git_connection.rb +2 -2
  383. data/lib/volcano/generated/lib/volcano-generated/models/project_git_connection_summary.rb +2 -2
  384. data/lib/volcano/generated/lib/volcano-generated/models/project_git_deploy_settings.rb +2 -2
  385. data/lib/volcano/generated/lib/volcano-generated/models/project_health_category.rb +2 -2
  386. data/lib/volcano/generated/lib/volcano-generated/models/project_health_check.rb +2 -2
  387. data/lib/volcano/generated/lib/volcano-generated/models/project_health_data_status.rb +2 -2
  388. data/lib/volcano/generated/lib/volcano-generated/models/project_health_evidence.rb +2 -2
  389. data/lib/volcano/generated/lib/volcano-generated/models/project_health_resource.rb +2 -2
  390. data/lib/volcano/generated/lib/volcano-generated/models/project_health_response.rb +2 -2
  391. data/lib/volcano/generated/lib/volcano-generated/models/project_health_scope.rb +2 -2
  392. data/lib/volcano/generated/lib/volcano-generated/models/project_health_status.rb +2 -2
  393. data/lib/volcano/generated/lib/volcano-generated/models/project_health_summary.rb +2 -2
  394. data/lib/volcano/generated/lib/volcano-generated/models/project_import_action.rb +2 -2
  395. data/lib/volcano/generated/lib/volcano-generated/models/project_import_action_code.rb +2 -2
  396. data/lib/volcano/generated/lib/volcano-generated/models/project_import_destination.rb +2 -2
  397. data/lib/volcano/generated/lib/volcano-generated/models/project_import_destination_mode.rb +2 -2
  398. data/lib/volcano/generated/lib/volcano-generated/models/project_import_disposition.rb +2 -2
  399. data/lib/volcano/generated/lib/volcano-generated/models/project_import_finding.rb +2 -2
  400. data/lib/volcano/generated/lib/volcano-generated/models/project_import_impact.rb +2 -2
  401. data/lib/volcano/generated/lib/volcano-generated/models/project_import_preflight_request.rb +2 -2
  402. data/lib/volcano/generated/lib/volcano-generated/models/project_import_readiness.rb +2 -2
  403. data/lib/volcano/generated/lib/volcano-generated/models/project_import_report.rb +2 -2
  404. data/lib/volcano/generated/lib/volcano-generated/models/project_import_resource.rb +2 -2
  405. data/lib/volcano/generated/lib/volcano-generated/models/project_import_resource_kind.rb +2 -2
  406. data/lib/volcano/generated/lib/volcano-generated/models/project_import_run.rb +2 -2
  407. data/lib/volcano/generated/lib/volcano-generated/models/project_import_run_status.rb +2 -2
  408. data/lib/volcano/generated/lib/volcano-generated/models/project_import_start_request.rb +2 -2
  409. data/lib/volcano/generated/lib/volcano-generated/models/project_import_summary.rb +2 -2
  410. data/lib/volcano/generated/lib/volcano-generated/models/project_import_target.rb +2 -2
  411. data/lib/volcano/generated/lib/volcano-generated/models/project_lock_lease.rb +2 -2
  412. data/lib/volcano/generated/lib/volcano-generated/models/project_lock_lease_request.rb +2 -2
  413. data/lib/volcano/generated/lib/volcano-generated/models/project_lock_state.rb +2 -2
  414. data/lib/volcano/generated/lib/volcano-generated/models/project_metrics_data_status.rb +2 -2
  415. data/lib/volcano/generated/lib/volcano-generated/models/project_metrics_dimensions.rb +2 -2
  416. data/lib/volcano/generated/lib/volcano-generated/models/project_metrics_group_by.rb +2 -2
  417. data/lib/volcano/generated/lib/volcano-generated/models/project_metrics_metric.rb +2 -2
  418. data/lib/volcano/generated/lib/volcano-generated/models/project_metrics_query.rb +2 -2
  419. data/lib/volcano/generated/lib/volcano-generated/models/project_metrics_query_request.rb +2 -2
  420. data/lib/volcano/generated/lib/volcano-generated/models/project_metrics_query_response.rb +2 -2
  421. data/lib/volcano/generated/lib/volcano-generated/models/project_metrics_query_time_range.rb +2 -2
  422. data/lib/volcano/generated/lib/volcano-generated/models/project_metrics_result.rb +2 -2
  423. data/lib/volcano/generated/lib/volcano-generated/models/project_metrics_unit.rb +2 -2
  424. data/lib/volcano/generated/lib/volcano-generated/models/project_metrics_value.rb +2 -2
  425. data/lib/volcano/generated/lib/volcano-generated/models/project_metrics_window.rb +2 -2
  426. data/lib/volcano/generated/lib/volcano-generated/models/project_source_export.rb +2 -2
  427. data/lib/volcano/generated/lib/volcano-generated/models/project_source_export_omission.rb +2 -2
  428. data/lib/volcano/generated/lib/volcano-generated/models/project_source_export_skip.rb +2 -2
  429. data/lib/volcano/generated/lib/volcano-generated/models/project_source_export_state.rb +2 -2
  430. data/lib/volcano/generated/lib/volcano-generated/models/project_template_installation.rb +217 -0
  431. data/lib/volcano/generated/lib/volcano-generated/models/project_usage_response.rb +2 -2
  432. data/lib/volcano/generated/lib/volcano-generated/models/publish_durable_message_request.rb +205 -0
  433. data/lib/volcano/generated/lib/volcano-generated/models/publish_sandbox_preset_request.rb +2 -2
  434. data/lib/volcano/generated/lib/volcano-generated/models/realtime_config.rb +2 -2
  435. data/lib/volcano/generated/lib/volcano-generated/models/realtime_plan_limits.rb +2 -2
  436. data/lib/volcano/generated/lib/volcano-generated/models/realtime_stats.rb +2 -2
  437. data/lib/volcano/generated/lib/volcano-generated/models/refresh_o_auth_provider_token200_response.rb +2 -2
  438. data/lib/volcano/generated/lib/volcano-generated/models/register_durable_message_wait_request.rb +284 -0
  439. data/lib/volcano/generated/lib/volcano-generated/models/rename_variable_environment_request.rb +176 -0
  440. data/lib/volcano/generated/lib/volcano-generated/models/replace_frontend_shared_variables_request.rb +237 -0
  441. data/lib/volcano/generated/lib/volcano-generated/models/replace_shared_variables_request.rb +2 -2
  442. data/lib/volcano/generated/lib/volcano-generated/models/request_durable_approval_request.rb +355 -0
  443. data/lib/volcano/generated/lib/volcano-generated/models/reset_database_password200_response.rb +2 -2
  444. data/lib/volcano/generated/lib/volcano-generated/models/resolve_function_response.rb +13 -3
  445. data/lib/volcano/generated/lib/volcano-generated/models/resource_reference.rb +2 -2
  446. data/lib/volcano/generated/lib/volcano-generated/models/sandbox_access.rb +2 -2
  447. data/lib/volcano/generated/lib/volcano-generated/models/sandbox_access_request.rb +2 -2
  448. data/lib/volcano/generated/lib/volcano-generated/models/sandbox_build_log_page.rb +176 -0
  449. data/lib/volcano/generated/lib/volcano-generated/models/sandbox_build_log_page_data_inner.rb +190 -0
  450. data/lib/volcano/generated/lib/volcano-generated/models/sandbox_capacity.rb +2 -2
  451. data/lib/volcano/generated/lib/volcano-generated/models/sandbox_capacity_list.rb +2 -2
  452. data/lib/volcano/generated/lib/volcano-generated/models/sandbox_command_request.rb +13 -14
  453. data/lib/volcano/generated/lib/volcano-generated/models/sandbox_command_result.rb +2 -2
  454. data/lib/volcano/generated/lib/volcano-generated/models/sandbox_deployment.rb +2 -2
  455. data/lib/volcano/generated/lib/volcano-generated/models/sandbox_deployment_page.rb +2 -2
  456. data/lib/volcano/generated/lib/volcano-generated/models/sandbox_execution_request.rb +53 -15
  457. data/lib/volcano/generated/lib/volcano-generated/models/sandbox_execution_result.rb +2 -2
  458. data/lib/volcano/generated/lib/volcano-generated/models/sandbox_file_read_request.rb +2 -2
  459. data/lib/volcano/generated/lib/volcano-generated/models/sandbox_file_result.rb +2 -2
  460. data/lib/volcano/generated/lib/volcano-generated/models/sandbox_file_write_request.rb +2 -2
  461. data/lib/volcano/generated/lib/volcano-generated/models/sandbox_pagination.rb +2 -2
  462. data/lib/volcano/generated/lib/volcano-generated/models/sandbox_preset.rb +2 -2
  463. data/lib/volcano/generated/lib/volcano-generated/models/sandbox_preset_list.rb +2 -2
  464. data/lib/volcano/generated/lib/volcano-generated/models/sandbox_session.rb +6 -32
  465. data/lib/volcano/generated/lib/volcano-generated/models/sandbox_session_page.rb +2 -2
  466. data/lib/volcano/generated/lib/volcano-generated/models/sandbox_subject_grant_request.rb +2 -2
  467. data/lib/volcano/generated/lib/volcano-generated/models/sandbox_template.rb +2 -2
  468. data/lib/volcano/generated/lib/volcano-generated/models/sandbox_template_page.rb +2 -2
  469. data/lib/volcano/generated/lib/volcano-generated/models/schedule_request.rb +2 -2
  470. data/lib/volcano/generated/lib/volcano-generated/models/send_durable_message_request.rb +205 -0
  471. data/lib/volcano/generated/lib/volcano-generated/models/service_key.rb +2 -2
  472. data/lib/volcano/generated/lib/volcano-generated/models/set_project_git_production_branch_request.rb +2 -2
  473. data/lib/volcano/generated/lib/volcano-generated/models/storage_bucket.rb +2 -2
  474. data/lib/volcano/generated/lib/volcano-generated/models/storage_copy_request.rb +2 -2
  475. data/lib/volcano/generated/lib/volcano-generated/models/storage_list_response.rb +2 -2
  476. data/lib/volcano/generated/lib/volcano-generated/models/storage_move_request.rb +2 -2
  477. data/lib/volcano/generated/lib/volcano-generated/models/storage_object.rb +2 -2
  478. data/lib/volcano/generated/lib/volcano-generated/models/storage_object_with_bucket.rb +2 -2
  479. data/lib/volcano/generated/lib/volcano-generated/models/storage_policy.rb +2 -2
  480. data/lib/volcano/generated/lib/volcano-generated/models/storage_stats.rb +2 -2
  481. data/lib/volcano/generated/lib/volcano-generated/models/storage_visibility_request.rb +2 -2
  482. data/lib/volcano/generated/lib/volcano-generated/models/test_email_request.rb +2 -2
  483. data/lib/volcano/generated/lib/volcano-generated/models/test_email_response.rb +2 -2
  484. data/lib/volcano/generated/lib/volcano-generated/models/unban_user_response.rb +2 -2
  485. data/lib/volcano/generated/lib/volcano-generated/models/update_auth_config_request.rb +81 -3
  486. data/lib/volcano/generated/lib/volcano-generated/models/update_auth_hosted_page_request.rb +2 -2
  487. data/lib/volcano/generated/lib/volcano-generated/models/update_auth_page_layout_request.rb +2 -2
  488. data/lib/volcano/generated/lib/volcano-generated/models/update_auth_page_theme_request.rb +2 -2
  489. data/lib/volcano/generated/lib/volcano-generated/models/update_autofix_settings_request.rb +273 -0
  490. data/lib/volcano/generated/lib/volcano-generated/models/update_database_branch_request.rb +2 -2
  491. data/lib/volcano/generated/lib/volcano-generated/models/update_database_type_request.rb +2 -2
  492. data/lib/volcano/generated/lib/volcano-generated/models/update_email_template_request.rb +2 -2
  493. data/lib/volcano/generated/lib/volcano-generated/models/update_function_request.rb +13 -4
  494. data/lib/volcano/generated/lib/volcano-generated/models/update_function_scheduler_request.rb +2 -2
  495. data/lib/volcano/generated/lib/volcano-generated/models/update_issue_request.rb +186 -0
  496. data/lib/volcano/generated/lib/volcano-generated/models/update_o_auth_config_request.rb +2 -2
  497. data/lib/volcano/generated/lib/volcano-generated/models/update_project_git_deploy_settings_request.rb +2 -2
  498. data/lib/volcano/generated/lib/volcano-generated/models/update_project_request.rb +2 -2
  499. data/lib/volcano/generated/lib/volcano-generated/models/update_realtime_config_request.rb +2 -2
  500. data/lib/volcano/generated/lib/volcano-generated/models/update_sandbox_template_request.rb +2 -2
  501. data/lib/volcano/generated/lib/volcano-generated/models/update_storage_bucket_request.rb +2 -2
  502. data/lib/volcano/generated/lib/volcano-generated/models/update_variable_request.rb +2 -2
  503. data/lib/volcano/generated/lib/volcano-generated/models/upload_session_part.rb +2 -2
  504. data/lib/volcano/generated/lib/volcano-generated/models/upload_session_status_response.rb +2 -2
  505. data/lib/volcano/generated/lib/volcano-generated/models/upload_storage_object201_response.rb +3 -3
  506. data/lib/volcano/generated/lib/volcano-generated/models/usage_data_point.rb +2 -2
  507. data/lib/volcano/generated/lib/volcano-generated/models/variable.rb +13 -3
  508. data/lib/volcano/generated/lib/volcano-generated/models/variable_environment.rb +325 -0
  509. data/lib/volcano/generated/lib/volcano-generated/models/variable_environment_list.rb +175 -0
  510. data/lib/volcano/generated/lib/volcano-generated/models/verified_domain.rb +192 -0
  511. data/lib/volcano/generated/lib/volcano-generated/models/verified_domains_response.rb +166 -0
  512. data/lib/volcano/generated/lib/volcano-generated/models/verify_domain_request.rb +183 -0
  513. data/lib/volcano/generated/lib/volcano-generated/version.rb +2 -2
  514. data/lib/volcano/generated/lib/volcano-generated.rb +90 -2
  515. data/lib/volcano/generated_transport.rb +1 -0
  516. data/lib/volcano/generated_transport_durable.rb +59 -0
  517. data/lib/volcano/generated_transport_durable_messages.rb +57 -0
  518. data/lib/volcano/generated_transport_functions.rb +1 -1
  519. data/lib/volcano/generated_transport_sandbox.rb +33 -1
  520. data/lib/volcano/lock_response.rb +2 -2
  521. data/lib/volcano/realtime/channel_callbacks.rb +5 -1
  522. data/lib/volcano/realtime/channel_lifecycle.rb +4 -1
  523. data/lib/volcano/realtime/durable_channel.rb +47 -0
  524. data/lib/volcano/realtime/lifecycle.rb +37 -1
  525. data/lib/volcano/realtime/protocol.rb +7 -3
  526. data/lib/volcano/realtime/protocol_dispatch.rb +1 -1
  527. data/lib/volcano/realtime/protocol_io.rb +7 -4
  528. data/lib/volcano/realtime/protocol_lifecycle.rb +7 -0
  529. data/lib/volcano/realtime/protocol_recovery.rb +23 -12
  530. data/lib/volcano/realtime.rb +42 -8
  531. data/lib/volcano/redaction.rb +1 -1
  532. data/lib/volcano/sandbox_deployment_response.rb +39 -0
  533. data/lib/volcano/sandbox_deployments.rb +79 -0
  534. data/lib/volcano/sandbox_models.rb +8 -0
  535. data/lib/volcano/sandbox_request.rb +6 -0
  536. data/lib/volcano/sandboxes.rb +2 -0
  537. data/lib/volcano/storage_mutations.rb +2 -2
  538. data/lib/volcano/storage_object_response.rb +2 -2
  539. data/lib/volcano/transport.rb +1 -1
  540. data/lib/volcano/version.rb +1 -1
  541. data/lib/volcano.rb +14 -0
  542. data/sig/core_facades.rbs +29 -0
  543. data/sig/durable_approval_records.rbs +218 -0
  544. data/sig/durable_message_records.rbs +68 -0
  545. data/sig/durable_records.rbs +17 -9
  546. data/sig/errors.rbs +3 -0
  547. data/sig/sandboxes.rbs +42 -0
  548. metadata +115 -9
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 6f70aca387b3651859ed9b1ce7fbc2ff100811d50823a3e3939ae14fdd49d737
4
- data.tar.gz: 1c30afc50e2d95d0071ae85709631c10e20ef874a2ef62a86fc2665e32c0bf39
3
+ metadata.gz: a17106ab631dea9f34c8efbe196bd1636ceb1dd80f2751f3c93570f925176418
4
+ data.tar.gz: 0d8853a55cadc7f86e34b7c6bf39e751b0474d4f878f9732ed013f6b5715794f
5
5
  SHA512:
6
- metadata.gz: 6a4752c01a40435051cc380077c8107e921c2d8990bba76a7c127ab1faa799c0589d80d81fdeabd285ebec9f25e997a44408922c685478de9cd4de4352cc12e1
7
- data.tar.gz: 037ecea94fbe86893befc7449856ed41d9a63cd6a93a5e348472bcb335b22db849b3498f442bbb68a22d3819374a6ebd50e50911541d00dafe087a2d948146d3
6
+ metadata.gz: a2d0f334b4dd8b5482e26b9146e66ad44c97af567e0db6a12124f0a715033bd8e0c9307cbd75bab5b1ee1c6866f47212b999f1a6c237297b749b6803912331c8
7
+ data.tar.gz: fdfa815814d401cd36bccfb6bfc1179e9222d0792cc993529d3cd16246942cf5c5d1afaf25c84fb7ea8f642551cb494b394b7884dcba64fe4a8c72946de2ce2e
data/README.md CHANGED
@@ -522,10 +522,11 @@ owner_client.durable.stop(project_id, "charge-order", handle.id)
522
522
  `start` takes a durable function's name or its id and returns a handle, never a
523
523
  result: an execution can run for up to 366 days, so its result is read back with `get`.
524
524
  It uses the same credential `invoke` does — the active user session, then a
525
- configured service key, then the anonymous key — and is the only durable
526
- operation an application credential may perform. An `execution_name` makes the
527
- start idempotent: starting again under the same name returns the execution that
528
- already exists rather than beginning a second one.
525
+ configured service key, then the anonymous key — and is, with `messages`, the
526
+ only durable operation an application credential may perform. An
527
+ `execution_name` makes the start idempotent: starting again under the same name
528
+ returns the execution that already exists rather than beginning a second one.
529
+ Only the start that creates the execution returns its `client_token`.
529
530
 
530
531
  `get`, `list`, and `stop` are owner-scoped and require the project owner's
531
532
  platform user token, because an execution is addressed by its id alone.
@@ -550,6 +551,105 @@ caller needs.
550
551
  Ruby remains a fully supported runtime for [standard
551
552
  functions](https://volcano.dev/platform/functions/overview).
552
553
 
554
+ ### Decide durable approvals
555
+
556
+ A durable function written in JavaScript or Python can pause until a person
557
+ approves or denies a request. Ruby lists those requests and decides them:
558
+
559
+ ```ruby
560
+ approvals = owner_client.durable.approvals
561
+
562
+ page = approvals.list(project_id, status: "pending", function: "refunds", limit: 20)
563
+ page.approvals.each do |approval|
564
+ puts [approval.id, approval.title, approval.details, approval.expires_at]
565
+ end
566
+
567
+ begin
568
+ approval = approvals.approve(project_id, page.approvals.first.id, comment: "Matches the invoice")
569
+ puts approval.decision.decided_at
570
+ rescue Volcano::Error::ConflictError => e
571
+ puts e.code # approval_decided, approval_expired, or approval_cancelled
572
+ end
573
+
574
+ approvals.deny(project_id, "00000000-0000-4000-8000-000000000051")
575
+
576
+ stats = approvals.stats(project_id, from: Time.now - (7 * 86_400))
577
+ puts [stats.counts.pending, stats.approval_rate, stats.median_seconds_to_decision]
578
+ ```
579
+
580
+ `list` returns the newest approvals first. Filter by `status` (`pending`,
581
+ `approved`, `denied`, `expired`, or `cancelled`), `function` (a durable
582
+ function's id or name), `execution_id`, and a `from`/`to` window given as a
583
+ `Time` or an ISO 8601 string with an offset, such as `2026-10-01T00:00:00Z`.
584
+ `stats` covers the last 30 days unless you pass a
585
+ window, up to 366 days. It counts approvals by status, gives the approval rate
586
+ and the median and 90th-percentile time to a decision (nil when nothing in the
587
+ window was decided), lists the ten functions that requested the most approvals
588
+ with the rest summed in `other_functions`, and returns `daily` counts keyed by
589
+ `YYYY-MM-DD` UTC dates, omitting days without approvals.
590
+
591
+ An approval keeps its function and execution names after they are deleted;
592
+ their ids become nil. `decision` is nil unless the approval was approved or
593
+ denied, and its `decided_by` is nil once the deciding account is deleted.
594
+
595
+ Reading approvals accepts the project owner's platform user token or a project
596
+ access token. Approving and denying require a person: a project access token
597
+ raises `Volcano::Error::PermissionDeniedError` (HTTP 403, a subclass of
598
+ `AuthenticationError`, so existing rescues still apply). Repeating the same
599
+ decision returns the approval unchanged; a conflicting decision, or deciding an
600
+ expired or cancelled approval, raises `Volcano::Error::ConflictError` (HTTP
601
+ 409). An unknown approval, or one in another project, raises
602
+ `Volcano::Error::NotFoundError`. A `comment` is optional, up to 2,000
603
+ characters.
604
+
605
+ ### Message a durable execution
606
+
607
+ A durable function written in JavaScript or Python can wait for a named
608
+ message, and publish messages of its own. Ruby sends them, lists them, and
609
+ follows what the execution publishes:
610
+
611
+ ```ruby
612
+ require "async"
613
+
614
+ handle = client.durable.start("onboarding", { account_id: "account-7" })
615
+ messages = client.durable.messages
616
+
617
+ messages.send_message("onboarding", handle.id, "documents-uploaded", { count: 3 },
618
+ idempotency_key: "upload-42")
619
+
620
+ page = messages.list("onboarding", handle.id, direction: "out", after: 0)
621
+ puts page.messages.map(&:name), page.has_more
622
+
623
+ Async do
624
+ subscription = messages.subscribe("onboarding", handle.id, client_token: handle.client_token) do |message|
625
+ puts [message.seq, message.name, message.data]
626
+ end
627
+ # ...
628
+ subscription.unsubscribe
629
+ ensure
630
+ client.realtime.disconnect
631
+ end.wait
632
+ ```
633
+
634
+ A sent message waits until the execution waits for its name. Repeating a send
635
+ with the same `idempotency_key` returns the stored message; sending to an
636
+ execution that has ended raises `Volcano::Error::ConflictError` with `code`
637
+ `execution_not_running`. `subscribe` delivers each published message once, in
638
+ `seq` order, one block call at a time: those published before the call first,
639
+ then live ones, and after a reconnect or a lost live message the ones it
640
+ missed. It needs a signed-in session and an Async reactor; a client with only a
641
+ client token or the service key raises `Volcano::Error::AuthenticationError`.
642
+ Signing out, signing in again, or setting another session ends the
643
+ subscription; a token refresh does not. So does a reconnect the server refuses
644
+ to restore it on, as when the execution is no longer visible to the session.
645
+
646
+ The service key reaches every execution. A signed-in user reaches the executions
647
+ they started; the anon key, or another user, passes the execution's
648
+ `client_token:`, which only the creating start returns. Pass `project_id:` to
649
+ `send_message`, `list`, or `subscribe` to use the owner's route with a platform
650
+ user token or a project access token; `subscribe` reads back over it. See the
651
+ [functions guide](https://github.com/Kong/volcano-sdk-ruby/blob/main/docs/functions.md#message-a-durable-execution).
652
+
553
653
  ### Read project logs
554
654
 
555
655
  ```ruby
@@ -80,8 +80,8 @@ module Volcano
80
80
 
81
81
  def profile_optional_boolean(value)
82
82
  return if value.nil?
83
- return true if value == true
84
- return false if value == false
83
+ return true if value.equal?(true)
84
+ return false if value.equal?(false)
85
85
 
86
86
  raise Error::AuthenticationError, INVALID_USER
87
87
  end
@@ -118,7 +118,6 @@ module Volcano
118
118
  def initialize_facades(socket_factory, reconnect_delay)
119
119
  @auth = Auth.new(self, @transport, api_url: @api_url)
120
120
  @functions = Functions.new(self, @transport, api_url: @api_url)
121
- @durable = Durable.new(self, @transport)
122
121
  @logs = Logs.new(self, @transport)
123
122
  @storage = Storage.new(self, @transport, api_url: @api_url, anon_key: @anon_key)
124
123
  @locks = Locks.new(self, @transport)
@@ -129,6 +128,7 @@ module Volcano
129
128
  socket_factory: socket_factory,
130
129
  reconnect_delay: reconnect_delay
131
130
  )
131
+ @durable = Durable.new(self, @transport, @realtime)
132
132
  end
133
133
  end
134
134
  end
@@ -3,27 +3,35 @@
3
3
  module Volcano
4
4
  # Starts and follows executions of deployed durable functions.
5
5
  class Durable
6
- # What the platform accepts as an execution name, and the page size it
7
- # serves at most. Mirrored from the wire contract so a refusal is the
8
- # facade's rather than the generated client's.
6
+ # What the platform accepts as an execution name. Mirrored from the wire
7
+ # contract so a refusal is the facade's rather than the generated client's.
9
8
  EXECUTION_NAME = /\A[A-Za-z0-9._-]{1,255}\z/
10
- MAX_PAGE_SIZE = 100
9
+ include DurableArguments
11
10
  include DurableResponses
12
11
 
13
- def initialize(client, transport)
12
+ # Lists, reads, and decides the approvals durable workflows request.
13
+ attr_reader :approvals
14
+
15
+ # Sends to, lists, and follows the messages of durable executions.
16
+ attr_reader :messages
17
+
18
+ def initialize(client, transport, realtime)
14
19
  @client = client
15
20
  @transport = transport
21
+ @approvals = DurableApprovals.new(client, transport)
22
+ @messages = DurableMessages.new(client, transport, realtime)
16
23
  end
17
24
 
18
25
  # Starts an execution and returns its handle. A durable function is never
19
26
  # invoked synchronously: it can outlive any request a caller could hold
20
27
  # open, so its result is read back with #get.
21
28
  #
22
- # Starting is the only durable operation an application credential may
23
- # perform, and it takes the token an invoke takes. Passing an
29
+ # Starting takes the token an invoke takes, and is, with #messages, the
30
+ # only durable operation an application credential may perform. Passing an
24
31
  # +execution_name+ makes the start idempotent: starting again under the
25
32
  # same name returns the execution that already exists rather than
26
- # beginning a second one.
33
+ # beginning a second one. Only the start that created the execution
34
+ # returns its +client_token+.
27
35
  def start(function_name, payload = {}, execution_name: nil)
28
36
  # A durable function's id is accepted here as well as its name, so the
29
37
  # DNS-safe name pattern an invoke checks would reject half the input.
@@ -99,18 +107,6 @@ module Volcano
99
107
  ]
100
108
  end
101
109
 
102
- # An empty path segment would address the collection instead of the
103
- # execution, which is a different request rather than a failed one.
104
- def identifier(value, field)
105
- raise ArgumentError, "#{field} must be a non-empty String" unless value.is_a?(String) && present_string?(value)
106
-
107
- value.strip.freeze
108
- end
109
-
110
- # The generated client validates this header against the same pattern and
111
- # raises its own message, naming the operation and the option key it knows
112
- # the header by. Checked here first so the caller reads a message about the
113
- # argument they passed, the way Functions#invoke does for a function name.
114
110
  def execution_name_argument(value)
115
111
  name = identifier(value, 'execution_name')
116
112
  unless EXECUTION_NAME.match?(name)
@@ -120,23 +116,5 @@ module Volcano
120
116
 
121
117
  name
122
118
  end
123
-
124
- # Same reason: the generated client enforces the page and limit bounds and
125
- # answers with its own vocabulary.
126
- def validate_paging(page, limit)
127
- raise ArgumentError, 'page must be a positive Integer' unless page.nil? || positive_integer?(page)
128
-
129
- validate_page_limit(limit)
130
- end
131
-
132
- def validate_page_limit(limit)
133
- return if limit.nil? || (limit.is_a?(Integer) && positive_integer?(limit) && limit <= MAX_PAGE_SIZE)
134
-
135
- raise ArgumentError, "limit must be an Integer between 1 and #{MAX_PAGE_SIZE}"
136
- end
137
-
138
- def positive_integer?(value)
139
- value.is_a?(Integer) && value.positive?
140
- end
141
119
  end
142
120
  end
@@ -0,0 +1,171 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'immutable_request_value'
4
+
5
+ module Volcano
6
+ DURABLE_APPROVAL_ATTRIBUTES = %i[
7
+ id status name title description details function execution requested_at expires_at decision
8
+ ].freeze
9
+ DURABLE_APPROVAL_STATS_ATTRIBUTES = %i[
10
+ from to counts approval_rate median_seconds_to_decision p90_seconds_to_decision
11
+ functions other_functions daily
12
+ ].freeze
13
+ private_constant :DURABLE_APPROVAL_ATTRIBUTES, :DURABLE_APPROVAL_STATS_ATTRIBUTES
14
+
15
+ # Checks keywords for the durable records with too many fields for an
16
+ # explicit keyword list, and owns immutable copies of their values.
17
+ module DurableApprovalAttributes
18
+ def self.capture(attributes, names, optional:)
19
+ unknown = attributes.keys - names
20
+ raise ArgumentError, "unknown keywords: #{unknown.join(', ')}" unless unknown.empty?
21
+
22
+ missing = names - optional - attributes.keys
23
+ raise ArgumentError, "missing keywords: #{missing.join(', ')}" unless missing.empty?
24
+
25
+ names.to_h { |name| [name, immutable_value(attributes[name])] }
26
+ end
27
+
28
+ def self.immutable_value(value)
29
+ case value
30
+ when Hash, Array, Time, String then ImmutableRequestValue.capture(value)
31
+ else value
32
+ end
33
+ end
34
+ end
35
+ private_constant :DurableApprovalAttributes
36
+
37
+ # The durable function that requested an approval. `id` is nil once the
38
+ # function has been deleted; `name` is kept.
39
+ DurableApprovalFunction = Data.define(:id, :name)
40
+
41
+ # Reopens the generated record for checked initialization.
42
+ class DurableApprovalFunction
43
+ # @dynamic id, name, members, with, to_h, deconstruct, deconstruct_keys, self.[]
44
+ # @dynamic self.members
45
+ def initialize(id:, name:)
46
+ id = id&.dup&.freeze
47
+ name = name.dup.freeze
48
+ super
49
+ end
50
+ end
51
+
52
+ # The durable execution that requested an approval. `id` and `status` are
53
+ # nil once the execution is no longer retained; `name` is kept.
54
+ DurableApprovalExecution = Data.define(:id, :name, :status)
55
+
56
+ # Reopens the generated record for checked initialization.
57
+ class DurableApprovalExecution
58
+ # @dynamic id, name, status, members, with, to_h, deconstruct, deconstruct_keys
59
+ # @dynamic self.[], self.members
60
+ def initialize(id:, name:, status:)
61
+ id = id&.dup&.freeze
62
+ name = name.dup.freeze
63
+ status = status&.dup&.freeze
64
+ super
65
+ end
66
+ end
67
+
68
+ # The person who decided an approval.
69
+ DurableApprovalDecider = Data.define(:id, :email)
70
+
71
+ # Reopens the generated record for checked initialization.
72
+ class DurableApprovalDecider
73
+ # @dynamic id, email, members, with, to_h, deconstruct, deconstruct_keys, self.[]
74
+ # @dynamic self.members
75
+ def initialize(id:, email:)
76
+ id = id.dup.freeze
77
+ email = email.dup.freeze
78
+ super
79
+ end
80
+ end
81
+
82
+ # Who decided an approval and when. `decided_by` is nil once that person's
83
+ # account is deleted.
84
+ DurableApprovalDecision = Data.define(:comment, :decided_by, :decided_at)
85
+
86
+ # Reopens the generated record for checked initialization.
87
+ class DurableApprovalDecision
88
+ # @dynamic comment, decided_by, decided_at, members, with, to_h, deconstruct
89
+ # @dynamic deconstruct_keys, self.[], self.members
90
+ def initialize(comment:, decided_by:, decided_at:)
91
+ comment = comment.dup.freeze
92
+ decided_at = decided_at.dup.freeze
93
+ super
94
+ end
95
+ end
96
+
97
+ # An approval a durable workflow requested.
98
+ #
99
+ # `decision` is nil unless the approval was approved or denied, and
100
+ # `expires_at` is nil when the workflow set no timeout. `details` is the
101
+ # workflow's own JSON, frozen all the way down.
102
+ DurableApproval = Data.define(*DURABLE_APPROVAL_ATTRIBUTES)
103
+
104
+ # Reopens the generated record for checked initialization.
105
+ class DurableApproval
106
+ # @dynamic id, status, name, title, description, details, function, execution
107
+ # @dynamic requested_at, expires_at, decision, members, with, to_h, deconstruct
108
+ # @dynamic deconstruct_keys, self.[], self.members
109
+ def initialize(**attributes)
110
+ values = DurableApprovalAttributes.capture(
111
+ attributes, DURABLE_APPROVAL_ATTRIBUTES, optional: %i[details expires_at decision]
112
+ )
113
+ attributes = values
114
+ super
115
+ end
116
+ end
117
+
118
+ # One page of a project's approvals, newest first.
119
+ DurableApprovalPage = Data.define(:approvals, :page, :limit, :total, :has_more)
120
+
121
+ # Reopens the generated record for checked initialization.
122
+ class DurableApprovalPage
123
+ # @dynamic approvals, page, limit, total, has_more, members, with, to_h, deconstruct
124
+ # @dynamic deconstruct_keys, self.[], self.members
125
+ def initialize(approvals:, page:, limit:, total:, has_more:)
126
+ approvals = approvals.to_a.dup.freeze
127
+ super
128
+ end
129
+ end
130
+
131
+ # Approvals by status. `requested` counts every approval, whatever its status.
132
+ DurableApprovalCounts = Data.define(:requested, :pending, :approved, :denied, :expired, :cancelled)
133
+
134
+ # One workflow's approval counts.
135
+ DurableApprovalFunctionCounts = Data.define(:function, :counts)
136
+
137
+ # Approval counts for one UTC day, given as `YYYY-MM-DD`.
138
+ DurableApprovalDailyCounts = Data.define(:date, :counts)
139
+
140
+ # Reopens the generated record for checked initialization.
141
+ class DurableApprovalDailyCounts
142
+ # @dynamic date, counts, members, with, to_h, deconstruct, deconstruct_keys, self.[]
143
+ # @dynamic self.members
144
+ def initialize(date:, counts:)
145
+ date = date.dup.freeze
146
+ super
147
+ end
148
+ end
149
+
150
+ # Approval outcomes over a time window.
151
+ #
152
+ # `functions` holds the ten workflows that requested the most approvals and
153
+ # `other_functions` sums the rest. `daily` omits days without approvals.
154
+ # The rate and decision times are nil when nothing in the window was decided.
155
+ DurableApprovalStats = Data.define(*DURABLE_APPROVAL_STATS_ATTRIBUTES)
156
+
157
+ # Reopens the generated record for checked initialization.
158
+ class DurableApprovalStats
159
+ # @dynamic from, to, counts, approval_rate, median_seconds_to_decision
160
+ # @dynamic p90_seconds_to_decision, functions, other_functions, daily, members, with
161
+ # @dynamic to_h, deconstruct, deconstruct_keys, self.[], self.members
162
+ def initialize(**attributes)
163
+ values = DurableApprovalAttributes.capture(
164
+ attributes, DURABLE_APPROVAL_STATS_ATTRIBUTES,
165
+ optional: %i[approval_rate median_seconds_to_decision p90_seconds_to_decision]
166
+ )
167
+ attributes = values
168
+ super
169
+ end
170
+ end
171
+ end
@@ -0,0 +1,222 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'time'
4
+
5
+ module Volcano
6
+ # Checks the fields shared by approval and statistics payloads.
7
+ module DurableApprovalFields
8
+ INCOMPLETE_APPROVAL = 'Expected a complete durable approval'
9
+ INCOMPLETE_PAGE = 'Expected a complete durable approval page'
10
+ INCOMPLETE_STATS = 'Expected complete durable approval statistics'
11
+ private_constant :INCOMPLETE_APPROVAL, :INCOMPLETE_PAGE, :INCOMPLETE_STATS
12
+
13
+ private
14
+
15
+ def approval_function(payload, message)
16
+ values = approval_object(payload, message)
17
+ DurableApprovalFunction.new(
18
+ id: optional_approval_text(values['id'], message), name: approval_text(values['name'], message)
19
+ )
20
+ end
21
+
22
+ def approval_object(payload, message)
23
+ raise TypeError, message unless payload.is_a?(Hash)
24
+
25
+ payload
26
+ end
27
+
28
+ def approval_list(value)
29
+ raise TypeError, INCOMPLETE_STATS unless value.is_a?(Array)
30
+
31
+ value
32
+ end
33
+
34
+ def approval_text(value, message = INCOMPLETE_APPROVAL)
35
+ raise TypeError, message unless value.is_a?(String) && !value.strip.empty?
36
+
37
+ value
38
+ end
39
+
40
+ def optional_approval_text(value, message)
41
+ value.nil? ? nil : approval_text(value, message)
42
+ end
43
+
44
+ def approval_string(value, message)
45
+ raise TypeError, message unless value.is_a?(String)
46
+
47
+ value
48
+ end
49
+
50
+ def approval_time(value, message)
51
+ case value
52
+ when String then Time.iso8601(value)
53
+ when Time then value
54
+ else raise TypeError, message
55
+ end
56
+ rescue ArgumentError
57
+ raise TypeError, message, cause: nil
58
+ end
59
+
60
+ def approval_count(value, message = INCOMPLETE_STATS)
61
+ raise TypeError, message unless value.is_a?(Integer)
62
+
63
+ value
64
+ end
65
+
66
+ def approval_flag(value)
67
+ return value if value.is_a?(TrueClass) || value.is_a?(FalseClass)
68
+
69
+ raise TypeError, INCOMPLETE_PAGE
70
+ end
71
+
72
+ def approval_number(value)
73
+ case value
74
+ when nil then nil
75
+ when Integer, Float then Float(value)
76
+ else raise TypeError, INCOMPLETE_STATS
77
+ end
78
+ end
79
+ end
80
+ private_constant :DurableApprovalFields
81
+
82
+ # Builds approvals and approval pages from transport payloads.
83
+ module DurableApprovalResponses
84
+ include DurableApprovalFields
85
+
86
+ private
87
+
88
+ def durable_approval(payload)
89
+ values = approval_object(payload, INCOMPLETE_APPROVAL)
90
+ id, status, name, title = approval_labels(values)
91
+ requested_at, expires_at = approval_schedule(values)
92
+ DurableApproval.new(
93
+ id: id, status: status, name: name, title: title,
94
+ description: approval_string(values['description'], INCOMPLETE_APPROVAL),
95
+ details: approval_details(values['details']),
96
+ function: approval_function(values['function'], INCOMPLETE_APPROVAL),
97
+ execution: approval_execution(values['execution']), requested_at: requested_at, expires_at: expires_at,
98
+ decision: approval_decision(values['decision'])
99
+ )
100
+ end
101
+
102
+ def durable_approval_page(payload)
103
+ values = approval_object(payload, INCOMPLETE_PAGE)
104
+ data = values['data']
105
+ raise TypeError, INCOMPLETE_PAGE unless data.is_a?(Array)
106
+
107
+ DurableApprovalPage.new(
108
+ approvals: data.map { |entry| durable_approval(entry) }, has_more: approval_flag(values['has_more']),
109
+ page: approval_count(values['page'], INCOMPLETE_PAGE), limit: approval_count(values['limit'], INCOMPLETE_PAGE),
110
+ total: approval_count(values['total'], INCOMPLETE_PAGE)
111
+ )
112
+ end
113
+
114
+ def approval_labels(values)
115
+ [approval_text(values['id']), approval_text(values['status']),
116
+ approval_text(values['name']), approval_text(values['title'])]
117
+ end
118
+
119
+ def approval_schedule(values)
120
+ expires_at = values['expires_at']
121
+ [approval_time(values['requested_at'], INCOMPLETE_APPROVAL),
122
+ expires_at.nil? ? nil : approval_time(expires_at, INCOMPLETE_APPROVAL)]
123
+ end
124
+
125
+ def approval_execution(payload)
126
+ values = approval_object(payload, INCOMPLETE_APPROVAL)
127
+ DurableApprovalExecution.new(
128
+ id: optional_approval_text(values['id'], INCOMPLETE_APPROVAL), name: approval_text(values['name']),
129
+ status: optional_approval_text(values['status'], INCOMPLETE_APPROVAL)
130
+ )
131
+ end
132
+
133
+ def approval_decision(payload)
134
+ return if payload.nil?
135
+
136
+ values = approval_object(payload, INCOMPLETE_APPROVAL)
137
+ DurableApprovalDecision.new(
138
+ comment: approval_string(values['comment'], INCOMPLETE_APPROVAL),
139
+ decided_by: approval_decider(values['decided_by']),
140
+ decided_at: approval_time(values['decided_at'], INCOMPLETE_APPROVAL)
141
+ )
142
+ end
143
+
144
+ def approval_decider(payload)
145
+ return if payload.nil?
146
+
147
+ values = approval_object(payload, INCOMPLETE_APPROVAL)
148
+ DurableApprovalDecider.new(
149
+ id: approval_text(values['id']), email: approval_string(values['email'], INCOMPLETE_APPROVAL)
150
+ )
151
+ end
152
+
153
+ def approval_details(value)
154
+ Transport.json_value(value)
155
+ rescue TypeError
156
+ raise TypeError, INCOMPLETE_APPROVAL, cause: nil
157
+ end
158
+ end
159
+ private_constant :DurableApprovalResponses
160
+
161
+ # Builds approval statistics from transport payloads.
162
+ module DurableApprovalStatsResponses
163
+ include DurableApprovalFields
164
+
165
+ DAY = /\A\d{4}-\d{2}-\d{2}\z/
166
+ private_constant :DAY
167
+
168
+ private
169
+
170
+ def durable_approval_stats(payload)
171
+ values = approval_object(payload, INCOMPLETE_STATS)
172
+ from, to = approval_window(values)
173
+ rate, median, p90 = approval_timings(values)
174
+ functions, daily = approval_breakdown(values)
175
+ DurableApprovalStats.new(
176
+ from: from, to: to, counts: approval_counts(values['counts']), approval_rate: rate,
177
+ median_seconds_to_decision: median, p90_seconds_to_decision: p90, functions: functions,
178
+ other_functions: approval_counts(values['other_functions']), daily: daily
179
+ )
180
+ end
181
+
182
+ def approval_window(values)
183
+ [approval_time(values['from'], INCOMPLETE_STATS), approval_time(values['to'], INCOMPLETE_STATS)]
184
+ end
185
+
186
+ def approval_timings(values)
187
+ [approval_number(values['approval_rate']), approval_number(values['median_seconds_to_decision']),
188
+ approval_number(values['p90_seconds_to_decision'])]
189
+ end
190
+
191
+ def approval_breakdown(values)
192
+ [approval_list(values['functions']).map { |entry| approval_function_counts(entry) },
193
+ approval_list(values['daily']).map { |entry| approval_daily_counts(entry) }]
194
+ end
195
+
196
+ def approval_counts(payload)
197
+ values = approval_object(payload, INCOMPLETE_STATS)
198
+ DurableApprovalCounts.new(
199
+ requested: approval_count(values['requested']), pending: approval_count(values['pending']),
200
+ approved: approval_count(values['approved']), denied: approval_count(values['denied']),
201
+ expired: approval_count(values['expired']), cancelled: approval_count(values['cancelled'])
202
+ )
203
+ end
204
+
205
+ def approval_function_counts(payload)
206
+ values = approval_object(payload, INCOMPLETE_STATS)
207
+ DurableApprovalFunctionCounts.new(
208
+ function: approval_function(values['function'], INCOMPLETE_STATS), counts: approval_counts(values['counts'])
209
+ )
210
+ end
211
+
212
+ def approval_daily_counts(payload)
213
+ values = approval_object(payload, INCOMPLETE_STATS)
214
+ date = approval_text(values['date'], INCOMPLETE_STATS)
215
+ valid = DAY.match?(date) && approval_time("#{date}T00:00:00Z", INCOMPLETE_STATS).strftime('%F') == date
216
+ raise TypeError, INCOMPLETE_STATS unless valid
217
+
218
+ DurableApprovalDailyCounts.new(date: date, counts: approval_counts(values['counts']))
219
+ end
220
+ end
221
+ private_constant :DurableApprovalStatsResponses
222
+ end